task-vuplus-enigma2
authorChang.H.S <jhs@dev3>
Tue, 27 Nov 2012 09:52:36 +0000 (18:52 +0900)
committerChang.H.S <jhs@dev3>
Tue, 27 Nov 2012 09:52:36 +0000 (18:52 +0900)
608 files changed:
meta-openvuplus/classes/schwerkraft-git.bbclass [new file with mode: 0644]
meta-openvuplus/recipes-base/firmwares/files/Marvell-Licence.txt [new file with mode: 0644]
meta-openvuplus/recipes-base/firmwares/firmware-drxd-a2.bb [new file with mode: 0644]
meta-openvuplus/recipes-base/firmwares/firmware-dvb-af9005.bb [new file with mode: 0644]
meta-openvuplus/recipes-base/firmwares/firmware-dvb-fe-af9013.bb [new file with mode: 0644]
meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-af9015.bb [new file with mode: 0644]
meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-af9035.bb [new file with mode: 0644]
meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-avertv-a800.bb [new file with mode: 0644]
meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-dib0700.bb [new file with mode: 0644]
meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-dibusb.bb [new file with mode: 0644]
meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-digitv.bb [new file with mode: 0644]
meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-ec168.bb [new file with mode: 0644]
meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-nova-t-usb2.bb [new file with mode: 0644]
meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-sms1xxx-hcw-dvbt.bb [new file with mode: 0644]
meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-sms1xxx-nova-dvbt.bb [new file with mode: 0644]
meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-ttusb-budget.bb [new file with mode: 0644]
meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-umt-010.bb [new file with mode: 0644]
meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-wt220u-zl0353.bb [new file with mode: 0644]
meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-xc5000.bb [new file with mode: 0644]
meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb.bb [new file with mode: 0644]
meta-openvuplus/recipes-base/firmwares/firmware-htc9271.bb [new file with mode: 0644]
meta-openvuplus/recipes-base/firmwares/firmware-rt2561.bb [new file with mode: 0644]
meta-openvuplus/recipes-base/firmwares/firmware-rt3070.bb [new file with mode: 0644]
meta-openvuplus/recipes-base/firmwares/firmware-rtl8721u.bb [new file with mode: 0644]
meta-openvuplus/recipes-base/firmwares/linux-firmware.inc [new file with mode: 0644]
meta-openvuplus/recipes-base/firmwares/marvell-gspi-fw/9.70.3-p37.tar.gz [new file with mode: 0644]
meta-openvuplus/recipes-base/firmwares/marvell-gspi-fw_9.70.3-p37.bb [new file with mode: 0644]
meta-openvuplus/recipes-base/firmwares/marvell-sdio-fw/9.70.3-p37.tar.gz [new file with mode: 0644]
meta-openvuplus/recipes-base/firmwares/marvell-sdio-fw_9.70.3-p37.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/aio-grab/aio-grab/aio-grab_vuplus.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/aio-grab/aio-grab_0.8.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/aio-grab/aio-grab_0.8.bbappend [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/Makefile.in.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/cdparanoia-III-10.2-privatefix.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/configure.in.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/fixes10.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/interface_Makefile.in.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/paranoia_Makefile.in.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia_svn.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/dreambox-dvbincludes/dreambox-dvbincludes.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/dreambox-dvbincludes/dreambox-dvbincludes_1.1.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/01peerdns [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/01peerdns-remove [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/dial.modem [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/disconnect.modem [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/dm800/options [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/options [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/pap-secrets [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts_0.1.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/dvbtools/dvb-apps-1.1.1/update-to-tip.diff [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/dvbtools/dvb-apps-1.1.1/update-to-trunk.diff [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/dvbtools/dvb-apps_1.1.1.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/dvbtools/dvbstream_cvs.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/dvbtools/dvbtune_cvs.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/dvbtools/wscan_20101204.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices.bb [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/lamedb.130 [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/lamedb.192 [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/lamedb.282 [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/sat130.info [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/sat192.info [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/sat282.info [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins.bb [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/dreamboxweb.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/dreamboxwebtv.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_20110810.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_ac3lipsync_dolby.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_autoresolution_fix.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_dependency.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_mytube_entry_vuplus.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_mytube_tpm.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_mytube_vuplus.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_webinterface_tpm.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/favicon.ico [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2-skins.bb [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2-streamproxy.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/enigma2/enigma2-streamproxy/streamproxy.socket [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/enigma2/enigma2-streamproxy/streamproxy.xinetd.in [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/enigma2/enigma2-streamproxy/streamproxy@.service [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/enigma2/enigma2.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/arrowdown.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/arrowleft.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/arrowright.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/arrowup.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_b.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_bl.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_br.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_l.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_r.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_t.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_tl.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_tr.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bar_ber.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bar_snr.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bg_list.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bg_main.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bg_setup_600.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bg_setup_650.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_epg.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_eventinfo.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_info.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu_300.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu_350.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu_a.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu_c.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_multiepg.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bottombar.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_130x23px.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_170x23px.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_230x23px.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_230x27px.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_250x32px.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_290x23px.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_360x23px.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_360x32px.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_380x23px.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_400x23px.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_440x23px.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_450x32px.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_480x23px.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_500x23px.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_520x23px.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_520x27px.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_550x27px.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_560x23px.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Thumbs.db [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/blue.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/blue_pressed.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_blue.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_blue_off.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_green.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_green_off.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_red.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_red_off.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_yellow.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_yellow_off.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/green-big.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/green.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_0.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_1.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_2.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_3.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_4.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_5.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_6.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_7.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_8.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_9.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_blue.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_green.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_info.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_menu.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_red.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_text.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_yellow.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/red-big.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/red.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_left_arrow.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_right_arrow.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_23p.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_23px.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_39p.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_39px.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_43p.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_48p.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_48px.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_72p.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_72px.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/yellow.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/Thumbs.db [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/ad.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/ae.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/cz.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/de.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/dk.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/en.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/es.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/fi.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/fr.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/gr.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/hr.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/hu.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/is.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/it.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/lt.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/missing.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/nl.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/no.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/pl.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/pt.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/ro.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/ru.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/se.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/si.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/tr.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/div-h.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/div-v.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/epg_more.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/epg_next.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/epg_now.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/expandable-plugins.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/expanded-plugins.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/Thumbs.db [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/clock.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/dish.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/dish_scan.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/dmm_logo.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock_add.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock_post.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock_pre.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock_prepost.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/folder.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/ico_mp_forward.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/ico_mp_pause.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/ico_mp_play.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/ico_mp_rewind.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/ico_mp_stop.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_channelselection_radio.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_channelselection_tv.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_crypt.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_crypt_off.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_dolby.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_dolby_off.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_epg.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_event.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_format.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_format_off.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_mainmenu.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_media.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_note.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_rec.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_rec_off.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_recorded.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_timerlist.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_txt.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_txt_off.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_txt_x.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_view.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icons_off.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icons_off_1.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icons_off_X.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/input_error.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/input_info.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/input_question.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/lock.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/lock_error.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/lock_off.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/lock_on.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/marker.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/mp_buttons.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/plugin.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_logo.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_page1.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_page2.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_page3.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_page4.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/record.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/redx.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/repeat_off.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/repeat_on.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/scan-c.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/scan-s.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/scan-t.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/selectioncross.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/info-bg.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/info-bg_mp.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/mediaplayer_bg.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/Thumbs.db [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/dvd_player.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/information.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/media_player.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/plugins.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/scart.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/setup.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/shutdown.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/subtitles.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/timer.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/mute.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/nim_active.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/no_coverArt.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/output.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/pal.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/picon_default.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/position_arrow.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/position_pointer.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/position_pointer_580.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/prev.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/progress_bg.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/progress_big.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/progress_medium.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/progress_recording.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/progress_small.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/rc.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/rcold.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/screws.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/screws_mp.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/scroll.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/singlelineList_selected_23p.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/sleeptimer.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/spinner/Thumbs.db [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/spinner/wait1.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/spinner/wait2.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/spinner/wait3.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/spinner/wait4.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/timeline-now.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/timeline.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/unhandled-key.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/verticalline-plugins.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_backspace.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_bg.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_clr.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_esc.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_icon.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_left.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_ok.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_right.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_sel.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_shift.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_shift_sel.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_space.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_text.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/volume.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/volume_box.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/wizard.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/MyriadPro-Regular.otf [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/MyriadPro-Semibold.otf [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/MyriadPro-SemiboldIt.otf [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_EPG_list.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_EPG_view.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_List.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_Media.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_Media_info.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_Subtitle.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_divideline.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Solo_Menu_bg520.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Statusbar_white.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/arrowdown.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/arrowleft.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/arrowright.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/arrowup.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_b.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_bl.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_br.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_l.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_r.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_t.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_tl.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_tr.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/bar_ber.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/bar_snr.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/bg.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/border_eventinfo.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/border_info.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/border_menu.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/FocusBar_H36.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/FocusBar_H42.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/FocusBar_H45.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/blue.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/button_bluekey.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/button_off.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/green.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_0.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_1.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_2.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_3.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_4.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_5.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_6.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_7.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_8.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_9.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_text.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/red.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/yellow.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ad.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ae.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/cz.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/de.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/dk.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ee.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/en.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/es.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/fi.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/fr.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/gr.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/hr.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/hu.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/is.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/it.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/lt.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/lv.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/missing.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/nl.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/no.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/pl.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/pt.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ro.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ru.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/se.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/si.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/sk.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/tr.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ua.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/x-fy.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/yu.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/div-h.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/div-v.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/epg_more.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/epg_next.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/epg_now.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/Mediaplayerbar_gray.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/Mediaplayerbar_purple.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/clock.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/dish.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/dish_scan.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_Chlist_title.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_Radio_title.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_folder.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_noreplay.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_player.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_replay.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_crypt.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_crypt_off.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_dolby.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_dolby_off.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_event.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_format.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_format_off.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_rec.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_rec_off.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_txt.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_txt_off.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_view.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icons_off.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/input_error.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/input_info.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/input_question.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/lock.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/lock_error.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/lock_off.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/lock_on.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/mp_buttons.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/mp_wb_buttons.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/plugin.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/rass_logo.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/record.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/redx.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/scan-c.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/scan-s.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/scan-t.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/info-bg.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_EPG_title.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_Plugin_All_title.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Info.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Media.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Plugin.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Setup.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Standby.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Subtitles.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Timer.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Info.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_MENU.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Media.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Plugin.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Pluginall.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Setup.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Standby.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Subtitles.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Timer.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_media-info.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/mp_wb_background.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/mute.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/no_coverArt.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/position_arrow.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/prev.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/progress_bg.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/progress_big.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/progress_medium.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/progress_small.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/rc.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/rc_wb_desc.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/rcold.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/sleeptimer.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/timeline-now.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/timeline.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/unhandled-key.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_backspace.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_bg.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_clr.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_esc.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_icon.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_left.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_ok.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_right.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_sel.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_shift.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_shift_sel.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_space.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_text.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/volume_background.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/volume_up.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/wizard.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/analog.ttf [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_addlibpythondeps.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_mediaplayer.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_mediaplayer_subtitle.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_mediaplayer_unpause.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_misc.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_networksetup.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_remove_dreambox_enigma.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_skin.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_textvfd.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_vfd.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_vfd_mode.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_0.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_1.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_2.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_3.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_4.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_5.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_6.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_7.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_8.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_9.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/skin_user.xml [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_crypt.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_dolby.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_format.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_rec.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_txt.png [new file with mode: 0755]
meta-openvuplus/recipes-enigma2/gstreamer/gst-plugin-dvbmediasink_0.10.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad-0.10.23/0001-mpegtsdemux-fix-bd-streamtype-detection.diff.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad-0.10.23/0002-add-indexing-capabilities-to-generate-a-SPN-PTS-map-.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad-0.10.23/0003-mpegpsdemux_speedup.diff.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad-0.10.23/orc.m4-fix-location-of-orcc-when-cross-compiling.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad_0.10.23.bbappend [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-base-0.10.36/orc.m4-fix-location-of-orcc-when-cross-compiling.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-base_0.10.36.bbappend [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-good-0.10.31/audioparser-raise-ranks.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-good-0.10.31/orc.m4-fix-location-of-orcc-when-cross-compiling.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-good_0.10.31.bbappend [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly-0.10.19/dvdsubdec-addproperty-singlebuffer.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly-0.10.19/fix-opencore-amr-1.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly-0.10.19/fix-opencore-amr-2.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly-0.10.19/orc.m4-fix-location-of-orcc-when-cross-compiling.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly_0.10.19.bbappend [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/libav/libav_0.7.4.bbappend [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/libdreamdvd/libdreamdvd_0.9.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/libdvbsi++/libdvbsi++_0.3.6.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/libdvdnav/libdvdnav/0001-dvdnavmini.pc-link-against-libdvdnavmini.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/libdvdnav/libdvdnav_svn.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/libdvdread/libdvdread_svn.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2-1.2.5/autofoo.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2-1.2.5/fix-install.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2-1.2.5/pkgconfig.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2-1.2.5/to_1.2.7.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2_1.2.5.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/libungif/libungif-native_4.1.3.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/libungif/libungif_4.1.3.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/libxmlccwrap/files/disable_libxslt.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/libxmlccwrap/files/dont_build_unneeded.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/libxmlccwrap/files/fix_assignment_operator.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/libxmlccwrap/libxmlccwrap_0.0.12.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/opencore-amr/opencore-amr_0.1.3.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/opkg/opkg-collateral.bbappend [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/opkg/opkg-collateral/dest [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/opkg/opkg/0001-Fixed-opkg-losing-auto_installed-flag-on-upgrading.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/opkg/opkg/0002-Don-t-mark-Conflicts-as-Depends.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/opkg/opkg/0003-Statically-link-libopkg-and-libbb.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/opkg/opkg/0004-Makefile.am-remove-g-and-O-compiler-flags.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/opkg/opkg/0005-pkg_depends-remove-unused-variables-to-fix-compiler-.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/opkg/opkg/0006-pkg_hash_fetch_conflicts-fix-possible-segfaults.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/opkg/opkg/0007-pkg_hash_fetch_conflicts-move-iteration-over-conflic.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/opkg/opkg/0008-pkg_hash_fetch_conflicts-take-into-account-conflicts.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/opkg/opkg/0009-Revert-Add-Recommended-packages-to-the-depended_upon.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/opkg/opkg/0010-opkg_remove-auto-delete-.pyo-files.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/opkg/opkg_svn.bbappend [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/python/python-coherence_git.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/python/python-daap/python-daap.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/python/python-daap_0.7.1.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/python/python-daap_0.7.1.bbappend [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/python/python-flickrapi_1.4.2.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/python/python-gdata_2.0.14.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/python/python-mutagen/patch.diff [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/python/python-mutagen_1.18.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/python/python-native_2.7.2.bbappend [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/python/python-pycrypto/no-usr-include.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/python/python-pycrypto_2.5.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/python/python-transmissionrpc_hg.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/python/python-twisted_12.0.0.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/python/python-wifi_0.5.0.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/python/python/ctypes-error-handling-fix.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/python/python/fix_pthread_site.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/python/python/no-ldconfig.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/python/python/some_configure_fixes.patch [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/python/python_2.7.2.bbappend [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/rt2870sta/files/RT2870STA.dat [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/rt2870sta/rt2870sta_1.0.0.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/rt73-firmware/rt73-firmware_1.8.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/showiframe/showiframe_1.8.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/swig/swig_2.0.4.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/tasks/task-vuplus-enigma2.bb [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/tasks/task-vuplus-enigma2.inc [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/timezones/files/GPL-1.0 [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/timezones/files/zoneinfo.tar.bz2 [new file with mode: 0644]
meta-openvuplus/recipes-enigma2/timezones/timezones-alternative.bb [new file with mode: 0644]

diff --git a/meta-openvuplus/classes/schwerkraft-git.bbclass b/meta-openvuplus/classes/schwerkraft-git.bbclass
new file mode 100644 (file)
index 0000000..312a8e1
--- /dev/null
@@ -0,0 +1,5 @@
+SCHWERKRAFT_PROJECT ?= "${BPN}"
+
+SRC_URI += "git://schwerkraft.elitedvb.net/${SCHWERKRAFT_PROJECT}/${SCHWERKRAFT_PROJECT}.git;protocol=git"
+
+inherit git-project
diff --git a/meta-openvuplus/recipes-base/firmwares/files/Marvell-Licence.txt b/meta-openvuplus/recipes-base/firmwares/files/Marvell-Licence.txt
new file mode 100644 (file)
index 0000000..87035b0
--- /dev/null
@@ -0,0 +1,40 @@
+FIRMWARE LICENSE TERMS*
+
+Copyright (c) Marvell International Ltd.
+
+All rights reserved.
+
+Redistribution. Redistribution and use in binary form, without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions must reproduce the above copyright notice and the following
+  disclaimer in the documentation and/or other materials provided with the
+  distribution.
+
+* Neither the name of Marvell International Ltd. nor the names of its suppliers
+  may be used to endorse or promote products derived from this software without
+  specific prior written permission.
+
+* No reverse engineering, decompilation, or disassembly of this software is
+  permitted.
+
+Limited patent license. Marvell International Ltd. grants a world-wide,
+royalty-free, non-exclusive license under patents it now or hereafter owns or
+controls to make, have made, use, import, offer to sell and sell ("Utilize")
+this software, but solely to the extent that any such patent is necessary to
+Utilize the software alone, or in combination with an operating system licensed
+under an approved Open Source license as listed by the Open Source Initiative
+at http://opensource.org/licenses. The patent license shall not apply to any
+other combinations which include this software. No hardware per se is licensed
+hereunder.
+
+DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.*
diff --git a/meta-openvuplus/recipes-base/firmwares/firmware-drxd-a2.bb b/meta-openvuplus/recipes-base/firmwares/firmware-drxd-a2.bb
new file mode 100644 (file)
index 0000000..1d02c51
--- /dev/null
@@ -0,0 +1,9 @@
+require linux-firmware.inc
+
+SRCREV = "46c66487a85cd05a4acbd5eb4828f72783d1be4c"
+
+do_install() {
+        install -d ${D}${base_libdir}/firmware
+        install -m 0644 drxd-a2-1.1.fw ${D}/${base_libdir}/firmware/
+}
+
diff --git a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-af9005.bb b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-af9005.bb
new file mode 100644 (file)
index 0000000..004fd4a
--- /dev/null
@@ -0,0 +1,9 @@
+require linux-firmware.inc
+
+SRCREV = "46c66487a85cd05a4acbd5eb4828f72783d1be4c"
+
+do_install() {
+        install -d ${D}${base_libdir}/firmware
+        install -m 0644 af9005.fw ${D}/${base_libdir}/firmware/
+}
+
diff --git a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-fe-af9013.bb b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-fe-af9013.bb
new file mode 100644 (file)
index 0000000..03916f5
--- /dev/null
@@ -0,0 +1,9 @@
+require linux-firmware.inc
+
+SRCREV = "46c66487a85cd05a4acbd5eb4828f72783d1be4c"
+
+do_install() {
+        install -d ${D}${base_libdir}/firmware
+        install -m 0644 dvb-fe-af9013.fw ${D}/${base_libdir}/firmware/
+}
+
diff --git a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-af9015.bb b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-af9015.bb
new file mode 100644 (file)
index 0000000..0079bd2
--- /dev/null
@@ -0,0 +1,9 @@
+require linux-firmware.inc
+
+SRCREV = "46c66487a85cd05a4acbd5eb4828f72783d1be4c"
+
+do_install() {
+        install -d ${D}${base_libdir}/firmware
+        install -m 0644 dvb-usb-af9015.fw ${D}/${base_libdir}/firmware/
+}
+
diff --git a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-af9035.bb b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-af9035.bb
new file mode 100644 (file)
index 0000000..7097f6d
--- /dev/null
@@ -0,0 +1,9 @@
+require linux-firmware.inc
+
+SRCREV = "46c66487a85cd05a4acbd5eb4828f72783d1be4c"
+
+do_install() {
+        install -d ${D}${base_libdir}/firmware
+        install -m 0644 dvb-usb-af9035-01.fw ${D}/${base_libdir}/firmware/
+}
+
diff --git a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-avertv-a800.bb b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-avertv-a800.bb
new file mode 100644 (file)
index 0000000..193c763
--- /dev/null
@@ -0,0 +1,9 @@
+require linux-firmware.inc
+
+SRCREV = "46c66487a85cd05a4acbd5eb4828f72783d1be4c"
+
+do_install() {
+        install -d ${D}${base_libdir}/firmware
+        install -m 0644 dvb-usb-avertv-a800-02.fw ${D}/${base_libdir}/firmware/
+}
+
diff --git a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-dib0700.bb b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-dib0700.bb
new file mode 100644 (file)
index 0000000..431bc48
--- /dev/null
@@ -0,0 +1,12 @@
+require linux-firmware.inc
+
+SRCREV = "46c66487a85cd05a4acbd5eb4828f72783d1be4c"
+
+do_install() {
+        install -d ${D}${base_libdir}/firmware
+        install -m 0644 dvb-usb-dib0700-01.fw ${D}/${base_libdir}/firmware/
+        install -m 0644 dvb-usb-dib0700-03-pre1.fw ${D}/${base_libdir}/firmware/
+        install -m 0644 dvb-usb-dib0700-1.10.fw ${D}/${base_libdir}/firmware/
+        install -m 0644 dvb-usb-dib0700-1.20.fw ${D}/${base_libdir}/firmware/
+}
+
diff --git a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-dibusb.bb b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-dibusb.bb
new file mode 100644 (file)
index 0000000..5298eb3
--- /dev/null
@@ -0,0 +1,11 @@
+require linux-firmware.inc
+
+SRCREV = "46c66487a85cd05a4acbd5eb4828f72783d1be4c"
+
+do_install() {
+        install -d ${D}${base_libdir}/firmware
+        install -m 0644 dvb-usb-dibusb-6.0.0.8.fw ${D}/${base_libdir}/firmware/
+        install -m 0644 dvb-usb-dibusb-an2235-01.fw ${D}/${base_libdir}/firmware/
+        install -m 0644 dvb-usb-dibusb-5.0.0.11.fw ${D}/${base_libdir}/firmware/
+}
+
diff --git a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-digitv.bb b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-digitv.bb
new file mode 100644 (file)
index 0000000..570241e
--- /dev/null
@@ -0,0 +1,9 @@
+require linux-firmware.inc
+
+SRCREV = "46c66487a85cd05a4acbd5eb4828f72783d1be4c"
+
+do_install() {
+        install -d ${D}${base_libdir}/firmware
+        install -m 0644 dvb-usb-digitv-02.fw ${D}/${base_libdir}/firmware/
+}
+
diff --git a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-ec168.bb b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-ec168.bb
new file mode 100644 (file)
index 0000000..7a6c1d4
--- /dev/null
@@ -0,0 +1,9 @@
+require linux-firmware.inc
+
+SRCREV = "46c66487a85cd05a4acbd5eb4828f72783d1be4c"
+
+do_install() {
+        install -d ${D}${base_libdir}/firmware
+        install -m 0644 dvb-usb-ec168.fw ${D}/${base_libdir}/firmware/
+}
+
diff --git a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-nova-t-usb2.bb b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-nova-t-usb2.bb
new file mode 100644 (file)
index 0000000..bd5a261
--- /dev/null
@@ -0,0 +1,10 @@
+require linux-firmware.inc
+
+SRCREV = "46c66487a85cd05a4acbd5eb4828f72783d1be4c"
+
+do_install() {
+        install -d ${D}${base_libdir}/firmware
+        install -m 0644 dvb-usb-nova-t-usb2-01.fw ${D}/${base_libdir}/firmware/
+        install -m 0644 dvb-usb-nova-t-usb2-02.fw ${D}/${base_libdir}/firmware/
+}
+
diff --git a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-sms1xxx-hcw-dvbt.bb b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-sms1xxx-hcw-dvbt.bb
new file mode 100644 (file)
index 0000000..221497a
--- /dev/null
@@ -0,0 +1,11 @@
+require linux-firmware.inc
+
+SRCREV = "46c66487a85cd05a4acbd5eb4828f72783d1be4c"
+
+do_install() {
+        install -d ${D}${base_libdir}/firmware
+        install -m 0644 sms1xxx-hcw-55xxx-dvbt-01.fw ${D}/${base_libdir}/firmware/
+        install -m 0644 sms1xxx-hcw-55xxx-dvbt-02.fw ${D}/${base_libdir}/firmware/
+        install -m 0644 sms1xxx-hcw-55xxx-dvbt-03.fw ${D}/${base_libdir}/firmware/
+}
+
diff --git a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-sms1xxx-nova-dvbt.bb b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-sms1xxx-nova-dvbt.bb
new file mode 100644 (file)
index 0000000..aeaf2a0
--- /dev/null
@@ -0,0 +1,10 @@
+require linux-firmware.inc
+
+SRCREV = "46c66487a85cd05a4acbd5eb4828f72783d1be4c"
+
+do_install() {
+        install -d ${D}${base_libdir}/firmware
+        install -m 0644 sms1xxx-nova-a-dvbt-01.fw ${D}/${base_libdir}/firmware/
+        install -m 0644 sms1xxx-nova-b-dvbt-01.fw ${D}/${base_libdir}/firmware/
+}
+
diff --git a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-ttusb-budget.bb b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-ttusb-budget.bb
new file mode 100644 (file)
index 0000000..62292cc
--- /dev/null
@@ -0,0 +1,9 @@
+require linux-firmware.inc
+
+SRCREV = "46c66487a85cd05a4acbd5eb4828f72783d1be4c"
+
+do_install() {
+        install -d ${D}${base_libdir}/firmware/ttusb-budget/
+        install -m 0644 ttusb-budget/dspbootcode.bin ${D}/${base_libdir}/firmware/ttusb-budget/
+}
+
diff --git a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-umt-010.bb b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-umt-010.bb
new file mode 100644 (file)
index 0000000..d53b9db
--- /dev/null
@@ -0,0 +1,9 @@
+require linux-firmware.inc
+
+SRCREV = "46c66487a85cd05a4acbd5eb4828f72783d1be4c"
+
+do_install() {
+        install -d ${D}${base_libdir}/firmware
+        install -m 0644 dvb-usb-umt-010-02.fw ${D}/${base_libdir}/firmware/
+}
+
diff --git a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-wt220u-zl0353.bb b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-wt220u-zl0353.bb
new file mode 100644 (file)
index 0000000..1eebc64
--- /dev/null
@@ -0,0 +1,9 @@
+require linux-firmware.inc
+
+SRCREV = "46c66487a85cd05a4acbd5eb4828f72783d1be4c"
+
+do_install() {
+        install -d ${D}${base_libdir}/firmware
+        install -m 0644 dvb-usb-wt220u-zl0353-01.fw ${D}/${base_libdir}/firmware/
+}
+
diff --git a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-xc5000.bb b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-xc5000.bb
new file mode 100644 (file)
index 0000000..67a4b19
--- /dev/null
@@ -0,0 +1,10 @@
+require linux-firmware.inc
+
+SRCREV = "46c66487a85cd05a4acbd5eb4828f72783d1be4c"
+
+do_install() {
+        install -d ${D}${base_libdir}/firmware
+        install -m 0644 dvb-fe-xc5000-1.1.fw ${D}/${base_libdir}/firmware/
+        install -m 0644 dvb-fe-xc5000-1.6.114.fw ${D}/${base_libdir}/firmware/
+}
+
diff --git a/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb.bb b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb.bb
new file mode 100644 (file)
index 0000000..25e68b6
--- /dev/null
@@ -0,0 +1,13 @@
+
+require linux-firmware.inc
+
+PR = "r1"
+
+DESCRIPTION = "Temporary Firmware collections"
+
+SRCREV = "13f0b6bda7b567d29c747196aa65ad82b18651ca"
+
+do_install() {
+        install -d ${D}${base_libdir}/firmware
+        install -m 0644 *.fw rt2870.bin ${D}${base_libdir}/firmware
+}
diff --git a/meta-openvuplus/recipes-base/firmwares/firmware-htc9271.bb b/meta-openvuplus/recipes-base/firmwares/firmware-htc9271.bb
new file mode 100644 (file)
index 0000000..359057b
--- /dev/null
@@ -0,0 +1,9 @@
+require linux-firmware.inc
+
+SRCREV = "46c66487a85cd05a4acbd5eb4828f72783d1be4c"
+
+do_install() {
+        install -d ${D}${base_libdir}/firmware
+        install -m 0644 htc_9271.fw ${D}/${base_libdir}/firmware/
+}
+
diff --git a/meta-openvuplus/recipes-base/firmwares/firmware-rt2561.bb b/meta-openvuplus/recipes-base/firmwares/firmware-rt2561.bb
new file mode 100644 (file)
index 0000000..6418604
--- /dev/null
@@ -0,0 +1,9 @@
+require linux-firmware.inc
+
+SRCREV = "46c66487a85cd05a4acbd5eb4828f72783d1be4c"
+
+do_install() {
+        install -d ${D}${base_libdir}/firmware
+        install -m 0644 rt2561.bin ${D}/${base_libdir}/firmware/
+}
+
diff --git a/meta-openvuplus/recipes-base/firmwares/firmware-rt3070.bb b/meta-openvuplus/recipes-base/firmwares/firmware-rt3070.bb
new file mode 100644 (file)
index 0000000..a9357c0
--- /dev/null
@@ -0,0 +1,10 @@
+require linux-firmware.inc
+
+SRCREV = "46c66487a85cd05a4acbd5eb4828f72783d1be4c"
+
+do_install() {
+        install -d ${D}${base_libdir}/firmware
+        install -m 0644 rt2870.bin ${D}/${base_libdir}/firmware/
+        install -m 0644 rt3070.bin ${D}/${base_libdir}/firmware/
+}
+
diff --git a/meta-openvuplus/recipes-base/firmwares/firmware-rtl8721u.bb b/meta-openvuplus/recipes-base/firmwares/firmware-rtl8721u.bb
new file mode 100644 (file)
index 0000000..1cae3f9
--- /dev/null
@@ -0,0 +1,9 @@
+require linux-firmware.inc
+
+SRCREV = "46c66487a85cd05a4acbd5eb4828f72783d1be4c"
+
+do_install() {
+        install -d ${D}${base_libdir}/firmware/rtlwifi
+        install -m 0644 rtlwifi/rtl8712u.bin ${D}/${base_libdir}/firmware/rtlwifi/
+}
+
diff --git a/meta-openvuplus/recipes-base/firmwares/linux-firmware.inc b/meta-openvuplus/recipes-base/firmwares/linux-firmware.inc
new file mode 100644 (file)
index 0000000..4c23ccf
--- /dev/null
@@ -0,0 +1,11 @@
+LICENSE = "CLOSED"
+
+SRC_URI = "git://github.com/mdamt/linux-firmware.git;protocol=git"
+SRC_URI = "git://github.com/BjornLee/linux-firmware.git;protocol=git"
+
+S = "${WORKDIR}/git"
+
+PACKAGES = "${PN}"
+FILES_${PN} += "${base_libdir}/firmware"
+
+PACKAGE_ARCH = "all"
diff --git a/meta-openvuplus/recipes-base/firmwares/marvell-gspi-fw/9.70.3-p37.tar.gz b/meta-openvuplus/recipes-base/firmwares/marvell-gspi-fw/9.70.3-p37.tar.gz
new file mode 100644 (file)
index 0000000..c7bf768
Binary files /dev/null and b/meta-openvuplus/recipes-base/firmwares/marvell-gspi-fw/9.70.3-p37.tar.gz differ
diff --git a/meta-openvuplus/recipes-base/firmwares/marvell-gspi-fw_9.70.3-p37.bb b/meta-openvuplus/recipes-base/firmwares/marvell-gspi-fw_9.70.3-p37.bb
new file mode 100644 (file)
index 0000000..9fdfd6f
--- /dev/null
@@ -0,0 +1,20 @@
+DESCRIPTION = "Firmware for Marvel 8686 gspi wifi chipset"
+LICENSE = "closed"
+
+SRC_URI = "file://${PV}.tar.gz \
+           file://Marvell-Licence.txt"
+
+S = "${WORKDIR}/${PV}/FwImage"
+
+do_install() {
+
+       install -d ${D}${base_libdir}/firmware
+       install -m 0644 gspi8686.bin helper_gspi.bin ${D}${base_libdir}/firmware
+       install -m 0644 ${WORKDIR}/Marvell-Licence.txt ${D}${base_libdir}/firmware
+       ln -s helper_gspi.bin ${D}${base_libdir}/firmware/gspi8686_hlp.bin
+}
+
+PACKAGES = "${PN}"
+FILES_${PN} += "${base_libdir}/firmware"
+
+PACKAGE_ARCH = "all"
diff --git a/meta-openvuplus/recipes-base/firmwares/marvell-sdio-fw/9.70.3-p37.tar.gz b/meta-openvuplus/recipes-base/firmwares/marvell-sdio-fw/9.70.3-p37.tar.gz
new file mode 100644 (file)
index 0000000..3efd73f
Binary files /dev/null and b/meta-openvuplus/recipes-base/firmwares/marvell-sdio-fw/9.70.3-p37.tar.gz differ
diff --git a/meta-openvuplus/recipes-base/firmwares/marvell-sdio-fw_9.70.3-p37.bb b/meta-openvuplus/recipes-base/firmwares/marvell-sdio-fw_9.70.3-p37.bb
new file mode 100644 (file)
index 0000000..181b2ba
--- /dev/null
@@ -0,0 +1,19 @@
+DESCRIPTION = "Firmware for Marvel 8686 gspi wifi chipset"
+LICENSE = "closed"
+
+SRC_URI = "file://${PV}.tar.gz \
+           file://Marvell-Licence.txt"
+
+S = "${WORKDIR}/${PV}/FwImage"
+
+do_install() {
+
+       install -d ${D}${base_libdir}/firmware
+       install -m 0644 sd8686.bin sd8686_helper.bin ${D}${base_libdir}/firmware
+       install -m 0644 ${WORKDIR}/Marvell-Licence.txt ${D}${base_libdir}/firmware
+}
+
+PACKAGES = "${PN}"
+FILES_${PN} += "${base_libdir}/firmware"
+
+PACKAGE_ARCH = "all"
diff --git a/meta-openvuplus/recipes-enigma2/aio-grab/aio-grab/aio-grab_vuplus.patch b/meta-openvuplus/recipes-enigma2/aio-grab/aio-grab/aio-grab_vuplus.patch
new file mode 100644 (file)
index 0000000..1459e22
--- /dev/null
@@ -0,0 +1,94 @@
+diff --git a/main.c b/main.c
+index 190ff5f..08298e9 100644
+--- a/main.c
++++ b/main.c
+@@ -101,8 +101,8 @@ static void combine(unsigned char *output,
+                   const unsigned char *video, const unsigned char *osd,
+                   unsigned int xres, unsigned int yres);
+-enum {UNKNOWN,PALLAS,VULCAN,XILLEON,BRCM7401,BRCM7400,BRCM7405};
+-static const char *stb_name[]={"unknown","Pallas","Vulcan","Xilleon","Brcm7401","Brcm7400","Brcm7405"};
++enum {UNKNOWN,PALLAS,VULCAN,XILLEON,BRCM7401,BRCM7400,BRCM7405,BRCM7335,BRCM7325};
++static const char *stb_name[]={"unknown","Pallas","Vulcan","Xilleon","Brcm7401","Brcm7400","Brcm7405","Brcm7335","Brcm7325"};
+ static int stb_type=UNKNOWN;
+ static const char *file_getline(const char *filename)
+@@ -221,6 +221,22 @@ int main(int argc, char **argv) {
+                        !strcmp(line, "dm800se") ||
+                        !strcmp(line, "dm7020hd"))
+                       stb_type = BRCM7405;
++
++              // CPU Detection. idea from pl
++              if (line != NULL)
++                      free(line);
++              line = file_getline("/proc/stb/info/chipset");
++              if(line)
++              {
++                      if (!strcmp(line, "7335"))
++                              stb_type = BRCM7335;
++                      else if (!strcmp(line, "7325"))
++                              stb_type = BRCM7325;
++                      else if (!strcmp(line, "7405"))
++                              stb_type = BRCM7405;
++              }
++              free(line);
++              
+       } else if (strstr(line, "xilleonfb")) {
+               stb_type = XILLEON;
+       } else if (strstr(line, "Pallas FB")) {
+@@ -564,7 +580,7 @@ static bool getvideo(unsigned char *video, unsigned int *xres, unsigned int *yre
+               return false;
+       }
+-      if (stb_type == BRCM7401 || stb_type == BRCM7400 || stb_type == BRCM7405)
++      if (stb_type == BRCM7401 || stb_type == BRCM7400 || stb_type == BRCM7405 || stb_type == BRCM7335 || stb_type == BRCM7325)
+       {
+               // grab brcm7401 pic from decoder memory
+               unsigned char *memory = mmap(0, 100, PROT_READ, MAP_SHARED, mem_fd, 0x10100000);
+@@ -609,7 +625,7 @@ static bool getvideo(unsigned char *video, unsigned int *xres, unsigned int *yre
+               assert(chroma);
+               // grabbing luma & chroma plane from the decoder memory
+-              if (stb_type == BRCM7401 || stb_type == BRCM7405) {
++              if (stb_type == BRCM7401 || stb_type == BRCM7405 || stb_type == BRCM7325) {
+                       // on dm800/dm500hd we have direct access to the decoder memory
+                       memory = mmap(0, offset + stride*(ofs2+64), PROT_READ, MAP_SHARED, mem_fd, adr);
+                       if (memory == MAP_FAILED) {
+@@ -620,7 +636,7 @@ static bool getvideo(unsigned char *video, unsigned int *xres, unsigned int *yre
+                       usleep(50000);  // we try to get a full picture, its not possible to get a sync from the decoder so we use a delay
+                                       // and hope we get a good timing. dont ask me why, but every DM800 i tested so far produced a good
+                                       // result with a 50ms delay
+-              } else if (stb_type == BRCM7400) { 
++              } else if (stb_type == BRCM7400 || stb_type == BRCM7335) {
+                       // on dm8000 we have to use dma, so dont change anything here until you really know what you are doing !
+                       
+                       unsigned int i = 0;
+@@ -640,6 +656,7 @@ static bool getvideo(unsigned char *video, unsigned int *xres, unsigned int *yre
+                       volatile unsigned long *mem_dma;
+                       mem_dma = mmap(0, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, mem_fd, 0x10c02000);
++                      mem_dma = mmap(0, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, mem_fd, (stb_type==BRCM7400)? 0x10c02000:0x10c01000);
+                       if (mem_dma == MAP_FAILED) {
+                               perror("mmap");
+                               return false;
+@@ -676,7 +693,7 @@ static bool getvideo(unsigned char *video, unsigned int *xres, unsigned int *yre
+               unsigned int chr_luma_stride = 0x40;
+               unsigned int sw;
+-              if (stb_type == BRCM7405)
++              if (stb_type == BRCM7405 || stb_type == BRCM7325)
+                       chr_luma_stride *= 2;
+               xsub=chr_luma_stride;
+@@ -711,9 +728,9 @@ static bool getvideo(unsigned char *video, unsigned int *xres, unsigned int *yre
+                       }
+               }
+-              if (stb_type == BRCM7401 || stb_type == BRCM7405)
++              if (stb_type == BRCM7401 || stb_type == BRCM7405 || stb_type == BRCM7325)
+                       munmap(memory, offset + stride * (ofs2 + 64));
+-              else if (stb_type == BRCM7400) {
++              else if (stb_type == BRCM7400 || stb_type == BRCM7335) {
+                       memory -= 0x1000;
+                       munmap(memory, DMA_BLOCKSIZE + 0x1000);
+               }
diff --git a/meta-openvuplus/recipes-enigma2/aio-grab/aio-grab_0.8.bb b/meta-openvuplus/recipes-enigma2/aio-grab/aio-grab_0.8.bb
new file mode 100644 (file)
index 0000000..bc89b2d
--- /dev/null
@@ -0,0 +1,7 @@
+SUMMARY = "Screen grabber for Dreambox Set-Top-Boxes"
+LICENSE = "GPLv2"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=94d55d512a9ba36caa9b7df079bae19f"
+SRCREV = "8394e1ba98c73d7c56d3235ef16cce253dc597cd"
+PR = "r1"
+
+inherit autotools schwerkraft-git
diff --git a/meta-openvuplus/recipes-enigma2/aio-grab/aio-grab_0.8.bbappend b/meta-openvuplus/recipes-enigma2/aio-grab/aio-grab_0.8.bbappend
new file mode 100644 (file)
index 0000000..9199d4a
--- /dev/null
@@ -0,0 +1,8 @@
+PR .= "-vuplus0"
+
+SRC_URI += " \
+        file://aio-grab_vuplus.patch;patch=1;pnum=1 \
+"
+
+FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
+
diff --git a/meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/Makefile.in.patch b/meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/Makefile.in.patch
new file mode 100644 (file)
index 0000000..40cf4ad
--- /dev/null
@@ -0,0 +1,13 @@
+--- cdparanoia-III-10.2/Makefile.in.orig       2009-01-27 23:32:15.000000000 +0100
++++ cdparanoia-III-10.2/Makefile.in    2009-01-27 23:32:53.000000000 +0100
+@@ -87,8 +87,9 @@
+               $(LIBDIR)/libcdda_paranoia.so
+ cdparanoia:   $(OFILES) $(LIBDEP)
+-              $(LD) $(CFLAGS) $(LDFLAGS) $(OFILES) \
++              $(LD) $(CFLAGS) \
+               -L$(PWD)/paranoia -L$(PWD)/interface \
++              $(LDFLAGS) $(OFILES) \
+               -o cdparanoia $(LIBS)
+ .c.o:
diff --git a/meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/cdparanoia-III-10.2-privatefix.patch b/meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/cdparanoia-III-10.2-privatefix.patch
new file mode 100644 (file)
index 0000000..55f39b2
--- /dev/null
@@ -0,0 +1,561 @@
+diff -ru cdparanoia-III-10.2/interface/cdda_interface.h cdparanoia-III-10.2-mod/interface/cdda_interface.h
+--- cdparanoia-III-10.2/interface/cdda_interface.h     2008-09-11 11:43:52.000000000 +0100
++++ cdparanoia-III-10.2-mod/interface/cdda_interface.h 2009-09-08 16:08:37.000000000 +0100
+@@ -84,7 +84,7 @@
+   int is_atapi;
+   int is_mmc;
+-  cdda_private_data_t *private;
++  cdda_private_data_t *impl;
+   void         *reserved;
+   unsigned char inqbytes[4];
+diff -ru cdparanoia-III-10.2/interface/cooked_interface.c cdparanoia-III-10.2-mod/interface/cooked_interface.c
+--- cdparanoia-III-10.2/interface/cooked_interface.c   2008-08-26 10:55:22.000000000 +0100
++++ cdparanoia-III-10.2-mod/interface/cooked_interface.c       2009-09-08 16:09:35.000000000 +0100
+@@ -13,13 +13,13 @@
+ static int timed_ioctl(cdrom_drive *d, int fd, int command, void *arg){
+   struct timespec tv1;
+   struct timespec tv2;
+-  int ret1=clock_gettime(d->private->clock,&tv1);
++  int ret1=clock_gettime(d->impl->clock,&tv1);
+   int ret2=ioctl(fd, command,arg);
+-  int ret3=clock_gettime(d->private->clock,&tv2);
++  int ret3=clock_gettime(d->impl->clock,&tv2);
+   if(ret1<0 || ret3<0){
+-    d->private->last_milliseconds=-1;
++    d->impl->last_milliseconds=-1;
+   }else{
+-    d->private->last_milliseconds = (tv2.tv_sec-tv1.tv_sec)*1000. + (tv2.tv_nsec-tv1.tv_nsec)/1000000.;
++    d->impl->last_milliseconds = (tv2.tv_sec-tv1.tv_sec)*1000. + (tv2.tv_nsec-tv1.tv_nsec)/1000000.;
+   }
+   return ret2;
+ }
+diff -ru cdparanoia-III-10.2/interface/interface.c cdparanoia-III-10.2-mod/interface/interface.c
+--- cdparanoia-III-10.2/interface/interface.c  2008-09-11 11:43:52.000000000 +0100
++++ cdparanoia-III-10.2-mod/interface/interface.c      2009-09-08 16:09:50.000000000 +0100
+@@ -39,9 +39,9 @@
+     if(d->drive_model)free(d->drive_model);
+     if(d->cdda_fd!=-1)close(d->cdda_fd);
+     if(d->ioctl_fd!=-1 && d->ioctl_fd!=d->cdda_fd)close(d->ioctl_fd);
+-    if(d->private){
+-      if(d->private->sg_hd)free(d->private->sg_hd);
+-      free(d->private);
++    if(d->impl){
++      if(d->impl->sg_hd)free(d->impl->sg_hd);
++      free(d->impl);
+     }
+     free(d);
+@@ -127,7 +127,7 @@
+       }
+       }       
+     }
+-    if(ms)*ms=d->private->last_milliseconds;
++    if(ms)*ms=d->impl->last_milliseconds;
+     return(sectors);
+   }
+   
+diff -ru cdparanoia-III-10.2/interface/scan_devices.c cdparanoia-III-10.2-mod/interface/scan_devices.c
+--- cdparanoia-III-10.2/interface/scan_devices.c       2008-08-26 10:55:22.000000000 +0100
++++ cdparanoia-III-10.2-mod/interface/scan_devices.c   2009-09-08 16:09:17.000000000 +0100
+@@ -264,11 +264,11 @@
+   d->interface=COOKED_IOCTL;
+   d->bigendianp=-1; /* We don't know yet... */
+   d->nsectors=-1;
+-  d->private=calloc(1,sizeof(*d->private));
++  d->impl=calloc(1,sizeof(*d->impl));
+   {
+     /* goddamnit */
+     struct timespec tv;
+-    d->private->clock=(clock_gettime(CLOCK_MONOTONIC,&tv)<0?CLOCK_REALTIME:CLOCK_MONOTONIC);
++    d->impl->clock=(clock_gettime(CLOCK_MONOTONIC,&tv)<0?CLOCK_REALTIME:CLOCK_MONOTONIC);
+   }
+   idmessage(messagedest,messages,"\t\tCDROM sensed: %s\n",description);
+   return(d);
+@@ -674,15 +674,15 @@
+   d->bigendianp=-1; /* We don't know yet... */
+   d->nsectors=-1;
+   d->messagedest = messagedest;
+-  d->private=calloc(1,sizeof(*d->private));
++  d->impl=calloc(1,sizeof(*d->impl));
+   {
+     /* goddamnit */
+     struct timespec tv;
+-    d->private->clock=(clock_gettime(CLOCK_MONOTONIC,&tv)<0?CLOCK_REALTIME:CLOCK_MONOTONIC);
++    d->impl->clock=(clock_gettime(CLOCK_MONOTONIC,&tv)<0?CLOCK_REALTIME:CLOCK_MONOTONIC);
+   }
+   if(use_sgio){
+     d->interface=SGIO_SCSI;
+-    d->private->sg_buffer=(unsigned char *)(d->private->sg_hd=malloc(MAX_BIG_BUFF_SIZE));
++    d->impl->sg_buffer=(unsigned char *)(d->impl->sg_hd=malloc(MAX_BIG_BUFF_SIZE));
+     g_fd=d->cdda_fd=dup(d->ioctl_fd);
+   }else{
+     version=verify_SG_version(d,messagedest,messages);
+@@ -696,8 +696,8 @@
+     }
+     /* malloc our big buffer for scsi commands */
+-    d->private->sg_hd=malloc(MAX_BIG_BUFF_SIZE);
+-    d->private->sg_buffer=((unsigned char *)d->private->sg_hd)+SG_OFF;
++    d->impl->sg_hd=malloc(MAX_BIG_BUFF_SIZE);
++    d->impl->sg_buffer=((unsigned char *)d->impl->sg_hd)+SG_OFF;
+   }
+   {
+@@ -772,9 +772,9 @@
+   if(i_fd!=-1)close(i_fd);
+   if(g_fd!=-1)close(g_fd);
+   if(d){
+-    if(d->private){
+-      if(d->private->sg_hd)free(d->private->sg_hd);
+-      free(d->private);
++    if(d->impl){
++      if(d->impl->sg_hd)free(d->impl->sg_hd);
++      free(d->impl);
+     }
+     free(d);
+   }
+@@ -821,7 +821,7 @@
+   d->interface=TEST_INTERFACE;
+   d->bigendianp=-1; /* We don't know yet... */
+   d->nsectors=-1;
+-  d->private=calloc(1,sizeof(*d->private));
++  d->impl=calloc(1,sizeof(*d->impl));
+   d->drive_model=copystring("File based test interface");
+   idmessage(messagedest,messages,"\t\tCDROM sensed: %s\n",d->drive_model);
+   
+diff -ru cdparanoia-III-10.2/interface/scsi_interface.c cdparanoia-III-10.2-mod/interface/scsi_interface.c
+--- cdparanoia-III-10.2/interface/scsi_interface.c     2008-09-11 21:33:30.000000000 +0100
++++ cdparanoia-III-10.2-mod/interface/scsi_interface.c 2009-09-08 16:10:30.000000000 +0100
+@@ -15,13 +15,13 @@
+ static int timed_ioctl(cdrom_drive *d, int fd, int command, void *arg){
+   struct timespec tv1;
+   struct timespec tv2;
+-  int ret1=clock_gettime(d->private->clock,&tv1);
++  int ret1=clock_gettime(d->impl->clock,&tv1);
+   int ret2=ioctl(fd, command,arg);
+-  int ret3=clock_gettime(d->private->clock,&tv2);
++  int ret3=clock_gettime(d->impl->clock,&tv2);
+   if(ret1<0 || ret3<0){
+-    d->private->last_milliseconds=-1;
++    d->impl->last_milliseconds=-1;
+   }else{
+-    d->private->last_milliseconds = (tv2.tv_sec-tv1.tv_sec)*1000. + (tv2.tv_nsec-tv1.tv_nsec)/1000000.;
++    d->impl->last_milliseconds = (tv2.tv_sec-tv1.tv_sec)*1000. + (tv2.tv_nsec-tv1.tv_nsec)/1000000.;
+   }
+   return ret2;
+ }
+@@ -96,7 +96,7 @@
+ static void clear_garbage(cdrom_drive *d){
+   fd_set fdset;
+   struct timeval tv;
+-  struct sg_header *sg_hd=d->private->sg_hd;
++  struct sg_header *sg_hd=d->impl->sg_hd;
+   int flag=0;
+   /* clear out any possibly preexisting garbage */
+@@ -185,7 +185,7 @@
+   struct timespec tv2;
+   int tret1,tret2;
+   int status = 0;
+-  struct sg_header *sg_hd=d->private->sg_hd;
++  struct sg_header *sg_hd=d->impl->sg_hd;
+   long writebytes=SG_OFF+cmd_len+in_size;
+   /* generic scsi device services */
+@@ -195,7 +195,7 @@
+   memset(sg_hd,0,sizeof(sg_hd)); 
+   memset(sense_buffer,0,SG_MAX_SENSE); 
+-  memcpy(d->private->sg_buffer,cmd,cmd_len+in_size);
++  memcpy(d->impl->sg_buffer,cmd,cmd_len+in_size);
+   sg_hd->twelve_byte = cmd_len == 12;
+   sg_hd->result = 0;
+   sg_hd->reply_len = SG_OFF + out_size;
+@@ -209,7 +209,7 @@
+      tell if the command failed.  Scared yet? */
+   if(bytecheck && out_size>in_size){
+-    memset(d->private->sg_buffer+cmd_len+in_size,bytefill,out_size-in_size); 
++    memset(d->impl->sg_buffer+cmd_len+in_size,bytefill,out_size-in_size); 
+     /* the size does not remove cmd_len due to the way the kernel
+        driver copies buffers */
+     writebytes+=(out_size-in_size);
+@@ -243,7 +243,7 @@
+   }
+   sigprocmask (SIG_BLOCK, &(d->sigset), NULL );
+-  tret1=clock_gettime(d->private->clock,&tv1);  
++  tret1=clock_gettime(d->impl->clock,&tv1);  
+   errno=0;
+   status = write(d->cdda_fd, sg_hd, writebytes );
+@@ -289,7 +289,7 @@
+     }
+   }
+-  tret2=clock_gettime(d->private->clock,&tv2);  
++  tret2=clock_gettime(d->impl->clock,&tv2);  
+   errno=0;
+   status = read(d->cdda_fd, sg_hd, SG_OFF + out_size);
+   sigprocmask ( SIG_UNBLOCK, &(d->sigset), NULL );
+@@ -313,7 +313,7 @@
+   if(bytecheck && in_size+cmd_len<out_size){
+     long i,flag=0;
+     for(i=in_size;i<out_size;i++)
+-      if(d->private->sg_buffer[i]!=bytefill){
++      if(d->impl->sg_buffer[i]!=bytefill){
+       flag=1;
+       break;
+       }
+@@ -326,9 +326,9 @@
+   errno=0;
+   if(tret1<0 || tret2<0){
+-    d->private->last_milliseconds=-1;
++    d->impl->last_milliseconds=-1;
+   }else{
+-    d->private->last_milliseconds = (tv2.tv_sec-tv1.tv_sec)*1000 + (tv2.tv_nsec-tv1.tv_nsec)/1000000;
++    d->impl->last_milliseconds = (tv2.tv_sec-tv1.tv_sec)*1000 + (tv2.tv_nsec-tv1.tv_nsec)/1000000;
+   }
+   return(0);
+ }
+@@ -347,7 +347,7 @@
+   memset(&hdr,0,sizeof(hdr));
+   memset(sense,0,sizeof(sense));
+-  memcpy(d->private->sg_buffer,cmd+cmd_len,in_size);
++  memcpy(d->impl->sg_buffer,cmd+cmd_len,in_size);
+   hdr.cmdp = cmd;
+   hdr.cmd_len = cmd_len;
+@@ -355,7 +355,7 @@
+   hdr.mx_sb_len = SG_MAX_SENSE;
+   hdr.timeout = 50000;
+   hdr.interface_id = 'S';
+-  hdr.dxferp =  d->private->sg_buffer;
++  hdr.dxferp =  d->impl->sg_buffer;
+   hdr.flags = SG_FLAG_DIRECT_IO;  /* direct IO if we can get it */
+   /* scary buffer fill hack */
+@@ -400,7 +400,7 @@
+   if(bytecheck && in_size<out_size){
+     long i,flag=0;
+     for(i=in_size;i<out_size;i++)
+-      if(d->private->sg_buffer[i]!=bytefill){
++      if(d->impl->sg_buffer[i]!=bytefill){
+       flag=1;
+       break;
+       }
+@@ -412,7 +412,7 @@
+   }
+   /* Can't rely on .duration because we can't be certain kernel has HZ set to something useful */
+-  /* d->private->last_milliseconds = hdr.duration; */
++  /* d->impl->last_milliseconds = hdr.duration; */
+   errno = 0;
+   return 0;
+@@ -445,9 +445,9 @@
+   handle_scsi_cmd(d, cmd, 6, 0, 56, 0,0, sense);
+-  key = d->private->sg_buffer[2] & 0xf;
+-  ASC = d->private->sg_buffer[12];
+-  ASCQ = d->private->sg_buffer[13];
++  key = d->impl->sg_buffer[2] & 0xf;
++  ASC = d->impl->sg_buffer[12];
++  ASCQ = d->impl->sg_buffer[13];
+   
+   if(key == 2 && ASC == 4 && ASCQ == 1) return 0;
+   return 1;
+@@ -492,7 +492,7 @@
+   if (handle_scsi_cmd (d, cmd, 10, 0, size+4,'\377',1,sense)) return(1);
+   {
+-    unsigned char *b=d->private->sg_buffer;
++    unsigned char *b=d->impl->sg_buffer;
+     if(b[0])return(1); /* Handles only up to 256 bytes */
+     if(b[6])return(1); /* Handles only up to 256 bytes */
+@@ -604,8 +604,8 @@
+ static unsigned int get_orig_sectorsize(cdrom_drive *d){
+   if(mode_sense(d,12,0x01))return(-1);
+-  d->orgdens = d->private->sg_buffer[4];
+-  return(d->orgsize = ((int)(d->private->sg_buffer[10])<<8)+d->private->sg_buffer[11]);
++  d->orgdens = d->impl->sg_buffer[4];
++  return(d->orgsize = ((int)(d->impl->sg_buffer[10])<<8)+d->impl->sg_buffer[11]);
+ }
+ /* switch CDROM scsi drives to given sector size  */
+@@ -664,8 +664,8 @@
+     return(-4);
+   }
+-  first=d->private->sg_buffer[2];
+-  last=d->private->sg_buffer[3];
++  first=d->impl->sg_buffer[2];
++  last=d->impl->sg_buffer[3];
+   tracks=last-first+1;
+   if (last > MAXTRK || first > MAXTRK || last<0 || first<0) {
+@@ -683,7 +683,7 @@
+       return(-5);
+     }
+     {
+-      scsi_TOC *toc=(scsi_TOC *)(d->private->sg_buffer+4);
++      scsi_TOC *toc=(scsi_TOC *)(d->impl->sg_buffer+4);
+       d->disc_toc[i-first].bFlags=toc->bFlags;
+       d->disc_toc[i-first].bTrack=i;
+@@ -704,7 +704,7 @@
+     return(-2);
+   }
+   {
+-    scsi_TOC *toc=(scsi_TOC *)(d->private->sg_buffer+4);
++    scsi_TOC *toc=(scsi_TOC *)(d->impl->sg_buffer+4);
+     
+     d->disc_toc[i-first].bFlags=toc->bFlags;
+     d->disc_toc[i-first].bTrack=0xAA;
+@@ -738,7 +738,7 @@
+   }
+   /* copy to our structure and convert start sector */
+-  tracks = d->private->sg_buffer[1];
++  tracks = d->impl->sg_buffer[1];
+   if (tracks > MAXTRK) {
+     cderror(d,"003: CDROM reporting illegal number of tracks\n");
+     return(-3);
+@@ -754,33 +754,33 @@
+       return(-5);
+     }
+     
+-    d->disc_toc[i].bFlags = d->private->sg_buffer[10];
++    d->disc_toc[i].bFlags = d->impl->sg_buffer[10];
+     d->disc_toc[i].bTrack = i + 1;
+     d->disc_toc[i].dwStartSector= d->adjust_ssize * 
+-      (((signed char)(d->private->sg_buffer[2])<<24) | 
+-       (d->private->sg_buffer[3]<<16)|
+-       (d->private->sg_buffer[4]<<8)|
+-       (d->private->sg_buffer[5]));
++      (((signed char)(d->impl->sg_buffer[2])<<24) | 
++       (d->impl->sg_buffer[3]<<16)|
++       (d->impl->sg_buffer[4]<<8)|
++       (d->impl->sg_buffer[5]));
+   }
+   d->disc_toc[i].bFlags = 0;
+   d->disc_toc[i].bTrack = i + 1;
+-  memcpy (&foo, d->private->sg_buffer+2, 4);
+-  memcpy (&bar, d->private->sg_buffer+6, 4);
++  memcpy (&foo, d->impl->sg_buffer+2, 4);
++  memcpy (&bar, d->impl->sg_buffer+6, 4);
+   d->disc_toc[i].dwStartSector = d->adjust_ssize * (be32_to_cpu(foo) +
+                                                   be32_to_cpu(bar));
+   d->disc_toc[i].dwStartSector= d->adjust_ssize * 
+-    ((((signed char)(d->private->sg_buffer[2])<<24) | 
+-      (d->private->sg_buffer[3]<<16)|
+-      (d->private->sg_buffer[4]<<8)|
+-      (d->private->sg_buffer[5]))+
++    ((((signed char)(d->impl->sg_buffer[2])<<24) | 
++      (d->impl->sg_buffer[3]<<16)|
++      (d->impl->sg_buffer[4]<<8)|
++      (d->impl->sg_buffer[5]))+
+      
+-     ((((signed char)(d->private->sg_buffer[6])<<24) | 
+-       (d->private->sg_buffer[7]<<16)|
+-       (d->private->sg_buffer[8]<<8)|
+-       (d->private->sg_buffer[9]))));
++     ((((signed char)(d->impl->sg_buffer[6])<<24) | 
++       (d->impl->sg_buffer[7]<<16)|
++       (d->impl->sg_buffer[8]<<8)|
++       (d->impl->sg_buffer[9]))));
+   d->cd_extra = FixupTOC(d,tracks+1);
+@@ -817,7 +817,7 @@
+   cmd[8] = sectors;
+   if((ret=handle_scsi_cmd(d,cmd,10,0,sectors * CD_FRAMESIZE_RAW,'\177',1,sense)))
+     return(ret);
+-  if(p)memcpy(p,d->private->sg_buffer,sectors*CD_FRAMESIZE_RAW);
++  if(p)memcpy(p,d->impl->sg_buffer,sectors*CD_FRAMESIZE_RAW);
+   return(0);
+ }
+@@ -836,7 +836,7 @@
+   cmd[9] = sectors;
+   if((ret=handle_scsi_cmd(d,cmd,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1,sense)))
+     return(ret);
+-  if(p)memcpy(p,d->private->sg_buffer,sectors*CD_FRAMESIZE_RAW);
++  if(p)memcpy(p,d->impl->sg_buffer,sectors*CD_FRAMESIZE_RAW);
+   return(0);
+ }
+@@ -854,7 +854,7 @@
+   cmd[8] = sectors;
+   if((ret=handle_scsi_cmd(d,cmd,10,0,sectors * CD_FRAMESIZE_RAW,'\177',1,sense)))
+     return(ret);
+-  if(p)memcpy(p,d->private->sg_buffer,sectors*CD_FRAMESIZE_RAW);
++  if(p)memcpy(p,d->impl->sg_buffer,sectors*CD_FRAMESIZE_RAW);
+   return(0);
+ }
+@@ -872,7 +872,7 @@
+   cmd[9] = sectors;
+   if((ret=handle_scsi_cmd(d,cmd,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1,sense)))
+     return(ret);
+-  if(p)memcpy(p,d->private->sg_buffer,sectors*CD_FRAMESIZE_RAW);
++  if(p)memcpy(p,d->impl->sg_buffer,sectors*CD_FRAMESIZE_RAW);
+   return(0);
+ }
+@@ -890,7 +890,7 @@
+   cmd[8] = sectors;
+   if((ret=handle_scsi_cmd(d,cmd,10,0,sectors * CD_FRAMESIZE_RAW,'\177',1,sense)))
+     return(ret);
+-  if(p)memcpy(p,d->private->sg_buffer,sectors*CD_FRAMESIZE_RAW);
++  if(p)memcpy(p,d->impl->sg_buffer,sectors*CD_FRAMESIZE_RAW);
+   return(0);
+ }
+@@ -908,7 +908,7 @@
+   cmd[9] = sectors;
+   if((ret=handle_scsi_cmd(d,cmd,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1,sense)))
+     return(ret);
+-  if(p)memcpy(p,d->private->sg_buffer,sectors*CD_FRAMESIZE_RAW);
++  if(p)memcpy(p,d->impl->sg_buffer,sectors*CD_FRAMESIZE_RAW);
+   return(0);
+ }
+@@ -922,7 +922,7 @@
+   cmd[8] = sectors;
+   if((ret=handle_scsi_cmd(d,cmd,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1,sense)))
+     return(ret);
+-  if(p)memcpy(p,d->private->sg_buffer,sectors*CD_FRAMESIZE_RAW);
++  if(p)memcpy(p,d->impl->sg_buffer,sectors*CD_FRAMESIZE_RAW);
+   return(0);
+ }
+@@ -936,7 +936,7 @@
+   cmd[8] = sectors;
+   if((ret=handle_scsi_cmd(d,cmd,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1,sense)))
+     return(ret);
+-  if(p)memcpy(p,d->private->sg_buffer,sectors*CD_FRAMESIZE_RAW);
++  if(p)memcpy(p,d->impl->sg_buffer,sectors*CD_FRAMESIZE_RAW);
+   return(0);
+ }
+@@ -950,7 +950,7 @@
+   cmd[8] = sectors;
+   if((ret=handle_scsi_cmd(d,cmd,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1,sense)))
+     return(ret);
+-  if(p)memcpy(p,d->private->sg_buffer,sectors*CD_FRAMESIZE_RAW);
++  if(p)memcpy(p,d->impl->sg_buffer,sectors*CD_FRAMESIZE_RAW);
+   return(0);
+ }
+@@ -964,7 +964,7 @@
+   cmd[8] = sectors;
+   if((ret=handle_scsi_cmd(d,cmd,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1,sense)))
+     return(ret);
+-  if(p)memcpy(p,d->private->sg_buffer,sectors*CD_FRAMESIZE_RAW);
++  if(p)memcpy(p,d->impl->sg_buffer,sectors*CD_FRAMESIZE_RAW);
+   return(0);
+ }
+@@ -978,7 +978,7 @@
+   cmd[8] = sectors;
+   if((ret=handle_scsi_cmd(d,cmd,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1,sense)))
+     return(ret);
+-  if(p)memcpy(p,d->private->sg_buffer,sectors*CD_FRAMESIZE_RAW);
++  if(p)memcpy(p,d->impl->sg_buffer,sectors*CD_FRAMESIZE_RAW);
+   return(0);
+ }
+@@ -992,7 +992,7 @@
+   cmd[8] = sectors;
+   if((ret=handle_scsi_cmd(d,cmd,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1,sense)))
+     return(ret);
+-  if(p)memcpy(p,d->private->sg_buffer,sectors*CD_FRAMESIZE_RAW);
++  if(p)memcpy(p,d->impl->sg_buffer,sectors*CD_FRAMESIZE_RAW);
+   return(0);
+ }
+@@ -1026,7 +1026,7 @@
+   if((ret=handle_scsi_cmd(d,cmd,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1,sense)))
+     return(ret);
+-  if(p)memcpy(p,d->private->sg_buffer,sectors*CD_FRAMESIZE_RAW);
++  if(p)memcpy(p,d->impl->sg_buffer,sectors*CD_FRAMESIZE_RAW);
+   return(0);
+ }
+@@ -1039,7 +1039,7 @@
+   if((ret=handle_scsi_cmd(d,cmd,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1,sense)))
+     return(ret);
+-  if(p)memcpy(p,d->private->sg_buffer,sectors*CD_FRAMESIZE_RAW);
++  if(p)memcpy(p,d->impl->sg_buffer,sectors*CD_FRAMESIZE_RAW);
+   return(0);
+ }
+@@ -1052,7 +1052,7 @@
+   
+   if((ret=handle_scsi_cmd(d,cmd,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1,sense)))
+     return(ret);
+-  if(p)memcpy(p,d->private->sg_buffer,sectors*CD_FRAMESIZE_RAW);
++  if(p)memcpy(p,d->impl->sg_buffer,sectors*CD_FRAMESIZE_RAW);
+   return(0);
+ }
+@@ -1275,7 +1275,7 @@
+ static int count_2352_bytes(cdrom_drive *d){
+   long i;
+   for(i=2351;i>=0;i--)
+-    if(d->private->sg_buffer[i]!=(unsigned char)'\177')
++    if(d->impl->sg_buffer[i]!=(unsigned char)'\177')
+       return(((i+3)>>2)<<2);
+   return(0);
+@@ -1284,7 +1284,7 @@
+ static int verify_nonzero(cdrom_drive *d){
+   long i,flag=0;
+   for(i=0;i<2352;i++)
+-    if(d->private->sg_buffer[i]!=0){
++    if(d->impl->sg_buffer[i]!=0){
+       flag=1;
+       break;
+     }
+@@ -1625,7 +1625,7 @@
+   d->is_mmc=0;
+   if(mode_sense(d,22,0x2A)==0){
+   
+-    b=d->private->sg_buffer;
++    b=d->impl->sg_buffer;
+     b+=b[3]+4;
+     
+     if((b[0]&0x3F)==0x2A){
+@@ -1673,7 +1673,7 @@
+     cderror(d,"008: Unable to identify CDROM model\n");
+     return(NULL);
+   }
+-  return (d->private->sg_buffer);
++  return (d->impl->sg_buffer);
+ }
+ int scsi_init_drive(cdrom_drive *d){
+@@ -1742,8 +1742,8 @@
+   check_cache(d);
+   d->error_retry=1;
+-  d->private->sg_hd=realloc(d->private->sg_hd,d->nsectors*CD_FRAMESIZE_RAW + SG_OFF + 128);
+-  d->private->sg_buffer=((unsigned char *)d->private->sg_hd)+SG_OFF;
++  d->impl->sg_hd=realloc(d->impl->sg_hd,d->nsectors*CD_FRAMESIZE_RAW + SG_OFF + 128);
++  d->impl->sg_buffer=((unsigned char *)d->impl->sg_hd)+SG_OFF;
+   d->report_all=1;
+   return(0);
+ }
diff --git a/meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/configure.in.patch b/meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/configure.in.patch
new file mode 100644 (file)
index 0000000..2ca2516
--- /dev/null
@@ -0,0 +1,13 @@
+--- cdparanoia-III-10.2.old/configure.in       2009-12-02 22:44:37.000000000 +0100
++++ cdparanoia-III-10.2/configure.in   2009-12-02 22:45:04.000000000 +0100
+@@ -5,9 +5,7 @@
+ AC_CANONICAL_HOST
+-if test -z "$CC"; then
+-      AC_PROG_CC      
+-fi
++AC_PROG_CC    
+ AC_PROG_RANLIB
+ AC_CHECK_PROG(AR,ar,ar)
+ AC_CHECK_PROG(INSTALL,install,install)
diff --git a/meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/fixes10.patch b/meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/fixes10.patch
new file mode 100644 (file)
index 0000000..414ff39
--- /dev/null
@@ -0,0 +1,25 @@
+--- cdparanoia-III-alpha9.8/configure.in       2000-03-26 00:33:22.000000000 -0700
++++ cdparanoia-III-alpha9.8.new/configure.in   2004-12-23 16:34:04.072846728 -0700
+@@ -1,7 +1,7 @@
+ AC_INIT(interface/interface.c)
+-cp $srcdir/configure.guess $srcdir/config.guess
+-cp $srcdir/configure.sub $srcdir/config.sub
++#cp $srcdir/configure.guess $srcdir/config.guess
++#cp $srcdir/configure.sub $srcdir/config.sub
+ AC_CANONICAL_HOST
+--- cdparanoia-III-alpha9.8/interface/scan_devices.c   2001-03-25 22:44:01.000000000 -0700
++++ cdparanoia-III-alpha9.8.new/interface/scan_devices.c       2004-12-23 16:38:47.128815680 -0700
+@@ -19,6 +19,10 @@
+ #include "common_interface.h"
+ #include "utils.h"
++#ifndef PATH_MAX
++#define PATH_MAX 4096
++#endif
++
+ #define MAX_DEV_LEN 20 /* Safe because strings only come from below */
+ /* must be absolute paths! */
+ static char *scsi_cdrom_prefixes[]={
diff --git a/meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/interface_Makefile.in.patch b/meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/interface_Makefile.in.patch
new file mode 100644 (file)
index 0000000..4dbd2bb
--- /dev/null
@@ -0,0 +1,11 @@
+--- cdparanoia-III-10.2/interface/Makefile.in.orig     2009-01-27 23:52:42.000000000 +0100
++++ cdparanoia-III-10.2/interface/Makefile.in  2009-01-27 23:53:27.000000000 +0100
+@@ -46,7 +46,7 @@
+       $(RANLIB) libcdda_interface.a
+ libcdda_interface.so:         $(OFILES)       
+-      $(CC) -fpic -shared -o libcdda_interface.so.0.$(VERSION) -Wl,-soname -Wl,libcdda_interface.so.0 $(OFILES) $(LIBS)
++      $(CC) -fpic -shared -o libcdda_interface.so.0.$(VERSION) $(LDFLAGS) -Wl,-soname -Wl,libcdda_interface.so.0 $(OFILES) $(LIBS)
+       [ -e libcdda_interface.so.0 ] || ln -s libcdda_interface.so.0.$(VERSION) libcdda_interface.so.0
+       [ -e libcdda_interface.so ] || ln -s libcdda_interface.so.0.$(VERSION) libcdda_interface.so
diff --git a/meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/paranoia_Makefile.in.patch b/meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/paranoia_Makefile.in.patch
new file mode 100644 (file)
index 0000000..962a43a
--- /dev/null
@@ -0,0 +1,11 @@
+--- cdparanoia-III-10.2/paranoia/Makefile.in.orig      2009-01-27 23:54:45.000000000 +0100
++++ cdparanoia-III-10.2/paranoia/Makefile.in   2009-01-27 23:55:05.000000000 +0100
+@@ -44,7 +44,7 @@
+       $(RANLIB) libcdda_paranoia.a
+ libcdda_paranoia.so:  $(OFILES)       
+-      $(CC) -fpic -shared -o libcdda_paranoia.so.0.$(VERSION) -Wl,-soname -Wl,libcdda_paranoia.so.0 $(OFILES) -L ../interface -lcdda_interface
++      $(CC) -fpic -shared -o libcdda_paranoia.so.0.$(VERSION) $(LDFLAGS) -Wl,-soname -Wl,libcdda_paranoia.so.0 $(OFILES) -L ../interface -lcdda_interface
+       [ -e libcdda_paranoia.so.0 ] || ln -s libcdda_paranoia.so.0.$(VERSION) libcdda_paranoia.so.0
+       [ -e libcdda_paranoia.so ] || ln -s libcdda_paranoia.so.0.$(VERSION) libcdda_paranoia.so
diff --git a/meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia_svn.bb b/meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia_svn.bb
new file mode 100644 (file)
index 0000000..b88c74b
--- /dev/null
@@ -0,0 +1,43 @@
+# Copyright (C) 2005, Advanced Micro Devices, Inc.  All Rights Reserved
+SUMMARY = "audio extraction tool for sampling CDs"
+HOMEPAGE = "http://xiph.org/paranoia/"
+LICENSE = "GPLv2"
+LIC_FILES_CHKSUM = "file://COPYING-GPL;md5=1ed9d357695b2e3ef099df37fed63d96 \
+                    file://COPYING-LGPL;md5=d370feaa1c9edcdbd29ca27ea3d2304d"
+SECTION = "multimedia"
+SRCREV = "17289"
+PV = "10.2+svnr${SRCPV}"
+PR = "r1"
+
+SRC_URI = "svn://svn.xiph.org/trunk;module=cdparanoia;proto=http \
+        file://fixes10.patch \
+        file://Makefile.in.patch \
+        file://interface_Makefile.in.patch \
+        file://paranoia_Makefile.in.patch \
+        file://configure.in.patch"
+
+S = "${WORKDIR}/cdparanoia"
+
+PARALLEL_MAKE = ""
+
+inherit autotools pkgconfig
+
+PACKAGES += "libcdparanoia libcdparanoia-dev libcdparanoia-static"
+
+LICENSE_libcdparanoia = "LGPLv2.1"
+LICENSE_libcdparanoia-dev = "LGPLv2.1"
+LICENSE_libcdparanoia-static = "LGPLv2.1"
+
+FILES_${PN} = "${bindir}/*"
+FILES_${PN}-dev = ""
+FILES_${PN}-static = ""
+FILES_libcdparanoia = "${libdir}/lib*${SOLIBS}"
+FILES_libcdparanoia-dev = "${includedir} ${libdir}/lib*${SOLIBSDEV} ${libdir}/pkgconfig"
+FILES_libcdparanoia-static = "${libdir}/*.a"
+
+do_install() {
+       oe_runmake BINDIR="${D}${bindir}" MANDIR="${D}${datadir}/man/" \
+                  INCLUDEDIR="${D}${includedir}" LIBDIR="${D}${libdir}" \
+                  PKGCONFIGDIR="${D}${libdir}/pkgconfig" \
+                  install
+}
diff --git a/meta-openvuplus/recipes-enigma2/dreambox-dvbincludes/dreambox-dvbincludes.bb b/meta-openvuplus/recipes-enigma2/dreambox-dvbincludes/dreambox-dvbincludes.bb
new file mode 100644 (file)
index 0000000..7f5188a
--- /dev/null
@@ -0,0 +1,34 @@
+SUMMARY = "This package provides dbox2/dreambox \
+compatible header files for the API to the drivers."
+
+MAINTAINER = "Felix Domke <tmbinc@elitedvb.net>"
+
+PV="1"
+LICENSE = "GPLv2+"
+LIC_FILES_CHKSUM = "file://dbox/avs_core.h;beginline=1;endline=21;md5=b2ab401756a0768647ae13acb2e325ab"
+
+SRC_URI = "http://sources.dreamboxupdate.com/snapshots/include2.tar.gz"
+SRC_URI[md5sum] = "9d236095a88d7ce9f3bf0503ee5237d6"
+SRC_URI[sha256sum] = "739bc35bccdb1e4c6e14b77ab86808354eb6fd75434d3bd6236f3b3346805e02"
+
+S = "${WORKDIR}/include"
+
+ALLOW_EMPTY_dreambox-dvbincludes = "1"
+
+INPUT_FILES = "input_fake.h ci/ci.h  dbox/avia_gt_pig.h dbox/avs_core.h \
+       dbox/event.h dbox/fp.h dbox/info.h dbox/lcd.h dbox/saa7126_core.h \
+       dbox/lcd-ks0713.h dbox/fb.h \
+       dreambox/dreaminfo.h \
+       tuxbox/hardware_dbox2.h tuxbox/hardware_dreambox.h tuxbox/hardware_pci.h \
+       tuxbox/info.h tuxbox/info_dbox2.h tuxbox/kernel.h"
+
+do_install() {
+       install -d ${STAGING_INCDIR}/ci
+       install -d ${STAGING_INCDIR}/dbox
+       install -d ${STAGING_INCDIR}/dreambox
+       install -d ${STAGING_INCDIR}/tuxbox
+       for f in ${INPUT_FILES}; do
+               install -m 0644 ${S}/$f ${STAGING_INCDIR}/$f
+       done;
+}
+
diff --git a/meta-openvuplus/recipes-enigma2/dreambox-dvbincludes/dreambox-dvbincludes_1.1.bb b/meta-openvuplus/recipes-enigma2/dreambox-dvbincludes/dreambox-dvbincludes_1.1.bb
new file mode 100644 (file)
index 0000000..bb2a4a2
--- /dev/null
@@ -0,0 +1,26 @@
+SUMMARY = "dbox2/dreambox compatible header files"
+LICENSE = "GPLv2+"
+LIC_FILES_CHKSUM = "file://dbox/avs_core.h;beginline=1;endline=21;md5=b2ab401756a0768647ae13acb2e325ab"
+PR = "r1"
+
+SRC_URI = "http://sources.dreamboxupdate.com/snapshots/include2.tar.gz"
+SRC_URI[md5sum] = "9d236095a88d7ce9f3bf0503ee5237d6"
+SRC_URI[sha256sum] = "739bc35bccdb1e4c6e14b77ab86808354eb6fd75434d3bd6236f3b3346805e02"
+
+S = "${WORKDIR}/include"
+
+# avs_core.h and saa7126_core.h are obsolete, but
+# libtuxtxt currently doesn't compile without them.
+INPUT_FILES = " \
+       dbox/fp.h \
+       dbox/lcd-ks0713.h \
+       dbox/avs_core.h \
+       dbox/saa7126_core.h \
+"
+
+do_install() {
+       install -d ${D}${includedir}/dbox
+       for f in ${INPUT_FILES}; do
+               install -m 0644 $f ${D}${includedir}/$f
+       done
+}
diff --git a/meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/01peerdns b/meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/01peerdns
new file mode 100644 (file)
index 0000000..5ee1ebd
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/sh
+mv /etc/resolv.conf /etc/resolv.conf-back
+ln -s /var/run/ppp/resolv.conf /etc/resolv.conf
diff --git a/meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/01peerdns-remove b/meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/01peerdns-remove
new file mode 100644 (file)
index 0000000..f0ea5a5
--- /dev/null
@@ -0,0 +1,5 @@
+#!/bin/sh
+if [ -f /etc/resolv.conf-back ];  then
+               rm /etc/resolv.conf
+               mv /etc/resolv.conf-back /etc/resolv.conf
+fi
diff --git a/meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/dial.modem b/meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/dial.modem
new file mode 100644 (file)
index 0000000..c099b6e
--- /dev/null
@@ -0,0 +1,20 @@
+#!/bin/sh
+#
+# This script is used to dial a modem using a specific
+# number.
+#
+
+if [ $# -lt 1 ]
+then
+  echo "$0: no phone number given." >&2
+  exit -1
+fi
+
+PHONENUM=$1
+
+chat -v \
+ABORT "N" \
+ABORT "n"  \
+'' 'ATZ' \
+'O' "ATDT${PHONENUM}" \
+'c' 
diff --git a/meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/disconnect.modem b/meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/disconnect.modem
new file mode 100644 (file)
index 0000000..ef0cc50
--- /dev/null
@@ -0,0 +1,10 @@
+#!/bin/sh
+#
+#
+# This script is used to disconnect the modem.
+#
+# It assumes the modem will respond back to a
+# command state by the "+++" sequence.
+#
+
+chat "" "\d\d+\p+\p+\c" '' "\d\dATH0"
diff --git a/meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/dm800/options b/meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/dm800/options
new file mode 100644 (file)
index 0000000..25b3144
--- /dev/null
@@ -0,0 +1,18 @@
+/dev/ttyS1 2400
+
+nocrtscts
+nocdtrcts
+local
+
+lock
+defaultroute
+usepeerdns
+asyncmap 0
+mtu 552
+mru 552
+user arcor
+
+#hangup script
+disconnect /etc/ppp/disconnect.modem
+#dial script
+connect "/etc/ppp/dial.modem 01920793"
diff --git a/meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/options b/meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/options
new file mode 100644 (file)
index 0000000..746ee81
--- /dev/null
@@ -0,0 +1,18 @@
+/dev/ttyS1 2400
+
+crtscts
+nocdtrcts
+local
+
+lock
+defaultroute
+usepeerdns
+asyncmap 0
+mtu 552
+mru 552
+user arcor
+
+#hangup script
+disconnect /etc/ppp/disconnect.modem
+#dial script
+connect "/etc/ppp/dial.modem 01920793"
diff --git a/meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/pap-secrets b/meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/pap-secrets
new file mode 100644 (file)
index 0000000..7825deb
--- /dev/null
@@ -0,0 +1,3 @@
+# Secrets for authentication using PAP
+# client       server  secret                  IP addresses
+arcor * internet
diff --git a/meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts_0.1.bb b/meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts_0.1.bb
new file mode 100644 (file)
index 0000000..859ab5c
--- /dev/null
@@ -0,0 +1,25 @@
+SUMMARY = "ppp scripts for dreambox builtin modem"
+SECTION = "base"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://${OPENDREAMBOX_BASE}/LICENSE;md5=0a5ec7423edaca24547634f416478834"
+PR = "r2"
+
+S = "${WORKDIR}"
+
+SRC_URI = "file://options file://pap-secrets file://dial.modem \
+       file://disconnect.modem file://01peerdns file://01peerdns-remove"
+
+do_install() {
+       install -d ${D}/etc/ppp
+       for i in dial.modem disconnect.modem; do
+               install -m 0755 ${S}/$i ${D}/etc/ppp/
+       done
+       for i in options pap-secrets; do
+               install -m 0644 ${S}/$i ${D}/etc/ppp/
+       done
+       install -d ${D}/etc/ppp/ip-up.d
+       install -m 0755 ${S}/01peerdns ${D}/etc/ppp/ip-up.d
+       install -d ${D}/etc/ppp/ip-down.d
+       install -m 0755 ${S}/01peerdns-remove ${D}/etc/ppp/ip-down.d
+}
+
diff --git a/meta-openvuplus/recipes-enigma2/dvbtools/dvb-apps-1.1.1/update-to-tip.diff b/meta-openvuplus/recipes-enigma2/dvbtools/dvb-apps-1.1.1/update-to-tip.diff
new file mode 100644 (file)
index 0000000..b91a750
--- /dev/null
@@ -0,0 +1,37589 @@
+Update to:
+
+changeset 1406:c87abbb20491 tip
+
+update scan file for fr-Reims
+submitted by sylvestre.cartier gmail.com
+author Christoph Pfister <pfister@linuxtv.org>
+date   Sun Nov 28 21:24:42 2010 +0100 (3 weeks ago)
+parents        ce1c094b9636
+
+Make.rules                                 |    2 
+ README                                     |    7 
+ a/util/scan/dvb-t/be-Brussels              |    5 
+ a/util/scan/dvb-t/be-Libramont             |   10 
+ a/util/scan/dvb-t/be-Schoten               |    3 
+ a/util/scan/dvb-t/be-St_Pieters_Leeuw      |    3 
+ a/util/scan/dvb-t/be-Tournai               |    3 
+ a/util/scan/dvb-t/cz-Brno                  |   10 
+ a/util/scan/dvb-t/cz-Domazlice             |    3 
+ a/util/scan/dvb-t/cz-Klet                  |    4 
+ a/util/scan/dvb-t/cz-Ostrava               |    3 
+ a/util/scan/dvb-t/cz-Plzen                 |    8 
+ a/util/scan/dvb-t/cz-Praha                 |    7 
+ a/util/scan/dvb-t/fr-Lille                 |   30 
+ a/util/scan/dvb-t/fr-LilleT2               |   13 
+ a/util/scan/dvb-t/hr-Zagreb                |    3 
+ b/util/alevt/COPYRIGHT                     |  297 +
+ b/util/alevt/ChangeLog                     |  535 ++
+ b/util/alevt/EXPORT.HOWTO                  |   84 
+ b/util/alevt/Makefile                      |  130 
+ b/util/alevt/README                        |   72 
+ b/util/alevt/README.OLD                    |   78 
+ b/util/alevt/ReadmeGR                      |   28 
+ b/util/alevt/TODO                          |   12 
+ b/util/alevt/alevt-cap.1                   |   53 
+ b/util/alevt/alevt-cap.c                   |  280 +
+ b/util/alevt/alevt-date.1                  |   41 
+ b/util/alevt/alevt-date.c                  |  225 +
+ b/util/alevt/alevt.1                       |   60 
+ b/util/alevt/alevt.desktop                 |    9 
+ b/util/alevt/bdf2xbm.c                     |  212 +
+ b/util/alevt/cache.c                       |  229 +
+ b/util/alevt/cache.h                       |   41 
+ b/util/alevt/dllist.h                      |   55 
+ b/util/alevt/exp-gfx.c                     |  258 +
+ b/util/alevt/exp-html.c                    |  299 +
+ b/util/alevt/exp-txt.c                     |  226 +
+ b/util/alevt/export.c                      |  364 +
+ b/util/alevt/export.h                      |   66 
+ b/util/alevt/fdset.c                       |   97 
+ b/util/alevt/fdset.h                       |   28 
+ b/util/alevt/font.c                        |    5 
+ b/util/alevt/font.h                        |   19 
+ b/util/alevt/hamm.c                        |  229 +
+ b/util/alevt/hamm.h                        |    7 
+ b/util/alevt/help.c                        |   83 
+ b/util/alevt/help.h                        |    8 
+ b/util/alevt/icon.xbm                      |   17 
+ b/util/alevt/lang.c                        |  393 +
+ b/util/alevt/lang.h                        |   28 
+ b/util/alevt/main.c                        |  221 +
+ b/util/alevt/misc.c                        |   66 
+ b/util/alevt/misc.h                        |   32 
+ b/util/alevt/os.h                          |    7 
+ b/util/alevt/search.c                      |  127 
+ b/util/alevt/search.h                      |   16 
+ b/util/alevt/ui.c                          |  721 +++
+ b/util/alevt/ui.h                          |   35 
+ b/util/alevt/vbi.c                         |  942 ++++
+ b/util/alevt/vbi.h                         |   47 
+ b/util/alevt/vt.h                          |   62 
+ b/util/alevt/vt900.out                     |   29 
+ b/util/alevt/vt901.out                     |   29 
+ b/util/alevt/vt902.out                     |   29 
+ b/util/alevt/vt903.out                     |   29 
+ b/util/alevt/vt904.out                     |   29 
+ b/util/alevt/vt905.out                     |   29 
+ b/util/alevt/vt906.out                     |   29 
+ b/util/alevt/vt907.out                     |   29 
+ b/util/alevt/vt908.out                     |   29 
+ b/util/alevt/vt909.out                     |   29 
+ b/util/alevt/vt910.out                     |   29 
+ b/util/alevt/vt911.out                     |   29 
+ b/util/alevt/vt912.out                     |   29 
+ b/util/alevt/vt913.out                     |   29 
+ b/util/alevt/vt914.out                     |   29 
+ b/util/alevt/vt915.out                     |   29 
+ b/util/alevt/vtxt-iso8859-7.bdf            | 5768 ++++++++++++++++++++++++++++
+ b/util/alevt/vtxt-koi8.bdf                 | 5906 +++++++++++++++++++++++++++++
+ b/util/alevt/vtxt-latin-1.bdf              | 5906 +++++++++++++++++++++++++++++
+ b/util/alevt/vtxt-latin-2.bdf              | 5906 +++++++++++++++++++++++++++++
+ b/util/alevt/xio.c                         | 1156 +++++
+ b/util/alevt/xio.h                         |   80 
+ b/util/gotox/Makefile                      |   17 
+ b/util/gotox/gotox.c                       |  145 
+ b/util/scan/dvb-c/at-Kabel-Braunau         |   26 
+ b/util/scan/dvb-c/at-Kabelsignal           |   38 
+ b/util/scan/dvb-c/de-komro-Rosenheim       |   30 
+ b/util/scan/dvb-c/fi-Oulu                  |   19 
+ b/util/scan/dvb-c/hu-Digikabel             |   21 
+ b/util/scan/dvb-c/nl-REKAM-CAIW_Gouda      |    4 
+ b/util/scan/dvb-s/Agila2_C-146.0E          |   60 
+ b/util/scan/dvb-s/Apstar6_C-134.0E         |   15 
+ b/util/scan/dvb-s/AsiaSat2_C-100.5E        |   51 
+ b/util/scan/dvb-s/Asiasat4_C-122.2E        |   27 
+ b/util/scan/dvb-s/Astra-23.5E              |   66 
+ b/util/scan/dvb-s/Atlantic-Bird-3-5.0W     |    4 
+ b/util/scan/dvb-s/Chinastar1_C-87.5E       |   15 
+ b/util/scan/dvb-s/Insat2E_C-83.0E          |   93 
+ b/util/scan/dvb-s/Insat3A_C-93.5E          |   66 
+ b/util/scan/dvb-s/Insat4A_C-83.0E          |   93 
+ b/util/scan/dvb-s/Insat4B_C-93.5E          |   51 
+ b/util/scan/dvb-s/Intelsat8_C-166.0E       |   39 
+ b/util/scan/dvb-s/JCSat3A_C-128.0E         |   18 
+ b/util/scan/dvb-s/Measat3_C-91.5E          |   54 
+ b/util/scan/dvb-s/PalapaC2_C-113.0E        |   39 
+ b/util/scan/dvb-s/ST1_C-80.0E              |   27 
+ b/util/scan/dvb-s/Telkom1_C-108.0E         |   48 
+ b/util/scan/dvb-s/Telstar10_C-76.5E        |   63 
+ b/util/scan/dvb-s/Telstar18_C-138.0E       |   18 
+ b/util/scan/dvb-s/Thaicom1A_C-120.0E       |   24 
+ b/util/scan/dvb-s/Thaicom2_C-78.5E         |   33 
+ b/util/scan/dvb-s/Thaicom5_C-78.5E         |   69 
+ b/util/scan/dvb-s/Vinasat1_C-132.0E        |   12 
+ b/util/scan/dvb-t/au-AdelaideFoothills     |   12 
+ b/util/scan/dvb-t/au-Ballarat              |   12 
+ b/util/scan/dvb-t/au-Bendigo               |   41 
+ b/util/scan/dvb-t/au-Devonport             |   19 
+ b/util/scan/dvb-t/au-FraserCoast-Bundaberg |   12 
+ b/util/scan/dvb-t/au-Goulburn-Rocky_Hill   |   19 
+ b/util/scan/dvb-t/au-Hervey_Bay-Ghost_Hill |   16 
+ b/util/scan/dvb-t/au-Sutherland            |   20 
+ b/util/scan/dvb-t/be-All                   |    8 
+ b/util/scan/dvb-t/ch-Geneva                |   16 
+ b/util/scan/dvb-t/cz-All                   |   41 
+ b/util/scan/dvb-t/es-BaixoMinho            |   16 
+ b/util/scan/dvb-t/es-Granada               |    8 
+ b/util/scan/dvb-t/es-Pamplona              |    9 
+ b/util/scan/dvb-t/es-SC_Tenerife           |   18 
+ b/util/scan/dvb-t/es-Vitoria-Gasteiz       |    8 
+ b/util/scan/dvb-t/fi-Smedsbole             |   13 
+ b/util/scan/dvb-t/fr-Lille-Bouvigny        |   26 
+ b/util/scan/dvb-t/fr-Rochefort-sur-mer     |   14 
+ b/util/scan/dvb-t/hr-All                   |   30 
+ b/util/scan/dvb-t/hu-Budapest              |    8 
+ b/util/scan/dvb-t/hu-Debrecen              |    8 
+ b/util/scan/dvb-t/hu-Gyor                  |    8 
+ b/util/scan/dvb-t/hu-Kabhegy               |    8 
+ b/util/scan/dvb-t/hu-Kekes                 |    8 
+ b/util/scan/dvb-t/hu-Kiskoros              |    8 
+ b/util/scan/dvb-t/hu-Nagykanizsa-Ujudvar   |    8 
+ b/util/scan/dvb-t/hu-Pecs                  |    8 
+ b/util/scan/dvb-t/hu-Szeged                |    8 
+ b/util/scan/dvb-t/hu-Szentes               |    8 
+ b/util/scan/dvb-t/hu-Tokaj                 |    8 
+ b/util/scan/dvb-t/hu-Uzd                   |    8 
+ b/util/scan/dvb-t/hu-Vasvar-Hegyhatsal     |    8 
+ b/util/scan/dvb-t/il-All                   |    5 
+ b/util/scan/dvb-t/ir-Tehran                |    4 
+ b/util/scan/dvb-t/it-Montevergine          |   18 
+ b/util/scan/dvb-t/lt-All                   |   39 
+ b/util/scan/dvb-t/ro-Bucharest             |    5 
+ b/util/scan/dvb-t/si-Ljubljana             |    5 
+ b/util/scan/dvb-t/sk-Bardejov              |   11 
+ b/util/scan/dvb-t/sk-Michalovce            |   11 
+ b/util/scan/dvb-t/sk-Namestovo             |   11 
+ b/util/scan/dvb-t/sk-Poprad                |   11 
+ b/util/scan/dvb-t/sk-RimavskaSobota        |   11 
+ b/util/scan/dvb-t/sk-Trencin               |   12 
+ b/util/scan/dvb-t/sk-VelkyKrtis            |   11 
+ b/util/scan/dvb-t/sk-Zilina                |   11 
+ b/util/scan/dvb-t/vn-Thaibinh              |    5 
+ b/util/szap/util.c                         |  126 
+ b/util/szap/util.h                         |   24 
+ lib/libdvben50221/en50221_stdcam_llci.c    |   19 
+ lib/libdvbsec/dvbsec_api.c                 |   17 
+ test/Makefile                              |    1 
+ test/README                                |    2 
+ test/test_video.c                          |   53 
+ util/Makefile                              |    1 
+ util/femon/femon.c                         |   57 
+ util/scan/dvb-c/at-KarrerNet               |   18 
+ util/scan/dvb-c/de-Primacom                |    5 
+ util/scan/dvb-c/de-Unitymedia              |   17 
+ util/scan/dvb-c/fi-Turku                   |    8 
+ util/scan/dvb-c/se-comhem                  |   22 
+ util/scan/dvb-s/AsiaSat3S_C-105.5E         |  164 
+ util/scan/dvb-t/au-Adelaide                |    2 
+ util/scan/dvb-t/au-Brisbane                |    2 
+ util/scan/dvb-t/au-SunshineCoast           |    2 
+ util/scan/dvb-t/ch-All                     |    1 
+ util/scan/dvb-t/de-Baden-Wuerttemberg      |   23 
+ util/scan/dvb-t/de-Bayern                  |   56 
+ util/scan/dvb-t/de-Berlin                  |   13 
+ util/scan/dvb-t/de-Brandenburg             |    4 
+ util/scan/dvb-t/de-Bremen                  |    8 
+ util/scan/dvb-t/de-Hamburg                 |   20 
+ util/scan/dvb-t/de-Hessen                  |   26 
+ util/scan/dvb-t/de-Mecklenburg-Vorpommern  |   10 
+ util/scan/dvb-t/de-Niedersachsen           |   33 
+ util/scan/dvb-t/de-Nordrhein-Westfalen     |   16 
+ util/scan/dvb-t/de-Rheinland-Pfalz         |   10 
+ util/scan/dvb-t/de-Saarland                |    6 
+ util/scan/dvb-t/de-Sachsen                 |   14 
+ util/scan/dvb-t/de-Sachsen-Anhalt          |    8 
+ util/scan/dvb-t/de-Schleswig-Holstein      |   26 
+ util/scan/dvb-t/de-Thueringen              |    8 
+ util/scan/dvb-t/dk-All                     |   16 
+ util/scan/dvb-t/es-Albacete                |   20 
+ util/scan/dvb-t/es-Alfabia                 |    3 
+ util/scan/dvb-t/es-Collserola              |   16 
+ util/scan/dvb-t/es-Las_Palmas              |   22 
+ util/scan/dvb-t/es-Sevilla                 |   17 
+ util/scan/dvb-t/fr-Boulogne                |   17 
+ util/scan/dvb-t/fr-Brest                   |   10 
+ util/scan/dvb-t/fr-Chambery                |   42 
+ util/scan/dvb-t/fr-Laval                   |   12 
+ util/scan/dvb-t/fr-Montbeliard             |   28 
+ util/scan/dvb-t/fr-Nantes                  |   13 
+ util/scan/dvb-t/fr-Poitiers                |   12 
+ util/scan/dvb-t/fr-Reims                   |   18 
+ util/scan/dvb-t/fr-Tours                   |   32 
+ util/scan/dvb-t/gr-Athens                  |    2 
+ util/scan/dvb-t/is-Reykjavik               |   42 
+ util/scan/dvb-t/it-Milano                  |   38 
+ util/scan/dvb-t/se-Horby_Sallerup          |    2 
+ util/scan/dvb-t/se-Ornskoldsvik_As         |    1 
+ util/scan/dvb-t/se-Skelleftea              |    1 
+ util/scan/dvb-t/sk-BanskaBystrica          |    9 
+ util/scan/dvb-t/sk-Bratislava              |    9 
+ util/scan/dvb-t/sk-Kosice                  |    9 
+ util/scan/dvb-t/uk-Aberdare                |   17 
+ util/scan/dvb-t/uk-Redruth                 |   13 
+ util/scan/dvb-t/uk-StocklandHill           |   15 
+ util/scan/dvb-t/uk-Storeton                |   15 
+ util/scan/dvb-t/uk-WinterHill              |   18 
+ util/scan/scan.c                           |   11 
+ util/szap/Makefile                         |    2 
+ util/szap/azap.c                           |   27 
+ util/szap/czap.c                           |   91 
+ util/szap/szap.c                           |   97 
+ util/szap/tzap.c                           |   73 
+ 232 files changed, 34875 insertions(+), 778 deletions(-)
+diff -r af23d23c278b Make.rules
+--- a/Make.rules       Sat Jun 20 16:47:55 2009 +0200
++++ b/Make.rules       Tue Dec 21 12:13:28 2010 +0100
+@@ -35,7 +35,7 @@
+ sharedir   ?= $(prefix)/share
+ ifneq ($(DESTDIR),)
+-DESTDIR = $(DESTDIR)/
++DESTDIR := $(DESTDIR)/
+ endif
+ ifeq ($(V),1)
+diff -r af23d23c278b README
+--- a/README   Sat Jun 20 16:47:55 2009 +0200
++++ b/README   Tue Dec 21 12:13:28 2010 +0100
+@@ -15,6 +15,8 @@
+ util/dvbtraffic       - Monitor traffic on a digital device.
+ util/femon    - Monitor the tuning on a digital TV device.
+ util/zap      - *Just* tunes a digital device - really intended for developers.
++util/gotox    - Simple Rotor control utility
++util/alevt    - Teletext capture and display utility
+ Hardware Specific Utilities:
+ util/av7110_loadkeys  - Load remote keys into an av7110 based card
+@@ -36,5 +38,10 @@
+ files as they are contained in the linuxtv-dvb-1.? release
+ and the 2.6.x Linux kernel.
++AleVT is not compiled by the main Makefile, because it depends on external
++libraries which might not be available in your system (see util/alevt/README for
++details). If you have the required libraries, to compile AleVT go to util/alevt/
++and type "make".
++
+ Johannes Stezenbach <js@convergence.de>
+ Andrew de Quincey <adq_dvb@lidskialf.net>
+diff -r af23d23c278b lib/libdvben50221/en50221_stdcam_llci.c
+--- a/lib/libdvben50221/en50221_stdcam_llci.c  Sat Jun 20 16:47:55 2009 +0200
++++ b/lib/libdvben50221/en50221_stdcam_llci.c  Tue Dec 21 12:13:28 2010 +0100
+@@ -374,14 +374,21 @@
+               } else if (resource_id == EN50221_APP_MMI_RESOURCEID) {
+                       llci->stdcam.mmi_session_number = session_number;
+               }
++              break;
++      case S_SCALLBACK_REASON_CLOSE:
++              if (resource_id == EN50221_APP_MMI_RESOURCEID) {
++                      llci->stdcam.mmi_session_number = -1;
++              } else if (resource_id == EN50221_APP_DATETIME_RESOURCEID) {
++                      llci->datetime_session_number = -1;
++              } else if (resource_id == EN50221_APP_AI_RESOURCEID) {
++                      llci->stdcam.ai_session_number = -1;
++              } else if (resource_id == EN50221_APP_CA_RESOURCEID) {
++                      llci->stdcam.ca_session_number = -1;
++              } else if (resource_id == EN50221_APP_MMI_RESOURCEID) {
++                      llci->stdcam.mmi_session_number = -1;
++              }
+               break;
+-    case S_SCALLBACK_REASON_CLOSE:
+-        if (resource_id == EN50221_APP_MMI_RESOURCEID) {
+-            llci->stdcam.mmi_session_number = -1;
+-        }
+-
+-        break;
+       }
+       return 0;
+ }
+diff -r af23d23c278b lib/libdvbsec/dvbsec_api.c
+--- a/lib/libdvbsec/dvbsec_api.c       Sat Jun 20 16:47:55 2009 +0200
++++ b/lib/libdvbsec/dvbsec_api.c       Tue Dec 21 12:13:28 2010 +0100
+@@ -537,19 +537,12 @@
+       }
+       // generate the command
+-      if (integer < -256) {
+-              return -EINVAL;
+-      } else if (integer < 0) {
+-              integer = -integer;
+-              data[3] = 0xf0;
+-      } else if (integer < 256) {
+-              data[3] = 0x00;
+-      } else if (integer < 512) {
+-              integer -= 256;
+-              data[3] = 0x10;
+-      } else {
+-              return -EINVAL;
++      if (integer < 0.0) {
++              data[3] = 0xD0;  // West is a negative angle value
++      } else if (integer >= 0.0) {
++              data[3] = 0xE0;  // East is a positive angle value
+       }
++      integer = abs(integer);
+       data[3] |= ((integer / 16) & 0x0f);
+       integer = integer % 16;
+       data[4] |= ((integer & 0x0f) << 4) | fraction;
+diff -r af23d23c278b test/Makefile
+--- a/test/Makefile    Sat Jun 20 16:47:55 2009 +0200
++++ b/test/Makefile    Tue Dec 21 12:13:28 2010 +0100
+@@ -18,6 +18,7 @@
+            test_stillimage \
+            test_tt         \
+            test_vevent     \
++           test_video      \
+          evtest          \
+          video           \
+          szap2
+diff -r af23d23c278b test/README
+--- a/test/README      Sat Jun 20 16:47:55 2009 +0200
++++ b/test/README      Tue Dec 21 12:13:28 2010 +0100
+@@ -47,4 +47,4 @@
+ test_dvr      :
+ test_front    :
+ test_switch   :
+-test_video    :
++test_video    : Play video-only file on /dev/dvb/adapter0/video0
+diff -r af23d23c278b test/test_video.c
+--- a/test/test_video.c        Sat Jun 20 16:47:55 2009 +0200
++++ b/test/test_video.c        Tue Dec 21 12:13:28 2010 +0100
+@@ -23,6 +23,7 @@
+ #include <sys/ioctl.h>
+ #include <stdio.h>
++#include <stdlib.h>
+ #include <stdint.h>
+ #include <sys/types.h>
+ #include <sys/stat.h>
+@@ -31,8 +32,7 @@
+ #include <unistd.h>
+ #include <linux/dvb/dmx.h>
+-#include <linux/dvb/frontend_old.h>
+-#include <linux/dvb/sec.h>
++#include <linux/dvb/frontend.h>
+ #include <linux/dvb/video.h>
+ #include <sys/poll.h>
+@@ -100,7 +100,7 @@
+-int videoSetBlank(int fd, boolean state)
++int videoSetBlank(int fd, int state)
+ {
+       int ans;
+@@ -138,72 +138,72 @@
+ int videoGetStatus(int fd)
+ {
+-      struct video_status stat;
++      struct video_status vstat;
+       int ans;
+-      if ((ans = ioctl(fd,VIDEO_GET_STATUS, &stat)) < 0) {
++      if ((ans = ioctl(fd,VIDEO_GET_STATUS, &vstat)) < 0) {
+               perror("VIDEO GET STATUS: ");
+               return -1;
+       }
+       printf("Video Status:\n");
+       printf("  Blank State          : %s\n",
+-             (stat.video_blank ? "BLANK" : "STILL"));
++             (vstat.video_blank ? "BLANK" : "STILL"));
+       printf("  Play State           : ");
+-      switch ((int)stat.play_state){
++      switch ((int)vstat.play_state){
+       case VIDEO_STOPPED:
+-              printf("STOPPED (%d)\n",stat.play_state);
++              printf("STOPPED (%d)\n",vstat.play_state);
+               break;
+       case VIDEO_PLAYING:
+-              printf("PLAYING (%d)\n",stat.play_state);
++              printf("PLAYING (%d)\n",vstat.play_state);
+               break;
+       case VIDEO_FREEZED:
+-              printf("FREEZED (%d)\n",stat.play_state);
++              printf("FREEZED (%d)\n",vstat.play_state);
+               break;
+       default:
+-              printf("unknown (%d)\n",stat.play_state);
++              printf("unknown (%d)\n",vstat.play_state);
+               break;
+       }
+       printf("  Stream Source        : ");
+-      switch((int)stat.stream_source){
++      switch((int)vstat.stream_source){
+       case VIDEO_SOURCE_DEMUX:
+-              printf("DEMUX (%d)\n",stat.stream_source);
++              printf("DEMUX (%d)\n",vstat.stream_source);
+               break;
+       case VIDEO_SOURCE_MEMORY:
+-              printf("MEMORY (%d)\n",stat.stream_source);
++              printf("MEMORY (%d)\n",vstat.stream_source);
+               break;
+       default:
+-              printf("unknown (%d)\n",stat.stream_source);
++              printf("unknown (%d)\n",vstat.stream_source);
+               break;
+       }
+       printf("  Format (Aspect Ratio): ");
+-      switch((int)stat.video_format){
++      switch((int)vstat.video_format){
+       case VIDEO_FORMAT_4_3:
+-              printf("4:3 (%d)\n",stat.video_format);
++              printf("4:3 (%d)\n",vstat.video_format);
+               break;
+       case VIDEO_FORMAT_16_9:
+-              printf("16:9 (%d)\n",stat.video_format);
++              printf("16:9 (%d)\n",vstat.video_format);
+               break;
+       default:
+-              printf("unknown (%d)\n",stat.video_format);
++              printf("unknown (%d)\n",vstat.video_format);
+               break;
+       }
+       printf("  Display Format       : ");
+-      switch((int)stat.display_format){
++      switch((int)vstat.display_format){
+       case VIDEO_PAN_SCAN:
+-              printf("Pan&Scan (%d)\n",stat.display_format);
++              printf("Pan&Scan (%d)\n",vstat.display_format);
+               break;
+       case VIDEO_LETTER_BOX:
+-              printf("Letterbox (%d)\n",stat.display_format);
++              printf("Letterbox (%d)\n",vstat.display_format);
+               break;
+       case VIDEO_CENTER_CUT_OUT:
+-              printf("Center cutout (%d)\n",stat.display_format);
++              printf("Center cutout (%d)\n",vstat.display_format);
+               break;
+       default:
+-              printf("unknown (%d)\n",stat.display_format);
++              printf("unknown (%d)\n",vstat.display_format);
+               break;
+       }
+       return 0;
+@@ -230,7 +230,6 @@
+       int written;
+       struct pollfd pfd[NFD];
+       int stopped = 0;
+-      int ch;
+       pfd[0].fd = STDIN_FILENO;
+       pfd[0].events = POLLIN;
+@@ -327,7 +326,7 @@
+       videoPlay(fd);
+ }
+-main(int argc, char **argv)
++int main(int argc, char **argv)
+ {
+       int fd;
+       int filefd;
+@@ -338,7 +337,7 @@
+               perror("File open:");
+               return -1;
+       }
+-      if ((fd = open("/dev/ost/video1",O_RDWR|O_NONBLOCK)) < 0){
++      if ((fd = open("/dev/dvb/adapter0/video0",O_RDWR|O_NONBLOCK)) < 0){
+               perror("VIDEO DEVICE: ");
+               return -1;
+       }
+diff -r af23d23c278b util/Makefile
+--- a/util/Makefile    Sat Jun 20 16:47:55 2009 +0200
++++ b/util/Makefile    Tue Dec 21 12:13:28 2010 +0100
+@@ -16,4 +16,5 @@
+       $(MAKE) -C szap $@
+       $(MAKE) -C ttusb_dec_reset $@
+       $(MAKE) -C gnutv $@
++      $(MAKE) -C gotox $@
+       $(MAKE) -C zap $@
+diff -r af23d23c278b util/alevt/COPYRIGHT
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/COPYRIGHT     Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,297 @@
++This message applies to all files within the archive:
++
++    Copyright (C) 1998,1999,2000 Edgar Toernig (froese@gmx.de)
++    All rights reserved.
++
++    This program is free software; you can redistribute it and/or modify
++    it under the terms of the GNU General Public License Version 2 as
++    published by the Free Software Foundation.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU General Public License for more details.
++
++
++And here's the GNU GPL V2:
++
++                  GNU GENERAL PUBLIC LICENSE
++                     Version 2, June 1991
++
++ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
++                          675 Mass Ave, Cambridge, MA 02139, USA
++ Everyone is permitted to copy and distribute verbatim copies
++ of this license document, but changing it is not allowed.
++
++                          Preamble
++
++  The licenses for most software are designed to take away your
++freedom to share and change it.  By contrast, the GNU General Public
++License is intended to guarantee your freedom to share and change free
++software--to make sure the software is free for all its users.  This
++General Public License applies to most of the Free Software
++Foundation's software and to any other program whose authors commit to
++using it.  (Some other Free Software Foundation software is covered by
++the GNU Library General Public License instead.)  You can apply it to
++your programs, too.
++
++  When we speak of free software, we are referring to freedom, not
++price.  Our General Public Licenses are designed to make sure that you
++have the freedom to distribute copies of free software (and charge for
++this service if you wish), that you receive source code or can get it
++if you want it, that you can change the software or use pieces of it
++in new free programs; and that you know you can do these things.
++
++  To protect your rights, we need to make restrictions that forbid
++anyone to deny you these rights or to ask you to surrender the rights.
++These restrictions translate to certain responsibilities for you if you
++distribute copies of the software, or if you modify it.
++
++  For example, if you distribute copies of such a program, whether
++gratis or for a fee, you must give the recipients all the rights that
++you have.  You must make sure that they, too, receive or can get the
++source code.  And you must show them these terms so they know their
++rights.
++
++  We protect your rights with two steps: (1) copyright the software, and
++(2) offer you this license which gives you legal permission to copy,
++distribute and/or modify the software.
++
++  Also, for each author's protection and ours, we want to make certain
++that everyone understands that there is no warranty for this free
++software.  If the software is modified by someone else and passed on, we
++want its recipients to know that what they have is not the original, so
++that any problems introduced by others will not reflect on the original
++authors' reputations.
++
++  Finally, any free program is threatened constantly by software
++patents.  We wish to avoid the danger that redistributors of a free
++program will individually obtain patent licenses, in effect making the
++program proprietary.  To prevent this, we have made it clear that any
++patent must be licensed for everyone's free use or not licensed at all.
++
++  The precise terms and conditions for copying, distribution and
++modification follow.
++
++                  GNU GENERAL PUBLIC LICENSE
++   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
++
++  0. This License applies to any program or other work which contains
++a notice placed by the copyright holder saying it may be distributed
++under the terms of this General Public License.  The "Program", below,
++refers to any such program or work, and a "work based on the Program"
++means either the Program or any derivative work under copyright law:
++that is to say, a work containing the Program or a portion of it,
++either verbatim or with modifications and/or translated into another
++language.  (Hereinafter, translation is included without limitation in
++the term "modification".)  Each licensee is addressed as "you".
++
++Activities other than copying, distribution and modification are not
++covered by this License; they are outside its scope.  The act of
++running the Program is not restricted, and the output from the Program
++is covered only if its contents constitute a work based on the
++Program (independent of having been made by running the Program).
++Whether that is true depends on what the Program does.
++
++  1. You may copy and distribute verbatim copies of the Program's
++source code as you receive it, in any medium, provided that you
++conspicuously and appropriately publish on each copy an appropriate
++copyright notice and disclaimer of warranty; keep intact all the
++notices that refer to this License and to the absence of any warranty;
++and give any other recipients of the Program a copy of this License
++along with the Program.
++
++You may charge a fee for the physical act of transferring a copy, and
++you may at your option offer warranty protection in exchange for a fee.
++
++  2. You may modify your copy or copies of the Program or any portion
++of it, thus forming a work based on the Program, and copy and
++distribute such modifications or work under the terms of Section 1
++above, provided that you also meet all of these conditions:
++
++    a) You must cause the modified files to carry prominent notices
++    stating that you changed the files and the date of any change.
++
++    b) You must cause any work that you distribute or publish, that in
++    whole or in part contains or is derived from the Program or any
++    part thereof, to be licensed as a whole at no charge to all third
++    parties under the terms of this License.
++
++    c) If the modified program normally reads commands interactively
++    when run, you must cause it, when started running for such
++    interactive use in the most ordinary way, to print or display an
++    announcement including an appropriate copyright notice and a
++    notice that there is no warranty (or else, saying that you provide
++    a warranty) and that users may redistribute the program under
++    these conditions, and telling the user how to view a copy of this
++    License.  (Exception: if the Program itself is interactive but
++    does not normally print such an announcement, your work based on
++    the Program is not required to print an announcement.)
++
++These requirements apply to the modified work as a whole.  If
++identifiable sections of that work are not derived from the Program,
++and can be reasonably considered independent and separate works in
++themselves, then this License, and its terms, do not apply to those
++sections when you distribute them as separate works.  But when you
++distribute the same sections as part of a whole which is a work based
++on the Program, the distribution of the whole must be on the terms of
++this License, whose permissions for other licensees extend to the
++entire whole, and thus to each and every part regardless of who wrote it.
++
++Thus, it is not the intent of this section to claim rights or contest
++your rights to work written entirely by you; rather, the intent is to
++exercise the right to control the distribution of derivative or
++collective works based on the Program.
++
++In addition, mere aggregation of another work not based on the Program
++with the Program (or with a work based on the Program) on a volume of
++a storage or distribution medium does not bring the other work under
++the scope of this License.
++
++  3. You may copy and distribute the Program (or a work based on it,
++under Section 2) in object code or executable form under the terms of
++Sections 1 and 2 above provided that you also do one of the following:
++
++    a) Accompany it with the complete corresponding machine-readable
++    source code, which must be distributed under the terms of Sections
++    1 and 2 above on a medium customarily used for software interchange; or,
++
++    b) Accompany it with a written offer, valid for at least three
++    years, to give any third party, for a charge no more than your
++    cost of physically performing source distribution, a complete
++    machine-readable copy of the corresponding source code, to be
++    distributed under the terms of Sections 1 and 2 above on a medium
++    customarily used for software interchange; or,
++
++    c) Accompany it with the information you received as to the offer
++    to distribute corresponding source code.  (This alternative is
++    allowed only for noncommercial distribution and only if you
++    received the program in object code or executable form with such
++    an offer, in accord with Subsection b above.)
++
++The source code for a work means the preferred form of the work for
++making modifications to it.  For an executable work, complete source
++code means all the source code for all modules it contains, plus any
++associated interface definition files, plus the scripts used to
++control compilation and installation of the executable.  However, as a
++special exception, the source code distributed need not include
++anything that is normally distributed (in either source or binary
++form) with the major components (compiler, kernel, and so on) of the
++operating system on which the executable runs, unless that component
++itself accompanies the executable.
++
++If distribution of executable or object code is made by offering
++access to copy from a designated place, then offering equivalent
++access to copy the source code from the same place counts as
++distribution of the source code, even though third parties are not
++compelled to copy the source along with the object code.
++
++  4. You may not copy, modify, sublicense, or distribute the Program
++except as expressly provided under this License.  Any attempt
++otherwise to copy, modify, sublicense or distribute the Program is
++void, and will automatically terminate your rights under this License.
++However, parties who have received copies, or rights, from you under
++this License will not have their licenses terminated so long as such
++parties remain in full compliance.
++
++  5. You are not required to accept this License, since you have not
++signed it.  However, nothing else grants you permission to modify or
++distribute the Program or its derivative works.  These actions are
++prohibited by law if you do not accept this License.  Therefore, by
++modifying or distributing the Program (or any work based on the
++Program), you indicate your acceptance of this License to do so, and
++all its terms and conditions for copying, distributing or modifying
++the Program or works based on it.
++
++  6. Each time you redistribute the Program (or any work based on the
++Program), the recipient automatically receives a license from the
++original licensor to copy, distribute or modify the Program subject to
++these terms and conditions.  You may not impose any further
++restrictions on the recipients' exercise of the rights granted herein.
++You are not responsible for enforcing compliance by third parties to
++this License.
++
++  7. If, as a consequence of a court judgment or allegation of patent
++infringement or for any other reason (not limited to patent issues),
++conditions are imposed on you (whether by court order, agreement or
++otherwise) that contradict the conditions of this License, they do not
++excuse you from the conditions of this License.  If you cannot
++distribute so as to satisfy simultaneously your obligations under this
++License and any other pertinent obligations, then as a consequence you
++may not distribute the Program at all.  For example, if a patent
++license would not permit royalty-free redistribution of the Program by
++all those who receive copies directly or indirectly through you, then
++the only way you could satisfy both it and this License would be to
++refrain entirely from distribution of the Program.
++
++If any portion of this section is held invalid or unenforceable under
++any particular circumstance, the balance of the section is intended to
++apply and the section as a whole is intended to apply in other
++circumstances.
++
++It is not the purpose of this section to induce you to infringe any
++patents or other property right claims or to contest validity of any
++such claims; this section has the sole purpose of protecting the
++integrity of the free software distribution system, which is
++implemented by public license practices.  Many people have made
++generous contributions to the wide range of software distributed
++through that system in reliance on consistent application of that
++system; it is up to the author/donor to decide if he or she is willing
++to distribute software through any other system and a licensee cannot
++impose that choice.
++
++This section is intended to make thoroughly clear what is believed to
++be a consequence of the rest of this License.
++
++  8. If the distribution and/or use of the Program is restricted in
++certain countries either by patents or by copyrighted interfaces, the
++original copyright holder who places the Program under this License
++may add an explicit geographical distribution limitation excluding
++those countries, so that distribution is permitted only in or among
++countries not thus excluded.  In such case, this License incorporates
++the limitation as if written in the body of this License.
++
++  9. The Free Software Foundation may publish revised and/or new versions
++of the General Public License from time to time.  Such new versions will
++be similar in spirit to the present version, but may differ in detail to
++address new problems or concerns.
++
++Each version is given a distinguishing version number.  If the Program
++specifies a version number of this License which applies to it and "any
++later version", you have the option of following the terms and conditions
++either of that version or of any later version published by the Free
++Software Foundation.  If the Program does not specify a version number of
++this License, you may choose any version ever published by the Free Software
++Foundation.
++
++  10. If you wish to incorporate parts of the Program into other free
++programs whose distribution conditions are different, write to the author
++to ask for permission.  For software which is copyrighted by the Free
++Software Foundation, write to the Free Software Foundation; we sometimes
++make exceptions for this.  Our decision will be guided by the two goals
++of preserving the free status of all derivatives of our free software and
++of promoting the sharing and reuse of software generally.
++
++                          NO WARRANTY
++
++  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
++FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
++OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
++PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
++OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
++MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
++TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
++PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
++REPAIR OR CORRECTION.
++
++  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
++WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
++REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
++INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
++OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
++TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
++YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
++PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
++POSSIBILITY OF SUCH DAMAGES.
++
++                   END OF TERMS AND CONDITIONS
+diff -r af23d23c278b util/alevt/ChangeLog
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/ChangeLog     Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,535 @@
++Thu Feb 11 22:05:00 MET 2010  (1.7.0)
++
++    - redesigned version:
++    - outfile, new starting methods, libzvbi implementation
++    - lots of bug fixes, all patches available in the Internet applied
++    - extensive code cleanup
++
++Mon Dec  3 03:11:07 MET 2007  (1.6.2)
++
++    - compilation fixes for newer gcc
++    - makefile tweaks (man vs share/man, /usr/X11R6 vs /usr, etc)
++    - default device changed to /dev/vbi0
++    - adapt to current v4l2 api
++    - some minor fixes collected during the past years
++
++    This is a build-time update to conform to newer compilers and
++    system environments.  If you have a running AleVT there's no
++    reason to update.  The only real fix is in the html-exporter
++    which was producing broken html (missing double-quotes).
++
++Thu Jan 23 01:53:10 MET 2003
++
++    - Fixed a bug in contrib/cap-all.c (fdset_init before vbi_open)
++    - Expaned cap-all.c to show how to save in two formats simultaneously.
++
++Tue Aug 20 05:22:16 MEST 2002 (1.6.1)
++
++    - Removed the bttv-warning from the help pages ;-)
++
++Mon Jul 23 18:34:32 MEST 2001
++
++    - Fixed bug in ui.c - found by <pawel@sakowski.eu.org>.
++    - When clicking on page numbers accept sub-page numbers too.
++
++Sat Dec 23 15:12:11 MET 2000
++
++    - Fixed 'double height last line' bug in export.c reported by
++      <Matthias.Kleinmann@urz.uni-heidelberg.de>
++
++Thu Oct 12 02:19:31 MEST 2000
++
++    - The &nbsp; fix was wrong.  Removed it.
++
++Wed Oct 11 19:41:38 MEST 2000 (1.6.0)
++
++    - Some documentation tweaks.
++    - Release.  Made it 1.6 because of V4l2 API.
++
++Thu Sep 21 21:07:12 MEST 2000
++
++    - Removed old bttv-only decoder.  Only the v4l2-based stays.
++      If the device does not support v4l2, default parameters
++      appropriate for the bttv-driver are taken.
++    - Subpage cycling (up/down and 2nd wheel) stays in the current
++      page.
++
++Sat Sep 16 23:52:12 MEST 2000
++
++    - Experimental v4l2 interface added.
++    - Finetune defaults to 1 now.  Works best for me.  Tell me
++      if you don't like it.
++    - Russian patch still not added :-/
++    - Fixed the bug in xio.c that Ben Smithurst
++      <ben@scientia.demon.co.uk> found.
++    - Added the dual-wheel-mouse patch from Holger Fitzner.
++
++Tue May 30 03:09:24 MEST 2000
++
++    - As Matto Fransen <matto@matto.nl> reported: the ; after &nbsp
++      in exp-html is missing.  fixed that.
++
++Tue May  9 20:21:52 MEST 2000
++
++    - Removed the -oldbttv/-newbttv options.  If your driver has
++      a buffer size different from that in the current bttv you
++      either have to support the VBISIZE ioctl or change the source.
++      (Tried to implement an autodetect by non-blocking reads but
++      that confuses the driver that much that it no longers gives
++      reasonable data.)
++    - Added a compression option to the png export filter and
++      changed the default compression level to the lib's default.
++      The prev default of 9 was way to slow.
++
++Wed May  3 19:18:55 MEST 2000
++
++    - Added a smaller font.  Made out of the neep9 font from
++      the really great jmk-fonts (http://www.pobox.com/~jmknoble).
++
++Sat Apr 29 02:36:41 MEST 2000
++
++    - Fixed SEGV in export.c:adjust.
++    - Fixed a possible buffer overrun in exp-txt.c
++
++Thu Nov  4 21:18:52 MET 1999  (1.5.1)
++
++    - Added os.h.  That way alevt compiles right out of the
++      box on all BSD systems (I hope *g*).
++    - Fixed the DST bug in alevt-date.
++    - Put vtwiz.pl in contrib, a perl/tk/set-tv script to
++      launch alevt written by Joern Borgert.
++
++Tue Oct 26 23:55:09 MEST 1999 (1.5.1-pre1)
++
++    - Added timeout option to alevt-cap.
++    - Use install instead of cp in the Makefile.
++    - Added -I/usr/local/include and -L/usr/local/lib
++      in the Makefile.
++    - Changed #ifdef FREEBSD to #ifdef BSD.
++    - exchanged contrib/paul-export.patch with
++      paul.fmt_page.c (a replacement for export.c:fmt_page())
++      and paul.fmt_page.patch (the same in form of a
++      patch file).
++    - Some doc corrections.
++
++Thu Oct 14 02:49:48 MEST 1999
++
++    - Added FREEBSD patches.
++
++Fri Oct  8 23:36:45 MEST 1999 (1.5.0)
++
++    - Updated the documentation.
++
++    So, what's new since 1.4.9 (nearly 4 months ago)?
++    Two major things: full latin-2 support and export
++    filters for alevt-cap and alevt itself.
++
++    For the latin-2 support page enhancement packets
++    have to be decoded and some latin-1 pages may
++    benefit from that, too.  Note: if you select
++    latin-2 everything is latin-2, even cut'n paste.
++    (new cmdline option -charset latin-1|2)
++
++    The export filters allow saving pages in different
++    formats.  At the moment there's ascii (with and with-
++    out color), html, png, and ppm.  The png filter
++    requires libpng.  If you don't have it (or don't want
++    png support) just remove the WITH_PNG from the
++    Makefile.  To save the currently displayed page just
++    press 's'.  See alevt-cap(1) for the format string.
++
++    Preview: 1.5.1 will have the FreeBSD patches and
++    any bug fixes.  (But not more *g*).
++
++Fri Oct  8 02:06:35 MEST 1999 (1.5.0-pre4)
++
++    Finally I could get away from my Playstation and
++    work a little bit on alevt *g*
++
++    - Tried to change alevt-date with freebsd patches from
++      Thomas Runge <runge@rostock.zgdv.de>.  They do not
++      have the timezone and daylight variables.  But I do
++      not have tm_gmtoff.  So it's commented out for the
++      moment.
++    - Made font.[ch] so that only one copy of the fonts is
++      in the executable when including export modules
++      (exp-gfx.c uses them).  Had to tweak the makefile.
++    - Added 's' for saving pages to files.  Prompts for
++      a format string and a filename and saves the
++      currently displayed page.
++      (Formerly, 's' and 'S' were aliases for '/' and '?'
++      (searching))
++    - Found a bug in export.c regarding double height lines.
++    - Added a patch to the contrib dir to pass the URL you
++      click on to netscape.
++
++    The documentation updates are still missing.  That's
++    the last thing to do for 1.5.0.  But that's so boring...
++
++Fri Aug 20 21:28:18 MEST 1999
++
++    Back from holidays and time for alevt...
++
++    - Added html, png, and ppm export modules from Paul.
++    - Fixed the return status for export_output.
++    - Tweaked the makefile for libpng support.
++    - Added the export howto to the contrib dir.
++    - Added Paul's fmt_page routine to contrib as a patch
++      to export.c
++    - Added "-format help" to list all output formats and
++      its options.
++
++    Still to do: update man page of alevt-cap, add export
++    to alevt, add erc to alevt-cap.
++
++    Oh, btw, alevt is running on FreeBSD with the bt848
++    driver from Roger Hardiman <roger@cs.strath.ac.uk> *g*.
++    I wonder if it's possible to port his driver to linux.
++    Maybe it runs better then bttv... (I still get reports
++    with stuck xawtvs ...)
++
++Mon Jul 19 01:15:50 MEST 1999 (1.5.0-pre3)
++
++    - Added export modules.  It's gotten much to complex.
++
++    A lot of things still to do:  add other formats [Paul?],
++    add documentation, add format-help, add export to alevt,
++    add erc to alevt-cap, ...
++
++Mon Jul 12 00:09:03 MEST 1999
++
++    - Added an incomplete 20x24 font to the contrib dir.
++
++Tue Jun 29 00:46:03 MEST 1999 (1.5.0-pre2)
++
++    - Added lanugage tables from Radoslaw.
++    - Added new latin-2 font from Radoslaw.
++    - Fixed a bug with hold graphics.  There's still one bug
++      on CNN's page 100 (has to do with set-after behaviour of
++      color select in hold graphics mode).  The last line of the
++      earth should be blue-blue-green not blue-green-green.
++      AleVT always uses set-at behaviour.  Afaik, this combination
++      (hold + set-after) is the only way to see the difference
++      between set-at and set-after.  Set-after will blow up the
++      code so I will leave it as it is.
++    - vbi now collects all pkt26 and enhances the page before
++      it is passed on.  Seem's to work.
++
++Tue Jun 22 22:13:45 MEST 1999 (1.5.0-pre1)
++
++    - Fixed hamm24.  And, it should be fast now *g*
++    - Moved the language conversion parts to lang.c
++    - Added additional lang_chars for use with the latin-2 charset.
++    - Added -charset latin-1/2 option.
++    - Added pkt x/26 decoding.  ... and noticed, that these packets
++      are sent between line 0 and 1.  FUCK.  Now I have to save
++      all x/26 until the page is complete.  But not today... :-(
++
++      Things are getting more and more uglier.  The right thing
++      to do would be to make a big font with all possible chars
++      (including cyrillic, arabic, smoothed graphics, ...).
++      That would mean to make each char in vtp->data 16 bit.  
++      And then add an attribute word for each char so that the
++      enhanced attributes work, too.  Searching and cut & paste
++      would be more complicated...  but the worst, the pages
++      will be much bigger (4 times larger).  Really bad for
++      the cache and god knows for what else...
++      Is it worth all the trouble???  I don't need that!
++
++Tue Jun 15 01:25:40 MEST 1999
++
++    - Changed .specs file again.  I previously changed alevt.spec
++      instead of alevt.spec.in :-(
++
++Mon Jun 14 23:45:48 MEST 1999 (1.4.9)
++
++    - Made a very simple capture program (alevt-cap).  Just collects
++      the given pages and writes them to disk in ASCII.
++      I will only accept bug reports/fixes, no enhancement requests 
++      at the moment *g*
++      (I can't believe it; I even wrote a man page...)
++    - Changed the subpage delimiter on the command line from '/' to '.'
++      The old one ('/') is still accepted.  (Reason: alevt-cap uses
++      the page number as part of the filename and a / is inconvenient.
++      And I already wanted to let you enter subpages with the keypad
++      and the '.' would be a nice key for that.)
++    - Tweaked the .specs file...  (Btw, alevt-date and alevt-cap should
++      not be installed in the X11 tree.)
++
++Thu Jun 10 22:13:40 MEST 1999
++
++    - moved the hamming decoding and associated table to hamm.c
++    - played with pkt26 to support polish stations.  not finished.
++
++Tue Jun  8 21:00:42 MEST 1999
++
++    - Added -[no]bell option.  And the 'b' key.
++    - Replaced all xio_bell calls with appropriate status messages.
++
++Sat Jun  5 00:42:19 MEST 1999 (1.4.8)
++
++    - Shit.  Just after the release I found a bug.  The header line
++      isn't updated as it should :-(  (Just affects parallel mode
++      transmission, so no new version, yet.)
++    - Created mailing list.  Either go to http://alevt.listbot.com/
++      or write mail to alevt-subscribe@listbot.com.
++    - Added bttv-patch to the contrib dir for those who don't want
++      to wait for bttv-0.6.5.
++
++Fri Jun  4 17:19:41 MEST 1999 (1.4.7)
++
++    - Added autodetection of VBIBUF_SIZE (only with newer bttv, 0.6.5).
++    - Forgot to close vbi_fd in vbi_close :-/
++    - Made ERC on by default.  If the page has no errors it
++      costs nothing and if it has you'll turn it on anyway.
++    - Changed parameters of EV_HEADER.
++    - Removed XAWTV_HACKS.
++    - Updated some docu.
++    - Modified the contrib samples to reflect previous API changes.
++
++Fri May 28 20:16:44 MEST 1999
++
++    - Added status messages.
++    - Added EV_TIMER event.
++    - Added channel change detection (only with newer bttv, 0.6.5).
++      Sends EV_RESET event.  The XAWTV_HACKS can be removed *phww*.
++      Now the cache is automatically cleared if you switch to a
++      new channel.  It even works with a SAT receiver connected to
++      Video-In.
++
++Thu May 27 23:54:32 MEST 1999 (1.4.6 unofficial)
++
++    - Cache reset didn't reset npages and hi_subno.
++    - Added XAWTV_HACKS, that is: alevt scans for a window with
++      the _XAWTV_STATION property and registers for property changes.
++      Result: when switching channels in xawtv, the cache is cleared.
++      (This is just an ugly hack.  Xawtv must already be running
++      when alevt is started.  If you quit and restart xawtv, it no
++      longer works.  There's no method to detect if the monitored
++      xawtv is really the one controlling our /dev/vbi, etc...)
++      Added on request of Paul Ortyl <ortylp@key.net.pl>.
++    - Added error reduction circuit.  It's part of the cache.
++      Errors in a new page are replaced by characters/lines from
++      an already cached (older) page.  May be toggled by pressing
++      'e' (editor is now on 'E').  It's not enabled by default
++      because it takes some CPU time.  Idea by Paul Ortyl.
++    - TODO: clean up.  document new features.  add status messages.
++
++Sun May 23 19:13:07 MEST 1999 (1.4.5)
++
++    - New spec file from Karsten Hopp <karsten.hopp@delix.de>
++    - Changed it even further *g*
++    - Fixed a bug with graphics selection of double height lines.
++    - Documented the -oldbttv option in the man page.  Now it's in
++      every page.  This should finally halve the mails I get.
++      (For the other halve I have to write alevt-capture *g*)
++
++Sat May  8 02:41:21 MEST 1999
++
++    - Ehhh, changed u32 typedef from unsigned long to unsigned int.
++      Same for s32.  The Alpha's longs are 64 bits.
++      Thanks to Sdruddin Rejeb <rejeb@dpmail.epfl.ch>.
++      (There's something strange with this in the X libs.  They are
++      sometimes very lazy about ints and longs.  Someone with an
++      Alpha should check the cut & paste, both, text and graphics
++      selections.)
++
++Thu Apr 29 22:38:37 MEST 1999
++
++    - Updated contrib/t1.c
++    - Added ':' as a subpage delimiter for clicking (2:7 is the same as 2/7)
++
++Mon Apr 19 19:40:09 MEST 1999
++
++    - Switched the scrolling direction of the wheel
++
++Mon Mar 29 01:23:06 MEST 1999 (1.4.4)
++
++    - fixed DST bug in alevt-date
++    - added crude latin-2 support.  'make FONT=latin-2' should be enough.
++      (found the stuff on the website http://www.penguin.cz/~marvin/ of
++      Daniel Smolik <smolikdan@email.cz>.  I don't know if he is the one
++      who made the font).
++
++Wed Mar 17 20:53:59 MET 1999
++
++    - added timeout to alevt-date
++
++Fri Feb 19 18:22:53 MET 1999  (1.4.3>
++
++    - Makefile changes.
++
++Fri Jan 29 18:01:27 MET 1999
++    
++    - fixed bug in dllist.h.  dl_insert_first(h, dl_remove(n)) was only
++      working due to gcc implementation details.
++
++Mon Jan 25 18:33:42 MET 1999  (1.4.2)
++
++    - fixed 'clear cache'.  no longer removes the help pages.
++    - made next/prev key/button to skip missing pages.
++    - added support for wheeled mice.  (I heard it's really cool *g*)
++    - problem with subpages > 0xff fixed.
++
++Thu Jan 21 17:31:46 MET 1999  (1.4.1)
++
++    - added man pages from Thomas Schoepf <schoepf@usa.net>.
++    - added rpm-spec file from Mario Mikocevic <mozgy@times.hr>.
++      (looks a little bit odd, but I don't know very much about rpms)
++    - minor option fix in alevt-date (people are really using it!?!)
++
++Tue Jan  5 03:50:08 MET 1999  (1.4.0)
++
++    - should be 1.3.10 but that gives problems with the help pages :-(
++    - fixed varargs for alpha
++    - default is now -newbttv (aka -fuckbttv).  use -oldbttv for v<0.5.20.
++
++Sat Jan  2 21:40:54 MET 1999
++
++    - small patches to alevt-date (-vbi options and tzset fix)
++    - played with pkt8/30.  what a mess.  MTV is 25:13 ahead *g*
++
++Wed Dec 30 19:30:14 MET 1998  (1.3.9)
++
++    - slightly modified the pll (may need further tuning)
++
++Wed Dec 30 05:27:26 MET 1998  (1.3.8)
++
++    - added pll (-finetune auto).  try -debug for status msgs.
++
++Tue Dec 29 05:15:53 MET 1998  (1.3.7)
++
++    - added finetune option (see README)
++    - you may now type -newbttv instead of -fuckbttv *g*
++
++Mon Dec 28 19:36:32 MET 1998  (1.3.6)
++
++    - Makefile: R5 -> R6  :-(
++    - vbi.c now works without cache.c
++    - added alevt-date (set system time from teletext)
++    - bug in option parsing (error reporting)
++
++Thu Dec 17 19:56:16 MET 1998  (1.3.5)
++
++    - added -L/usr/X11R6/lib in Makefile
++    - put some blurb (in german) in contrib.
++
++Thu Dec 17 05:01:34 MET 1998  (1.3.4)
++
++    - added class hints on (invisible) leader window to make docking
++      in wmaker easier.  instant name for leader is "VTLeader" and for
++      the viewing windows "VTPage"
++    - made the icon a little bit smaller
++
++Mon Dec 14 23:05:41 MET 1998  (1.3.3)
++
++    Release 1.3.3
++
++    - added spanish/portuguese charset decoding
++    - added similar looking glyphs for czech
++    - minor changes on the font
++    - middle click on current page number opens new parent window
++    - case dependant search if the pattern begins with a '!'
++    - line editing may be aborted with ^C
++
++Sun Dec 13 17:55:32 MET 1998  (1.3.2)
++
++    - when there were multiple windows of the same page, cycling through
++      the subpages changed all windows.  fixed.
++    - hilight the found text (make it the selection).
++    - slightly modified the hilight colors.
++    - default window size set to 41x25 (looks better).
++    - rewrote the editor.
++
++Sun Dec 13 07:03:10 MET 1998  (1.3.1)
++
++    - fixed one command line option
++    - corrected bug in searching
++
++Sat Dec 12 20:27:03 MET 1998  (1.3.0)
++
++    Release 1.3.0
++
++    - searching is now ready (still need a status line for error msgs).
++    - set SIGPIPE to SIG_DFL.  some shells (KDE) set it to SIG_IGN and then
++      the timer task won't be killed on exit.
++    - updated the help pages.
++    - I'm frustrated!  BTTV_VERSION doesn't work on /dev/vbi.  So no
++      autodetection of driver version.  Added -fuckbttv option instead.
++
++Fri Dec 11 19:36:03 MET 1998  (1.2.5)
++
++    - reworked national charset (lang) handling.  everthing now done in vbi.c.
++      the rest just deals with latin-1.
++    - first version of searching (functional, but dirty.  needs more work.)
++
++Thu Dec 10 20:06:27 MET 1998  (1.2.4)
++
++    - new file edline.c (line editor for the menu line. start for searching...)
++    - blinking cursor
++    - added an 48x48 icon from Ulf Rompe
++    - added pasting into the line editor (insert key).
++    - release ownership of XA_PRIMARY when deselecting selection.
++
++Tue Dec  8 21:26:26 MET 1998  (1.2.3)
++
++    - new file ui.c (most user interface stuff from main.c)
++    - rewrote option parsing
++    - allow specification of child windows on command line. now
++      it's possible to regenerate the complete window layout by
++      the commandline (may be of some use for session management).
++    - some spelling fixes in the help pages from Mark Bryars
++
++Mon Dec  7 16:59:28 MET 1998  (1.2.2)
++
++    - reworked hidden handling in xio.c
++
++Sun Dec  6 19:54:10 MET 1998  (1.2.1)
++
++    - class name changed!  from Alevt to AleVT.
++    - window/icon title shows current page number
++    - changed the icon to a 64 pixel width one.  not nice but ...
++    - added a small mini icon for the title bar. is there a property I can set?
++    - pressing on the CPN puts the page on hold
++    - pressing on the violet * reveals concealed text
++    - added simple menu if no FastText menu is present
++    - allow subpages to be specified on the command line (eg 100/4)
++
++Sat Dec  5 20:59:51 MET 1998  (1.2.0)
++
++    Release 1.2.0
++
++    - finished the help pages.
++    - added command line handling
++    - added user geometry handling in xio.c
++
++Sat Dec  5 02:28:16 MET 1998  (1.1.2)
++
++    - allow magazin 9 (help system)
++    - start box char after a pagenumber selects subpage 1 (hack)
++    - added a crude page editor (just to create the help pages.  not for users.)
++    - started with the online help system (sounds great, hehe)
++
++Tue Dec  1 20:19:53 MET 1998  (1.1.1)
++
++    - added concept of parent and child windows.  now, the middle mouse
++      button changes the contens of the child window.  if there isn't
++      one, it is created.
++    - Middle mouse button on x/y (subpage cycling) selects the previous
++      subpage.  (updating the child with subpages is hairy...)
++
++Sun Nov 29 23:34:18 MET 1998  (1.1.0)
++
++   Release 1.1.0
++
++   - removed most of the recovery for single bad lines (does too much harm)
++   - changed handling of parallel mode transmission (untested.  unused in .de)
++   - added selection (text & graphic!).  try pasting into xpaint :-)
++   - added cache-clear function ('c')
++   - click on x/y selects the next subpage
++   - some minor tweaks
++   - added an icon bitmap.
++
++Wed Nov 24 23:33:34 MET 1998  (1.0.0)
++
++    First Release 1.0.0
+diff -r af23d23c278b util/alevt/EXPORT.HOWTO
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/EXPORT.HOWTO  Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,84 @@
++HOW TO IMPLEMENT A NEW EXPORT MODULE:
++
++As an example look at exp-txt.c (it implements two modules which
++are pretty similar).
++
++You have to create one exported structure (struct export_module).
++This structure holds the following data:
++
++1. The name of the format (example: "ascii").
++
++2. The default extension to use for building filenames ("txt").
++
++3. A list of module options. It's a 0 terminated array of char
++pointers, one for each option (similar to argv of main).
++If an option string contains a '=', it is an option that
++requires an argument.  The part after the '=' is ignored at
++the moment.  Later, I want to add help messages that show
++these options strings and then the part after the '=' becomes
++useful.
++If you do not have local options, set this field to 0.
++
++4. The number of bytes for local data in the export structure.
++There you may store data collected during option parsing or
++for whatever you want.
++Don't use global variables for storing this data!  With
++alevt-cap you may give:
++
++alevt-cap -format ascii,color 100  -format ascii 100
++
++to save the page in two different formats.  Using global
++vars would inhibit this.  The data area in struct export
++starts at the 'data' field.  You have to cast it to the
++appropriate type (see the D macro in exp-txt.c).
++If you do not need local data, set this field to 0.
++
++5. An open function (or call it constructor).  It is called
++when your module is needed and it is passed a struct export
++(the instance).  This function may be used to initialize
++the local data in the export struct.
++If all goes well return 0.  Else call export_error (see
++below) and return -1.
++If you do not need an open function, set this field to 0.
++
++6. A close function (or call it destructor).  It is called
++when your module is no longer needed.  If you allocated
++memory in the open func, this is the place to free it.
++If you do not need a close function, set it to 0.
++
++7. An option function.  It is called for each module option
++the user has given.  It is passed an option number (first
++option in the option-array gives 1, ...) and a char pointer
++to the argument for that option (0 if the option does not
++need an arg).  The argument pointer keeps valid until the
++close function is called.
++If all goes well, return 0.  Else call export_error and
++return -1.
++If you gave an option list at point 3 you have to specify
++this function.  Else set it to 0.
++
++8. An output function.  It is called to produce the output.
++It is given the file name to use and a fmt_page pointer.
++The fmt_page contains an interpreted image of the page.
++There are no control chars in it.  It uses the character
++set defined by the two fonts.
++These function may be called consecutive for multiple
++pages.  Don't expect one output for one open/close.
++Return codes as above... (0: ok,  -1: error).
++
++The export_error function:  If one of your functions wants to
++report an error, it has to use the export_error function.
++It's a printf like function to set error messages.  In alevt-cap
++these messages are printed to stderr, in alevt they will be
++shown in the status line (so don't make them too long).
++
++The last step is to add your export_module structure to the
++list of modules in export.c (at the top).
++Please, make sure that this structure is the only exported
++symbol.  All other things should be static.
++
++That's all.  A structure describing your module and 4 functions
++(open, close, option, output) to implement it.  Shouldn't be too
++complicated.
++
++Ciao, ET.
+diff -r af23d23c278b util/alevt/Makefile
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/Makefile      Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,130 @@
++VER=1.7.0
++OPT=-O -g -w
++DEFS=-DWITH_PNG
++DEFS+=-DUSE_LIBZVBI
++FONT=vtxt
++MAN_DIR=man
++DESTDIR=
++PREFIX=/usr
++HOSTCC=$(CC)
++CFLAGS=$(OPT) -DVERSION=\"$(VER)\" $(DEFS) -I$(USR_X11R6)/include
++EXPOBJS=export.o exp-txt.o exp-html.o exp-gfx.o font.o
++OBJS=main.o ui.o xio.o fdset.o vbi.o cache.o help.o search.o misc.o hamm.o lang.o $(EXPOBJS)
++TOBJS=alevt-date.o vbi.o fdset.o misc.o hamm.o lang.o
++COBJS=alevt-cap.o vbi.o fdset.o misc.o hamm.o lang.o $(EXPOBJS)
++
++ifneq ($(findstring WITH_PNG,$(DEFS)),)
++EXPLIBS=-lpng -lz -lm
++endif
++
++ifneq ($(findstring USE_LIBZVBI,$(DEFS)),)
++ZVBILIB=-lzvbi -lpthread
++EXPLIBS+=$(ZVBILIB)
++endif
++
++all: alevt alevt-date alevt-cap alevt.1 alevt-date.1 alevt-cap.1
++
++alevt: $(OBJS)
++      $(CC) $(OPT) $(OBJS) -o alevt -L$(PREFIX)/lib -L$(PREFIX)/lib64 -lX11 $(EXPLIBS)
++
++alevt-date: $(TOBJS)
++      $(CC) $(OPT) $(TOBJS) -o alevt-date $(ZVBILIB)
++
++alevt-cap: $(COBJS)
++      $(CC) $(OPT) $(COBJS) -o alevt-cap $(EXPLIBS)
++
++font.o: font1.xbm font2.xbm font3.xbm font4.xbm
++fontsize.h: font1.xbm font2.xbm font3.xbm font4.xbm
++      fgrep -h "#define" font1.xbm font2.xbm font3.xbm font4.xbm >fontsize.h
++
++font1.xbm: bdf2xbm $(FONT)-latin-1.bdf
++      ./bdf2xbm font1 <$(FONT)-latin-1.bdf >font1.xbm
++
++font2.xbm: bdf2xbm $(FONT)-latin-2.bdf
++      ./bdf2xbm font2 <$(FONT)-latin-2.bdf >font2.xbm
++
++font3.xbm: bdf2xbm vtxt-koi8.bdf
++      ./bdf2xbm font3 <vtxt-koi8.bdf >font3.xbm
++
++font4.xbm: bdf2xbm vtxt-iso8859-7.bdf
++      ./bdf2xbm font4 <vtxt-iso8859-7.bdf >font4.xbm
++
++bdf2xbm: bdf2xbm.c
++      $(HOSTCC) bdf2xbm.c -o bdf2xbm
++
++clean:
++      rm -f *.o page*.txt a.out core bdf2xbm font?.xbm fontsize.h
++      rm -f alevt alevt-date alevt-cap
++
++rpm-install: all
++      install -m 0755 alevt        ${RPM_BUILD_ROOT}$(USR_X11R6)/bin
++      install -m 0755 alevt-date   ${RPM_BUILD_ROOT}$(USR_X11R6)/bin
++      install -m 0755 alevt-cap    ${RPM_BUILD_ROOT}$(USR_X11R6)/bin
++      install -m 0644 alevt.1      ${RPM_BUILD_ROOT}$(USR_X11R6)/$(MAN)/man1
++      install -m 0644 alevt-date.1 ${RPM_BUILD_ROOT}$(USR_X11R6)/$(MAN)/man1
++      install -m 0644 alevt-cap.1  ${RPM_BUILD_ROOT}$(USR_X11R6)/$(MAN)/man1
++      install -d 0755 $(RPM_BUILD_ROOT)$(USR_X11R6)/include/X11/pixmaps
++      install -m 0644 alevt.png $(RPM_BUILD_ROOT)$(USR_X11R6)/include/X11/pixmaps
++
++install: all
++      install -m 0755 alevt           $(DESTDIR)$(PREFIX)/bin
++      install -m 0755 alevt-date      $(DESTDIR)$(PREFIX)/bin
++      install -m 0755 alevt-cap       $(DESTDIR)$(PREFIX)/bin
++      install -m 0644 alevt.1         $(DESTDIR)$(PREFIX)/share/man/man1
++      install -m 0644 alevt-date.1    $(DESTDIR)$(PREFIX)/share/man/man1
++      install -m 0644 alevt-cap.1     $(DESTDIR)$(PREFIX)/share/man/man1
++      install -m 0644 alevt.png $(DESTDIR)$(PREFIX)/share/pixmaps
++      install -m 0644 alevt.desktop $(DESTDIR)$(PREFIX)/share/applications
++
++uninstall: clean
++      rm -f /usr/bin/alevt /usr/bin/alevt-cap /usr/bin/alevt-date \
++      /usr/share/pixmaps/alevt.png /usr/share/applications/alevt.desktop \
++      /usr/share/man/man1/alevt.1 /usr/share/man/man1/alevt-cap.1 \
++      /usr/share/man/man1/alevt-date.1
++
++depend:
++      makedepend -Y -- $(CFLAGS_none) -- *.c 2>/dev/null
++
++tar-html: alevt.1 alevt-date.1 alevt-cap.1
++      for i in alevt.1 alevt-date.1 alevt-cap.1 ; do \
++          j=`basename $$i .1` ; \
++          j=`basename $$j .1x` ; \
++          nroff -man $$i | { \
++              echo "<HTML><HEAD><TITLE>AleVT</TITLE></HEAD><BODY>" ; \
++              man2html -bare -uelem U -nodepage ; \
++              echo "</B0DY></HTML>" ; \
++          } | sed -e "s,</B> <B>, ,g" -e "s,</U> <U>, ,g" >~/exit/alevt/$$j.html ;\
++      done
++
++tar: tar-html clean
++      sed s/VERSION/$(VER)/g <alevt.lsm.in >~/exit/alevt/alevt-$(VER).lsm
++      sed s/VERSION/$(VER)/g <alevt.spec.in >alevt.spec
++      cd .. ;\
++          ln -s alevt alevt-$(VER) ;\
++          tar vcfz ~/exit/alevt/alevt-$(VER).tar.gz alevt-$(VER)/* ;\
++          rm alevt-$(VER)
++      cat <CHANGELOG >~/exit/alevt/changes
++
++# DO NOT DELETE
++
++alevt-cap.o: vt.h misc.h fdset.h dllist.h vbi.h cache.h lang.h export.h
++alevt-date.o: os.h vt.h misc.h fdset.h dllist.h vbi.h cache.h lang.h
++cache.o: misc.h dllist.h cache.h vt.h help.h
++exp-gfx.o: lang.h misc.h vt.h export.h font.h fontsize.h
++exp-html.o: lang.h misc.h vt.h export.h
++exp-txt.o: os.h export.h vt.h misc.h
++export.o: vt.h misc.h export.h
++fdset.o: dllist.h misc.h fdset.h
++font.o: font1.xbm font2.xbm font3.xbm font4.xbm
++hamm.o: vt.h misc.h hamm.h
++help.o: vt.h misc.h vt900.out vt901.out vt902.out vt903.out vt904.out vt905.out
++help.o: vt906.out vt907.out vt908.out vt909.out vt910.out vt911.out vt912.out
++lang.o: misc.h vt.h lang.h
++main.o: vt.h misc.h fdset.h dllist.h xio.h vbi.h cache.h lang.h ui.h
++main.o: search.h
++misc.o: misc.h
++search.o: vt.h misc.h cache.h dllist.h search.h
++ui.o: vt.h misc.h xio.h dllist.h vbi.h cache.h lang.h fdset.h
++ui.o: search.h export.h ui.h
++vbi.o: os.h vt.h misc.h vbi.h dllist.h cache.h lang.h fdset.h hamm.h
++xio.o: vt.h misc.h dllist.h xio.h fdset.h lang.h icon.xbm font.h fontsize.h
+diff -r af23d23c278b util/alevt/README
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/README        Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,72 @@
++Hi,
++
++this software is not just a program, it's moreover a legend.
++It is THE protagonist of all videotext applications under Linux.
++
++During the past 10 years the video standards, the APIs, the kernel
++have seen lots of changes.
++But unfortunately this program has NOT seen much maintenance.
++The results of that misfit appearance are:
++
++1. lots of forks flying around in the Internet
++2. lots of patches flying around, some good, some disgusting, some out of time
++3. lots of cruft which is completely outdated or obsolete for other reasons
++
++To handle all that in one big effort I decided to redesign the program
++completely, enlarging its capabilities for DVB-S at the same time.
++
++So here are the changes:
++
++1. Erasure of old help pages and rename / reorganize / update the rest
++-> redesign of the online help system / implying alevt-date and alevt-cap
++
++2. Erasure of old outdated integers, functions, parameters:
++
++- bell, big_buf, debug, display, editor, erc, fine_tune, newbttv,
++- oldbttv
++
++3. Coding style cleanups (no superfluous comments, not more than
++   80 characters per column, no uncommented code.
++
++4. No strange characters in the outfile, latin alphabet in purity instead.
++
++5. Alevt can be started in 4 modes now if you are running it in DVB mode:
++
++- by service id (sid)
++- by teletext pid (ttpid)
++- by channel name
++- without parameter
++
++6. Starting it in DVB mode on the command line it presents you
++a table with human readable values such as sid, teletext pid,
++PMT (Program Map Table), provider name, service name, language, service type.
++This makes it easier for you to start multiple teletext windows
++in multiple console sessions manually.
++
++If working with a script and the option -o (outfile) you can
++also start multiple teletext windows of all channels in a transponder.
++I develop a GUI using TCL / TK 8.5 and Iwidgets 4.01 to do that and other
++tasks graphically (i. e. by mouse click).
++
++7. If you install the program on the command line by typing "make &
++   make install" there is an uninstaller now to revert the installation:
++   "make uninstall".
++
++ENJOY IT!
++
++Uwe Bugla, February 11th, 2010.
++
++External dependencies
++
++AleVT needs some system libraries to be installed in your system.
++They are zlib, libX11, libpng and libzvbi.
++
++Credits go to:
++- Andreas Rottmann from debian.org for compiler fixes and
++  other kinds of investigation.
++- Francesco Lavra for supplying a kernel patch to avoid kernel demux
++  incompatibilities with kernels >= 2.6.32
++- Andy Walls for helpful investigation in kernelspace
++- Edgar Toernig for providing the source version 1.6.2 and doing all the
++  development for the basic versions
++- Tom Zoerner for the implementation of libzvbi
+diff -r af23d23c278b util/alevt/README.OLD
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/README.OLD    Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,78 @@
++Hi,                                           Menden, 21 Sep 2000
++
++    This program decodes and displays Videotext/Teletext from a
++    /dev/vbi device.
++
++
++COMPILE & INSTALL:
++
++    There's nothing to configure.  A simple 'make' is all.
++    If you do not want png support remove the WITH_PNG in
++    the Makefile.  Additionally, if you want a smaller font
++    uncomment the "FONT=neep9" line.
++
++    It gives you 'alevt', 'alevt-date', and 'alevt-cap' and
++    their man pages 'alevt.1x', 'alevt-date.1', and 'alevt-cap.1'.
++
++    You can install them where ever you want (i.e. /usr/local/bin).
++    The programs are self-contained and require no other files.
++
++    NOTE: Be careful with 'make install'.  It's just for me :-)
++
++
++PROBLEMS:
++
++    If you have a lot of decoding errors (lot of these lightning symbols)
++    you may try pressing the 'f' and 'F' key.  This allows fine tuning of
++    the decoder circuit.  There's also a -finetune command line option.
++    This should only be necessary on really bad signals.
++
++    Maybe, I add autotuning later...
++
++    UPDATE: added autotuning.  It's the default.  If you add -debug the
++    the actions of the pll are printed to stdout.
++
++    To get the old (pre finetune) behaviour start it with -finetune 0.
++
++    UPDATE: disabled autotuning *g*  sometimes it's too jumpy...
++
++
++ALEVT-DATE:
++    I added a little tool to set the system time from the videotext
++    time.  The date is not interpreted (not even transmitted on some
++    channels).  So it allows only adjustment of +/-12 hours.
++    The default allowed adjustment is limited to +/-2 hours (use
++    -delta to change).  Without the -set option it just display
++    the date in the format of the date command.  Look at strftime(3)
++    for possible control sequences you may use in the -format option.
++
++
++HACKING:
++
++    If you want to play with the font size, you may resize it with
++    xv (xv font1.xbm).  Just make sure, that its width is a multiple of
++    32 and its height a multiple of 8.  A simple make will create
++    a version of AleTV with the new font.  Warning: a make clean
++    will erase font1.xbm.  The next make will recreate font.xbm from
++    vtxt.bdf.
++
++    AleVT has a built in page editor.  If you start it with -editor
++    you may press 'E' to invoke it.  For the usage you have to consult
++    the sources.  (It's very crude!)
++
++
++TODO: (no specific order)
++
++    - Error correction in alevt-cap
++    - Better language support.  Internal 16-bit charset.
++    - Separated graphics.
++    - Rewrite the whole stuff.  A networked teletext daemon and clients
++      that connect to it for display, capture, cgi, ...
++
++
++NEWER VERSIONS:
++
++    The primary site of AleVT is http://goron.de/~froese
++
++Have fun,
++Edgar Toernig (froese@gmx.de)
+diff -r af23d23c278b util/alevt/ReadmeGR
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/ReadmeGR      Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,28 @@
++29-9-2003
++
++ÅëëçíéêÜ ãéá ôï ALEVT 
++Ç ðñïóèÞêç Åëëçíéêþí Ýãéíå ôñïðïðïéþíôáò ôï patch alevt-1.6.3.rus.diff ðïõ âñßóêåôå óôï öÜêåëï
++contrib óôá sources  ôïõ alevt-1.6.3
++
++ÎåêéíÞóôå ôï ðñüãñáììá ìå ôçí ðáñÜìåôñï 
++
++alevt -charset iso8859-7 
++
++ç 
++
++alevt -charset el
++
++ÄïõëåéÝò ðïõ Ý÷ïõí íá ãßíïõí:
++Êáëýôåñïò ó÷åäéáóìüò ôïõ font file vtxt-iso8859-7.bdf 
++ïé Áããëéêïß ÷áñáêôÞñåò ìïéÜæïõí óáí bold óå ó÷Ýóç ìå ôïõò Åëëçíéêïýò êáé õðÜñ÷ïõí 
++êÜðïéá ìéêñÜ ðñïâëçìáôÜêéá ìå ôïõò graphics  (0x01 -0x1f)
++
++¸ëåã÷ïò ãéá ôï áí áðåéêïíßæïíôáé óùóôÜ üëïé ïé ÷áñáêôÞñåò
++
++¼ðïéïò èÝëåé íá âïçèÞóåé ðáñáêáëþ íá ìïõ óôåßëåé ôçò áëëáãÝò ôïõ óôï sl45sms@yahoo.gr
++Áí êÜðïéïò êÜíåé åêôåôáìÝíåò áëëáãÝò ðïõ äåí áöïñïýí ôá ÅëëçíéêÜ èá ðñÝðåé íá ôéò óôåßëåé êáé
++óôïí óõããñáöÝá ôïõ ðñïãñÜììáôïò
++
++ÍåüôåñÜ áñ÷åßá ôïõ ðáñüíôïò èá ìðïñåßôå íá âñßóêåôå óôï  http://go.to/sl45sms/alevt/index.html
++
++ÓêáñâÝëçò Ðáíáãéþôçò
+diff -r af23d23c278b util/alevt/TODO
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/TODO  Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,12 @@
++Hi, these are issues that I unfortunately cannot resolve myself:
++
++1. graphical menu written in GKT2, to be used in general connection with
++    the outfile (-o) option.
++
++2. for usage without script and outfile option:
++    DVB monitoring demon helping the program to rewrite the PAT when the
++    external player software has chosen a channel which is part of a
++    new transponder.
++    At the moment alevt hangs when the transponder is changed.
++
++Uwe Bugla, February 11th, 2010.
+diff -r af23d23c278b util/alevt/alevt-cap.1
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/alevt-cap.1   Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,53 @@
++.TH alevt-cap 1 "February 07, 2010"
++.SH NAME
++alevt-cap \- capture teletext windows.
++.SH SYNOPSIS
++.B alevt-cap
++.RI [ options ]
++.br
++.SH DESCRIPTION
++This manual page documents briefly the
++.B alevt-cap
++commands.
++.PP
++\fBalevt-cap\fP is a program to capture teletext pages.
++.SH OPTIONS
++.TP
++.B \-cs -charset <latin-1/2/koi8-r/iso-8859-7>
++character set
++.TP
++.B \-f -format <fmt[,options]>
++format to save
++.TP
++.B \-f help -format help
++lists available storage formats
++.TP
++.B \-h -help
++print this page
++.TP
++.B \-n -name <filename>
++page name to save
++.B \-t -timeout <secs>
++timeout
++.TP
++.B \-s -sid <sid>
++service pid
++.TP
++.B \-t -ttpid <ttpid>
++teletext pid
++.TP
++.B \-v -vbi <vbidev>
++vbi device
++.TP
++Sequence: /dev/vbi; /dev/vbi0; /dev/video0; /dev/dvb/adapter0/demux0
++.TP
++ppp.ss stands for a page number and an optional
++subpage number (example: 123.4).
++.TP
++.SH SEE ALSO
++.BR alevt-date (1) , alevt (1).
++.br
++.SH AUTHOR
++alevt-cap was written by Edgar Toernig <froese@gmx.de>.
++.PP
++This manual page was written by Uwe Bugla <uwe.bugla@gmx.de>.
+diff -r af23d23c278b util/alevt/alevt-cap.c
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/alevt-cap.c   Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,280 @@
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <locale.h>
++#include <signal.h>
++#include <unistd.h>
++#include "vt.h"
++#include "misc.h"
++#include "fdset.h"
++#include "vbi.h"
++#include "lang.h"
++#include "dllist.h"
++#include "export.h"
++
++static volatile int timed_out = 0;
++static char *channel;
++char *outfile = "";
++u_int16_t sid;
++
++
++struct req
++{
++    struct dl_node node[1];
++    char *name; // file name
++    char *pgno_str; // the pgno as given on the cmdline
++    int pgno, subno; // decoded pgno
++    struct export *export; // export data
++    struct vt_page vtp[1]; // the capture page data
++};
++
++
++static void usage(FILE *fp, int exitval)
++{
++    fprintf(fp, "\nUsage: %s [options] ppp.ss...\n", prgname);
++    fprintf(fp,
++          "\n"
++          "  Valid options:\t\tDefault:\n"
++          "    -cs -charset\t\tlatin-1\n"
++          "    <latin-1/2/koi8-r/iso8859-7>\n"
++          "    -f -format <fmt,options>\tascii\n"
++          "    -f help -format help\n"
++          "    -h -help\n"
++          "    -n -name <filename>\t\tttext-%%s.%%e\n"
++          "    -s -sid <sid>\t\t(none;dvb only)\n"
++          "    -to -timeout <secs>\t\t(none)\n"
++          "    -t -ttpid <ttpid>\t\t(none;dvb only)\n"
++          "    -v -vbi <vbidev>\t\t/dev/vbi\n"
++              "                 \t\t/dev/vbi0\n"
++              "                 \t\t/dev/video0\n"
++              "                 \t\t/dev/dvb/adapter0/demux0\n"
++          "\n"
++          "  ppp.ss stands for a page number and an\n"
++          "  optional subpage number (ie 123.4).\n"
++      );
++    exit(exitval);
++}
++
++
++static void exp_help(FILE *fp)
++{
++    struct export_module **ep;
++    char **cp, c;
++
++    fprintf(fp,
++          "\nSyntax: -format Name[,Options]\n"
++          "\n"
++          "    Name\tExt.\tOptions\n"
++          "    --------------------------------\n"
++      );
++    for (ep = modules; *ep; ep++)
++    {
++      fprintf(fp, "    %-7s\t.%-4s", (*ep)->fmt_name, (*ep)->extension);
++      for (c = '\t', cp = (*ep)->options; cp && *cp; cp++, c = ',')
++          fprintf(fp, "%c%s", c, *cp);
++      fprintf(fp, "\n");
++    }
++    fprintf(fp,
++          "\n"
++          "Common options: reveal,hide\n"
++          "Example: -format ansi,reveal,bg=none\n"
++          "\n"
++      );
++    exit(0);
++}
++
++
++static int arg_pgno(char *p, int *subno)
++{
++    char *end;
++    int pgno;
++
++    *subno = ANY_SUB;
++    if (*p)
++    {
++      pgno = strtol(p, &end, 16);
++      if ((*end == ':' || *end == '/' || *end == '.') && end[1])
++          *subno = strtol(end + 1, &end, 16);
++      if (*end == 0)
++          if (pgno >= 0x100 && pgno <= 0x899)
++              if (*subno == ANY_SUB || (*subno >= 0x00 && *subno <= 0x3f7f))
++                  return pgno;
++    }
++    fatal("%s: invalid page number", p);
++}
++
++
++static int option(int argc, char **argv, int *ind, char **arg)
++{
++    static struct { char *nam, *altnam; int arg; } opts[] = {
++      { "-charset", "-cs", 1 },
++      { "-format", "-f", 1 },
++      { "-help", "-h", 0 },
++      { "-name", "-n", 1 },
++      { "-sid", "-s", 1 },
++      { "-timeout", "-to", 1 },
++      { "-ttpid", "-t", 1 },
++      { "-vbi", "-v", 1 },
++    };
++    int i;
++
++    if (*ind >= argc)
++      return 0;
++
++    *arg = argv[(*ind)++];
++    for (i = 0; i < NELEM(opts); ++i)
++      if (streq(*arg, opts[i].nam) || streq(*arg, opts[i].altnam))
++      {
++          if (opts[i].arg)
++              if (*ind < argc)
++                  *arg = argv[(*ind)++];
++              else
++                  fatal("option %s requires an argument", *arg);
++          return i+1;
++      }
++
++    if (**arg == '-')
++    {
++      fatal("%s: invalid option", *arg);
++      usage(stderr, 2);
++    }
++
++    return -1;
++}
++
++
++static void event(struct dl_head *reqs, struct vt_event *ev)
++{
++    struct req *req, *nxt;
++
++    switch (ev->type)
++    {
++      case EV_PAGE: // new page
++      {
++          struct vt_page *vtp = ev->p1;
++
++          for (req = PTR reqs->first; nxt = PTR req->node->next; req = nxt)
++              if (req->pgno == vtp->pgno)
++                  if (req->subno == ANY_SUB || req->subno == vtp->subno)
++                  {
++                      *req->vtp = *vtp;
++                      dl_insert_last(reqs + 1, dl_remove(req->node));
++          }
++      }
++    }
++}
++
++
++int main(int argc, char **argv)
++{
++    char *vbi_name = NULL;
++    int timeout = 0;
++    char *fname = "ttext-%s.%e";
++    char *out_fmt = "ascii";
++    struct export *fmt = 0;
++    int opt, ind;
++    char *arg;
++    struct vbi *vbi;
++    struct req *req;
++    struct dl_head reqs[2]; // simple linear lists of requests & captures
++    int ttpid = -1;
++
++    setlocale (LC_CTYPE, "");
++    setprgname(argv[0]);
++
++    fdset_init(fds);
++    dl_init(reqs); // the requests
++    dl_init(reqs+1); // the captured pages
++
++    ind = 1;
++    while (opt = option(argc, argv, &ind, &arg))
++      switch (opt)
++      {
++            case 1: // charset
++              if (streq(arg, "latin-1") || streq(arg, "1"))
++                  latin1 = 1;
++              else if (streq(arg, "latin-2") || streq(arg, "2"))
++                  latin1 = 0;
++              else if (streq(arg, "koi8-r") || streq(arg, "koi"))
++                  latin1 = KOI8;
++              else if (streq(arg, "iso8859-7") || streq(arg, "el"))
++                  latin1 = GREEK;
++              else
++                  fatal("bad charset (not latin-1/2/koi8-r/iso8859-7)");
++              break;
++          case 2: // format
++              if (streq(arg, "help") || streq(arg, "?") || streq(arg, "list"))
++                  exp_help(stdout);
++              out_fmt = arg;
++              fmt = 0;
++              break;
++          case 3: // help
++              usage(stdout, 0);
++              break;
++          case 4: // name
++              fname = arg;
++              break;
++          case 5: // timeout
++              timeout = strtol(arg, 0, 10);
++              if (timeout < 1 || timeout > 999999)
++              fatal("bad timeout value", timeout);
++              break;
++          case 6: // service id
++              sid = strtoul(arg, NULL, 0);
++              break;
++          case 7: // teletext pid
++              ttpid = strtoul(arg, NULL, 0);
++              break;
++          case 8: // vbi
++              vbi_name = arg;
++              break;
++          case -1: // non-option arg
++              if (not fmt)
++              fmt = export_open(out_fmt);
++              if (not fmt)
++              fatal("%s", export_errstr());
++              if (not(req = malloc(sizeof(*req))))
++              out_of_mem(sizeof(*req));
++              req->name = fname;
++              req->pgno_str = arg;
++              req->pgno = arg_pgno(arg, &req->subno);
++              req->export = fmt;
++              dl_insert_last(reqs, req->node);
++              break;
++      }
++
++    if (dl_empty(reqs))
++      fatal("no pages requested");
++
++    // setup device
++    if (not(vbi = vbi_open(vbi_name, 0, channel, outfile, sid, ttpid)))
++      fatal("cannot open %s", vbi_name);
++    vbi_add_handler(vbi, event, reqs); // register event handler
++
++    if (timeout)
++      alarm(timeout);
++
++    // capture pages (moves requests from reqs[0] to reqs[1])
++    while (not dl_empty(reqs) && not timed_out)
++      if (fdset_select(fds, 30000) == 0) // 30sec select time out
++      {
++          error("no signal.");
++          break;
++      }
++
++    alarm(0);
++    vbi_del_handler(vbi, event, reqs);
++    vbi_close(vbi);
++    if (not dl_empty(reqs))
++      error("capture aborted. Some pages are missing.");
++
++    for (req = PTR reqs[1].first; req->node->next; req = PTR req->node->next)
++    {
++      fname = export_mkname(req->export, req->name, req->vtp, req->pgno_str);
++      if (not fname || export(req->export, req->vtp, fname))
++          error("error saving page %s: %s", req->pgno_str, export_errstr());
++      if (fname)
++          free(fname);
++    }
++    exit(dl_empty(reqs) ? 0 : 1);
++}
+diff -r af23d23c278b util/alevt/alevt-date.1
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/alevt-date.1  Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,41 @@
++.TH alevt-date 1 "February 07, 2010"
++.SH NAME
++alevt-date \- print out UTC date.
++.SH SYNOPSIS
++.B alevt-date
++.RI [ options ]
++.br
++.SH DESCRIPTION
++This manual page documents briefly the
++.B alevt-date
++commands.
++.PP
++\fBalevt-date\fP is a program to print the UTC date.
++.SH OPTIONS
++.TP
++.B \-d -delta <max_secs>
++maximum delta
++.TP
++.B \-f -format <fmtstr>
++time format
++.TP
++.B \-h -help
++print this page
++.TP
++.B \-s -set
++set the system clock
++.TP
++.B \-t -timeout <seconds>
++timeout
++.TP
++.B \-v -vbi <vbidev>
++vbi device /dev/vbi; /dev/vbi0; /dev/video0; /dev/dvb/adapter0/demux0
++.TP
++.br
++.SH SEE ALSO
++.BR alevt-cap (1) , alevt (1).
++.br
++.SH AUTHOR
++alevt-date was written by Edgar Toernig <froese@gmx.de>.
++.PP
++This manual page was written by Uwe Bugla <uwe.bugla@gmx.de>.
+diff -r af23d23c278b util/alevt/alevt-date.c
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/alevt-date.c  Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,225 @@
++#include <stdio.h>
++#include <string.h>
++#include <sys/time.h>
++#include <time.h>
++#include <stdlib.h>
++#include <unistd.h>
++#include <signal.h>
++#include "os.h"
++#include "vt.h"
++#include "fdset.h"
++#include "vbi.h"
++#include "lang.h"
++#include "misc.h"
++
++char *fmt = "%a %b %d %H:%M:%S %Z %Y";
++int max_diff = 2*60*60; // default: 2 hours
++int set_time = 0;
++char *outfile = "";
++static char *channel;
++u_int16_t sid;
++
++
++static void chk_time(int t)
++{
++    struct tm *tm;
++    time_t sys_t;
++    int dt;
++    char buf[256];
++
++    if (t < 0 || t > 235959 || t%100 > 59 || t/100%100 > 59)
++    return;
++
++    sys_t = time(0);
++    tm = localtime(&sys_t);
++
++    // Now convert to UTC seconds
++    t = t/100/100 * 60*60 + t/100%100 * 60 + t%100;
++#ifdef BSD
++    t -= tm->tm_gmtoff; // dst already included...
++#else
++    t += timezone;
++    if (tm->tm_isdst)
++      t -= 60*60;
++#endif
++
++    dt = t - sys_t % (24*60*60);
++    if (dt <= -12*60*60)
++      dt += 24*60*60;
++
++    if (dt <= -max_diff || dt >= max_diff)
++      fatal("time diff too big (%2d:%02d:%02d)", dt/60/60, abs(dt)/60%60, abs(dt)%60);
++
++    sys_t += dt;
++
++    if (set_time)
++    {
++      struct timeval tv[1];
++
++      tv->tv_sec = sys_t;
++      tv->tv_usec = 500000;
++      if (settimeofday(tv, 0) == -1)
++          ioerror("settimeofday");
++    }
++    if (*fmt)
++    {
++      tm = localtime(&sys_t);
++      if (strftime(buf, sizeof(buf), fmt, tm))
++          puts(buf);
++    }
++    exit(0);
++}
++
++
++static void event(void *_, struct vt_event *ev)
++{
++    switch (ev->type)
++    {
++      /* vbi may generate EV_PAGE, EV_HEADER, EV_XPACKET */
++      /* for event arguments see vt.h */
++
++      case EV_HEADER: // a new title line (for running headers)
++      {
++          static int last_t = -1;
++          u8 *s = ev->p1;
++          int i, t = 1;
++
++          if (ev->i2 & PG_OUTOFSEQ)
++              break;
++
++          for (i = 32; i < 40; ++i)
++              if (s[i] >= '0' && s[i] <= '9')
++                  t = t * 10+ s[i] - '0';
++          if (t >= 1000000 && t <= 1235959)
++              if (t == last_t || t - last_t == 1)
++                  chk_time(t - 1000000);
++          last_t = t;
++          break;
++      }
++    }
++}
++
++
++static void usage(FILE *fp, int exit_val)
++{
++    fprintf(fp, "usage: %s [options]\n", prgname);
++    fprintf(fp,
++          "\n"
++          "  Valid options:\t\tDefault:\n"
++          "    -d -delta <max_secs>\t7200 (2 hours)\n"
++          "    -f -format <fmtstr>\t\t%%c\n"
++          "    -h -help\n"
++          "    -s -set\t\t\toff\n"
++          "    -to -timeout <seconds>\t(none)\n"
++          "    -v -vbi <vbidev>\t\t/dev/vbi\n"
++              "                 \t\t/dev/vbi0\n"
++              "                 \t\t/dev/video0\n"
++              "                 \t\t/dev/dvb/adapter0/demux0\n"
++          );
++    exit(exit_val);
++}
++
++
++static int option(int argc, char **argv, int *ind, char **arg)
++{
++    static struct { char *nam, *altnam; int arg; } opts[] = {
++      { "-delta", "-d", 1 },
++      { "-format", "-f", 1 },
++      { "-help", "-h", 0 },
++      { "-set", "-s", 0 },
++      { "-timeout", "-to", 1 },
++      { "-vbi", "-v", 1 },
++    };
++    int i;
++
++    if (*ind >= argc)
++      return 0;
++
++    *arg = argv[(*ind)++];
++    for (i = 0; i < NELEM(opts); ++i)
++      if (streq(*arg, opts[i].nam) || streq(*arg, opts[i].altnam))
++      {
++          if (opts[i].arg)
++              if (*ind < argc)
++                  *arg = argv[(*ind)++];
++              else
++                  fatal("option %s requires an argument", *arg);
++          return i+1;
++      }
++
++    if (**arg == '-')
++    {
++      fatal("%s: invalid option", *arg);
++      usage(stderr, 1);
++    }
++
++    return -1;
++}
++
++
++int main(int argc, char **argv)
++{
++    char *vbi_name = NULL;
++    int timeout = 0;
++    struct vbi *vbi;
++    int opt, ind;
++    char *arg;
++    int ttpid = -1;
++
++    setprgname(argv[0]);
++    ind = 1;
++    while (opt = option(argc, argv, &ind, &arg))
++      switch (opt)
++      {
++          case 1: // -delta
++              max_diff = atoi(arg);
++              if (max_diff < 1)
++                  fatal("-delta: illegal value '%s'", arg);
++              if (max_diff > 12*60*60)
++              {
++                  max_diff = 12*60*60;
++                  error("-delta: %d too big. Assuming %d", arg, max_diff);
++              }
++              break;
++          case 2: // -format
++              fmt = arg;
++              break;
++          case 3: // help
++              usage(stdout, 0);
++              break;
++          case 4: // -set
++              set_time = 1;
++              break;
++          case 5: // -timeout
++              timeout = atoi(arg);
++              if (timeout < 1 || timeout > 60*60)
++                  fatal("-timeout: illegal value '%s'", arg);
++              break;
++          case 6: // -vbi
++              vbi_name = arg;
++              break;
++          case -1:
++              usage(stderr, 1);
++              break;
++      }
++
++    fdset_init(fds);
++
++    if (timeout)
++    {
++      signal(SIGALRM, SIG_DFL); // kill me
++      alarm(timeout);
++    }
++    vbi = vbi_open(vbi_name, 0, channel, outfile, sid, ttpid); // open device
++    if (not vbi)
++      fatal_ioerror(vbi_name);
++    vbi_add_handler(vbi, event, 0); // register event handler
++
++    for (;;)
++      fdset_select(fds, -1); // call scheduler
++
++    /* never reached */
++    vbi_del_handler(vbi, event, 0);
++    vbi_close(vbi);
++    exit(0);
++}
+diff -r af23d23c278b util/alevt/alevt.1
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/alevt.1       Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,60 @@
++.TH alevt 1 "February 07, 2010"
++.SH NAME
++alevt \- a teletext browser for analogue and DVB channels.
++.SH SYNOPSIS
++.B alevt
++.RI [ options ]
++.br
++.SH DESCRIPTION
++This manual page documents briefly the
++.B alevt
++commands.
++.PP
++\fBalevt\fP is a program to read teletext from analogue or DVB channels.
++.SH OPTIONS
++.TP
++.B \-c <channel>
++channel name (dvb only)
++.TP
++.B \-ch -child <ppp.ss>
++child window
++.TP
++.B \-cs -charset <latin-1/2/koi8-r/iso8859-7>
++character set
++.TP
++.B \-h -help
++print this page
++.TP
++.B \-o <outfile>
++path + file for all services (dvb only)
++.TP
++.B \-p -parent <ppp.ss>
++parent window
++.TP
++.B \-s -sid <sid>
++service id (dvb only)
++.TP
++.B \-t -ttpid <ttpid>
++teletext pid (dvb only)
++.TP
++.B \-v -vbi <vbidev>
++vbi device
++.TP
++Sequence: /dev/vbi; /dev/vbi0; /dev/video0; /dev/dvb/adapter0/demux0
++.TP
++Order is important! Each page number opens a new window
++with the previously given geometry, device, and display.
++.TP
++ppp.ss stands for a page number and an optional
++subpage number (example: 123.4).
++.TP
++The -child option requires a parent window. So it must
++be preceded by a parent or another child window.
++.TP
++.SH SEE ALSO
++.BR alevt-cap (1), alevt-date (1).
++.br
++.SH AUTHOR
++alevt was written by Edgar Toernig <froese@gmx.de>.
++.PP
++This manual page was written by Uwe Bugla <uwe.bugla@gmx.de>.
+diff -r af23d23c278b util/alevt/alevt.desktop
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/alevt.desktop Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,9 @@
++[Desktop Entry]
++Encoding=UTF-8
++Name=alevt
++Comment=Teletext Browser
++Exec=alevt
++Icon=alevt
++Terminal=false
++Type=Application
++Categories=GNOME;GTK;AudioVideo;Video;
+diff -r af23d23c278b util/alevt/bdf2xbm.c
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/bdf2xbm.c     Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,212 @@
++/*
++    Simple program to convert a bdf-font to a bitmap.
++    The characters are arranged in a 32x8 matrix.
++    usage: bdf2xbm [identifier] <bdf >xbm
++    Copyright 1998,1999 by E. Toernig (froese@gmx.de)
++*/
++
++#include <stdio.h>
++#include <string.h>
++#include <stdlib.h>
++#include <ctype.h>
++#include <stdarg.h>
++
++#define not !
++#define streq(a,b) (strcmp((a),(b)) == 0)
++
++int lineno;
++char *word[64];
++int nword;
++
++char *font = "font%dx%d";
++int w, h, bpl;
++unsigned char *bmap;
++
++
++static void error(char *fmt, ...)
++{
++    va_list args;
++
++    va_start(args, fmt);
++    fprintf(stderr, "bdf2xbm");
++    if (lineno)
++      fprintf(stderr, ":%d", lineno);
++    fprintf(stderr, ": ");
++    vfprintf(stderr, fmt, args);
++    fputc('\n', stderr);
++    exit(1);
++}
++
++
++static int nextline()
++{
++    static char buf[256];
++    char *p;
++    int i;
++
++    do
++    {
++      nword = 0;
++      if (fgets(buf, sizeof(buf), stdin) == 0)
++          return nword;
++      lineno++;
++      
++      p = buf;
++      for (;;)
++      {
++          while (isspace(*p))
++              p++;
++          if (*p == 0)
++              break;
++          word[nword++] = p;
++          while (*p && not isspace(*p))
++              *p = toupper(*p), p++;
++          if (*p == 0)
++              break;
++          *p++ = 0;
++      }
++    } while (nword == 0);
++
++    for (i = nword; i < 64; ++i)
++      word[i] = "";
++    return nword;
++}
++
++
++static inline void setbit(int ch, int x, int y)
++{
++
++    int yo = ch / 32 * h + y;
++    int xo = ch % 32 * w + x;
++
++    bmap[yo * bpl + xo / 8] |= 1 << (xo % 8);
++}
++
++
++static void dobitmap(int ch, int x, int y)
++{
++    int i, j;
++
++    for (i = 0; i < y; ++i)
++    {
++      nextline();
++      if (nword > 1 || strlen(word[0]) != (x + 7) / 8 * 2)
++          error("bad BITMAP");
++      for (j = 0; j < x; ++j)
++      {
++          int c = word[0][j / 4];
++          if (c >= '0' && c <= '9')
++              c -= '0';
++          else if (c >= 'A' && c <= 'F')
++              c -= 'A' - 10;
++          else
++              error("bad hexchar in BITMAP");
++          if (c & (8 >> (j % 4)))
++              setbit(ch, j, i);
++      }
++    }
++}
++
++
++static void dochar()
++{
++    int ch = -1, x = -1,  y = -1;
++
++    while (nextline())
++    {
++      if (streq(word[0], "ENDCHAR"))
++          return;
++      else if (streq(word[0], "ENCODING") && nword == 2)
++      {
++          ch = atoi(word[1]);
++          if (ch < 0 || ch > 255)
++              error("bad character code %d", ch);
++      }
++      else if (streq(word[0], "BBX") && nword == 5)
++      {
++          x = atoi(word[1]), y = atoi(word[2]);
++          if (x < 1 || x > 64 || y < 1 || y > 64)
++              error("bad BBX (%dx%d)", x, y);
++      }
++      else if (streq(word[0], "BITMAP"))
++      {
++          if (x < 0)
++              error("missing BBX");
++          if (ch < 0)
++              error("missing ENDCODING");
++          dobitmap(ch, x, y);
++      }
++    }
++    error("unexpected EOF (missing ENDCHAR)");
++}
++
++
++static void dofile()
++{
++    lineno = 0;
++    w = h = 0;
++    bmap = 0;
++
++    nextline();
++    if (nword != 2 || not streq(word[0], "STARTFONT"))
++      error("not a bdf-file");
++
++    while (nextline())
++    {
++      if (streq(word[0], "ENDFONT"))
++          return;
++      else if (streq(word[0], "FONTBOUNDINGBOX") && nword == 5)
++      {
++          if (bmap)
++              error("multiple FONTBOUNDINGBOXes!?!");
++          w = atoi(word[1]), h = atoi(word[2]);
++          if (w < 1 || w > 64 || h < 1 || h > 64)
++              error("bad bounding box %dx%d\n", w, h);
++          bpl = (w*32+7)/8; // rounding is unnecessary
++          bmap = calloc(1, bpl * h*8);
++          if (bmap == 0)
++              error("out of memory");
++      }
++      else if (streq(word[0], "STARTCHAR"))
++      {
++          if (not bmap)
++              error("no FONTBOUNDINGBOX");
++          dochar();
++      }
++    }
++    error("unexpected EOF (missing ENDFONT)");
++}
++
++
++static void writexbm()
++{
++    char buf[256];
++    int i, j;
++    unsigned char *p = bmap;
++
++    if (not bmap)
++      return;
++
++    sprintf(buf, font, w, h);
++
++    printf("#define %s_width %d\n", buf, 32 * w);
++    printf("#define %s_height %d\n", buf, 8 * h);
++    printf("static unsigned char %s_bits[] = {\n", buf);
++    for (i = 0; i < 16 * h * w / 8; ++i)
++    {
++      for (j = 0; j < 16; ++j)
++          printf("0x%02x,", *p++);
++      printf("\n");
++    }
++    printf("};\n");
++}
++
++
++int main(int argc, char **argv)
++{
++    if (argc > 1)
++      font = argv[1];
++    dofile();
++    writexbm();
++    exit(0);
++}
+diff -r af23d23c278b util/alevt/cache.c
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/cache.c       Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,229 @@
++#include <stdlib.h>
++#include <string.h>
++#include "misc.h"
++#include "dllist.h"
++#include "cache.h"
++#include "help.h"
++
++
++static inline int hash(int pgno)
++{
++    // very simple...
++    return pgno % HASH_SIZE;
++}
++
++
++static void do_erc(struct vt_page *ovtp, struct vt_page *nvtp)
++{
++    int l, c;
++
++    if (nvtp->errors == 0 && ovtp->lines == nvtp->lines)
++      return;
++
++    for (l = 0; l < H; ++l)
++    {
++      if (~nvtp->lines & (1 << l))
++          memcpy(nvtp->data[l], ovtp->data[l], W);
++      else if (ovtp->lines & (1 << l))
++          for (c = 0; c < W; ++c)
++              if (nvtp->data[l][c] == BAD_CHAR)
++                  nvtp->data[l][c] = ovtp->data[l][c];
++    }
++    nvtp->lines |= ovtp->lines;
++}
++
++
++static void cache_close(struct cache *ca)
++{
++    struct cache_page *cp;
++    int i;
++
++    for (i = 0; i < HASH_SIZE; ++i)
++      while (not dl_empty(ca->hash + i))
++      {
++          cp = PTR ca->hash[i].first;
++          dl_remove(cp->node);
++          free(cp);
++      }
++    free(ca);
++}
++
++
++static void cache_reset(struct cache *ca)
++{
++    struct cache_page *cp, *cpn;
++    int i;
++
++    for (i = 0; i < HASH_SIZE; ++i)
++      for (cp = PTR ca->hash[i].first; cpn = PTR cp->node->next; cp = cpn)
++          if (cp->page->pgno / 256 != 9) // don't remove help pages
++          {
++              dl_remove(cp->node);
++              free(cp);
++              ca->npages--;
++          }
++    memset(ca->hi_subno, 0, sizeof(ca->hi_subno[0]) * 0x900);
++}
++
++/*  Get a page from the cache.
++    If subno is SUB_ANY, the newest subpage of that page is returned */
++
++
++static struct vt_page * cache_get(struct cache *ca, int pgno, int subno)
++{
++    struct cache_page *cp;
++    int h = hash(pgno);
++
++    for (cp = PTR ca->hash[h].first; cp->node->next; cp = PTR cp->node->next)
++      if (cp->page->pgno == pgno)
++          if (subno == ANY_SUB || cp->page->subno == subno)
++          {
++              // found, move to front (make it 'new')
++              dl_insert_first(ca->hash + h, dl_remove(cp->node));
++              return cp->page;
++          }
++    return 0;
++}
++
++/*  Put a page in the cache.
++    If it's already there, it is updated. */
++
++
++static struct vt_page * cache_put(struct cache *ca, struct vt_page *vtp)
++{
++    struct cache_page *cp;
++    int h = hash(vtp->pgno);
++    
++    for (cp = PTR ca->hash[h].first; cp->node->next; cp = PTR cp->node->next)
++      if (cp->page->pgno == vtp->pgno && cp->page->subno == vtp->subno)
++          break;
++
++    if (cp->node->next)
++    {
++      // move to front.
++      dl_insert_first(ca->hash + h, dl_remove(cp->node));
++      if (ca->erc)
++          do_erc(cp->page, vtp);
++    }
++    else
++    {
++      cp = malloc(sizeof(*cp));
++      if (cp == 0)
++          return 0;
++      if (vtp->subno >= ca->hi_subno[vtp->pgno])
++          ca->hi_subno[vtp->pgno] = vtp->subno + 1;
++      ca->npages++;
++      dl_insert_first(ca->hash + h, cp->node);
++    }
++
++    *cp->page = *vtp;
++    return cp->page;
++}
++
++/* Same as cache_get but doesn't make the found entry new */
++
++
++static struct vt_page * cache_lookup(struct cache *ca, int pgno, int subno)
++{
++    struct cache_page *cp;
++    int h = hash(pgno);
++
++    for (cp = PTR ca->hash[h].first; cp->node->next; cp = PTR cp->node->next)
++      if (cp->page->pgno == pgno)
++          if (subno == ANY_SUB || cp->page->subno == subno)
++              return cp->page;
++    return 0;
++}
++
++
++static struct vt_page * cache_foreach_pg(struct cache *ca, int pgno, int subno,
++    int dir, int (*func)(), void *data)
++{
++    struct vt_page *vtp, *s_vtp = 0;
++
++    if (ca->npages == 0)
++      return 0;
++
++    if (vtp = cache_lookup(ca, pgno, subno))
++      subno = vtp->subno;
++    else if (subno == ANY_SUB)
++      subno = dir < 0 ? 0 : 0xffff;
++
++    for (;;)
++    {
++      subno += dir;
++      while (subno < 0 || subno >= ca->hi_subno[pgno])
++      {
++          pgno += dir;
++          if (pgno < 0x100)
++              pgno = 0x9ff;
++          if (pgno > 0x9ff)
++              pgno = 0x100;
++          subno = dir < 0 ? ca->hi_subno[pgno] - 1 : 0;
++      }
++      if (vtp = cache_lookup(ca, pgno, subno))
++      {
++          if (s_vtp == vtp)
++              return 0;
++          if (s_vtp == 0)
++              s_vtp = vtp;
++          if (func(data, vtp))
++              return vtp;
++      }
++    }
++}
++
++
++static int cache_mode(struct cache *ca, int mode, int arg)
++{
++    int res = -1;
++
++    switch (mode)
++    {
++      case CACHE_MODE_ERC:
++          res = ca->erc;
++          ca->erc = arg ? 1 : 0;
++          break;
++    }
++    return res;
++}
++
++
++static struct cache_ops cops =
++{
++    cache_close,
++    cache_get,
++    cache_put,
++    cache_reset,
++    cache_foreach_pg,
++    cache_mode,
++};
++
++
++struct cache * cache_open(void)
++{
++    struct cache *ca;
++    struct vt_page *vtp;
++    int i;
++
++    if (not(ca = malloc(sizeof(*ca))))
++      goto fail1;
++
++    for (i = 0; i < HASH_SIZE; ++i)
++      dl_init(ca->hash + i);
++
++    memset(ca->hi_subno, 0, sizeof(ca->hi_subno));
++    ca->erc = 1;
++    ca->npages = 0;
++    ca->op = &cops;
++
++    for (vtp = help_pages; vtp < help_pages + nr_help_pages; vtp++)
++      cache_put(ca, vtp);
++
++    return ca;
++
++fail2:
++    free(ca);
++fail1:
++    return 0;
++}
+diff -r af23d23c278b util/alevt/cache.h
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/cache.h       Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,41 @@
++#ifndef CACHE_H
++#define CACHE_H
++
++#include "vt.h"
++#include "misc.h"
++#include "dllist.h"
++
++#define HASH_SIZE 113
++
++
++struct cache
++{
++    struct dl_head hash[HASH_SIZE];
++    int erc; // error reduction circuit on
++    int npages;
++    u16 hi_subno[0x9ff + 1]; // 0:pg not in cache, 1-3f80:highest subno + 1
++    struct cache_ops *op;
++};
++
++
++struct cache_page
++{
++    struct dl_node node[1];
++    struct vt_page page[1];
++};
++
++
++struct cache_ops
++{
++    void (*close)(struct cache *ca);
++    struct vt_page *(*get)(struct cache *ca, int pgno, int subno);
++    struct vt_page *(*put)(struct cache *ca, struct vt_page *vtp);
++    void (*reset)(struct cache *ca);
++    struct vt_page *(*foreach_pg)(struct cache *ca, int pgno, int subno, int dir,
++    int (*func)(), void *data);
++    int (*mode)(struct cache *ca, int mode, int arg);
++};
++
++struct cache *cache_open(void);
++#define CACHE_MODE_ERC 1
++#endif
+diff -r af23d23c278b util/alevt/dllist.h
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/dllist.h      Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,55 @@
++#ifndef DLLIST_H
++#define DLLIST_H
++
++
++struct dl_node
++{
++    struct dl_node *next;
++    struct dl_node *prev;
++};
++
++
++struct dl_head
++{
++    struct dl_node *first;
++    struct dl_node *null;
++    struct dl_node *last;
++};
++
++
++static inline struct dl_head * dl_init(struct dl_head *h)
++{
++    h->first = (struct dl_node *)&h->null;
++    h->null = 0;
++    h->last = (struct dl_node *)&h->first;
++    return h;
++}
++
++
++static inline struct dl_node * dl_remove(struct dl_node *n)
++{
++    n->prev->next = n->next;
++    n->next->prev = n->prev;
++    return n;
++}
++
++
++static inline struct dl_node *
++    dl_insert_after(struct dl_node *p, struct dl_node *n)
++{
++    n->next = p->next;
++    n->prev = p;
++    p->next = n;
++    n->next->prev = n;
++    return n;
++}
++
++#define dl_empty(h)             ((h)->first->next == 0)
++#define dl_insert_before(p, n)  dl_insert_after((p)->prev, (n))
++#define dl_insert_first(h, n)   ({ struct dl_node *_n = (n); \
++                                      dl_insert_before((h)->first, _n); })
++#define dl_insert_last(h, n)    ({ struct dl_node *_n = (n); \
++                                      dl_insert_after((h)->last, _n); })
++#define dl_remove_first(h)      dl_remove((h)->first) // mustn't be empty!
++#define dl_remove_last(h)       dl_remove((h)->last) // mustn't be empty!
++#endif
+diff -r af23d23c278b util/alevt/exp-gfx.c
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/exp-gfx.c     Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,258 @@
++/* Copyright 1999 by Paul Ortyl <ortylp@from.pl> */
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include "lang.h"
++#include "export.h"
++#include "font.h"
++#define WW (W*CW) /* pixel width of window */
++#define WH (H*CH) /* pixel hegiht of window */
++
++
++static inline void draw_char(unsigned char * colour_matrix, int fg, int bg,
++    int c, int dbl, int _x, int _y, int sep)
++{
++  int x,y;
++  unsigned char* src= (latin1==LATIN1 ? font1_bits : font2_bits);
++  int dest_x=_x*CW;
++  int dest_y=_y*CH;
++      
++  for(y=0;y<(CH<<dbl); y++)
++    {
++      for(x=0;x<CW; x++)
++      {
++        int bitnr, bit, maskbitnr, maskbit;
++        bitnr=(c/32*CH + (y>>dbl))*CW*32+ c%32*CW +x;
++        bit=(*(src+bitnr/8))&(1<<bitnr%8);
++        if (sep)
++          {
++            maskbitnr=(0xa0/32*CH + (y>>dbl))*CW*32+ 0xa0%32*CW +x;
++            maskbit=(*(src+maskbitnr/8))&(1<<maskbitnr%8);
++            *(colour_matrix+WW*(dest_y+y)+dest_x+x)=
++              (char)((bit && (!maskbit)) ? fg : bg);
++          }
++        else 
++          *(colour_matrix+WW*(dest_y+y)+dest_x+x)=
++            (char)(bit ? fg : bg);
++      }
++    }
++  return;
++}
++
++
++static void prepare_colour_matrix(/*struct export *e,*/
++                    struct fmt_page *pg, 
++                    unsigned char *colour_matrix)
++{
++   int x, y;
++   for (y = 0; y < H; ++y)
++      {
++        for (x = 0; x < W; ++x)
++          { 
++            if (pg->dbl & (1<<(y-1)))
++              {
++                if (pg->data[y-1][x].attr & EA_HDOUBLE)
++                   draw_char(colour_matrix, pg->data[y][x].fg, 
++                          pg->data[y][x].bg, pg->data[y][x].ch, 
++                          (0), 
++                          x, y, 
++                          ((pg->data[y][x].attr & EA_SEPARATED) ? 1 : 0)
++                          );
++              }
++            else
++              {
++                draw_char(colour_matrix, pg->data[y][x].fg, 
++                          pg->data[y][x].bg, pg->data[y][x].ch, 
++                          ((pg->data[y][x].attr & EA_DOUBLE) ? 1 : 0), 
++                          x, y, 
++                          ((pg->data[y][x].attr & EA_SEPARATED) ? 1 : 0)
++                          );
++              }
++          }
++      }
++    return;
++}
++
++
++static int ppm_output(struct export *e, char *name, struct fmt_page *pg);
++
++struct export_module export_ppm = // exported module definition
++{
++    "ppm",                    // id
++    "ppm",                    // extension
++    0,                                // options
++    0,                                // size
++    0,                                // open
++    0,                                // close
++    0,                                // option
++    ppm_output                        // output
++};
++
++
++static int ppm_output(struct export *e, char *name, struct fmt_page *pg)
++{
++  FILE *fp;
++  long n;
++  static u8 rgb1[][3]={{0,0,0},
++                    {1,0,0},
++                    {0,1,0},
++                    {1,1,0},
++                    {0,0,1},
++                    {1,0,1},
++                    {0,1,1},
++                    {1,1,1}};
++  unsigned char *colour_matrix;
++
++  if (!(colour_matrix=malloc(WH*WW))) 
++    {
++      export_error("cannot allocate memory");
++      return 0;
++    }
++
++  prepare_colour_matrix(/*e,*/ pg, (unsigned char *)colour_matrix); 
++  if (not(fp = fopen(name, "w")))
++    {
++      free(colour_matrix);
++      export_error("cannot create file");
++      return -1;
++    }
++  fprintf(fp,"P6 %d %d 1\n", WW, WH);
++
++  for(n=0;n<WH*WW;n++)
++    {
++      if (!fwrite(rgb1[(int) *(colour_matrix+n)], 3, 1, fp))
++      {
++        export_error("error while writting to file");
++        free(colour_matrix);
++        fclose(fp);
++        return -1;
++      }
++    }
++  free(colour_matrix);
++  fclose(fp);
++  return 0;
++}
++
++
++#ifdef WITH_PNG
++
++#include <png.h>
++static int png_open(struct export *e);
++static int png_option(struct export *e, int opt, char *arg);
++static int png_output(struct export *e, char *name, struct fmt_page *pg);
++static char *png_opts[] =     // module options
++{
++    "compression=<0-9>",      // set compression level
++    0
++};
++
++struct png_data                       // private data in struct export
++{
++    int compression;
++};
++
++struct export_module export_png =     // exported module definition
++{
++    "png",                    // id
++    "png",                    // extension
++    png_opts,                 // options
++    sizeof(struct png_data),  // size
++    png_open,                 // open
++    0,                                // close
++    png_option,                       // option
++    png_output                        // output
++};
++
++#define D  ((struct png_data *)e->data)
++
++
++static int png_open(struct export *e)
++{
++    D->compression = Z_DEFAULT_COMPRESSION;
++    return 0;
++}
++
++
++static int png_option(struct export *e, int opt, char *arg)
++{
++    switch (opt)
++    {
++      case 1: // compression=
++          if (*arg >= '0' && *arg <= '9')
++              D->compression = *arg - '0';
++          break;
++    }
++    return 0;
++}
++
++
++static int png_output(struct export *e, char *name, struct fmt_page *pg)
++{
++  FILE *fp;
++  int x;
++  png_structp png_ptr;
++  png_infop info_ptr;
++  png_byte *row_pointers[WH];
++  static u8 rgb8[][3]={{  0,  0,  0},
++                    {255,  0,  0},
++                    {  0,255,  0},
++                    {255,255,  0},
++                    {  0,  0,255},
++                    {255,  0,255},
++                    {  0,255,255},
++                    {255,255,255}};
++  unsigned char *colour_matrix;
++
++  if (!(colour_matrix=malloc(WH*WW))) 
++    {
++      export_error("cannot allocate memory");
++      return -1;
++    }
++  prepare_colour_matrix(/*e,*/ pg, (unsigned char *)colour_matrix); 
++  if (not(fp = fopen(name, "w")))
++    {
++      free(colour_matrix);
++      export_error("cannot create file");
++      return -1;
++      }
++  png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, 
++                                  NULL, NULL, NULL);
++  if (!png_ptr)
++    {
++      free(colour_matrix);
++      fclose(fp);
++      export_error("libpng init error");
++      return -1;
++    }
++  info_ptr = png_create_info_struct(png_ptr);
++  if (!info_ptr)
++    {
++      png_destroy_write_struct(&png_ptr,
++                             (png_infopp)NULL);
++      free(colour_matrix);
++      fclose(fp);
++      export_error("libpng init error");
++      return -1;
++    }
++  png_init_io(png_ptr, fp);
++  png_set_compression_level(png_ptr, D->compression);
++  png_set_compression_mem_level(png_ptr, 9);
++  png_set_compression_window_bits(png_ptr, 15);
++  png_set_IHDR(png_ptr, info_ptr, WW, WH,
++             8, PNG_COLOR_TYPE_PALETTE , PNG_INTERLACE_NONE,
++             PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
++  png_set_PLTE(png_ptr, info_ptr,(png_color*) rgb8 , 8);
++  png_write_info(png_ptr, info_ptr);
++  for(x=0; x<WH; x++)
++    { row_pointers[x]=colour_matrix+x*WW; }
++  png_write_image(png_ptr, row_pointers);
++  png_write_end(png_ptr, info_ptr);
++  png_destroy_write_struct(&png_ptr, &info_ptr);
++  free(colour_matrix);
++  fclose(fp);
++  return 0;
++}
++
++#endif
++
+diff -r af23d23c278b util/alevt/exp-html.c
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/exp-html.c    Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,299 @@
++/* Copyright 1999 by Paul Ortyl <ortylp@from.pl> */
++
++#include <stdio.h>
++#include <string.h>
++#include "lang.h"
++#include "export.h"
++
++static int html_open(struct export *e);
++static int html_option(struct export *e, int opt, char *arg);
++static int html_output(struct export *e, char *name, struct fmt_page *pg);
++static char *html_opts[] = // module options
++{
++  "gfx-chr=<char>",             // substitute <char> for gfx-symbols
++  "bare",                     // no headers
++   0
++};
++
++struct html_data // private data in struct export
++{
++  u8 gfx_chr;
++  u8 bare;
++};
++
++
++struct export_module export_html =    // exported module definition
++{
++    "html",                   // id
++    "html",                   // extension
++    html_opts,                        // options
++    sizeof(struct html_data), // size
++    html_open,                        // open
++    0,                                // close
++    html_option,              // option
++    html_output                       // output
++};
++
++#define D  ((struct html_data *)e->data)
++
++
++static int html_open(struct export *e)
++{
++    D->gfx_chr = '#';
++    D->bare = 0;
++    //e->reveal=1;    // the default should be the same for all formats.
++    return 0;
++}
++
++
++static int html_option(struct export *e, int opt, char *arg)
++{
++  switch (opt)
++    {
++    case 1: // gfx-chr=
++      D->gfx_chr = *arg ?: ' ';
++      break;
++    case 2: // bare (no headers)
++      D->bare=1;
++      break;
++    }
++  return 0;
++}
++
++#define HTML_BLACK   "#000000"
++#define HTML_RED     "#FF0000"
++#define HTML_GREEN   "#00FF00"
++#define HTML_YELLOW  "#FFFF00"
++#define HTML_BLUE    "#0000FF"
++#define HTML_MAGENTA "#FF00FF"
++#define HTML_CYAN    "#00FFFF"
++#define HTML_WHITE   "#FFFFFF"
++
++#undef UNREADABLE_HTML //no '\n'
++#define STRIPPED_HTML   //only necessary fields in header
++
++static int html_output(struct export *e, char *name, struct fmt_page *pg)
++{
++    
++  const char* html_colours[]={ HTML_BLACK,
++                             HTML_RED,
++                             HTML_GREEN,
++                             HTML_YELLOW,
++                             HTML_BLUE,
++                             HTML_MAGENTA,
++                             HTML_CYAN,
++                             HTML_WHITE};
++  FILE *fp;
++  int x, y;
++
++#ifdef UNREADABLE_HTML
++#define HTML_NL
++#else
++#define HTML_NL fputc('\n',fp);
++#endif
++  
++  if (not(fp = fopen(name, "w")))
++    {
++      export_error("cannot create file");
++      return -1;
++    }
++
++if (!D->bare)
++  {
++#ifndef STRIPPED_HTML  
++    fputs("<!doctype html public \"-//w3c//dtd html 4.0 transitional//en\">",fp);
++    HTML_NL
++#endif
++      fputs("<html><head>",fp);
++    HTML_NL
++#ifndef STRIPPED_HTML
++      fputs("<meta http-equiv=\"Content-Type\" content=\"text/html;",fp);
++    switch(latin1) {
++      case LATIN1: fprintf(fp,"charset=iso-8859-1\">"); break;
++      case LATIN2: fprintf(fp,"charset=iso-8859-2\">"); break;
++      case KOI8: fprintf(fp,"charset=koi8-r\">"); break;
++      case GREEK: fprintf(fp,"charset=iso-8859-7\">"); break;
++    }
++    HTML_NL
++      fputs("<meta name=\"GENERATOR\" content=\"alevt-cap\">",fp);
++    HTML_NL
++#else
++    switch(latin1) {
++      case LATIN1: fprintf(fp,"<meta charset=iso-8859-1\">"); break;
++      case LATIN2: fprintf(fp,"<meta charset=iso-8859-2\">"); break;
++      case KOI8: fprintf(fp,"<meta charset=koi8-r\">"); break;
++      case GREEK: fprintf(fp,"<meta charset=iso-8859-7\">"); break;
++    }
++    HTML_NL
++#endif
++      fputs("</head>",fp);
++    fputs("<body text=\"#FFFFFF\" bgcolor=\"#000000\">",fp);
++    HTML_NL
++      } //bare
++
++      fputs("<tt><b>",fp);
++    HTML_NL
++
++  // write tables in form of HTML format
++  for (y = 0; y < 25; ++y)
++    { 
++      int last_nonblank=0;
++      int first_unprinted=0;
++      int last_space=1;
++      // previous char was &nbsp;
++      // is used for deciding to put semicolon or not
++      int nbsp=0; 
++
++      // for output filled with ' ' up to 40 chars
++      // set last_nonblank=39
++      for (x = 0 ; x < 40; ++x) 
++      { 
++        if (pg->data[y][x].attr & EA_GRAPHIC)
++          {pg->data[y][x].ch= D->gfx_chr;}
++        
++        if (pg->data[y][x].ch!=' ')
++        {
++          last_nonblank=x;
++        }
++      }
++
++      for (x = 0 ; x <= last_nonblank ; ++x)
++      {
++        if (pg->data[y][x].ch==' ')
++          {
++            // if single space between blinking/colour words
++            // then make the space blinking/colour too
++            if ((x)&&(x<39))
++              {
++                if ((pg->data[y][x-1].ch!=' ')
++                    &&(pg->data[y][x+1].ch!=' ')
++                    &&(pg->data[y][x-1].attr & EA_BLINK)
++                    &&(pg->data[y][x+1].attr & EA_BLINK))
++                  {pg->data[y][x].attr |= EA_BLINK;}
++                else              
++                  {pg->data[y][x].attr &= ~EA_BLINK;}
++                          
++                if ((pg->data[y][x-1].ch!=' ')
++                    &&(pg->data[y][x+1].ch!=' ')
++                    &&(pg->data[y][x-1].fg==pg->data[y][x+1].fg))
++                  {pg->data[y][x].fg=pg->data[y][x-1].fg;}
++                else
++                  pg->data[y][x].fg=7;
++              }
++            else
++              {
++                pg->data[y][x].attr &= ~EA_BLINK;
++                pg->data[y][x].fg=7;
++              }
++          }
++        else
++          {
++            // if foreground is black set the foreground to previous 
++            // background colour to let it be visible
++            if (!pg->data[y][x].fg)
++              {pg->data[y][x].fg=pg->data[y][x].bg;}
++          }
++        //check if attributes changed,
++        //if yes then print chars and update first_unprinted
++        //if not then go to next char
++        if (x)
++          {
++            if (((
++                  (pg->data[y][x].attr & EA_BLINK)
++                  ==
++                  (pg->data[y][x-1].attr & EA_BLINK)
++                  )
++                 &&
++                 (
++                  pg->data[y][x].fg == pg->data[y][x-1].fg
++                  ))
++                &&(x!=last_nonblank))
++              
++              { continue; }
++          }
++        else continue;
++          
++        {
++          int z=first_unprinted;
++          for(;(pg->data[y][z].ch==' ') && (z<x);z++)
++            {
++              if (last_space)
++                {
++                  fprintf(fp,"&nbsp");
++                  last_space=0;
++                  nbsp=1;
++                }
++              else 
++                {
++                  fputc(' ',fp);
++                  last_space=1;
++                  nbsp=0;
++                }
++            }
++         
++          first_unprinted=z;
++          
++          if (z==x) continue; 
++          
++          if (pg->data[y][first_unprinted].attr & EA_BLINK) 
++            {
++              fprintf(fp,"<blink>");
++              nbsp=0;
++            }
++          
++          if (pg->data[y][first_unprinted].fg!=7)
++            {
++              fprintf(fp,"<font color=\"%s\">",
++                      html_colours[pg->data[y][first_unprinted].fg]);
++              nbsp=0;
++            }
++          for(;(z<x)||(z==last_nonblank);z++)
++            {
++              
++              if (pg->data[y][z].ch==' ')
++                {
++                  for(;(pg->data[y][z].ch==' ') && (z<x);z++)
++                    {
++                      if (last_space)
++                        {
++                          fprintf(fp,"&nbsp");
++                          last_space=0;
++                          nbsp=1;
++                        }
++                      else 
++                        {
++                          fputc(' ',fp);
++                          last_space=1;
++                          nbsp=0;
++                        }
++                    }
++                  z--;
++                }
++              else
++                {
++                  //if previous nbsp --> put semicolon!!!
++                  if (nbsp) fputc(';',fp);
++                  fputc(pg->data[y][z].ch,fp);
++                  last_space=0;
++                  nbsp=0;
++                }
++            }
++          if (pg->data[y][first_unprinted].fg!=7)
++            {
++              fprintf(fp,"</font>");
++            }
++          if (pg->data[y][first_unprinted].attr & EA_BLINK)
++            fprintf(fp,"</blink>");
++          
++          first_unprinted=z;
++        }
++      }
++      fputs("<br>",fp);
++      HTML_NL
++    }
++  fputs("</b></tt>",fp);
++  if (!D->bare)
++    fputs("</body></html>",fp);
++  fclose(fp);
++  return 0;
++}
+diff -r af23d23c278b util/alevt/exp-txt.c
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/exp-txt.c     Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,226 @@
++#include <stdio.h>
++#include <string.h>
++#include <stdlib.h>
++#include "os.h"
++#include "export.h"
++
++static int txt_open(struct export *e);
++static int txt_option(struct export *e, int opt, char *arg);
++static int txt_output(struct export *e, char *name, struct fmt_page *pg);
++static char *txt_opts[] =     // module options
++{
++    "color",                  // generate ansi color codes (and attributes)
++    "gfx-chr=<char>",         // substitute <char> for gfx-symbols
++    "fg=<0-7|none>",          // assume term has <x> as foreground color
++    "bg=<0-7|none>",          // assume term has <x> as background color
++    "lines=<1-25>",           // output 24 or 25 lines
++    0
++};
++
++
++struct txt_data                       // private data in struct export
++{
++    u8 color;
++    u8 gfx_chr;
++    u8 def_fg;
++    u8 def_bg;
++    int endline;
++    struct fmt_char curr[1];
++    FILE *fp;
++};
++
++
++struct export_module export_txt =     // exported module definition
++{
++    "ascii",                  // id
++    "txt",                    // extension
++    txt_opts,                 // options
++    sizeof(struct txt_data),  // data size
++    txt_open,                 // open
++    0,                                // close
++    txt_option,                       // option
++    txt_output,                       // output
++};
++
++
++struct export_module export_ansi =    // exported module definition
++{
++    "ansi",                   // id
++    "txt",                    // extension
++    txt_opts,                 // options
++    sizeof(struct txt_data),  // data size
++    txt_open,                 // open
++    0,                                // close
++    txt_option,                       // option
++    txt_output,                       // output
++};
++
++#define D  ((struct txt_data *)e->data)
++
++
++char * my_stpcpy(char *dst, const char *src)
++{
++    while (*dst = *src++)
++      dst++;
++    return dst;
++}
++
++
++static int txt_open(struct export *e)
++{
++    D->gfx_chr = '#';
++    D->def_fg = -1;
++    D->def_bg = -1;
++    D->endline = H;
++    if (e->mod == &export_ansi)
++      D->color = 1;
++    return 0;
++}
++
++
++static int txt_option(struct export *e, int opt, char *arg)
++{
++    switch (opt)
++    {
++      case 1: // color
++          D->color = 1;
++          break;
++      case 2: // gfx-chr=
++          D->gfx_chr = *arg ?: ' ';
++          break;
++      case 3: // fg=
++          D->def_fg = *arg - '0';
++          break;
++      case 4: // bg=
++          D->def_bg = *arg - '0';
++          break;
++      case 5: // lines=
++          D->endline = atoi(arg);
++          if (D->endline < 1 || D->endline > H)
++          {
++              export_error("lines: invalid number");
++              return 1;
++          }
++    }
++    return 0;
++}
++
++
++static void put_attr(struct export *e, struct fmt_char *new)
++{
++    char buf[512];
++    char *p = buf;
++    int fg, bg, attr;
++    int reset = 0;
++
++    if (D->color)
++    {
++      fg = D->curr->fg ^ new->fg;
++      bg = D->curr->bg ^ new->bg;
++      attr = (D->curr->attr ^ new->attr) & (EA_BLINK | EA_DOUBLE);
++
++      if (fg | bg | attr)
++      {
++          if (~new->attr & attr)      // reset some attributes ->  reset all.
++              reset = 1;
++          if (fg && new->fg == D->def_fg)     // switch to def fg -> reset all
++              reset = 1;
++          if (bg && new->bg == D->def_bg)     // switch to def bg -> reset all
++              reset = 1;
++
++          p = my_stpcpy(buf, "\e[");
++          if (reset)
++          {
++              p = my_stpcpy(p, ";");          // "0;" but 0 isn't neccesary
++              attr = -1;                      // set all attributes
++              fg = new->fg ^ D->def_fg;       // set fg if != default fg
++              bg = new->bg ^ D->def_bg;       // set bg if != default bg
++          }
++          if (attr & new->attr & EA_BLINK)
++              p = my_stpcpy(p, "5;");                 // blink
++          if (attr & new->attr & EA_DOUBLE)
++              p = my_stpcpy(p, "1;");                 // bold
++          if (fg)
++              p += sprintf(p, "%d;", new->fg + 30);   // fg-color
++          if (bg)
++              p += sprintf(p, "%d;", new->bg + 40);   // bg-color
++          p[-1] = 'm';        // replace last ;
++          *D->curr = *new;
++      }
++    }
++    *p++ = new->ch;
++    *p = 0;
++    fputs(buf, D->fp);
++}
++
++
++static int txt_output(struct export *e, char *name, struct fmt_page *pg)
++{
++    struct fmt_char def_c[1];
++    struct fmt_char l[W+2];
++    #define L (l+1)
++    int x, y;
++
++    D->fp = fopen(name, "w");
++    if (not D->fp)
++    {
++      export_error("cannot create file");
++      return -1;
++    }
++
++    /* initialize default colors. These have to be restored at EOL. */
++    def_c->ch = '\n';
++    def_c->fg = D->def_fg;
++    def_c->bg = D->def_bg;
++    def_c->attr = E_DEF_ATTR;
++    *D->curr = *def_c;
++    L[-1] = L[W] = *def_c;
++
++    for (y = 0; y < D->endline; y++)
++      if (~pg->hid & (1 << y))        // not hidden
++      {
++          // character conversion
++          for (x = 0; x < W; ++x)
++          {
++              struct fmt_char c = pg->data[y][x];
++
++              switch (c.ch)
++              {
++                  case 0x00: case 0xa0:               c.ch = ' '; break;
++                  case 0x7f:                          c.ch = '*'; break;
++                  case BAD_CHAR:                      c.ch = '?'; break;
++                  default:
++                      if (c.attr & EA_GRAPHIC)
++                          c.ch = D->gfx_chr;
++                      break;
++              }
++              L[x] = c;
++          }
++
++          if (D->color)
++          {
++              // optimize color and attribute changes
++              // delay fg and attr changes as far as possible
++              for (x = 0; x < W; ++x)
++                  if (L[x].ch == ' ')
++                  {
++                      L[x].fg = L[x-1].fg;
++                      l[x].attr = L[x-1].attr;
++                  }
++
++              // move fg and attr changes to prev bg change point
++              for (x = W-1; x >= 0; x--)
++                  if (L[x].ch == ' ' && L[x].bg == L[x+1].bg)
++                  {
++                      L[x].fg = L[x+1].fg;
++                      L[x].attr = L[x+1].attr;
++                  }
++          }
++
++          // now emit the whole line (incl EOL)
++          for (x = 0; x < W+1; ++x)
++              put_attr(e, L + x);
++      }
++    fclose(D->fp);
++    return 0;
++}
+diff -r af23d23c278b util/alevt/export.c
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/export.c      Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,364 @@
++#include <stdarg.h>
++#include <stdlib.h>
++#include <stdio.h>
++#include <string.h>
++#include "vt.h"
++#include "misc.h"
++#include "export.h"
++
++extern struct export_module export_txt;
++extern struct export_module export_ansi;
++extern struct export_module export_html;
++extern struct export_module export_png;
++extern struct export_module export_ppm;
++struct export_module *modules[] =
++{
++    &export_txt,
++    &export_ansi,
++    &export_html,
++    &export_ppm,
++#ifdef WITH_PNG
++    &export_png,
++#endif
++    0
++};
++
++
++static char *glbl_opts[] =
++{
++    "reveal",         // show hidden text
++    "hide",           // don't show hidden text (default)
++    0
++};
++
++static char errbuf[64];
++
++
++void export_error(char *str, ...)
++{
++    va_list args;
++
++    va_start(args, str);
++    vsnprintf(errbuf, sizeof(errbuf)-1, str, args);
++}
++
++
++char * export_errstr(void)
++{
++    return errbuf;
++}
++
++
++static int find_opt(char **opts, char *opt, char *arg)
++{
++    int err = 0;
++    char buf[256];
++    char **oo, *o, *a;
++
++    if (oo = opts)
++      while (o = *oo++)
++      {
++          if (a = strchr(o, '='))
++          {
++              a = buf + (a - o);
++              o = strcpy(buf, o);
++              *a++ = 0;
++          }
++          if (strcasecmp(o, opt) == 0)
++          {
++              if ((a != 0) == (arg != 0))
++                  return oo - opts;
++              err = -1;
++          }
++      }
++    return err;
++}
++
++
++struct export * export_open(char *fmt)
++{
++    struct export_module **eem, *em;
++    struct export *e;
++    char *opt, *optend, *optarg;
++    int opti;
++
++    if (fmt = strdup(fmt))
++    {
++      if (opt = strchr(fmt, ','))
++          *opt++ = 0;
++      for (eem = modules; em = *eem; eem++)
++          if (strcasecmp(em->fmt_name, fmt) == 0)
++              break;
++      if (em)
++      {
++          if (e = malloc(sizeof(*e) + em->local_size))
++          {
++              e->mod = em;
++              e->fmt_str = fmt;
++              e->reveal = 0;
++              memset(e + 1, 0, em->local_size);
++              if (not em->open || em->open(e) == 0)
++              {
++                  for (; opt; opt = optend)
++                  {
++                      if (optend = strchr(opt, ','))
++                          *optend++ = 0;
++                      if (not *opt)
++                          continue;
++                      if (optarg = strchr(opt, '='))
++                          *optarg++ = 0;
++                      if ((opti = find_opt(glbl_opts, opt, optarg)) > 0)
++                      {
++                          if (opti == 1) // reveal
++                              e->reveal = 1;
++                          else if (opti == 2) // hide
++                              e->reveal = 0;
++                      }
++                      else if (opti == 0 &&
++                              (opti = find_opt(em->options, opt, optarg)) > 0)
++                      {
++                          if (em->option(e, opti, optarg))
++                              break;
++                      }
++                      else
++                      {
++                          if (opti == 0)
++                              export_error("%s: unknown option", opt);
++                          else if (optarg)
++                              export_error("%s: takes no arg", opt);
++                          else
++                              export_error("%s: missing arg", opt);
++                          break;
++                      }
++                  }
++                  if (opt == 0)
++                      return e;
++
++                  if (em->close)
++                      em->close(e);
++              }
++              free(e);
++          }
++          else
++              export_error("out of memory");
++      }
++      else
++          export_error("unknown format: %s", fmt);
++      free(fmt);
++    }
++    else
++      export_error("out of memory");
++    return 0;
++}
++
++
++void export_close(struct export *e)
++{
++    if (e->mod->close)
++      e->mod->close(e);
++    free(e->fmt_str);
++    free(e);
++}
++
++
++static char * hexnum(char *buf, unsigned int num)
++{
++    char *p = buf + 5;
++
++    num &= 0xffff;
++    *--p = 0;
++    do
++    {
++      *--p = "0123456789abcdef"[num % 16];
++      num /= 16;
++    } while (num);
++    return p;
++}
++
++
++static char * adjust(char *p, char *str, char fill, int width)
++{
++    int l = width - strlen(str);
++
++    while (l-- > 0)
++      *p++ = fill;
++    while (*p = *str++)
++      p++;
++    return p;
++}
++
++
++char * export_mkname(struct export *e, char *fmt, struct vt_page *vtp, char *usr)
++{
++    char bbuf[1024];
++    char *p = bbuf;
++
++    while (*p = *fmt++)
++      if (*p++ == '%')
++      {
++          char buf[32], buf2[32];
++          int width = 0;
++
++          p--;
++          while (*fmt >= '0' && *fmt <= '9')
++              width = width*10 + *fmt++ - '0';
++
++          switch (*fmt++)
++          {
++              case '%':
++                  p = adjust(p, "%", '%', width);
++                  break;
++              case 'e':       // extension
++                  p = adjust(p, e->mod->extension, '.', width);
++                  break;
++              case 'p':       // pageno[.subno]
++                  if (vtp->subno)
++                      p = adjust(p,strcat(strcat(hexnum(buf, vtp->pgno),
++                              "."), hexnum(buf2, vtp->subno)), ' ', width);
++                  else
++                      p = adjust(p, hexnum(buf, vtp->pgno), ' ', width);
++                  break;
++              case 'S':       // subno
++                  p = adjust(p, hexnum(buf, vtp->subno), '0', width);
++                  break;
++              case 'P':       // pgno
++                  p = adjust(p, hexnum(buf, vtp->pgno), '0', width);
++                  break;
++              case 's':       // user strin
++                  p = adjust(p, usr, ' ', width);
++                  break;
++              //TODO: add date, channel name, ...
++          }
++      }
++    p = strdup(bbuf);
++    if (not p)
++      export_error("out of memory");
++    return p;
++}
++
++
++static void fmt_page(struct export *e, struct fmt_page *pg, struct vt_page *vtp)
++{
++    char buf[16];
++    int x, y;
++    u8 *p = vtp->data[0];
++
++    pg->dbl = 0;
++
++    sprintf(buf, "\2%x.%02x\7", vtp->pgno, vtp->subno & 0xff);
++
++    for (y = 0; y < H; y++)
++    {
++      struct fmt_char c;
++      int last_ch = ' ';
++      int dbl = 0, hold = 0;
++
++      c.fg = 7;
++      c.bg = 0;
++      c.attr = 0;
++
++      for (x = 0; x < W; ++x)
++      {
++          c.ch = *p++;
++          if (y == 0 && x < 8)
++              c.ch = buf[x];
++          switch (c.ch)
++          {
++              case 0x00 ... 0x07:     /* alpha + fg color */
++                  c.fg = c.ch & 7;
++                  c.attr &= ~(EA_GRAPHIC | EA_CONCEALED);
++                  goto ctrl;
++              case 0x08:              /* flash */
++                  c.attr |= EA_BLINK;
++                  goto ctrl;
++              case 0x09:              /* steady */
++                  c.attr &= ~EA_BLINK;
++                  goto ctrl;
++              case 0x0a:              /* end box */
++              case 0x0b:              /* start box */
++                  goto ctrl;
++              case 0x0c:              /* normal height */
++                  c.attr &= EA_DOUBLE;
++                  goto ctrl;
++              case 0x0d:              /* double height */
++                  if (y < H-2)        /* ignored on last 2 lines */
++                  {
++                      c.attr |= EA_DOUBLE;
++                      dbl = 1;
++                  }
++                  goto ctrl;
++              case 0x10 ... 0x17:     /* gfx + fg color */
++                  c.fg = c.ch & 7;
++                  c.attr |= EA_GRAPHIC;
++                  c.attr &= ~EA_CONCEALED;
++                  goto ctrl;
++              case 0x18:              /* conceal */
++                  c.attr |= EA_CONCEALED;
++                  goto ctrl;
++              case 0x19:              /* contiguous gfx */
++                  c.attr &= ~EA_SEPARATED;
++                  goto ctrl;
++              case 0x1a:              /* separate gfx */
++                  c.attr |= EA_SEPARATED;
++                  goto ctrl;
++              case 0x1c:              /* black bg */
++                  c.bg = 0;
++                  goto ctrl;
++              case 0x1d:              /* new bg */
++                  c.bg = c.fg;
++                  goto ctrl;
++              case 0x1e:              /* hold gfx */
++                  hold = 1;
++                  goto ctrl;
++              case 0x1f:              /* release gfx */
++                  hold = 0;
++                  goto ctrl;
++
++              case 0x0e:              /* SO */
++              case 0x0f:              /* SI */
++              case 0x1b:              /* ESC */
++                  c.ch = ' ';
++                  break;
++
++              ctrl:
++                  c.ch = ' ';
++                  if (hold && (c.attr & EA_GRAPHIC))
++                      c.ch = last_ch;
++                  break;
++          }
++          if (c.attr & EA_GRAPHIC)
++              if ((c.ch & 0xa0) == 0x20)
++              {
++                  last_ch = c.ch;
++                  c.ch += (c.ch & 0x40) ? 32 : -32;
++              }
++          if (c.attr & EA_CONCEALED)
++              if (not e->reveal)
++                  c.ch = ' ';
++          pg->data[y][x] = c;
++      }
++      if (dbl)
++      {
++          pg->dbl |= 1 << y;
++          for (x = 0; x < W; ++x)
++          {
++              if (~pg->data[y][x].attr & EA_DOUBLE)
++                  pg->data[y][x].attr |= EA_HDOUBLE;
++              pg->data[y+1][x] = pg->data[y][x];
++              pg->data[y+1][x].ch = ' ';
++          }
++          y++;
++          p += W;
++      }
++    }
++    pg->hid = pg->dbl << 1;
++}
++
++
++int export(struct export *e, struct vt_page *vtp, char *name)
++{
++    struct fmt_page pg[1];
++
++    fmt_page(e, pg, vtp);
++    return e->mod->output(e, name, pg);
++}
+diff -r af23d23c278b util/alevt/export.h
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/export.h      Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,66 @@
++#ifndef EXPORT_H
++#define EXPORT_H
++
++#include "vt.h"
++#include "misc.h"
++
++
++struct fmt_char
++{
++    u8 ch, fg, bg, attr;
++};
++
++#define EA_DOUBLE     1       // double height char
++#define EA_HDOUBLE    2       // single height char in double height line
++#define EA_BLINK      4       // blink
++#define EA_CONCEALED  8       // concealed
++#define EA_GRAPHIC    16      // graphic symbol
++#define EA_SEPARATED  32      // use separated graphic symbol
++
++#define E_DEF_FG      7
++#define E_DEF_BG      0
++#define E_DEF_ATTR    0
++
++
++struct fmt_page
++{
++    struct vt_page *vtp;
++    u32 dbl, hid;
++    struct fmt_char data[H][W];
++};
++
++
++struct export
++{
++    struct export_module *mod;        // module type
++    char *fmt_str;            // saved option string (splitted)
++    // global options
++    int reveal;                       // reveal hidden chars
++    // local data for module's use.  initialized to 0.
++    struct { int dummy; } data[0];
++};
++
++
++struct export_module
++{
++    char *fmt_name;           // the format type name (ASCII/HTML/PNG/...)
++    char *extension;          // the default file name extension
++    char **options;           // module options
++    int local_size;
++    int (*open)(struct export *fmt);
++    void (*close)(struct export *fmt);
++    int (*option)(struct export *fmt, int opt, char *arg);
++    int (*output)(struct export *fmt, char *name, struct fmt_page *pg);
++};
++
++
++extern struct export_module *modules[];       // list of modules (for help msgs)
++void export_error(char *str, ...);    // set error
++char *export_errstr(void);            // return last error
++char *export_mkname(struct export *e, char *fmt, struct vt_page *vtp, char *usr);
++
++
++struct export *export_open(char *fmt);
++void export_close(struct export *e);
++int export(struct export *e, struct vt_page *vtp, char *user_str);
++#endif
+diff -r af23d23c278b util/alevt/fdset.c
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/fdset.c       Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,97 @@
++#include <stdlib.h>
++#include <unistd.h>
++#include <sys/time.h>
++#include "dllist.h"
++#include "misc.h"
++#include "fdset.h"
++
++struct fdset fds[1];          /* global fd list */
++
++
++int fdset_init(struct fdset *fds)
++{
++    dl_init(fds->list);
++    fds->del_count = 0;
++    return 0;
++}
++
++
++int fdset_add_fd(struct fdset *fds, int fd, void *handler, void *data)
++{
++    struct fdset_node *fn;
++
++    if (fd < 0)
++      return -1;
++    if (handler == 0)
++      return -1;
++
++    for (fn = PTR fds->list->first; fn->node->next; fn = PTR fn->node->next)
++      if (fn->fd == fd)
++          return -1;
++
++    if (not(fn = malloc(sizeof(*fn))))
++      return -1;
++    fn->fd = fd;
++    fn->handler = handler;
++    fn->data = data;
++    dl_insert_last(fds->list, fn->node);
++    return 0;
++}
++
++
++int fdset_del_fd(struct fdset *fds, int fd)
++{
++    struct fdset_node *fn;
++
++    for (fn = PTR fds->list->first; fn->node->next; fn = PTR fn->node->next)
++      if (fn->fd == fd)
++      {
++          dl_remove(fn->node);
++          free(fn);
++          fds->del_count++;
++          return 0;
++      }
++    return -1;
++}
++
++
++int fdset_select(struct fdset *fds, int timeout)
++{
++    struct fdset_node *fn;
++    fd_set rfds[1];
++    struct timeval tv[1], *tvp = 0;
++    int max_fd, x, del_count;
++
++    FD_ZERO(rfds);
++    max_fd = 0;
++    for (fn = PTR fds->list->first; fn->node->next; fn = PTR fn->node->next)
++    {
++      FD_SET(fn->fd, rfds);
++      if (fn->fd >= max_fd)
++          max_fd = fn->fd + 1;
++    }
++
++    if (timeout >= 0)
++    {
++      tv->tv_sec = timeout/1000;
++      tv->tv_usec = timeout%1000*1000;
++      tvp = tv;
++    }
++
++    x = select(max_fd, rfds, 0, 0, tvp);
++    if (x <= 0)
++      return x;
++
++    /* A little bit complicated. A called handler may modify the fdset... */
++restart:
++    del_count = fds->del_count;
++    for (fn = PTR fds->list->first; fn->node->next; fn = PTR fn->node->next)
++      if (FD_ISSET(fn->fd, rfds))
++      {
++          FD_CLR(fn->fd, rfds);
++          fn->handler(fn->data, fn->fd);
++          if (fds->del_count != del_count)
++              goto restart;
++      }
++    return 1;
++}
+diff -r af23d23c278b util/alevt/fdset.h
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/fdset.h       Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,28 @@
++#ifndef FDSET_H
++#define FDSET_H
++
++#include "dllist.h"
++
++
++struct fdset
++{
++    struct dl_head list[1];
++    int del_count;
++};
++
++
++struct fdset_node /*internal*/
++{
++    struct dl_node node[1];
++    int fd;
++    void (*handler)(void *data, int fd);
++    void *data;
++};
++
++extern struct fdset fds[1]; /* global fd list */
++
++int fdset_init(struct fdset *fds);
++int fdset_add_fd(struct fdset *fds, int fd, void *handler, void *data);
++int fdset_del_fd(struct fdset *fds, int fd);
++int fdset_select(struct fdset *fds, int timeout /*millisec*/);
++#endif
+diff -r af23d23c278b util/alevt/font.c
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/font.c        Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,5 @@
++#define static /* I want them global */
++#include "font1.xbm"
++#include "font2.xbm"
++#include "font3.xbm"
++#include "font4.xbm"
+diff -r af23d23c278b util/alevt/font.h
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/font.h        Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,19 @@
++#ifndef FONT_H
++#define FONT_H
++
++#include "fontsize.h" /* the #defines from font?.xbm */
++
++#if font1_width != font2_width || font1_height != font2_height
++#error different font sizes.
++#endif
++
++extern unsigned char font1_bits[];
++extern unsigned char font2_bits[];
++extern unsigned char font3_bits[];
++extern unsigned char font4_bits[];
++
++#define font_width font1_width
++#define font_height font1_height
++#define CW (font_width/32) /* pixel width of a character */
++#define CH (font_height/8) /* pixel height of a character */
++#endif
+diff -r af23d23c278b util/alevt/hamm.c
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/hamm.c        Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,229 @@
++#include "vt.h"
++#include "hamm.h"
++
++// table to decode hamm8/4 encoded bytes.
++// the low 4 bits are the (corrected) data bits
++// bit 8 is set if there was a single bit error
++// bit 12 is set if there was an uncorrectable error
++
++// the idea: you may add up to 15 words and get the
++// number of single bit errors in b8-b11 and the number
++// of double errors in b12-b15
++
++
++static unsigned short hammtab[256] =
++{
++    0x0101, 0x100f, 0x0001, 0x0101, 0x100f, 0x0100, 0x0101, 0x100f,
++    0x100f, 0x0102, 0x0101, 0x100f, 0x010a, 0x100f, 0x100f, 0x0107,
++    0x100f, 0x0100, 0x0101, 0x100f, 0x0100, 0x0000, 0x100f, 0x0100,
++    0x0106, 0x100f, 0x100f, 0x010b, 0x100f, 0x0100, 0x0103, 0x100f,
++    0x100f, 0x010c, 0x0101, 0x100f, 0x0104, 0x100f, 0x100f, 0x0107,
++    0x0106, 0x100f, 0x100f, 0x0107, 0x100f, 0x0107, 0x0107, 0x0007,
++    0x0106, 0x100f, 0x100f, 0x0105, 0x100f, 0x0100, 0x010d, 0x100f,
++    0x0006, 0x0106, 0x0106, 0x100f, 0x0106, 0x100f, 0x100f, 0x0107,
++    0x100f, 0x0102, 0x0101, 0x100f, 0x0104, 0x100f, 0x100f, 0x0109,
++    0x0102, 0x0002, 0x100f, 0x0102, 0x100f, 0x0102, 0x0103, 0x100f,
++    0x0108, 0x100f, 0x100f, 0x0105, 0x100f, 0x0100, 0x0103, 0x100f,
++    0x100f, 0x0102, 0x0103, 0x100f, 0x0103, 0x100f, 0x0003, 0x0103,
++    0x0104, 0x100f, 0x100f, 0x0105, 0x0004, 0x0104, 0x0104, 0x100f,
++    0x100f, 0x0102, 0x010f, 0x100f, 0x0104, 0x100f, 0x100f, 0x0107,
++    0x100f, 0x0105, 0x0105, 0x0005, 0x0104, 0x100f, 0x100f, 0x0105,
++    0x0106, 0x100f, 0x100f, 0x0105, 0x100f, 0x010e, 0x0103, 0x100f,
++    0x100f, 0x010c, 0x0101, 0x100f, 0x010a, 0x100f, 0x100f, 0x0109,
++    0x010a, 0x100f, 0x100f, 0x010b, 0x000a, 0x010a, 0x010a, 0x100f,
++    0x0108, 0x100f, 0x100f, 0x010b, 0x100f, 0x0100, 0x010d, 0x100f,
++    0x100f, 0x010b, 0x010b, 0x000b, 0x010a, 0x100f, 0x100f, 0x010b,
++    0x010c, 0x000c, 0x100f, 0x010c, 0x100f, 0x010c, 0x010d, 0x100f,
++    0x100f, 0x010c, 0x010f, 0x100f, 0x010a, 0x100f, 0x100f, 0x0107,
++    0x100f, 0x010c, 0x010d, 0x100f, 0x010d, 0x100f, 0x000d, 0x010d,
++    0x0106, 0x100f, 0x100f, 0x010b, 0x100f, 0x010e, 0x010d, 0x100f,
++    0x0108, 0x100f, 0x100f, 0x0109, 0x100f, 0x0109, 0x0109, 0x0009,
++    0x100f, 0x0102, 0x010f, 0x100f, 0x010a, 0x100f, 0x100f, 0x0109,
++    0x0008, 0x0108, 0x0108, 0x100f, 0x0108, 0x100f, 0x100f, 0x0109,
++    0x0108, 0x100f, 0x100f, 0x010b, 0x100f, 0x010e, 0x0103, 0x100f,
++    0x100f, 0x010c, 0x010f, 0x100f, 0x0104, 0x100f, 0x100f, 0x0109,
++    0x010f, 0x100f, 0x000f, 0x010f, 0x100f, 0x010e, 0x010f, 0x100f,
++    0x0108, 0x100f, 0x100f, 0x0105, 0x100f, 0x010e, 0x010d, 0x100f,
++    0x100f, 0x010e, 0x010f, 0x100f, 0x010e, 0x000e, 0x100f, 0x010e,
++};
++
++#if 0 // this information is contained in hamm24par bit 5
++// simple parity table (sum of 1 bits modulo 2)
++
++
++static char odd_parity[256] =
++{
++    0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
++    1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
++    1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
++    0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
++    1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
++    0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
++    0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
++    1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
++    1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
++    0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
++    0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
++    1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
++    0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
++    1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
++    1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
++    0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0
++};
++#endif
++
++// this table generates the parity checks for hamm24/18 decoding.
++// bit 0 is for test A, 1 for B, ...
++// thanks to R. Gancarz for this fine table *g*
++
++
++static char hamm24par[3][256] =
++{
++    { // parities of first byte
++       0, 33, 34,  3, 35,  2,  1, 32, 36,  5,  6, 39,  7, 38, 37,  4,
++      37,  4,  7, 38,  6, 39, 36,  5,  1, 32, 35,  2, 34,  3,  0, 33,
++      38,  7,  4, 37,  5, 36, 39,  6,  2, 35, 32,  1, 33,  0,  3, 34,
++       3, 34, 33,  0, 32,  1,  2, 35, 39,  6,  5, 36,  4, 37, 38,  7,
++      39,  6,  5, 36,  4, 37, 38,  7,  3, 34, 33,  0, 32,  1,  2, 35,
++       2, 35, 32,  1, 33,  0,  3, 34, 38,  7,  4, 37,  5, 36, 39,  6,
++       1, 32, 35,  2, 34,  3,  0, 33, 37,  4,  7, 38,  6, 39, 36,  5,
++      36,  5,  6, 39,  7, 38, 37,  4,  0, 33, 34,  3, 35,  2,  1, 32,
++      40,  9, 10, 43, 11, 42, 41,  8, 12, 45, 46, 15, 47, 14, 13, 44,
++      13, 44, 47, 14, 46, 15, 12, 45, 41,  8, 11, 42, 10, 43, 40,  9,
++      14, 47, 44, 13, 45, 12, 15, 46, 42, 11,  8, 41,  9, 40, 43, 10,
++      43, 10,  9, 40,  8, 41, 42, 11, 15, 46, 45, 12, 44, 13, 14, 47,
++      15, 46, 45, 12, 44, 13, 14, 47, 43, 10,  9, 40,  8, 41, 42, 11,
++      42, 11,  8, 41,  9, 40, 43, 10, 14, 47, 44, 13, 45, 12, 15, 46,
++      41,  8, 11, 42, 10, 43, 40,  9, 13, 44, 47, 14, 46, 15, 12, 45,
++      12, 45, 46, 15, 47, 14, 13, 44, 40,  9, 10, 43, 11, 42, 41,  8
++    }, { // parities of second byte
++       0, 41, 42,  3, 43,  2,  1, 40, 44,  5,  6, 47,  7, 46, 45,  4,
++      45,  4,  7, 46,  6, 47, 44,  5,  1, 40, 43,  2, 42,  3,  0, 41,
++      46,  7,  4, 45,  5, 44, 47,  6,  2, 43, 40,  1, 41,  0,  3, 42,
++       3, 42, 41,  0, 40,  1,  2, 43, 47,  6,  5, 44,  4, 45, 46,  7,
++      47,  6,  5, 44,  4, 45, 46,  7,  3, 42, 41,  0, 40,  1,  2, 43,
++       2, 43, 40,  1, 41,  0,  3, 42, 46,  7,  4, 45,  5, 44, 47,  6,
++       1, 40, 43,  2, 42,  3,  0, 41, 45,  4,  7, 46,  6, 47, 44,  5,
++      44,  5,  6, 47,  7, 46, 45,  4,  0, 41, 42,  3, 43,  2,  1, 40,
++      48, 25, 26, 51, 27, 50, 49, 24, 28, 53, 54, 31, 55, 30, 29, 52,
++      29, 52, 55, 30, 54, 31, 28, 53, 49, 24, 27, 50, 26, 51, 48, 25,
++      30, 55, 52, 29, 53, 28, 31, 54, 50, 27, 24, 49, 25, 48, 51, 26,
++      51, 26, 25, 48, 24, 49, 50, 27, 31, 54, 53, 28, 52, 29, 30, 55,
++      31, 54, 53, 28, 52, 29, 30, 55, 51, 26, 25, 48, 24, 49, 50, 27,
++      50, 27, 24, 49, 25, 48, 51, 26, 30, 55, 52, 29, 53, 28, 31, 54,
++      49, 24, 27, 50, 26, 51, 48, 25, 29, 52, 55, 30, 54, 31, 28, 53,
++      28, 53, 54, 31, 55, 30, 29, 52, 48, 25, 26, 51, 27, 50, 49, 24
++    }, { // parities of third byte
++      63, 14, 13, 60, 12, 61, 62, 15, 11, 58, 57,  8, 56,  9, 10, 59,
++      10, 59, 56,  9, 57,  8, 11, 58, 62, 15, 12, 61, 13, 60, 63, 14,
++       9, 56, 59, 10, 58, 11,  8, 57, 61, 12, 15, 62, 14, 63, 60, 13,
++      60, 13, 14, 63, 15, 62, 61, 12,  8, 57, 58, 11, 59, 10,  9, 56,
++       8, 57, 58, 11, 59, 10,  9, 56, 60, 13, 14, 63, 15, 62, 61, 12,
++      61, 12, 15, 62, 14, 63, 60, 13,  9, 56, 59, 10, 58, 11,  8, 57,
++      62, 15, 12, 61, 13, 60, 63, 14, 10, 59, 56,  9, 57,  8, 11, 58,
++      11, 58, 57,  8, 56,  9, 10, 59, 63, 14, 13, 60, 12, 61, 62, 15,
++      31, 46, 45, 28, 44, 29, 30, 47, 43, 26, 25, 40, 24, 41, 42, 27,
++      42, 27, 24, 41, 25, 40, 43, 26, 30, 47, 44, 29, 45, 28, 31, 46,
++      41, 24, 27, 42, 26, 43, 40, 25, 29, 44, 47, 30, 46, 31, 28, 45,
++      28, 45, 46, 31, 47, 30, 29, 44, 40, 25, 26, 43, 27, 42, 41, 24,
++      40, 25, 26, 43, 27, 42, 41, 24, 28, 45, 46, 31, 47, 30, 29, 44,
++      29, 44, 47, 30, 46, 31, 28, 45, 41, 24, 27, 42, 26, 43, 40, 25,
++      30, 47, 44, 29, 45, 28, 31, 46, 42, 27, 24, 41, 25, 40, 43, 26,
++      43, 26, 25, 40, 24, 41, 42, 27, 31, 46, 45, 28, 44, 29, 30, 47
++    }
++};
++
++// table to extract the lower 4 bit from hamm24/18 encoded bytes
++
++
++static char hamm24val[256] =
++{
++      0,  0,  0,  0,  1,  1,  1,  1,  0,  0,  0,  0,  1,  1,  1,  1,
++      2,  2,  2,  2,  3,  3,  3,  3,  2,  2,  2,  2,  3,  3,  3,  3,
++      4,  4,  4,  4,  5,  5,  5,  5,  4,  4,  4,  4,  5,  5,  5,  5,
++      6,  6,  6,  6,  7,  7,  7,  7,  6,  6,  6,  6,  7,  7,  7,  7,
++      8,  8,  8,  8,  9,  9,  9,  9,  8,  8,  8,  8,  9,  9,  9,  9,
++     10, 10, 10, 10, 11, 11, 11, 11, 10, 10, 10, 10, 11, 11, 11, 11,
++     12, 12, 12, 12, 13, 13, 13, 13, 12, 12, 12, 12, 13, 13, 13, 13,
++     14, 14, 14, 14, 15, 15, 15, 15, 14, 14, 14, 14, 15, 15, 15, 15,
++      0,  0,  0,  0,  1,  1,  1,  1,  0,  0,  0,  0,  1,  1,  1,  1,
++      2,  2,  2,  2,  3,  3,  3,  3,  2,  2,  2,  2,  3,  3,  3,  3,
++      4,  4,  4,  4,  5,  5,  5,  5,  4,  4,  4,  4,  5,  5,  5,  5,
++      6,  6,  6,  6,  7,  7,  7,  7,  6,  6,  6,  6,  7,  7,  7,  7,
++      8,  8,  8,  8,  9,  9,  9,  9,  8,  8,  8,  8,  9,  9,  9,  9,
++     10, 10, 10, 10, 11, 11, 11, 11, 10, 10, 10, 10, 11, 11, 11, 11,
++     12, 12, 12, 12, 13, 13, 13, 13, 12, 12, 12, 12, 13, 13, 13, 13,
++     14, 14, 14, 14, 15, 15, 15, 15, 14, 14, 14, 14, 15, 15, 15, 15
++};
++
++// mapping from parity checks made by table hamm24par to error
++// results return by hamm24.
++// (0 = no error, 0x0100 = single bit error, 0x1000 = double error)
++
++
++static short hamm24err[64] =
++{
++    0x0000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
++    0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
++    0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
++    0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
++    0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
++    0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
++    0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
++    0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
++};
++
++// mapping from parity checks made by table hamm24par to faulty bit
++// in the decoded 18 bit word.
++
++
++static int hamm24cor[64] =
++{
++    0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000,
++    0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000,
++    0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000,
++    0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000,
++    0x00000, 0x00000, 0x00000, 0x00001, 0x00000, 0x00002, 0x00004, 0x00008,
++    0x00000, 0x00010, 0x00020, 0x00040, 0x00080, 0x00100, 0x00200, 0x00400,
++    0x00000, 0x00800, 0x01000, 0x02000, 0x04000, 0x08000, 0x10000, 0x20000,
++    0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000,
++};
++
++
++int hamm8(u8 *p, int *err)
++{
++    int a = hammtab[p[0]];
++    *err += a;
++    return a & 15;
++}
++
++
++int hamm16(u8 *p, int *err)
++{
++    int a = hammtab[p[0]];
++    int b = hammtab[p[1]];
++    *err += a;
++    *err += b;
++    return (a & 15) | (b & 15) * 16;
++}
++
++
++int hamm24(u8 *p, int *err)
++{
++    int e = hamm24par[0][p[0]] ^ hamm24par[1][p[1]] ^ hamm24par[2][p[2]];
++    int x = hamm24val[p[0]] + p[1] % 128 * 16 + p[2] % 128 * 2048;
++    *err += hamm24err[e];
++    return x ^ hamm24cor[e];
++}
++
++
++int chk_parity(u8 *p, int n)
++{
++    int err;
++    for (err = 0; n--; p++)
++      if (hamm24par[0][*p] & 32)
++          *p &= 0x7f;
++      else
++          *p = BAD_CHAR, err++;
++    return err;
++}
+diff -r af23d23c278b util/alevt/hamm.h
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/hamm.h        Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,7 @@
++#ifndef HAMM_H
++#define HAMM_H
++int hamm8(u8 *p, int *err);
++int hamm16(u8 *p, int *err);
++int hamm24(u8 *p, int *err);
++int chk_parity(u8 *p, int n);
++#endif
+diff -r af23d23c278b util/alevt/help.c
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/help.c        Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,83 @@
++#include "vt.h"
++#include "misc.h"
++
++#define VFILL "     "
++#define HELP_HEADER                                                   \
++"........\6AleVT Online Help System       ",                          \
++"  \22`p0`0    p `0pppp                    ",                         \
++"\4\35\22\177 \177j5`p  \177 j5 j5        \7   Version \34",          \
++"\4\35\22\177,\177j5\177.! +t>! j5        \7"VFILL VERSION" \34",     \
++"  \22# #\42!\42#   \42   \42!                     ",
++#define FLOF_DATA                                                     \
++      1, { {0x100,ANY_SUB}, {0x200,ANY_SUB}, {0x300,ANY_SUB},         \
++           {0x400,ANY_SUB}, {0x0ff,ANY_SUB}, {0x100,ANY_SUB} }
++
++
++struct vt_page help_pages[] =
++{
++    { 0x900, 0, -1, 0, 0, (1<<26)-1, {
++#include "vt900.out"
++    }, FLOF_DATA },
++
++    { 0x901, 1, -1, 0, 0, (1<<26)-1, {
++#include "vt901.out"
++    }, FLOF_DATA },
++
++    { 0x902, 1, -1, 0, 0, (1<<26)-1, {
++#include "vt902.out"
++    }, FLOF_DATA },
++
++    { 0x903, 1, -1, 0, 0, (1<<26)-1, {
++#include "vt903.out"
++    }, FLOF_DATA },
++
++    { 0x904, 1, -1, 0, 0, (1<<26)-1, {
++#include "vt904.out"
++    }, FLOF_DATA },
++
++    { 0x905, 2, -1, 0, 0, (1<<26)-1, {
++#include "vt905.out"
++    }, FLOF_DATA },
++
++    { 0x906, 1, -1, 0, 0, (1<<26)-1, {
++#include "vt906.out"
++    }, FLOF_DATA },
++
++    { 0x907, 2, -1, 0, 0, (1<<26)-1, {
++#include "vt907.out"
++    }, FLOF_DATA },
++
++    { 0x908, 1, -1, 0, 0, (1<<26)-1, {
++#include "vt908.out"
++    }, FLOF_DATA },
++
++    { 0x909, 0, -1, 0, 0, (1<<26)-1, {
++#include "vt909.out"
++    }, FLOF_DATA },
++
++    { 0x910, 2, -1, 0, 0, (1<<26)-1, {
++#include "vt910.out"
++    }, FLOF_DATA },
++
++    { 0x911, 1, -1, 0, 0, (1<<26)-1, {
++#include "vt911.out"
++    }, FLOF_DATA },
++
++    { 0x912, 2, -1, 0, 0, (1<<26)-1, {
++#include "vt912.out"
++    }, FLOF_DATA },
++
++    { 0x913, 1, -1, 0, 0, (1<<26)-1, {
++#include "vt913.out"
++    }, FLOF_DATA },
++
++    { 0x914, 0, -1, 0, 0, (1<<26)-1, {
++#include "vt914.out"
++    }, FLOF_DATA },
++
++    { 0x915, 0, -1, 0, 0, (1<<26)-1, {
++#include "vt915.out"
++    }, FLOF_DATA },
++};
++
++const int nr_help_pages = NELEM(help_pages);
+diff -r af23d23c278b util/alevt/help.h
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/help.h        Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,8 @@
++#ifndef HELP_H
++#define HELP_H
++
++#include "vt.h"
++
++extern struct vt_page help_pages[];
++extern const int nr_help_pages;
++#endif
+diff -r af23d23c278b util/alevt/icon.xbm
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/icon.xbm      Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,17 @@
++#define icon_width 58
++#define icon_height 20
++static unsigned char icon_bits[] = {
++  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff,
++  0xff, 0xff, 0xff, 0x03, 0x0f, 0x30, 0xfe, 0xff, 0xf8, 0x11, 0x00, 0x03,
++  0x0f, 0x30, 0xfe, 0xff, 0xf8, 0x11, 0x00, 0x03, 0xc5, 0x23, 0xaa, 0xaa,
++  0xa8, 0xf1, 0xf1, 0x03, 0xc6, 0x22, 0xfe, 0xd5, 0x58, 0xb1, 0xb1, 0x02,
++  0x45, 0x23, 0x06, 0xaa, 0xa8, 0x51, 0x51, 0x01, 0xc6, 0x22, 0x06, 0xd6,
++  0x58, 0xb1, 0xb1, 0x02, 0x45, 0x23, 0x62, 0xac, 0xa8, 0x51, 0x51, 0x01,
++  0xc6, 0x22, 0x62, 0xd4, 0x58, 0xb1, 0xb1, 0x02, 0x45, 0x23, 0x62, 0xac,
++  0xa8, 0x51, 0x51, 0x01, 0xc6, 0x23, 0x62, 0xd4, 0xf8, 0xb1, 0xb1, 0x02,
++  0x05, 0x20, 0x02, 0xae, 0x61, 0x58, 0x51, 0x01, 0x06, 0x20, 0x02, 0x56,
++  0x61, 0xa8, 0xb1, 0x02, 0xc5, 0x23, 0xe2, 0xab, 0x06, 0x56, 0x51, 0x01,
++  0x46, 0x22, 0xe2, 0x57, 0x05, 0xaa, 0xb1, 0x02, 0xc7, 0x23, 0x06, 0xfe,
++  0x9f, 0xff, 0xf1, 0x03, 0xc7, 0x23, 0x06, 0xfe, 0x9f, 0xff, 0xf1, 0x03,
++  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff,
++  0xff, 0xff, 0xff, 0x03, };
+diff -r af23d23c278b util/alevt/lang.c
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/lang.c        Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,393 @@
++#include <string.h>
++#include <ctype.h>
++#include "misc.h"
++#include "vt.h"
++#include "lang.h"
++
++int latin1 = -1;
++
++
++static u8 lang_char[256];
++static u8 lang_chars[1+8+8][16] =
++{
++    { 0, 0x23,0x24,0x40,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x7b,0x7c,0x7d,0x7e },
++
++    // for latin-1 font
++    // English (100%)
++    { 0,  '£', '$', '@', '«', '½', '»', '¬', '#', '­', '¼', '¦', '¾', '÷' },
++    // German (100%)
++    { 0,  '#', '$', '§', 'Ä', 'Ö', 'Ü', '^', '_', '°', 'ä', 'ö', 'ü', 'ß' },
++    // Swedish/Finnish/Hungarian (100%)
++    { 0,  '#', '¤', 'É', 'Ä', 'Ö', 'Å', 'Ü', '_', 'é', 'ä', 'ö', 'å', 'ü' },
++    // Italian (100%)
++    { 0,  '£', '$', 'é', '°', 'ç', '»', '¬', '#', 'ù', 'à', 'ò', 'è', 'ì' },
++    // French (100%)
++    { 0,  'é', 'ï', 'à', 'ë', 'ê', 'ù', 'î', '#', 'è', 'â', 'ô', 'û', 'ç' },
++    // Portuguese/Spanish (100%)
++    { 0,  'ç', '$', '¡', 'á', 'é', 'í', 'ó', 'ú', '¿', 'ü', 'ñ', 'è', 'à' },
++    // Czech/Slovak (60%)
++    { 0,  '#', 'u', 'c', 't', 'z', 'ý', 'í', 'r', 'é', 'á', 'e', 'ú', 's' },
++    // reserved (English mapping)
++    { 0,  '£', '$', '@', '«', '½', '»', '¬', '#', '­', '¼', '¦', '¾', '÷' },
++
++    // for latin-2 font
++    // Polish (100%)
++    { 0,  '#', 'ñ', '±', '¯', '¦', '£', 'æ', 'ó', 'ê', '¿', '¶', '³', '¼' },
++    // German (100%)
++    { 0,  '#', '$', '§', 'Ä', 'Ö', 'Ü', '^', '_', '°', 'ä', 'ö', 'ü', 'ß' },
++    // Estonian (100%)
++    { 0,  '#', 'õ', '©', 'Ä', 'Ö', '®', 'Ü', 'Õ', '¹', 'ä', 'ö', '¾', 'ü' },
++    // Lettish/Lithuanian (90%)
++    { 0,  '#', '$', '©', 'ë', 'ê', '®', 'è', 'ü', '¹', '±', 'u', '¾', 'i' },
++    // French (90%)
++    { 0,  'é', 'i', 'a', 'ë', 'ì', 'u', 'î', '#', 'e', 'â', 'ô', 'u', 'ç' },
++    // Serbian/Croation/Slovenian (100%)
++    { 0,  '#', 'Ë', 'È', 'Æ', '®', 'Ð', '©', 'ë', 'è', 'æ', '®', 'ð', '¹' },
++    // Czech/Slovak (100%)
++    { 0,  '#', 'ù', 'è', '»', '¾', 'ý', 'í', 'ø', 'é', 'á', 'ì', 'ú', '¹' },
++    // Rumanian (95%)
++    { 0,  '#', '¢', 'Þ', 'Â', 'ª', 'Ã', 'Î', 'i', 'þ', 'â', 'º', 'ã', 'î' },
++};
++
++/* Yankable latin charset :-)
++     !"#$%&'()*+,-./0123456789:;<=>?
++    @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
++    `abcdefghijklmnopqrstuvwxyz{|}~
++     ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿
++    ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß
++    àáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
++*/
++
++
++static struct mark { u8 *g0, *latin1, *latin2; } marks[16] =
++{
++    /* none */                { "#",
++                        "¤",
++                        "$"                                   },
++    /* grave - ` */   { " aeiouAEIOU",
++                        "`àèìòùÀÈÌÒÙ",
++                        "`aeiouAEIOU"                         },
++    /* acute - ' */   { " aceilnorsuyzACEILNORSUYZ",
++                        "'ácéílnórsúýzÁCÉÍLNÓRSÚÝZ",
++                        "'áæéíåñóà¶úý¼ÁÆÉÍÅÑÓÀ¦Úݬ"           },
++    /* cirumflex - ^ */       { " aeiouAEIOU",
++                        "^âêîôûÂÊÎÔÛ",
++                        "^âeîôuÂEÎÔU"                         },
++    /* tilde - ~ */   { " anoANO",
++                        "~ãñõÃÑÕ",
++                        "~anoANO"                             },
++    /* ??? - ¯ */     { "",
++                        "",
++                        ""                                    },
++    /* breve - u */   { "aA",
++                        "aA",
++                        "ãÃ"                                  },
++    /* abovedot - · */        { "zZ",
++                        "zZ",
++                        "¿¯"                                  },
++    /* diaeresis ¨ */ { "aeiouAEIOU",
++                        "äëïöüÄËÏÖÜ",
++                        "äëiöüÄËIÖÜ"                          },
++    /* ??? - . */     { "",
++                        "",
++                        ""                                    },
++    /* ringabove - ° */       { " auAU",
++                        "°åuÅU",
++                        "°aùAÙ"                               },
++    /* cedilla - ¸ */ { "cstCST",
++                        "çstÇST",
++                        "çºþǪÞ"                              },
++    /* ??? - _ */     { " ",
++                        "_",
++                        "_"                                   },
++    /* dbl acute - " */       { " ouOU",
++                        "\"ouOU",
++                        "\"õûÕÛ"                              },
++    /* ogonek - \, */ { "aeAE",
++                        "aeAE",
++                        "±ê¡Ê"                                },
++    /* caron - v */   { "cdelnrstzCDELNRSTZ",
++                        "cdelnrstzCDELNRSTZ",
++                        "èïìµòø¹»¾ÈÏÌ¥ÒØ©«®"                  },
++};
++
++
++static u8 g2map_latin1[] =
++   /*0123456789abcdef*/
++    " ¡¢£$¥#§¤'\"«    "
++    "°±²³×µ¶·÷'\"»¼½¾¿"
++    " `´^~   ¨.°¸_\"  "
++    "_¹®©            "
++    " ÆЪH ILLØ ºÞTNn"
++    "Kædðhiillø ßþtn\x7f";
++
++
++static u8 g2map_latin2[] =
++   /*0123456789abcdef*/
++    " icL$Y#§¤'\"<    "
++    "°   ×u  ÷'\">    "
++    " `´^~ ¢ÿ¨.°¸_½²·"
++    "- RC            "
++    "  ÐaH iL£O opTNn"
++    "K ðdhiil³o ßptn\x7f";
++
++
++void lang_init(void)
++{
++    int i;
++
++    memset(lang_char, 0, sizeof(lang_char));
++    for (i = 1; i <= 13; i++)
++      lang_char[lang_chars[0][i]] = i;
++}
++
++
++void conv2latin(u8 *p, int n, int lang)
++{
++    int c, gfx = 0, lat=0;
++
++  if ((latin1 == KOI8) && lang==12) { /* russian */
++    while (n--) {
++      c=*p;
++
++      if(c==0x1b) lat = !lat; /* ESC switches languages inside page */
++
++       if ( is_koi(c)) {
++         if (not gfx || (c & 0xa0) != 0x20) {
++            if(!lat) conv2koi8(p);
++         }
++       }
++      else if ((c & 0xe8) == 0)
++          gfx = c & 0x10;
++      p++;
++   }
++ }
++else if ((latin1 == GREEK) && lang==15) { /* Hellas */
++    while (n--) {
++      c=*p;
++
++      if(c==0x1b) lat = !lat; /* ESC switches languages inside page */
++
++       if ( is_greek(c)) {
++         if (not gfx || (c & 0xa0) != 0x20) {
++            if(!lat) conv2greek(p);
++         }
++       }
++      else if ((c & 0xe8) == 0)
++          gfx = c & 0x10;
++      p++;
++   }
++ }
++
++ else {
++    while (n--)
++    {
++      if (lang_char[c = *p])
++      {
++          if (not gfx || (c & 0xa0) != 0x20) 
++              *p = lang_chars[lang + 1][lang_char[c]];
++      }
++      else if ((c & 0xe8) == 0)
++          gfx = c & 0x10;
++      p++;
++    }
++  }
++}
++
++
++/* check for Greek chars - needs locale iso8859-7 set */
++int is_greek(int c)
++{
++  if( isalpha(c | 0x80)) return 1;
++  return 0;
++}
++
++
++/* check for russian chars - needs locale KOI8-R set */
++int is_koi(int c)
++{
++  if( isalpha(c | 0x80)) return 1;
++  if( c=='&' ) return 1;
++  return 0;
++}
++
++
++/* teletext to koi8-r conversion */
++void conv2koi8(u8 *p)
++{
++    u8 c;
++    static u8 l2koi[]={
++      0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9,
++      0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3,
++      0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xFF, 0xFA, 0xFB, 0xFC, 0xFD,
++      0xFE, 0xF9, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
++      0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1,
++      0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB,
++      0xDC, 0xDD, 0xDE, 0xDF
++    };
++
++      c= *p;
++      if ( (c >= 0x40) && (c <= 0x7f)) *p=l2koi[(c & 0x7f) - 0x40];
++      if (c=='&') *p='Ù';
++}
++
++
++/* teletext to iso8859-7 conversion */
++void conv2greek(u8 *p)
++{
++    u8 c;
++   static u8 l2greek[]={
++/* 1 @ 0x40->ú*/0xc0,
++/* 2 A 0x41->Á*/0xc1,
++/* 3 B 0x42->Â*/0xc2,
++/* 4 C 0x43->Ã*/0xc3,
++/* 5 D 0x44->Ä*/0xc4,
++/* 6 E 0x45->Å*/0xc5,
++/* 7 F 0x46->Æ*/0xc6,
++/* 8 G 0x47->Ç*/0xc7,
++/* 9 H 0x48->È*/0xc8,
++/*10 I 0x49->É*/0xc9,
++/*11 J 0x4a->Ê*/0xca,
++/*12 K 0x4b->Ë*/0xcb,
++/*13 L 0x4c->Ì*/0xcc,
++/*14 M 0x4d->Í*/0xcd,
++/*15 N 0x4e->Î*/0xce,
++/*16 O 0x4f->Ï*/0xcf,
++/*17 P 0x50->Ð*/0xd0,
++/*18 Q 0x51->Ñ*/0xd1,
++/*19 R 0x52->?*/0x52,
++/*20 S 0x53->Ó*/0xd3,
++/*21 T 0x54->Ô*/0xd4,
++/*22 U 0x55->Õ*/0xd5,
++/*23 V 0x56->Ö*/0xd6,
++/*24 W 0x57->÷*/0xd7,
++/*25 X 0x58->Ø*/0xd8,
++/*26 Y 0x59->Ù*/0xd9,
++/*27 Z 0x5a->?*/0x5a,
++/*28 [ 0x5b->?*/0x5b,
++/*!29 \ 0x5c->Ü*/0xdc,
++/*!30 ] 0x5d->Ý*/0xdd,
++/*!31 ^ 0x5e->Þ*/0xde,
++/*!32 _ 0x5f->ß*/0xdf,
++/*33 ` 0x60->?*/0x60,
++/*!34 a 0x61->á*/0xe1,
++/*!35 b 0x62->â*/0xe2,
++/*!36 c 0x63->ã*/0xe3,
++/*!37 d 0x64->ä*/0xe4,
++/*!38 e 0x65->å*/0xe5,
++/*!39 f 0x66->æ*/0xe6,
++/*!40 g 0x67->ç*/0xe7,
++/*!41 h 0x68->è*/0xe8,
++/*!42 i 0x69->é*/0xe9,
++/*!43 j 0x6a->ê*/0xea,
++/*!44 k 0x6b->ë*/0xeb,
++/*!45 l 0x6c->ì*/0xec,
++/*!46 m 0x6d->í*/0xed,
++/*!47 n 0x6e->î*/0xee,
++/*!48 o 0x6f->ï*/0xef,
++/*!49 p 0x70->ð*/0xf0,
++/*!50 q 0x71->ñ*/0xf1,
++/*!51 r 0x72->ò*/0xf2,
++/*!52 s 0x73->ó*/0xf3,
++/*!53 t 0x74->ô*/0xf4,
++/*!54 u 0x75->õ*/0xf5,
++/*!55 v 0x76->ö*/0xf6,
++/*!56 w 0x77->÷*/0xf7,
++/*!57 x 0x78->ø*/0xf8,
++/*!58 y 0x79->ù*/0xf9,
++/*59 z 0x7a->ú(ìå ôüíï)*/0xc0,
++/*60 { 0x7b->?*/0x7b,
++/*!61 | 0x7c->ü*/0xfc,
++/*!62 } 0x7d->ý*/0xfd,
++/*!63 ~ 0x7e->þ*/0xfe,
++/*64   0x7f->?*/0x7f
++  };
++      c= *p;
++      if ( (c >= 0x40) && (c <= 0x7f)) *p=l2greek[(c & 0x7f) - 0x40];
++}
++
++
++void init_enhance(struct enhance *eh)
++{
++    eh->next_des = 0;
++}
++
++
++void add_enhance(struct enhance *eh, int dcode, u32 *t)
++{
++
++    if (dcode == eh->next_des)
++    {
++      memcpy(eh->trip + dcode * 13, t, 13 * sizeof(*t));
++      eh->next_des++;
++    }
++    else
++      eh->next_des = -1;
++}
++
++
++void enhance(struct enhance *eh, struct vt_page *vtp)
++{
++    int row = 0;
++    u32 *p, *e;
++
++    if (eh->next_des < 1)
++      return;
++
++    for (p = eh->trip, e = p + eh->next_des * 13; p < e; p++)
++      if (*p % 2048 != 2047)
++      {
++          int adr = *p % 64;
++          int mode = *p / 64 % 32;
++          int data = *p / 2048 % 128;
++
++          if (adr < 40)
++          {
++              // col functions
++              switch (mode)
++              {
++                  case 15: // char from G2 set
++                      if (adr < W && row < H)
++                          if (latin1==LATIN1)
++                              vtp->data[row][adr] = g2map_latin1[data-32];
++                          else if (latin1==LATIN2)
++                              vtp->data[row][adr] = g2map_latin2[data-32];
++                      break;
++                  case 16 ... 31: // char from G0 set with diacritical mark
++                      if (adr < W && row < H)
++                      {
++                          struct mark *mark = marks + (mode - 16);
++                          u8 *x;
++
++                          if (x = strchr(mark->g0, data))
++                              if (latin1==LATIN1)
++                                  data = mark->latin1[x - mark->g0];
++                              else if (latin1==LATIN2)
++                                  data = mark->latin2[x - mark->g0];
++                          vtp->data[row][adr] = data;
++                      }
++                      break;
++              }
++          }
++          else
++          {
++              // row functions
++              if ((adr -= 40) == 0)
++                  adr = 24;
++              
++              switch (mode)
++              {
++                  case 1: // full row color
++                      row = adr;
++                      break;
++                  case 4: // set active position
++                      row = adr;
++                      break;
++                  case 7: // address row 0 (+ full row color)
++                      if (adr == 23)
++                          row = 0;
++                      break;
++              }
++          }
++      }
++}
+diff -r af23d23c278b util/alevt/lang.h
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/lang.h        Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,28 @@
++#ifndef LANG_H
++#define LANG_H
++
++#include "misc.h"
++#include "vt.h"
++
++extern int latin1;
++
++#define LATIN1 1
++#define LATIN2 2
++#define KOI8 3
++#define GREEK 4
++
++
++struct enhance
++{
++    int next_des; // next expected designation code
++    u32 trip[13*16]; // tripplets
++};
++
++void lang_init(void);
++void conv2latin(u8 *p, int n, int lang);
++void conv2koi8(u8 *p);
++void conv2greek(u8 *p);
++void init_enhance(struct enhance *eh);
++void add_enhance(struct enhance *eh, int dcode, u32 *data);
++void enhance(struct enhance *eh, struct vt_page *vtp);
++#endif
+diff -r af23d23c278b util/alevt/main.c
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/main.c        Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,221 @@
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <locale.h>
++#include "vt.h"
++#include "misc.h"
++#include "fdset.h"
++#include "xio.h"
++#include "vbi.h"
++#include "lang.h"
++#include "cache.h"
++#include "ui.h"
++
++static char *geometry;
++static char *dpy_name;
++static char *vbi_name = NULL;
++static struct xio *xio;
++static struct vbi *vbi;
++static int erc = 1;
++char *outfile = "";
++static char *channel;
++static int ttpid = -1;
++u_int16_t sid = 0;
++
++
++static void usage(FILE *fp, int exitval)
++{
++    fprintf(fp, "\nUsage: %s [options]\n", prgname);
++    fprintf(fp,
++          "\n"
++          "  Valid options:\t\tDefault:\n"
++          "    -c <channel name>\t\t(none;dvb only)\n"
++          "    -ch -child <ppp.ss>\t\t(none)\n"
++          "    -cs -charset\t\tlatin-1\n"
++          "    <latin-1/2/koi8-r/iso8859-7>\n"
++          "    -h -help\n"
++          "    -o <outfile>\t\t(none;dvb only)\n"
++          "    -p -parent <ppp.ss>\t\t900\n"
++          "    -s -sid <sid>\t\t(none;dvb only)\n"
++          "    -t -ttpid <ttpid>\t\t(none;dvb only)\n"
++          "    -v -vbi <vbidev>\t\t/dev/vbi\n"
++              "                 \t\t/dev/vbi0\n"
++              "                 \t\t/dev/video0\n"
++              "                 \t\t/dev/dvb/adapter0/demux0\n"
++          "\n"
++          "  ppp.ss stands for a page number and an\n"
++          "  optional subpage number (Example: 123.4).\n"
++          "\n"
++          "  The -child option requires a parent\n"
++          "  window. So it must be preceded by\n"
++          "  a parent or another child window.\n"
++      );
++    exit(exitval);
++}
++
++
++static int arg_pgno(char *p, int *subno)
++{
++    char *end;
++    int pgno;
++
++    *subno = ANY_SUB;
++    if (*p)
++    {
++      pgno = strtol(p, &end, 16);
++      if ((*end == ':' || *end == '/' || *end == '.') && end[1])
++          *subno = strtol(end + 1, &end, 16);
++      if (*end == 0)
++          if (pgno >= 0x100 && pgno <= 0x999)
++              if (*subno == ANY_SUB || (*subno >= 0x00 && *subno <= 0x3f7f))
++                  return pgno;
++    }
++    fatal("%s: invalid page number", p);
++}
++
++
++static struct vtwin * start(int argc, char **argv, struct vtwin *parent,
++      int pgno, int subno)
++{
++    static int valid_vbi_name = 1;
++
++    if (!valid_vbi_name)
++      return parent;
++
++    if (vbi == 0)
++      vbi = vbi_open(vbi_name, cache_open(), channel, outfile, sid, ttpid);
++    if (vbi == 0)
++    {
++      if (vbi_name)
++          error("cannot open device: %s", vbi_name);
++      valid_vbi_name = 0;
++      vbi = open_null_vbi(cache_open());
++    }
++    if (vbi->cache)
++      vbi->cache->op->mode(vbi->cache, CACHE_MODE_ERC, erc);
++
++    if (xio == 0)
++      xio = xio_open_dpy(dpy_name, argc, argv);
++    if (xio == 0)
++      fatal("cannot open display");
++
++    parent = vtwin_new(xio, vbi, geometry, parent, pgno, subno);
++    if (parent == 0)
++      fatal("cannot create window");
++
++    if (!valid_vbi_name)
++    {
++      if (vbi_name)
++          send_errmsg(vbi, "cannot open device: %s", vbi_name);
++      else
++          send_errmsg(vbi, "cannot open any device", vbi_name);
++    }
++
++    return parent;
++}
++
++
++static int option(int argc, char **argv, int *ind, char **arg)
++{
++    static struct { char *nam, *altnam; int arg; } opts[] = {
++      { "-channel", "-c", 1 },
++      { "-child", "-ch", 1 },
++      { "-charset", "-cs", 1 },
++      { "-help", "-h", 0 },
++      { "-outfile", "-o", 1 },
++      { "-parent", "-p", 1 },
++      { "-sid", "-s", 1 },
++      { "-ttpid", "-t", 1 },
++      { "-vbi", "-v", 1 },
++    };
++    int i;
++    if (*ind >= argc)
++      return 0;
++    *arg = argv[(*ind)++];
++    for (i = 0; i < NELEM(opts); ++i)
++      if (streq(*arg, opts[i].nam) || streq(*arg, opts[i].altnam))
++      {
++          if (opts[i].arg)
++              if (*ind < argc)
++                  *arg = argv[(*ind)++];
++              else
++                  fatal("option %s requires an argument", *arg);
++          return i+1;
++      }
++    if (**arg == '-')
++    {
++      fatal("%s: invalid option", *arg);
++      usage(stderr, 1);
++    }
++    return -1;
++}
++
++
++int main(int argc, char **argv)
++{
++    struct vtwin *parent = 0;
++    int pgno, subno;
++    int opt, ind;
++    char *arg;
++    sid = 0;
++
++    setprgname(argv[0]);
++    fdset_init(fds);
++
++    ind = 1;
++    while (opt = option(argc, argv, &ind, &arg))
++      switch (opt)
++      {
++
++          case 1: // channel
++              channel = arg;
++              break;
++          case 2: // child
++              if (parent == 0)
++                  fatal("-child requires a parent window");
++              pgno = arg_pgno(arg, &subno);
++              parent = start(argc, argv, parent, pgno, subno);
++              geometry = 0;
++              break;
++          case 3: // charset
++              if (streq(arg, "latin-1") || streq(arg, "1"))
++                  latin1 = LATIN1;
++              else if (streq(arg, "latin-2") || streq(arg, "2"))
++                  latin1 = LATIN2;
++              else if (streq(arg, "koi8-r") || streq(arg, "koi"))
++                  latin1 = KOI8;
++              else if (streq(arg, "iso8859-7") || streq(arg, "el"))
++                  latin1 = GREEK;
++              else
++                  fatal("bad charset (not latin-1/2/koi8-r/iso8859-7)");
++              break;
++          case 4: // help
++              usage(stdout, 0);
++              break;
++          case 5: // outfile
++              outfile = arg;
++              break;
++          case 6: // parent
++          case -1: // non-option arg
++              pgno = arg_pgno(arg, &subno);
++              parent = start(argc, argv, 0, pgno, subno);
++              geometry = 0;
++              break;
++          case 7: // sid
++              sid = strtoul(arg, NULL, 0);
++              break;
++          case 8: // ttpid
++              ttpid = strtoul(arg, NULL, 0);
++              break;
++          case 9: // vbi
++              vbi_name = arg;
++              vbi = 0;
++              parent = 0;
++              break;
++      }
++
++    if (parent == 0)
++    start(argc, argv, 0, 0x900, ANY_SUB);
++    xio_event_loop();
++    exit(0);
++}
+diff -r af23d23c278b util/alevt/misc.c
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/misc.c        Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,66 @@
++#include <stdio.h>
++#include <stdarg.h>
++#include "misc.h"
++
++char *prgname = 0;
++
++extern char *strrchr(const char *, int);
++NORETURN(exit(int));
++
++
++void setprgname(char *str)
++{
++    char *x = strrchr(str, '/');
++    prgname = x ? x+1 : str;
++}
++
++
++static void print_prgname(void)
++{
++    if (prgname && *prgname)
++      fprintf(stderr, "%s: ", prgname);
++}
++
++
++void error(const char *str, ...)
++{
++    va_list args;
++    va_start(args, str);
++    print_prgname();
++    vfprintf(stderr, str, args);
++    fputc('\n', stderr);
++}
++
++
++void ioerror(const char *str)
++{
++    print_prgname();
++    perror(str);
++}
++
++
++void fatal(const char *str, ...)
++{
++    va_list args;
++    va_start(args, str);
++    print_prgname();
++    vfprintf(stderr, str, args);
++    fputc('\n', stderr);
++    exit(2);
++}
++
++
++void fatal_ioerror(const char *str)
++{
++    print_prgname();
++    perror(str);
++    exit(2);
++}
++
++
++void out_of_mem(int size)
++{
++    if (size > 0)
++      fatal("out of memory allocating %d bytes.", size);
++    fatal("out of memory.");
++}
+diff -r af23d23c278b util/alevt/misc.h
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/misc.h        Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,32 @@
++#ifndef MISC_H
++#define MISC_H
++#define PTR (void *)
++#define NELEM(x) ((int)(sizeof(x)/sizeof(*(x))))
++#define NORETURN(x) void x __attribute__((__noreturn__))
++#define DEFINE(x) typeof(x) x
++#define OFFSET_OF(type, elem) ((u8 *)&((type *)0)->elem - (u8 *)0)
++#define BASE_OF(type, elem, p) ((type *)((u8 *)(p) - OFFSET_OF(type, elem)))
++
++#define not !
++#define streq(a, b) (strcmp((a), (b)) == 0)
++#define min(a,b) ({ typeof(a) _a = a; typeof(b) _b = b; _a < _b ? _a : _b; })
++#define max(a,b) ({ typeof(a) _a = a; typeof(b) _b = b; _a > _b ? _a : _b; })
++#define bound(a,b,c) ({ typeof(a) _a = a; typeof(b) _b = b; typeof(c) _c = c; \
++      _b < _a ? _a : _b > _c ? _c : _b; })
++
++typedef unsigned char u8;
++typedef unsigned short u16;
++typedef unsigned int u32;
++typedef signed char s8;
++typedef signed short s16;
++typedef signed int s32;
++
++extern char *prgname;
++void setprgname(char *argv_0);
++
++NORETURN(fatal(const char *str, ...));
++NORETURN(fatal_ioerror(const char *str));
++NORETURN(out_of_mem(int size));
++void error(const char *str, ...);
++void ioerror(const char *str);
++#endif
+diff -r af23d23c278b util/alevt/os.h
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/os.h  Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,7 @@
++#ifndef OS_H
++#define OS_H
++#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBsd__) \
++      || defined(__bsdi__)
++#define BSD
++#endif
++#endif
+diff -r af23d23c278b util/alevt/search.c
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/search.c      Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,127 @@
++#include <sys/types.h> // for freebsd
++#include <stdlib.h>
++#include "vt.h"
++#include "misc.h"
++#include "cache.h"
++#include "search.h"
++
++
++static void convert(u8 *p, u8 *buf, int *line)
++{
++    int x, y, c, ch, gfx, hid = 0;
++
++    for (y = 1, p += 40; y < 25; ++y)
++    {
++      if (not hid)
++      {
++          gfx = 0;
++          for (x = 0; x < 40; ++x)
++          {
++              c = ' ';
++              switch (ch = *p++)
++              {
++                  case 0x00 ... 0x07:
++                      gfx = 0;
++                      break;
++                  case 0x10 ... 0x17:
++                      gfx = 1;
++                      break;
++                  case 0x0c:
++                      hid = 1;
++                      break;
++                  case 0x7f:
++                      c = '*';
++                      break;
++                  case 0x20 ... 0x7e:
++                      if (gfx && ch != ' ' && (ch & 0xa0) == 0x20)
++                          ch = '#';
++                  case 0xa0 ... 0xff:
++                      c= ch;
++              }
++              *buf++ = c;
++          }
++          *buf++ = '\n';
++          *line++ = y;
++      }
++      else
++      {
++          p += 40;
++          hid = 0;
++      }
++    }
++    *line = y;
++    *buf = 0;
++}
++
++
++static int search_pg(struct search *s, struct vt_page *vtp)
++{
++    regmatch_t m[1];
++    u8 buf[H *(W+1) + 1];
++    int line[H];
++
++    convert(PTR vtp->data, buf, line);
++    if (regexec(s->pattern, buf, 1, m, 0) == 0)
++    {
++      s->len = 0;
++      if (m->rm_so >= 0)
++      {
++          s->y = line[m->rm_so / (W+1)];
++          s->x = m->rm_so % (W+1);
++          s->len = m->rm_eo - m->rm_so;
++          if (s->x + s->len > 40)
++              s->len = 40 - s->x;
++      }
++      return 1;
++    }
++    return 0;
++}
++
++
++struct search * search_start(struct cache *ca, u8 *pattern)
++{
++    struct search *s;
++    int f = 0;
++
++    if (not(s = malloc(sizeof(*s))))
++      goto fail1;
++
++    if (pattern[0] == '!')
++      pattern++;
++    else
++      f = REG_ICASE;
++
++    if (regcomp(s->pattern, pattern, f | REG_NEWLINE) != 0)
++      goto fail2;
++
++    s->cache = ca;
++    return s;
++
++fail2:
++    free(s);
++fail1:
++    return 0;
++}
++
++
++void search_end(struct search *s)
++{
++    regfree(s->pattern);
++    free(s);
++}
++
++
++int search_next(struct search *s, int *pgno, int *subno, int dir)
++{
++    struct vt_page *vtp = 0;
++
++    if (s->cache)
++      vtp = s->cache->op->foreach_pg(s->cache, *pgno, *subno, dir,
++      search_pg, s);
++    if (vtp == 0)
++      return -1;
++
++    *pgno = vtp->pgno;
++    *subno = vtp->subno ?: ANY_SUB;
++    return 0;
++}
+diff -r af23d23c278b util/alevt/search.h
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/search.h      Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,16 @@
++#ifndef SEARCH_H
++#define SEARCH_H
++
++#include <regex.h>
++
++struct search
++{
++    struct cache *cache;
++    regex_t pattern[1];
++    int x, y, len; // the position of the match
++};
++
++struct search *search_start(struct cache *ca, u8 *pattern);
++void search_end(struct search *s);
++int search_next(struct search *s, int *pgno, int *subno, int dir);
++#endif
+diff -r af23d23c278b util/alevt/ui.c
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/ui.c  Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,721 @@
++#include <stdio.h>
++#include <unistd.h>
++#include <stdlib.h>
++#include <string.h>
++#include <fcntl.h>
++#include <ctype.h>
++#include <stdarg.h>
++#include "vt.h"
++#include "misc.h"
++#include "xio.h"
++#include "vbi.h"
++#include "fdset.h"
++#include "search.h"
++#include "export.h"
++#include "ui.h"
++
++static void vtwin_event(struct vtwin *w, struct vt_event *ev);
++static void msg(struct vtwin *w, u8 *str, ...);
++static void err(struct vtwin *w, u8 *str, ...);
++
++#define hist(w,o) ((w)->hist + (((w)->hist_top + (o)) & (N_HISTORY-1)))
++
++
++static int inc_hex(int i, int bcd_mode)
++{
++    i++;
++    if (bcd_mode)
++    {
++      if ((i & 0x000f) > 0x0009)
++          i = (i + 0x0010) & 0x0ff0;
++      if ((i & 0x00f0) > 0x090)
++          i = (i + 0x0100) & 0x0f00;
++      if ((i & 0x0f00) > 0x0900)
++          i = (i + 0x1000) & 0xf000;
++    }
++    return i;
++}
++
++
++static int dec_hex(int i, int bcd_mode)
++{
++    i--;
++    if (bcd_mode)
++    {
++      if ((i & 0x000f) > 0x0009)
++          i = (i & 0xfff0) + 0x0009;
++      if ((i & 0x00f0) > 0x0090)
++          i = (i & 0xff00) + 0x0099;
++      if ((i & 0x0f00) > 0x0900)
++          i = (i & 0xf000) + 0x0999;
++    }
++    return i;
++}
++
++
++static void set_title(struct vtwin *w)
++{
++    char buf[32], buf2[32];
++
++    if (w->subno == ANY_SUB)
++      sprintf(buf, "%x", w->pgno);
++    else
++      sprintf(buf, "%x/%x", w->pgno, w->subno);
++    if (w->searching)
++      sprintf(buf2, "(%s)", buf);
++    else
++      sprintf(buf2, "%s", buf);
++    xio_title(w->xw, buf2);
++}
++
++
++static void query_page(struct vtwin *w, int pgno, int subno)
++{
++    w->pgno = pgno;
++    w->subno = subno;
++    w->searching = 1;
++    w->hold = 0; //subno != ANY_SUB;
++    xio_set_concealed(w->xw, w->revealed = 0);
++
++    if (hist(w, 0)->pgno != pgno ||
++      (hist(w,0)->subno == ANY_SUB && subno != ANY_SUB))
++      w->hist_top++;
++    hist(w, 0)->pgno = pgno;
++    hist(w, 0)->subno = subno;
++    hist(w, 1)->pgno = 0;     // end marker
++
++    xio_cancel_selection(w->xw);
++    if (vbi_query_page(w->vbi, pgno, subno) == 0)
++    {
++      w->vtp = 0;
++    }
++    set_title(w);
++}
++
++
++static void new_or_query(struct vtwin *w, int pgno, int subno, int new_win)
++{
++    if (new_win)
++    {
++      if (w->child)
++          query_page(w->child, pgno, subno);
++      else
++          vtwin_new(w->xw->xio, w->vbi, 0, w, pgno, subno);
++    }
++    else
++      query_page(w, pgno, subno);
++}
++
++static int _next_pgno(int *arg, struct vt_page *vtp)
++{
++    int pgno = vtp->pgno;
++
++    if (arg[0] == pgno) // want different page
++      return 0;
++    if (arg[1])               // and not a hex page
++      for (; pgno; pgno >>=4)
++          if ((pgno & 15) > 9)
++              return 0;
++    return 1;
++}
++
++
++static int _next_subno(int *arg, struct vt_page *vtp)
++{
++    return vtp->pgno == arg[0];       // only subpages of this page
++}
++
++
++static void do_next_pgno(struct vtwin *w, int dir, int bcd_mode, int subs,
++    int new_win)
++{
++    struct vt_page *vtp;
++    struct vtwin *cw = (new_win && w->child) ? w->child : w;
++    int pgno = cw->pgno;
++    int subno = cw->subno;
++
++    if (w->vbi->cache)
++    {
++      int arg[2];
++      arg[0] = pgno;
++      arg[1] = bcd_mode;
++        if (vtp = w->vbi->cache->op->foreach_pg(w->vbi->cache,
++                  pgno, subno, dir, subs ? _next_subno:_next_pgno, &arg))
++      {
++          new_or_query(w, vtp->pgno, subs ? vtp->subno : ANY_SUB, new_win);
++          return;
++      }
++    }
++    err(w, "No page.");
++}
++
++#define notdigit(x) (not isdigit((x)))
++
++
++static int chk_screen_fromto(u8 *p, int x, int *n1, int *n2)
++{
++    p += x;
++
++    if (x >= 0 && x+5 < 42)
++      if (notdigit(p[1]) || notdigit(p[0]))
++          if (isdigit(p[2]))
++              if (p[3] == '/' || p[3] == ':')
++                  if (isdigit(p[4]))
++                      if (notdigit(p[5]) || notdigit(p[6]))   /* p[6] is save here */
++                      {
++                          *n1 = p[2] % 16;
++                          if (isdigit(p[1]))
++                              *n1 += p[1] % 16 * 16;
++                          *n2 = p[4] % 16;
++                          if (isdigit(p[5]))
++                              *n2 = *n2 * 16 + p[5] % 16;
++                          return 1;
++                      }
++    return 0;
++}
++
++
++static int chk_screen_pgno(u8 *p, int x, int *pgno, int *subno)
++{
++    p += x;
++
++    if (x >= 0 && x+4 < 42)
++      if (notdigit(p[0]) && notdigit(p[4]))
++          if (isdigit(p[1]) && isdigit(p[2]) && isdigit(p[3]))
++          {
++              *pgno = p[1] % 16 * 256 + p[2] % 16 * 16 + p[3] % 16;
++              if (*pgno >= 0x100 && *pgno <= 0x999)
++              {
++                  *subno = ANY_SUB;
++                  if (x+6 < 42)
++                      if (p[4] == '.' || p[4] == '/')
++                          if (isdigit(p[5]))
++                              if (notdigit(p[6]) || notdigit(p[7]))   /* p[7] is save here */
++                              {
++                                  *subno = p[5] % 16;
++                                  if (isdigit(p[6]))
++                                      *subno = *subno * 16 + p[6] % 16;
++                              }
++                  // hackhackhack:
++                  // pgno followed by start box gets subno 1
++                  if (x+4 < 42 && p[4] == 11)
++                      *subno = 1;
++                  return 1;
++              }
++          }
++    return 0;
++}
++
++
++static void do_screen_pgno(struct vtwin *w, int x, int y, int new_win)
++{
++    u8 buf[42];
++    int n1, n2, i;
++
++    if (x >= 0 && x < 40)
++    {
++      if (xio_get_line(w->xw, y, buf+1) == 0)
++      {
++          buf[0] = buf[41] = ' ';
++          x++;
++
++          for (i = -6; i < 35; i++)
++          {
++              if (w->vtp == 0 || w->vtp->subno != 0)
++                  if (chk_screen_fromto(buf, x+i, &n1, &n2))
++                  {
++                      // subno cycling works wrong with children.
++                      // so middle button cycles backwards...
++                      if (w->subno != ANY_SUB)
++                          n1 = w->subno;
++                      n1 = new_win ? dec_hex(n1, 1) : inc_hex(n1, 1);
++                      if (n1 < 1)
++                          n1 = n2;
++                      if (n1 > n2)
++                          n1 = 1;
++                      new_or_query(w, w->pgno, n1, 0);
++                      return;
++                  }
++              if (i >= -4)
++                  if (chk_screen_pgno(buf, x+i, &n1, &n2))
++                  {
++                      new_or_query(w, n1, n2, new_win);
++                      return;
++                  }
++          }
++      }
++    }
++    err(w, "No page.");
++}
++
++
++static void do_flof_pgno(struct vtwin *w, int button, int x, int new_win)
++{
++    struct vt_page *vtp = w->vtp;
++    int lk = 99, i, c;
++
++    if (vtp && vtp->flof)
++    {
++      switch (button)
++      {
++          case 1 ... 3:
++              for (i = 0; i <= x && i < 40; ++i)
++                  if ((c = vtp->data[24][i]) < 8)     // fg-color code
++                      lk = c;
++              lk = "x\0\1\2\3x\3x"[lk];               // color -> link#
++              break;
++          case KEY_F(1): lk = 0; break;
++          case KEY_F(2): lk = 1; break;
++          case KEY_F(3): lk = 2; break;
++          case KEY_F(4): lk = 3; break;
++          case KEY_F(5): lk = 5; break;
++      }
++      if (lk < 6 && (vtp->link[lk].pgno & 0xff) != 0xff)
++      {
++          new_or_query(w, vtp->link[lk].pgno, vtp->link[lk].subno, new_win);
++          return;
++      }
++    }
++    else
++    {
++      switch (button)
++      {
++          case 1 ... 3: lk = x / 8;   break;
++          case KEY_F(1): lk = 0;      break;
++          case KEY_F(2): lk = 1;      break;
++          case KEY_F(3): lk = 2;      break;
++          case KEY_F(4): lk = 3;      break;
++          case KEY_F(5): lk = 4;      break;
++      }
++      switch (lk)
++      {
++          case 0: new_or_query(w, 0x100, ANY_SUB, new_win);   return;
++          case 1: do_next_pgno(w, -1, 1, 0, new_win);         return;
++          case 2: new_or_query(w, 0x900, ANY_SUB, new_win);   return;
++          case 3: do_next_pgno(w, 1, 1, 0, new_win);          return;
++          case 4: new_or_query(w, 0x999, ANY_SUB, new_win);   return;
++      }
++    }
++    err(w, "No page.");
++}
++
++
++static void do_hist_pgno(struct vtwin *w)
++{
++    if (hist(w, -1)->pgno)
++    {
++      w->hist_top--;
++      query_page(w, hist(w, 0)->pgno, hist(w, 0)->subno);
++    }
++    else
++      err(w, "Empty history.");
++}
++
++
++static void put_head_line(struct vtwin *w, u8 *p)
++{
++    char buf[40];
++
++    if (p == 0)
++      xio_get_line(w->xw, 0, buf);
++    else
++      memcpy(buf + 8, p + 8, 32);
++
++    if (w->subno == ANY_SUB)
++      sprintf(buf, "\2%3x \5\xb7", w->pgno);
++    else
++      sprintf(buf, "\2S%02x \5\xb7", w->subno & 0xff);
++
++    if (w->searching)
++      buf[0] = 1;
++    if (w->hold)
++      buf[4] = 'H';
++    if (w->xw->concealed)
++      buf[6] = '*';
++    buf[7] = 7;
++
++    xio_put_line(w->xw, 0, buf);
++}
++
++
++static void put_menu_line(struct vtwin *w)
++{
++    if (w->status > 0)
++      xio_put_line(w->xw, 24, w->statusline);
++    else if (w->vtp && w->vtp->flof)
++      xio_put_line(w->xw, 24, w->vtp->data[24]);
++    else
++      xio_put_line(w->xw, 24, "\0   100     \4<<  \6Help  \4>>\0     999    ");
++}
++
++
++static void _msg(struct vtwin *w, u8 *str, va_list args)
++{
++    u8 buf[128];
++    int i;
++
++    i = vsprintf(buf, str, args);
++    if (i > W)
++    i = W;
++    memset(w->statusline, ' ', W);
++    memcpy(w->statusline + (W-i+1)/2, buf, i);
++    w->status = 6;
++    put_menu_line(w);
++}
++
++
++static void msg(struct vtwin *w, u8 *str, ...)
++{
++    va_list args;
++
++    va_start(args, str);
++    _msg(w, str, args);
++    va_end(args);
++}
++
++
++static void err(struct vtwin *w, u8 *str, ...)
++{
++    va_list args;
++
++    va_start(args, str);
++    _msg(w, str, args);
++    va_end(args);
++}
++
++
++static void next_search(struct vtwin *w, int rev)
++{
++    if (w->search)
++    {
++      int pgno = w->pgno;
++      int subno = w->subno;
++      int dir = rev ? -w->searchdir : w->searchdir;
++
++      if (search_next(w->search, &pgno, &subno, dir) == 0)
++      {
++          query_page(w, pgno, subno);
++          if (not w->searching && w->search->len)
++              xio_set_selection(w->xw, w->search->x, w->search->y,
++                          w->search->x + w->search->len - 1, w->search->y);
++          return;
++      }
++      else
++          err(w, "Pattern not found.");
++    }
++    else
++      err(w, "No search pattern.");
++}
++
++
++static void start_search(struct vtwin *w, u8 *string)
++{
++    if (not string)
++      return;
++
++    if (*string)
++    {
++      if (w->search)
++          search_end(w->search);
++      w->search = search_start(w->vbi->cache, string);
++      if (w->search == 0)
++      {
++          err(w, "Bad search pattern.");
++          return;
++      }
++    }
++    next_search(w, 0);
++}
++
++
++static void start_save2(struct vtwin *w, u8 *name)
++{
++    if (name && *name)
++      if (export(w->export, w->vtp, name))
++          err(w, export_errstr());
++
++    export_close(w->export);
++    w->export = 0;
++    put_menu_line(w);
++}
++
++
++struct vtwin * vtwin_new(struct xio *xio, struct vbi *vbi, char *geom,
++    struct vtwin *parent, int pgno, int subno)
++{
++    struct vtwin *w;
++
++    if (not(w = malloc(sizeof(*w))))
++      goto fail1;
++
++    if (not (w->xw = xio_open_win(xio, geom)))
++      goto fail2;
++    w->vbi = vbi;
++    w->vtp = 0;
++    w->search = 0;
++    w->export = 0;
++    w->parent = parent;
++    w->child = 0;
++    if (parent && parent->child)
++      fatal("internal error: parent already has a child != 0");
++    if (parent)
++      parent->child = w;
++
++    w->hist_top = 1;
++    hist(w,0)->pgno = 0;
++    hist(w,1)->pgno = 0;
++    w->status = 0;
++    xio_set_handler(w->xw, vtwin_event, w);
++    vbi_add_handler(w->vbi, vtwin_event, w);
++    query_page(w, pgno, subno);
++    return w;
++
++fail2:
++    free(w);
++fail1:
++    return 0;
++}
++
++
++static void vtwin_close(struct vtwin *w)
++{
++    if (w->parent)
++      w->parent->child = w->child;
++    if (w->child)
++      w->child->parent = w->parent;
++
++    if (w->search)
++      search_end(w->search);
++    if (w->export)
++      export_close(w->export);
++
++    vbi_del_handler(w->vbi, vtwin_event, w);
++    xio_close_win(w->xw, 1);
++    free(w);
++}
++
++
++static void vtwin_event(struct vtwin *w, struct vt_event *ev)
++{
++    struct xio_win *xw = w->xw;
++    int i;
++
++    switch (ev->type)
++    {
++      case EV_CLOSE:
++          vtwin_close(w);
++          break;
++
++      case EV_TIMER:
++          if (w->status > 0 && --w->status == 0)
++              put_menu_line(w);
++          break;
++
++      case EV_KEY:
++      {
++          switch (ev->i1)
++          {
++              case '0' ... '9':
++                  i = ev->i1 - '0';
++                  if (w->pgno >= 0x100)
++                  {
++                      if (i == 0)
++                          break;
++                      w->pgno = i;
++                  }
++                  else
++                  {
++                      w->pgno = w->pgno * 16 + i;
++                      if (w->pgno >= 0x100)
++                          query_page(w, w->pgno, ANY_SUB);
++                  }
++                  break;
++              case 'q':
++              case '\e':
++                  vtwin_close(w);
++                  break;
++              case 'h':
++                  query_page(w, 0x900, ANY_SUB);
++                  break;
++              case 'e':
++                  if (w->vbi->cache)
++                  {
++                      i = w->vbi->cache->op->mode(w->vbi->cache,
++                                                          CACHE_MODE_ERC, 0);
++                      w->vbi->cache->op->mode(w->vbi->cache,
++                                                          CACHE_MODE_ERC, !i);
++                      msg(w, "Error reduction %sabled.", i ? "dis" : "en");
++                  }
++                  break;
++              case 'o':
++                  if (vtwin_new(xw->xio, w->vbi, 0, 0, w->pgno, w->subno) == 0)
++                      err(w, "Unable to open new window.");
++                  break;
++              case KEY_RIGHT:
++                  do_next_pgno(w, 1, not ev->i2, 0, 0);
++                  break;
++              case KEY_LEFT:
++                  do_next_pgno(w, -1, not ev->i2, 0, 0);
++                  break;
++              case KEY_UP:
++                  do_next_pgno(w, -1, not ev->i2, 1, 0);
++                  break;
++              case KEY_DOWN:
++                  do_next_pgno(w, 1, not ev->i2, 1, 0);
++                  break;
++              case '\b':
++                  do_hist_pgno(w);
++                  break;
++              case ' ':
++                  w->hold = !w->hold;
++                  break;
++              case 'c':
++                  vbi_reset(w->vbi);
++                  break;
++              case 'i':
++                  if (w->vtp && w->vtp->flof &&
++                                       (w->vtp->link[5].pgno & 0xff) != 0xff)
++                      query_page(w, w->vtp->link[5].pgno,
++                                               w->vtp->link[5].subno);
++                  else
++                      query_page(w, 0x100, ANY_SUB);
++                  break;
++              case 'r':
++                  xio_set_concealed(xw, w->revealed = !w->revealed);
++                  break;
++              case KEY_F(1) ... KEY_F(5):
++                  do_flof_pgno(w, ev->i1, 0, ev->i2);
++                  break;
++              case 'n':
++                  next_search(w, 0);
++                  break;
++              case 'N':
++                  next_search(w, 1);
++                  break;
++              default:
++                  err(w, "Unused key.");
++                  break;
++          }
++          break;
++      }
++      case EV_RESET:
++      {
++          if (w->search)
++              search_end(w->search);
++          w->search = 0;
++
++          query_page(w, w->pgno, w->subno);
++          msg(w, "Cache cleared!");
++          break;
++      }
++      case EV_MOUSE:
++      {
++          if (ev->i1 == 3)
++              do_hist_pgno(w);
++          else if (ev->i1 == 5) // wheel mouse
++              do_next_pgno(w, 1, not ev->i2, 0, 0);
++          else if (ev->i1 == 4) // wheel mouse
++              do_next_pgno(w, -1, not ev->i2, 0, 0);
++          else if (ev->i1 == 7) // dual wheel mouse
++              do_next_pgno(w, 1, not ev->i2, 1, 0);
++          else if (ev->i1 == 6) // dual wheel mouse
++              do_next_pgno(w, -1, not ev->i2, 1, 0);
++          else if (ev->i4 == 24)
++              do_flof_pgno(w, ev->i1, ev->i3, ev->i1 == 2);
++          else if (ev->i4 == 0 && ev->i3 < 5)
++          {
++              if (ev->i1 == 1)
++                  w->hold = !w->hold;
++              else
++                  vtwin_new(xw->xio, w->vbi, 0, 0, w->pgno, w->subno);
++          }
++          else if (ev->i4 == 0 && ev->i3 < 8)
++          {
++              if (ev->i1 == 2 && w->child)
++                  w = w->child;
++              xio_set_concealed(w->xw, w->revealed = !w->revealed);
++          }
++          else
++              do_screen_pgno(w, ev->i3, ev->i4, ev->i1 == 2);
++          break;
++      }
++      case EV_PAGE:
++      {
++          struct vt_page *vtp = ev->p1;
++
++          if (0)
++              if (vtp->errors)
++                  printf("errors=%4d\n",vtp->errors);
++          if (w->searching || not(w->hold || ev->i1))
++              if (vtp->pgno == w->pgno)
++                  if (w->subno == ANY_SUB || vtp->subno == w->subno)
++              {
++                      w->searching = 0;
++                      w->vtp = vtp;
++                      put_head_line(w, vtp->data[0]);
++                      for (i = 1; i < 24; ++i)
++                          xio_put_line(w->xw, i, vtp->data[i]);
++                      put_menu_line(w);
++                      set_title(w);
++              }
++          break;
++      }
++      case EV_HEADER:
++      {
++          u8 *p = ev->p1;
++          int hdr_mag = ev->i1 / 256;
++          int flags = ev->i3;
++          int mag = w->pgno;
++          if (mag >= 0x10)
++              mag = mag >> 4;
++          if (mag >= 0x10)
++              mag = mag >> 4;
++          if (flags & PG_OUTOFSEQ)
++              p = 0;
++          else
++              if (~flags & PG_MAGSERIAL)
++                  if (mag != hdr_mag)
++                      p = 0;
++
++          put_head_line(w, p);
++          break;
++      }
++      case EV_XPACKET:
++      {
++#if 0 /* VPS data (seems to be unused in .de */
++          u8 *p = ev->p1;
++
++          if (ev->i1 == 8 && ev->i2 == 30 && p[0]/2 == 1)
++          {
++              int i;
++              int pil, cni, pty, misc;
++
++              for (i = 7; i < 20; ++i)
++                  p[i] = hamm8(p+i, &ev->i3);
++              if (ev->i3 & 0xf000)    /* uncorrectable errors */
++                  break;
++              cni = p[9] + p[15]/4*16 + p[16]%4*64 + p[10]%4*256
++                                      + p[16]/4*1024 + p[17]*4096;
++              pty = p[18] + p[19]*16;
++              pil = p[10]/4 + p[11]*4 + p[12]*64 + p[13]*1024
++                                      + p[14]*16384 + p[15]%4*262144;
++              misc = p[7] + p[8]*16;
++              err(w, "%02x %04x %05x %02x: %.20s", misc, cni, pil, pty, p+20);
++          }
++#endif
++          break;
++      }
++      case EV_ERR:
++      {
++          char *errmsg = ev->p1;
++          if (errmsg != NULL && *errmsg != '\0')
++          {
++              err(w, errmsg);
++              w->status = 30;
++              ev->p1 = NULL;
++              free(errmsg);
++          }
++          break;
++      }
++    }
++}
+diff -r af23d23c278b util/alevt/ui.h
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/ui.h  Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,35 @@
++#ifndef UI_H
++#define UI_H
++
++#include "vt.h"
++#include "xio.h"
++#include "vbi.h"
++#include "search.h"
++
++#define N_HISTORY (1 << 6) // number of history entries
++
++struct vtwin
++{
++    struct vtwin *parent, *child;
++    struct xio_win *xw;
++    struct vbi *vbi;
++    struct {
++    int pgno;
++    int subno;
++    } hist[N_HISTORY];
++    int hist_top;
++    int searching;
++    int revealed;
++    int hold;
++    int pgno, subno;
++    struct vt_page *vtp;
++    struct search *search;
++    int searchdir;
++    int status;
++    u8 statusline[W+1];
++    struct export *export;
++};
++
++extern struct vtwin *vtwin_new(struct xio *xio, struct vbi *vbi, char *geom,
++    struct vtwin *parent, int pgno, int subno);
++#endif
+diff -r af23d23c278b util/alevt/vbi.c
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/vbi.c Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,942 @@
++#define _GNU_SOURCE
++#include <stdlib.h>
++#include <string.h>
++#include <unistd.h>
++#include <fcntl.h>
++#include <stdio.h>
++#include <errno.h>
++#include <stdarg.h>
++#include <sys/ioctl.h>
++#include <sys/poll.h>
++#include "os.h"
++#include "vt.h"
++#include "misc.h"
++#include "vbi.h"
++#include "fdset.h"
++#include "hamm.h"
++#include "lang.h"
++#include <libzvbi.h>
++
++
++static vbi_capture      * pZvbiCapt;
++static vbi_raw_decoder  * pZvbiRawDec;
++static vbi_sliced       * pZvbiData;
++static vbi_proxy_client * pProxy;
++
++#define ZVBI_BUFFER_COUNT  10
++#define ZVBI_TRACE          0
++
++
++static int vbi_dvb_open(struct vbi *vbi, const char *vbi_name,
++      const char *channel, char *outfile, u_int16_t sid, int ttpid);
++static void dvb_handler(struct vbi *vbi, int fd);
++
++#define FAC (1<<16) // factor for fix-point arithmetic
++
++static u8 *rawbuf; // one common buffer for raw vbi data
++static int rawbuf_size; // its current size
++u_int16_t sid;
++static char *vbi_names[]
++      = { "/dev/vbi", "/dev/vbi0", "/dev/video0", "/dev/dvb/adapter0/demux0",
++      NULL }; // default device names if none was given at the command line
++
++
++static void out_of_sync(struct vbi *vbi)
++{
++    int i; // discard all in progress pages
++    for (i = 0; i < 8; ++i)
++    vbi->rpage[i].page->flags &= ~PG_ACTIVE;
++}
++
++
++// send an event to all clients
++static void vbi_send(struct vbi *vbi, int type, int i1, int i2, int i3, void *p1)
++{
++    struct vt_event ev[1];
++    struct vbi_client *cl, *cln;
++    ev->resource = vbi;
++    ev->type = type;
++    ev->i1 = i1;
++    ev->i2 = i2;
++    ev->i3 = i3;
++    ev->p1 = p1;
++    for (cl = PTR vbi->clients->first; cln = PTR cl->node->next; cl = cln)
++    cl->handler(cl->data, ev);
++}
++
++
++static void vbi_send_page(struct vbi *vbi, struct raw_page *rvtp, int page)
++{
++    struct vt_page *cvtp = 0;
++
++    if (rvtp->page->flags & PG_ACTIVE)
++    {
++    if (rvtp->page->pgno % 256 != page)
++    {
++    rvtp->page->flags &= ~PG_ACTIVE;
++    enhance(rvtp->enh, rvtp->page);
++    if (vbi->cache)
++    cvtp = vbi->cache->op->put(vbi->cache, rvtp->page);
++    vbi_send(vbi, EV_PAGE, 0, 0, 0, cvtp ?: rvtp->page);
++    }
++    }
++}
++
++
++static void pll_add(struct vbi *vbi, int n, int err)
++{
++}
++
++
++// process one videotext packet
++static int vt_line(struct vbi *vbi, u8 *p)
++{
++    struct vt_page *cvtp;
++    struct raw_page *rvtp;
++    int hdr, mag, mag8, pkt, i;
++    int err = 0;
++
++    hdr = hamm16(p, &err);
++    if (err & 0xf000)
++    return -4;
++    mag = hdr & 7;
++    mag8 = mag?: 8;
++    pkt = (hdr >> 3) & 0x1f;
++    p += 2;
++    rvtp = vbi->rpage + mag;
++    cvtp = rvtp->page;
++    switch (pkt)
++    {
++      case 0:
++      {
++          int b1, b2, b3, b4;
++          b1 = hamm16(p, &err); // page number
++          b2 = hamm16(p+2, &err); // subpage number + flags
++          b3 = hamm16(p+4, &err); // subpage number + flags
++          b4 = hamm16(p+6, &err); // language code + more flags
++          if (vbi->ppage->page->flags & PG_MAGSERIAL)
++              vbi_send_page(vbi, vbi->ppage, b1);
++          vbi_send_page(vbi, rvtp, b1);
++
++          if (err & 0xf000)
++              return 4;
++
++          cvtp->errors = (err >> 8) + chk_parity(p + 8, 32);;
++          cvtp->pgno = mag8 * 256 + b1;
++          cvtp->subno = (b2 + b3 * 256) & 0x3f7f;
++          cvtp->lang = "\0\4\2\6\1\5\3\7"[b4 >> 5] + (latin1==LATIN1 ? 0 : 8);
++          cvtp->flags = b4 & 0x1f;
++          cvtp->flags |= b3 & 0xc0;
++          cvtp->flags |= (b2 & 0x80) >> 2;
++          cvtp->lines = 1;
++          cvtp->flof = 0;
++          vbi->ppage = rvtp;
++          pll_add(vbi, 1, cvtp->errors);
++          conv2latin(p + 8, 32, cvtp->lang);
++          vbi_send(vbi, EV_HEADER, cvtp->pgno, cvtp->subno, cvtp->flags, p);
++
++          if (b1 == 0xff)
++          return 0;
++          cvtp->flags |= PG_ACTIVE;
++          init_enhance(rvtp->enh);
++          memcpy(cvtp->data[0]+0, p, 40);
++          memset(cvtp->data[0]+40, ' ', sizeof(cvtp->data)-40);
++          return 0;
++      }
++
++      case 1 ... 24:
++      {
++          pll_add(vbi, 1, err = chk_parity(p, 40));
++
++          if (~cvtp->flags & PG_ACTIVE)
++              return 0;
++
++          cvtp->errors += err;
++          cvtp->lines |= 1 << pkt;
++          conv2latin(p, 40, cvtp->lang);
++          memcpy(cvtp->data[pkt], p, 40);
++          return 0;
++      }
++      case 26:
++      {
++          int d, t[13];
++
++          if (~cvtp->flags & PG_ACTIVE)
++              return 0;
++
++          d = hamm8(p, &err);
++          if (err & 0xf000)
++              return 4;
++
++          for (i = 0; i < 13; ++i)
++              t[i] = hamm24(p + 1 + 3*i, &err);
++          if (err & 0xf000)
++              return 4;
++
++          add_enhance(rvtp->enh, d, t);
++          return 0;
++      }
++      case 27:
++      {
++          int b1,b2,b3,x;
++          if (~cvtp->flags & PG_ACTIVE)
++              return 0; // -1 flushes all pages. We may never resync again
++
++          b1 = hamm8(p, &err);
++          b2 = hamm8(p + 37, &err);
++          if (err & 0xf000)
++              return 4;
++          if (b1 != 0 || not(b2 & 8))
++              return 0;
++
++          for (i = 0; i < 6; ++i)
++          {
++              err = 0;
++              b1 = hamm16(p+1+6*i, &err);
++              b2 = hamm16(p+3+6*i, &err);
++              b3 = hamm16(p+5+6*i, &err);
++              if (err & 0xf000)
++                  return 1;
++              x = (b2 >> 7) | ((b3 >> 5) & 0x06);
++              cvtp->link[i].pgno = ((mag ^ x) ?: 8) * 256 + b1;
++              cvtp->link[i].subno = (b2 + b3 * 256) & 0x3f7f;
++          }
++          cvtp->flof = 1;
++          return 0;
++      }
++      case 30:
++      {
++          if (mag8 != 8)
++          return 0;
++          p[0] = hamm8(p, &err); // designation code
++          p[1] = hamm16(p+1, &err); // initial page
++          p[3] = hamm16(p+3, &err); // initial subpage + mag
++          p[5] = hamm16(p+5, &err); // initial subpage + mag
++          if (err & 0xf000)
++          return 4;
++          err += chk_parity(p+20, 20);
++          conv2latin(p+20, 20, 0);
++          vbi_send(vbi, EV_XPACKET, mag8, pkt, err, p);
++          return 0;
++      }
++      default:
++          return 0;
++    }
++    return 0;
++}
++
++
++// called when new vbi data is waiting
++static void vbi_handler(struct vbi *vbi, int fd)
++{
++    double timestamp;
++    struct timeval timeout;
++    int lineCount;
++    int line;
++    int res;
++
++    timeout.tv_sec  = 0;
++    timeout.tv_usec = 25000;
++    res = vbi_capture_read_sliced(pZvbiCapt, pZvbiData, &lineCount, &timestamp,
++    &timeout);
++    if (res > 0)
++    {
++      for (line=0; line < lineCount; line++)
++      {
++            if ((pZvbiData[line].id & VBI_SLICED_TELETEXT_B) != 0)
++          {
++              vt_line(vbi, pZvbiData[line].data);
++          }
++      }
++    }
++    else if (res < 0)
++    {
++    }
++}
++
++
++int vbi_add_handler(struct vbi *vbi, void *handler, void *data)
++{
++    struct vbi_client *cl;
++
++    if (not(cl = malloc(sizeof(*cl))))
++    return -1;
++    cl->handler = handler;
++    cl->data = data;
++    dl_insert_last(vbi->clients, cl->node);
++    return 0;
++}
++
++
++void vbi_del_handler(struct vbi *vbi, void *handler, void *data)
++{
++    struct vbi_client *cl;
++
++    for (cl = PTR vbi->clients->first; cl->node->next; cl = PTR cl->node->next)
++      if (cl->handler == handler && cl->data == data)
++      {
++          dl_remove(cl->node);
++          break;
++      }
++    return;
++}
++
++
++struct vbi * vbi_open(char *vbi_name, struct cache *ca,
++      const char *channel, char *outfile, u_int16_t sid, int ttpid)
++{
++    static int inited = 0;
++    struct vbi *vbi;
++    char * pErrStr;
++    int services;
++
++    if (vbi_name == NULL)
++    {
++        int i;
++        char *tried_devices = NULL;
++        char *old_tried_devices = NULL;
++        for (i = 0; vbi_names[i] != NULL; i++)
++        {
++        vbi_name = vbi_names[i];
++        // collect device names for the error message below
++        if (old_tried_devices)
++        {
++        if (asprintf(&tried_devices, "%s, %s", old_tried_devices, vbi_name) < 0)
++        tried_devices = NULL;
++        free(old_tried_devices);
++        }
++        else if (asprintf(&tried_devices, "%s", vbi_name) < 0)
++        tried_devices = NULL;
++        if (tried_devices == NULL)
++        out_of_mem(-1);
++        old_tried_devices = tried_devices;
++        if (access(vbi_name, R_OK) != 0)
++        continue;
++        vbi = vbi_open(vbi_name, ca, channel, outfile, sid, ttpid);
++        if (vbi != NULL)
++        {
++        if (tried_devices != NULL)
++        free(tried_devices);
++        return vbi;
++        }
++        }
++
++      error("could not open any of the standard devices (%s)", tried_devices);
++        free(tried_devices);
++      return NULL;
++    }
++
++    if (not inited)
++    lang_init();
++    inited = 1;
++
++    if (not(vbi = malloc(sizeof(*vbi))))
++    {
++      error("out of memory");
++      goto fail1;
++    }
++    if (!vbi_dvb_open(vbi, vbi_name, channel, outfile, sid, ttpid)) {
++          vbi->cache = ca;
++          dl_init(vbi->clients);
++          out_of_sync(vbi);
++          vbi->ppage = vbi->rpage;
++          fdset_add_fd(fds, vbi->fd, dvb_handler, vbi);
++          return vbi;
++    }
++
++    services = VBI_SLICED_TELETEXT_B;
++    pErrStr = NULL;
++    vbi->fd = -1;
++
++    pProxy = vbi_proxy_client_create(vbi_name, "alevt",
++    VBI_PROXY_CLIENT_NO_STATUS_IND, &pErrStr, ZVBI_TRACE);
++    if (pProxy != NULL)
++    {
++       pZvbiCapt = vbi_capture_proxy_new(pProxy, ZVBI_BUFFER_COUNT, 0,
++       &services, 0, &pErrStr);
++       if (pZvbiCapt == NULL)
++       {
++          vbi_proxy_client_destroy(pProxy);
++          pProxy = NULL;
++       }
++    }
++    if (pZvbiCapt == NULL)
++        pZvbiCapt = vbi_capture_v4l2_new(vbi_name, ZVBI_BUFFER_COUNT,
++        &services, 0, &pErrStr, ZVBI_TRACE);
++    if (pZvbiCapt == NULL)
++        pZvbiCapt = vbi_capture_v4l_new(vbi_name, 0, &services, 0, &pErrStr,
++        ZVBI_TRACE);
++
++    if (pZvbiCapt != NULL)
++    {
++        pZvbiRawDec = vbi_capture_parameters(pZvbiCapt);
++        if ((pZvbiRawDec != NULL) && ((services & VBI_SLICED_TELETEXT_B) != 0))
++        {
++            pZvbiData = malloc((pZvbiRawDec->count[0] + pZvbiRawDec->count[1]) \
++            * sizeof(*pZvbiData));
++
++            vbi->fd = vbi_capture_fd(pZvbiCapt);
++        }
++        else
++            vbi_capture_delete(pZvbiCapt);
++    }
++
++    if (pErrStr != NULL)
++    {
++        fprintf(stderr, "libzvbi: %s\n", pErrStr);
++        free(pErrStr);
++    }
++
++    if (vbi->fd == -1)
++        goto fail2;
++    vbi->cache = ca;
++    dl_init(vbi->clients);
++    out_of_sync(vbi);
++    vbi->ppage = vbi->rpage;
++    fdset_add_fd(fds, vbi->fd, vbi_handler, vbi);
++    return vbi;
++
++fail3:
++    close(vbi->fd);
++fail2:
++    free(vbi);
++fail1:
++    return 0;
++}
++
++
++void vbi_close(struct vbi *vbi)
++{
++    fdset_del_fd(fds, vbi->fd);
++    if (vbi->cache)
++    vbi->cache->op->close(vbi->cache);
++
++    if (pZvbiData != NULL)
++      free(pZvbiData);
++    pZvbiData = NULL;
++
++    if (pZvbiCapt != NULL)
++    {
++      vbi_capture_delete(pZvbiCapt);
++       pZvbiCapt = NULL;
++    }
++    if (pProxy != NULL)
++    {
++       vbi_proxy_client_destroy(pProxy);
++       pProxy = NULL;
++    }
++    free(vbi);
++}
++
++
++struct vt_page * vbi_query_page(struct vbi *vbi, int pgno, int subno)
++{
++    struct vt_page *vtp = 0;
++    if (vbi->cache)
++    vtp = vbi->cache->op->get(vbi->cache, pgno, subno);
++    if (vtp == 0)
++    {
++    return 0;
++    }
++    vbi_send(vbi, EV_PAGE, 1, 0, 0, vtp);
++    return vtp;
++}
++
++
++void vbi_reset(struct vbi *vbi)
++{
++    if (vbi->cache)
++    vbi->cache->op->reset(vbi->cache);
++    vbi_send(vbi, EV_RESET, 0, 0, 0, 0);
++}
++
++
++/* Starting from here: DVB API */
++#include <linux/dvb/dmx.h>
++#include <linux/dvb/frontend.h>
++#include <linux/dvb/video.h>
++
++static int dvb_get_table(int fd, u_int16_t pid, u_int8_t tblid, u_int8_t *buf,
++      size_t bufsz)
++{
++    struct dmx_sct_filter_params sctFilterParams;
++    struct pollfd pfd;
++    int r;
++    memset(&sctFilterParams, 0, sizeof(sctFilterParams));
++    sctFilterParams.pid = pid;
++    sctFilterParams.timeout = 10000;
++    sctFilterParams.flags = DMX_ONESHOT | DMX_IMMEDIATE_START | DMX_CHECK_CRC;
++    sctFilterParams.filter.filter[0] = tblid;
++    sctFilterParams.filter.mask[0] = 0xff;
++    if (ioctl(fd, DMX_SET_FILTER, &sctFilterParams)) {
++              perror("DMX_SET_FILTER");
++              return -1;
++      }
++      pfd.fd = fd;
++      pfd.events = POLLIN;
++      r = poll(&pfd, 1, 10000);
++      if (r < 0) {
++              perror("poll");
++              goto out;
++      }
++      if (r > 0) {
++              r = read(fd, buf, bufsz);
++              if (r < 0) {
++                      perror("read");
++                      goto out;
++              }
++      }
++ out:
++      ioctl(fd, DMX_STOP, 0);
++      return r;
++}
++
++static const u_int8_t byterev8[256] = {
++        0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
++        0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
++        0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
++        0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
++        0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
++        0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
++        0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
++        0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
++        0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
++        0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
++        0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
++        0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
++        0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
++        0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
++        0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
++        0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
++        0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
++        0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
++        0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
++        0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
++        0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
++        0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
++        0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
++        0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
++        0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
++        0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
++        0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
++        0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
++        0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
++        0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
++        0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
++        0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
++};
++
++static void dvb_handle_pes_payload(struct vbi *vbi, const u_int8_t *buf,
++      unsigned int len)
++{
++      unsigned int p, i;
++      u_int8_t data[42];
++
++      if (buf[0] < 0x10 || buf[0] > 0x1f)
++              return;  /* no EBU teletext data */
++      for (p = 1; p < len; p += /*6 + 40*/ 2 + buf[p + 1]) {
++#if 0
++      printf("Txt Line:\n"
++             "  data_unit_id             0x%02x\n"
++             "  data_unit_length         0x%02x\n"
++             "  reserved_for_future_use  0x%01x\n"
++             "  field_parity             0x%01x\n"
++             "  line_offset              0x%02x\n"
++             "  framing_code             0x%02x\n"
++             "  magazine_and_packet_addr 0x%04x\n"
++             "  data_block               0x%02x 0x%02x 0x%02x 0x%02x\n",
++             buf[p], buf[p+1],
++             buf[p+2] >> 6,
++             (buf[p+2] >> 5) & 1,
++             buf[p+2] & 0x1f,
++             buf[p+3],
++             (buf[p+4] << 8) | buf[p+5],
++             buf[p+6], buf[p+7], buf[p+8], buf[p+9]);
++#endif
++              for (i = 0; i < sizeof(data); i++)
++                      data[i] = byterev8[buf[p+4+i]];
++              /* note: we should probably check for missing lines and then
++               * call out_of_sync(vbi); and/or vbi_reset(vbi); */
++              vt_line(vbi, data);
++      }
++}
++
++static unsigned int rawptr;
++
++static void dvb_handler(struct vbi *vbi, int fd)
++{
++      /* PES packet start code prefix and stream_id == private_stream_1 */
++      static const u_int8_t peshdr[4] = { 0x00, 0x00, 0x01, 0xbd };
++      u_int8_t *bp;
++      int n;
++      unsigned int p, i, len;
++        u_int16_t rpid;
++        u_int32_t crc, crccomp;
++
++      if (rawptr >= (unsigned int)rawbuf_size)
++              rawptr = 0;
++      n = read(vbi->fd, rawbuf + rawptr, rawbuf_size - rawptr);
++      if (n <= 0)
++              return;
++      rawptr += n;
++      if (rawptr < 6)
++              return;
++      if (memcmp(rawbuf, peshdr, sizeof(peshdr))) {
++              bp = memmem(rawbuf, rawptr, peshdr, sizeof(peshdr));
++              if (!bp)
++                      return;
++              rawptr -= (bp - rawbuf);
++              memmove(rawbuf, bp, rawptr);
++              if (rawptr < 6)
++                      return;
++      }
++      len = (rawbuf[4] << 8) | rawbuf[5];
++      if (len < 9) {
++              rawptr = 0;
++              return;
++      }
++      if (rawptr < len + 6)
++              return;
++      p = 9 + rawbuf[8];
++#if 0
++      for (i = 0; i < len - p; i++) {
++              if (!(i & 15))
++                      printf("\n%04x:", i);
++              printf(" %02x", rawbuf[p + i]);
++      }
++      printf("\n");
++#endif
++      if (!dl_empty(vbi->clients))
++              dvb_handle_pes_payload(vbi, rawbuf + p, len - p);
++      rawptr -= len;
++      if (rawptr)
++              memmove(rawbuf, rawbuf + len, rawptr);
++}
++
++
++static int vbi_dvb_open(struct vbi *vbi, const char *vbi_name,
++      const char *channel, char *outfile, u_int16_t sid, int ttpid)
++{
++      struct {
++              u_int16_t pmtpid;
++              u_int16_t ttpid;
++              u_int16_t service_id;
++              u_int8_t service_type;
++              char service_provider_name[64];
++              char service_name[64];
++              u_int8_t txtlang[3];
++              u_int8_t txttype;
++              u_int8_t txtmagazine;
++              u_int8_t txtpage;
++      } progtbl[16], *progp;
++      u_int8_t tbl[4096];
++      u_int8_t * ppname, * psname, pncode, sncode, pnlen, snlen;
++      int r;
++      FILE *ofd;
++      unsigned int i, j, k, l, progcnt = 0;
++      struct dmx_pes_filter_params filterpar;
++
++      /* open DVB demux device */
++      if (!vbi_name)
++              vbi_name = "/dev/dvb/adapter0/demux0";
++      if ((vbi->fd = open(vbi_name, O_RDWR)) == -1) {
++              error("cannot open demux device %s", vbi_name);
++              return -1;
++      }
++      memset(progtbl, 0, sizeof(progtbl));
++      if (ttpid >= 0x15 && ttpid < 0x1fff) {
++              vbi->ttpid = ttpid;
++              printf("Using command line specified teletext PID 0x%x\n",
++              vbi->ttpid);
++              goto ttpidfound;
++      }
++      /* parse PAT to enumerate services and to find the PMT PIDs */
++      r = dvb_get_table(vbi->fd, 0, 0, tbl, sizeof(tbl));
++      if (r == -1)
++              goto outerr;
++      if (!(tbl[5] & 1)) {
++              error("PAT not active (current_next_indicator == 0)");
++              goto outerr;
++      }
++      if (tbl[6] != 0 || tbl[7] != 0) {
++              error("PAT has multiple sections");
++              goto outerr;
++      }
++      if (r < 13) {
++              error("PAT too short\n");
++              goto outerr;
++      }
++      r -= 13;
++      for (i = 0; i < (unsigned)r; i += 4) {
++              if (progcnt >= sizeof(progtbl)/sizeof(progtbl[0])) {
++                      error("Program table overflow");
++                      goto outerr;
++              }
++              progtbl[progcnt].service_id = (tbl[8 + i] << 8) | tbl[9 + i];
++              if (!progtbl[progcnt].service_id) /* this is the NIT pointer */
++                      continue;
++              progtbl[progcnt].pmtpid = ((tbl[10 + i] << 8) | tbl[11 + i])
++              & 0x1fff;
++              progcnt++;
++      }
++      /* find the SDT to get the station names */
++      r = dvb_get_table(vbi->fd, 0x11, 0x42, tbl, sizeof(tbl));
++      if (r == -1)
++              goto outerr;
++      if (!(tbl[5] & 1)) {
++              error("SDT not active (current_next_indicator == 0)");
++              goto outerr;
++      }
++      if (tbl[6] != 0 || tbl[7] != 0) {
++              error("SDT has multiple sections");
++              goto outerr;
++      }
++      if (r < 12) {
++              error("SDT too short\n");
++              goto outerr;
++      }
++      i = 11;
++      while (i < (unsigned)r - 1) {
++              k = (tbl[i] << 8) | tbl[i+1]; /* service ID */
++              progp = NULL;
++              for (j = 0; j < progcnt; j++)
++                      if (progtbl[j].service_id == k) {
++                              progp = &progtbl[j];
++                              break;
++                      }
++              j = i + 5;
++              i = j + (((tbl[i+3] << 8) | tbl[i+4]) & 0x0fff);
++              if (!progp) {
++                      error("SDT: service_id 0x%x not in PAT\n", k);
++                      continue;
++              }
++         while (j < i) {
++            switch (tbl[j]) {
++               case 0x48: // service descriptor
++                  k = j + 4 + tbl[j + 3];
++                  progp->service_type = tbl[j+2];
++                  ppname = tbl+j+4 ; // points to 1st byte of provider_name
++                  pncode = *ppname ; // 1st byte of provider_name
++                  pnlen = tbl[j+3]; // length of provider_name
++                  psname = tbl+k+1 ; // points to 1st byte of service_name
++                  sncode = *psname ; // 1st byte of service_name
++                  snlen = tbl[k]  ; // length of service_name
++                  if (pncode >= 0x20) {
++                     pncode = 0 ; // default character set Latin alphabet fig.A.1
++                  } else {
++                     ppname++ ; pnlen-- ;
++                     // character code from table A.3 1st byte = ctrl-code
++                  }
++                  if (sncode >= 0x20) {
++                     sncode = 0 ; // default character set Latin alphabet fig.A.1
++                  } else {
++                     psname++ ; snlen-- ;
++                     // character code from table A.3 ; 1st byte = ctrl-code
++                  }
++                  snprintf(progp->service_provider_name,
++                  sizeof(progp->service_provider_name), "%.*s", pnlen, ppname);
++                  snprintf(progp->service_name,
++                  sizeof(progp->service_name), "%.*s", snlen, psname); break;
++            }
++            j += 2 + tbl[j + 1]; // next descriptor
++         }
++      }
++      /* parse PMT's to find Teletext Services */
++      for (l = 0; l < progcnt; l++) {
++              progtbl[l].ttpid = 0x1fff;
++              if (progtbl[l].service_type != 0x01 || /* not digital TV */
++                  progtbl[l].pmtpid < 0x15 || /* PMT PID sanity check */
++                  progtbl[l].pmtpid >= 0x1fff)
++                      continue;
++              r = dvb_get_table(vbi->fd, progtbl[l].pmtpid, 0x02, tbl,
++              sizeof(tbl));
++              if (r == -1)
++                      goto outerr;
++              if (!(tbl[5] & 1)) { error \
++              ("PMT pid 0x%x not active (current_next_indicator == 0)",
++              progtbl[l].pmtpid);
++                      goto outerr;
++              }
++              if (tbl[6] != 0 || tbl[7] != 0) {
++                      error("PMT pid 0x%x has multiple sections",
++                      progtbl[l].pmtpid);
++                      goto outerr;
++              }
++              if (r < 13) {
++                      error("PMT pid 0x%x too short\n", progtbl[l].pmtpid);
++                      goto outerr;
++              }
++              i = 12 + (((tbl[10] << 8) | tbl[11]) & 0x0fff);
++              /* skip program info section */
++              while (i <= (unsigned)r-6) {
++                      j = i + 5;
++                      i = j + (((tbl[i + 3] << 8) | tbl[i + 4]) & 0x0fff);
++                      if (tbl[j - 5] != 0x06)
++                      /* teletext streams have type 0x06 */
++                              continue;
++                      k = ((tbl[j - 4] << 8) | tbl[j - 3]) & 0x1fff;
++              /* elementary PID - save until we know if it's teletext PID */
++                      while (j < i) {
++                              switch (tbl[j]) {
++                              case 0x56: /* EBU teletext descriptor */
++                                      progtbl[l].txtlang[0] = tbl[j + 2];
++                                      progtbl[l].txtlang[1] = tbl[j + 3];
++                                      progtbl[l].txtlang[2] = tbl[j + 4];
++                                      progtbl[l].txttype = tbl[j + 5] >> 3;
++                                      progtbl[l].txtmagazine = tbl[j + 5] & 7;
++                                      progtbl[l].txtpage = tbl[j + 6];
++                                      progtbl[l].ttpid = k;
++                                      break;
++                              }
++                              j += 2 + tbl[j + 1];
++                      }
++              }
++      }
++
++    printf \
++    ("sid:pmtpid:ttpid:type:provider:name:language:texttype:magazine:page\n\n");
++    for (i = 0; i < progcnt; i++) {
++    printf("%d:%d:%d:%d:%s:%s:lang=%.3s:type=%d:magazine=%1u:page=%3u\n",
++    progtbl[i].service_id, progtbl[i].pmtpid, progtbl[i].ttpid,
++    progtbl[i].service_type, progtbl[i].service_provider_name,
++    progtbl[i].service_name, progtbl[i].txtlang, progtbl[i].txttype,
++    progtbl[i].txtmagazine, progtbl[i].txtpage);
++    }
++
++    if (*outfile) {
++    ofd = fopen(outfile,"w") ;
++    if (ofd == NULL) { error("cannot open outfile\n"); goto outerr ; }
++    for (i = 0; i < progcnt; i++) {
++    if (progtbl[i].ttpid == 0x1fff) continue ; // service without teletext
++    fprintf(ofd,"%d:%d:%s:%s:lang=%.3s\n",
++    progtbl[i].service_id, progtbl[i].ttpid, progtbl[i].service_provider_name,
++    progtbl[i].service_name, progtbl[i].txtlang);
++    }
++    fclose(ofd) ;
++ }
++
++      progp = NULL;
++
++      if (channel) {
++              j = strlen(channel);
++              for (i = 0; i < progcnt; i++)
++                      if (!strncmp(progtbl[i].service_name, channel, j)
++                      && progtbl[i].ttpid != 0x1fff) { progp = &progtbl[i];
++                              break ;
++                      }
++      }
++
++      if (channel && !progp) {
++              j = strlen(channel);
++              for (i = 0; i < progcnt; i++)
++                      if (!strncasecmp(progtbl[i].service_name, channel, j)
++                      && progtbl[i].ttpid != 0x1fff) { progp = &progtbl[i];
++                              break ;
++                      }
++      }
++
++    if (sid) {
++    for (i = 0; i < progcnt; i++) {
++    if ((progtbl[i].service_id == sid) && (progtbl[i].ttpid != 0x1fff)) {
++            progp = &progtbl[i]; break ; }
++            }
++    }
++
++    if (!progp) {
++              for (i = 0; i < progcnt; i++)
++                      if (progtbl[i].ttpid != 0x1fff) {
++                              progp = &progtbl[i]; break ;
++                      }
++      }
++
++    printf("\nUsing: Service ID = %d ; PMT PID = %d ; TXT PID = %d ;\n"
++    "Service type = %d ; Provider Name = %s ; Service name = %s ;\n"
++    "language = %.3s ; Text type = %d ; Text Magazine = %1u ; Text page = %3u\n",
++    progp->service_id, progp->pmtpid, progp->ttpid, progp->service_type,
++    progp->service_provider_name, progp->service_name, progp->txtlang,
++    progp->txttype, progp->txtmagazine, progp->txtpage);
++    vbi->ttpid = progp->ttpid;
++
++ ttpidfound:
++      rawbuf = malloc(rawbuf_size = 8192);
++      if (!rawbuf)
++              goto outerr;
++      rawptr = 0;
++#if 0
++      close(vbi->fd);
++      if ((vbi->fd = open(vbi_name, O_RDWR)) == -1) {
++              error("cannot open demux device %s", vbi_name);
++              return -1;
++      }
++#endif
++      memset(&filterpar, 0, sizeof(filterpar));
++      filterpar.pid = vbi->ttpid;
++        filterpar.input = DMX_IN_FRONTEND;
++        filterpar.output = DMX_OUT_TAP;
++        filterpar.pes_type = DMX_PES_OTHER;
++        filterpar.flags = DMX_IMMEDIATE_START;
++        if (ioctl(vbi->fd, DMX_SET_PES_FILTER, &filterpar) < 0) {
++        error("ioctl: DMX_SET_PES_FILTER %s (%u)", strerror(errno), errno);
++        goto outerr;
++        }
++      return 0;
++
++ outerr:
++      close(vbi->fd);
++      vbi->fd = -1;
++      return -1;
++}
++
++
++struct vbi *open_null_vbi(struct cache *ca)
++{
++    static int inited = 0;
++    struct vbi *vbi;
++
++    if (not inited)
++    lang_init();
++    inited = 1;
++
++    vbi = malloc(sizeof(*vbi));
++    if (!vbi)
++    {
++              error("out of memory");
++              goto fail1;
++    }
++
++    vbi->fd = open("/dev/null", O_RDONLY);
++      if (vbi->fd == -1)
++      {
++              error("cannot open null device");
++              goto fail2;
++      }
++
++    vbi->ttpid = -1;
++    out_of_sync(vbi);
++    vbi->ppage = vbi->rpage;
++    fdset_add_fd(fds, vbi->fd, vbi_handler, vbi);
++    return vbi;
++
++fail3:
++    close(vbi->fd);
++fail2:
++    free(vbi);
++fail1:
++    return 0;
++}
++
++
++void send_errmsg(struct vbi *vbi, char *errmsg, ...)
++{
++      va_list args;
++      if (errmsg == NULL || *errmsg == '\0')
++              return;
++      va_start(args, errmsg);
++      char *buff = NULL;
++      if (vasprintf(&buff, errmsg, args) < 0)
++              buff = NULL;
++      va_end(args);
++      if(buff == NULL)
++              out_of_mem(-1);
++      vbi_send(vbi, EV_ERR, 0, 0, 0, buff);
++}
+diff -r af23d23c278b util/alevt/vbi.h
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/vbi.h Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,47 @@
++#ifndef VBI_H
++#define VBI_H
++
++#include "vt.h"
++#include "dllist.h"
++#include "cache.h"
++#include "lang.h"
++
++#define PLL_ADJUST 4
++
++struct raw_page
++{
++    struct vt_page page[1];
++    struct enhance enh[1];
++};
++
++struct vbi
++{
++    int fd;
++    struct cache *cache;
++    struct dl_head clients[1];
++    // page assembly
++    struct raw_page rpage[8]; // one for each magazin
++    struct raw_page *ppage; // points to page of previous pkt0
++    // DVB stuff
++    unsigned int ttpid;
++    u_int16_t sid;
++};
++
++struct vbi_client
++{
++    struct dl_node node[1];
++    void (*handler)(void *data, struct vt_event *ev);
++    void *data;
++};
++
++struct vbi *vbi_open(char *vbi_dev_name, struct cache *ca,
++      const char *channel, char *outfile, u_int16_t sid, int ttpid);
++void vbi_close(struct vbi *vbi);
++void vbi_reset(struct vbi *vbi);
++int vbi_add_handler(struct vbi *vbi, void *handler, void *data);
++void vbi_del_handler(struct vbi *vbi, void *handler, void *data);
++struct vt_page *vbi_query_page(struct vbi *vbi, int pgno, int subno);
++
++struct vbi *open_null_vbi(struct cache *ca);
++void send_errmsg(struct vbi *vbi, char *errmsg, ...);
++#endif
+diff -r af23d23c278b util/alevt/vt.h
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/vt.h  Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,62 @@
++#ifndef VT_H
++#define VT_H
++
++#include "misc.h"
++
++#define W 40
++#define H 25
++#define BAD_CHAR 0xb8 // substitute for chars with bad parity
++
++struct vt_event
++{
++    int type;
++    void *resource;   /* struct xio_win *, struct vbi *, ... */
++    int i1, i2, i3, i4;
++    void *p1;
++};
++
++#define EV_CLOSE      1
++#define EV_KEY                2       // i1:KEY_xxx  i2:shift-flag
++#define EV_MOUSE      3       // i1:button  i2:shift-flag i3:x  i4:y
++#define EV_SELECTION  4       // i1:len  p1:data
++#define EV_PAGE               5       // p1:vt_page i1:query-flag
++#define EV_HEADER     6       // i1:pgno  i2:subno  i3:flags  p1:data
++#define EV_XPACKET    7       // i1:mag  i2:pkt  i3:errors  p1:data
++#define EV_RESET      8       // ./.
++#define EV_TIMER      9       // ./.
++#define EV_ERR                10      // p1: errmsg
++#define KEY_F(i)      (1000+i)
++#define KEY_LEFT      2001
++#define KEY_RIGHT     2002
++#define KEY_UP                2003
++#define KEY_DOWN      2004
++#define KEY_PUP               2005
++#define KEY_PDOWN     2006
++#define KEY_DEL               2007
++#define KEY_INS               2008
++
++struct vt_page
++{
++    int pgno, subno;  // the wanted page number
++    int lang;         // language code
++    int flags;                // misc flags (see PG_xxx below)
++    int errors;               // number of single bit errors in page
++    u32 lines;                // 1 bit for each line received
++    u8 data[25][40];  // page contents
++    int flof;         // page has FastText links
++    struct {
++    int pgno;
++    int subno;
++    } link[6]; // FastText links (FLOF)
++};
++
++#define PG_SUPPHEADER 0x01    // C7  row 0 is not to be displayed
++#define PG_OUTOFSEQ   0x04    // C9  page out of numerical order
++#define PG_NODISPLAY  0x08    // C10 rows 1-24 is not to be displayed
++#define PG_MAGSERIAL  0x10    // C11 serial trans. (any pkt0 terminates page)
++#define PG_ERASE      0x20    // C4  clear previously stored lines
++#define PG_NEWSFLASH  0x40    // C5  box it and insert into normal video pict.
++#define PG_SUBTITLE   0x80    // C6  box it and insert into normal video pict.
++#define PG_ACTIVE     0x100   // currently fetching this page
++#define ANY_SUB               0x3f7f  // universal subpage number
++#endif
+diff -r af23d23c278b util/alevt/vt900.out
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/vt900.out     Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,29 @@
++#ifndef HELP_HEADER
++"        \6AleVT Online Help System         ",
++"  \22`p0`0    p `0pppp                     ",
++"\4\35\22\177 \177j5`p  \177 j5 j5           \7Version \34",
++"\4\35\22\177,\177j5\177.! +t>! j5           \7  1.7.0 \34",
++"  \22# #\42!\42#   \42   \42!              ",
++#else
++HELP_HEADER
++#endif
++"                                           ",
++"\6\15Contents:                             ",
++"\6\15Contents:                             ",
++"\24 ####################################   ",
++"                                           ",
++"   \3\177\6Starting alevt . . . . . . 902  ",
++"                                           ",
++"   \3\177\6Copying/Warranty . . . . . 904  ",
++"                                           ",
++"   \3\177\6The Status Line  . . . . . 905  ",
++"                                           ",
++"   \3\177\6Selecting Pages  . . . . . 907  ",
++"                                           ",
++"   \3\177\6QuickClick Page  . . . . . 915  ",
++"                                           ",
++"\24 pppppppppppppppppppppppppppppppppppp   ",
++"              (Click to select a page)     ",
++"                                           ",
++"\4\35\7                           Next 901 \34",
++"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
+diff -r af23d23c278b util/alevt/vt901.out
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/vt901.out     Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,29 @@
++#ifndef HELP_HEADER
++"        \6AleVT Online Help System         ",
++"  \22`p0`0    p `0pppp                     ",
++"\4\35\22\177 \177j5`p  \177 j5 j5           \7Version \34",
++"\4\35\22\177,\177j5\177.! +t>! j5           \7  1.7.0 \34",
++"  \22# #\42!\42#   \42   \42!              ",
++#else
++HELP_HEADER
++#endif
++"                                           ",
++"\6\15Contents:                             ",
++"\6\15Contents:                             ",
++"\24 ####################################   ",
++"                                           ",
++"\6  \3\177\6FastText Menu  . . . . . . 909 ",
++"\6                                         ",
++"\6  \3\177\6Keyboard Commands  . . . . 910 ",
++"\6                                         ",
++"\6  \3\177\6Starting alevt-cap . . . . 912 ",
++"\6                                         ",
++"\6  \3\177\6Starting alevt-date  . . . 914 ",
++"\6                                         ",
++"\6  \3\177\6QuickClick Page  . . . . . 915 ",
++"                                           ",
++"\24 pppppppppppppppppppppppppppppppppppp   ",
++"              (Click to select a page)     ",
++"                                           ",
++"\4\35\7Back 900     Index 900     Next 902 \34",
++"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
+diff -r af23d23c278b util/alevt/vt902.out
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/vt902.out     Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,29 @@
++#ifndef HELP_HEADER
++"        \6AleVT Online Help System         ",
++"  \22`p0`0    p `0pppp                     ",
++"\4\35\22\177 \177j5`p  \177 j5 j5        \7   Version \34",
++"\4\35\22\177,\177j5\177.! +t>! j5        \7     1.7.0 \34",
++"  \22# #\42!\42#   \42   \42!              ",
++#else
++HELP_HEADER
++#endif
++"                                           ",
++"\6\15Starting alevt:                       ",
++"\6\15Starting alevt:                       ",
++"\24 ####################################   ",
++"\6 $\7alevt\6[options]     Default:        ",
++"                                           ",
++"    -c\6<channel name>   (none;dvb only)   ",
++"    -ch -child\6<ppp.ss> (none)            ",
++"    -cs -charset       \6latin-1           ",
++"   \6<latin-1/2/koi8-r/                    ",
++"   \6iso8859-7>                            ",
++"    -h -help                               ",
++"                                           ",
++"                                           ",
++"                                           ",
++"\24 pppppppppppppppppppppppppppppppppppp   ",
++"                                           ",
++"                                           ",
++"\4\35\7Back 901     Index 900     Next 903 \34",
++"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
+diff -r af23d23c278b util/alevt/vt903.out
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/vt903.out     Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,29 @@
++#ifndef HELP_HEADER
++"        \6AleVT Online Help System         ",
++"  \22`p0`0    p `0pppp                     ",
++"\4\35\22\177 \177j5`p  \177 j5 j5           \7Version \34",
++"\4\35\22\177,\177j5\177.! +t>! j5           \7  1.7.0 \34",
++"  \22# #\42!\42#   \42   \42!              ",
++#else
++HELP_HEADER
++#endif
++"                                           ",
++"\6\15Starting alevt:                       ",
++"\6\15Starting alevt:                       ",
++"\24 ####################################   ",
++"\6 $\7alevt\6[options]     Default:        ",
++"    -o\6<outfile>        (none;dvb only)   ",
++"    -p -parent\6<ppp.ss> 900               ",
++"    -s -sid\6<sid>       (none;dvb only)   ",
++"    -t -ttpid\6<ttpid>   (none;dvb only)   ",
++"    -v -vbi\6<vbidev>    /dev/vbi          ",
++"                       \6/dev/vbi0         ",
++"                       \6/dev/video0       ",
++"          \6/dev/dvb/adapter0/demux0       ",
++"                                           ",
++"                                           ",
++"\24 pppppppppppppppppppppppppppppppppppp   ",
++"                                           ",
++"                                           ",
++"\4\35\7Back 902     Index 900     Next 904 \34",
++"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
+diff -r af23d23c278b util/alevt/vt904.out
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/vt904.out     Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,29 @@
++#ifndef HELP_HEADER
++"        \6AleVT Online Help System       ",
++"  \22`p0`0    p `0pppp                   ",
++"\4\35\22\177 \177j5`p  \177 j5 j5           \7Version \34",
++"\4\35\22\177,\177j5\177.! +t>! j5           \7  1.7.0 \34",
++"  \22# #\42!\42#   \42   \42!            ",
++#else
++HELP_HEADER
++#endif
++"                                         ",
++"\6\15Copying:                            ",
++"\6\15Copying:                            ",
++"\24 #################################### ",
++"\6 2002-07 Edgar Toernig (froese@gmx.de) ",
++"\6         All Rights Reserved.          ",
++"\6                                       ",
++"\6 This program is free software; you    ",
++"\6 can redistribute it and/or modify it  ",
++"\6 under the terms of the GNU General    ",
++"\6 Public License Version 2 as published ",
++"\6 by the Free Software Foundation.      ",
++"\6                                       ",
++"\6 This program is distributed in the    ",
++"\6 hope that it will be useful, but      ",
++"\6\7without any warranty.\6See the GNU   ",
++"\6 General Public License for details.   ",
++"                                         ",
++"\4\35\7Back 903     Index 900     Next 905 \34",
++"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
+diff -r af23d23c278b util/alevt/vt905.out
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/vt905.out     Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,29 @@
++#ifndef HELP_HEADER
++"        \6AleVT Online Help System       ",
++"  \22`p0`0    p `0pppp                   ",
++"\4\35\22\177 \177j5`p  \177 j5 j5           \7Version \34",
++"\4\35\22\177,\177j5\177.! +t>! j5           \7  1.7.0 \34",
++"  \22# #\42!\42#   \42   \42!            ",
++#else
++HELP_HEADER
++#endif
++"                                         ",
++"\6\15Status Line:                        ",
++"\6\15Status Line:                        ",
++"\24 #################################### ",
++"\6 The top line of each window is the    ",
++"\6 status line. On the left it shows     ",
++"\6 the current page number (CPN) and     ",
++"\6 some flags. The rest of the line      ",
++"\6 is the running header sent by the     ",
++"\6 TV station.                           ",
++"\6                                       ",
++"\6 If the CPN is red, the program is     ",
++"\6 searching for that page. If it's      ",
++"\6 green, it's the PN of the currently   ",
++"\6 displayed page.                       ",
++"\24 pppppppppppppppppppppppppppppppppppp ",
++"                                         ",
++"                                         ",
++"\4\35\7Back 904     Index 900     Next 906 \34",
++"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
+diff -r af23d23c278b util/alevt/vt906.out
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/vt906.out     Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,29 @@
++#ifndef HELP_HEADER
++"        \6AleVT Online Help System       ",
++"  \22`p0`0    p `0pppp                   ",
++"\4\35\22\177 \177j5`p  \177 j5 j5           \7Version \34",
++"\4\35\22\177,\177j5\177.! +t>! j5           \7  1.7.0 \34",
++"  \22# #\42!\42#   \42   \42!            ",
++#else
++HELP_HEADER
++#endif
++"                                         ",
++"\6\15Status Line:           \14\5\30     ",
++"\6\15Status Line:           \14\5\30     ",
++"\24 #################################### ",
++"\6 An\2H\6behind the CPN indicates that  ",
++"\6 the page is on hold. This inhibits    ",
++"\6 subpage cycling and page updates. A   ",
++"\6 click on the CPN toggles the\2H\6flag.",
++"                                         ",
++"\6 A\5*\6indicates that the page         ",
++"\6 contains concealed text. Clicking on  ",
++"\6 the\5*\6reveals that text.            ",
++"                                         ",
++"\6 A CPN in the form\2Sxx\6is shown if a ",
++"\6 specific subpage is selected.         ",
++"\24 pppppppppppppppppppppppppppppppppppp ",
++"                                         ",
++"                                         ",
++"\4\35\7Back 905     Index 900     Next 907 \34",
++"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
+diff -r af23d23c278b util/alevt/vt907.out
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/vt907.out     Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,29 @@
++#ifndef HELP_HEADER
++"        \6AleVT Online Help System        ",
++"  \22`p0`0    p `0pppp                    ",
++"\4\35\22\177 \177j5`p  \177 j5 j5           \7Version \34",
++"\4\35\22\177,\177j5\177.! +t>! j5           \7  1.7.0 \34",
++"  \22# #\42!\42#   \42   \42!             ",
++#else
++HELP_HEADER
++#endif
++"                                          ",
++"\6\15Selecting Pages:                     ",
++"\6\15Selecting Pages:                     ",
++"\24 ####################################  ",
++"\6 To select a specific page, you may     ",
++"\6 either enter the page number with      ",
++"\6 the keyboard or click with the\7left   ",
++"\6 mouse button on a page number          ",
++"\6 somewhere on the screen.               ",
++"\6                                        ",
++"\6 Clicking with the\7middle\6button will ",
++"\6 show the page in a child window. If    ",
++"\6 there is no child window, a new one    ",
++"\6 will be opened.                        ",
++"\6                                        ",
++"\24 pppppppppppppppppppppppppppppppppppp  ",
++"                                          ",
++"                                          ",
++"\4\35\7Back 906     Index 900     Next 908 \34",
++"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
+diff -r af23d23c278b util/alevt/vt908.out
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/vt908.out     Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,29 @@
++#ifndef HELP_HEADER
++"        \6AleVT Online Help System        ",
++"  \22`p0`0    p `0pppp                    ",
++"\4\35\22\177 \177j5`p  \177 j5 j5           \7Version \34",
++"\4\35\22\177,\177j5\177.! +t>! j5           \7  1.7.0 \34",
++"  \22# #\42!\42#   \42   \42!             ",
++#else
++HELP_HEADER
++#endif
++"                                          ",
++"\6\15Selecting Pages:                     ",
++"\6\15Selecting Pages:                     ",
++"\24 ####################################  ",
++"\6 AleVT also recognizes something like   ",
++"\3 3/7\6as a valid page number. Clicking  ",
++"\6 with the\7left\6button will cycle to   ",
++"\6 the next subpage of the current page.  ",
++"\6 The\7middle\6buttons cycles backwards. ",
++"\6                                        ",
++"\6 For each window a history of           ",
++"\6 recently visited pages is kept.        ",
++"\6 Pressing the\7right\6mouse button will ",
++"\6 take you back to the previous page.    ",
++"\6                                        ",
++"\24 pppppppppppppppppppppppppppppppppppp  ",
++"                                          ",
++"                                          ",
++"\4\35\7Back 907     Index 900     Next 909 \34",
++"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
+diff -r af23d23c278b util/alevt/vt909.out
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/vt909.out     Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,29 @@
++#ifndef HELP_HEADER
++"        \6AleVT Online Help System       ",
++"  \22`p0`0    p `0pppp                   ",
++"\4\35\22\177 \177j5`p  \177 j5 j5           \7Version \34",
++"\4\35\22\177,\177j5\177.! +t>! j5           \7  1.7.0 \34",
++"  \22# #\42!\42#   \42   \42!            ",
++#else
++HELP_HEADER
++#endif
++"                                         ",
++"\6\15FastText Menu:                      ",
++"\6\15FastText Menu:                      ",
++"\24 #################################### ",
++"\6 The last line of each window shows    ",
++"\6 the FastText Menu (only if one is     ",
++"\6 transmitted for that page).           ",
++"\6                                       ",
++"\6 It consists of up to four colored     ",
++"\6 labels. You may click on a label      ",
++"\6 or press one of the function keys     ",
++"\6 F1-F4 to go to the associated page.   ",
++"\6                                       ",
++"\6 For the 5th (white) key present on    ",
++"\6 some remote controls press F5.        ",
++"\24 pppppppppppppppppppppppppppppppppppp ",
++"                                         ",
++"                                         ",
++"\4\35\7Back 908     Index 900     Next 910 \34",
++"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
+diff -r af23d23c278b util/alevt/vt910.out
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/vt910.out     Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,29 @@
++#ifndef HELP_HEADER
++"        \6AleVT Online Help System       ",
++"  \22`p0`0    p `0pppp                   ",
++"\4\35\22\177 \177j5`p  \177 j5 j5           \7Version \34",
++"\4\35\22\177,\177j5\177.! +t>! j5           \7  1.7.0 \34",
++"  \22# #\42!\42#   \42   \42!            ",
++#else
++HELP_HEADER
++#endif
++"                                         ",
++"\6\15Keyboard Commands:                  ",
++"\6\15Keyboard Commands:                  ",
++"\24 #################################### ",
++"  0\6-\0079    \6Enter page number       ",
++"  q\6or\7ESC \6Close window              ",
++"  h        \6Goto page 900 (help page)   ",
++"  i        \6Goto page 100 (index page)  ",
++"  o        \6Open a new window           ",
++"  SPACE    \6Hold page                   ",
++"  RIGHT    \6Goto next page              ",
++"  LEFT     \6Goto previous page          ",
++"  DOWN     \6Goto next subpage           ",
++"  UP       \6Goto previous subpage       ",
++"  BACKSPACE\6Previous page from history  ",
++"\24 pppppppppppppppppppppppppppppppppppp ",
++"                                         ",
++"                                         ",
++"\4\35\7Back 909     Index 900     Next 911 \34",
++"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
+diff -r af23d23c278b util/alevt/vt911.out
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/vt911.out     Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,29 @@
++#ifndef HELP_HEADER
++"        \6AleVT Online Help System        ",
++"  \22`p0`0    p `0pppp                    ",
++"\4\35\22\177 \177j5`p  \177 j5 j5        \7   Version \34",
++"\4\35\22\177,\177j5\177.! +t>! j5        \007 1.7.0   \34",
++"  \22# #\42!\42#   \42   \42!             ",
++#else
++HELP_HEADER
++#endif
++"                                          ",
++"\6\15Keyboard Commands:                   ",
++"\6\15Keyboard Commands:                   ",
++"\24 ####################################  ",
++"  s        \6Save page to file            ",
++"  c        \6Clear page cache             ",
++"  r        \6Reveal concealed text        ",
++"  F1\6-\7F5  \6FastText keys              ",
++"  /\6and\7?  \6Search forward/backward    ",
++"  n\6and\7N  \6Search next/previous       ",
++"  f\6and\7F  \6Fine tune the decoder      ",
++"  e        \6Error reduction on/off       ",
++"  b        \6Error bell on/off            ",
++"\6 Holding the\7shift\6key while pressing ",
++"\6 one of the\7cursor\6keys allows        ",
++"\6 selecting the 'hex' pages (Ex.: 1f1).  ",
++"\24 pppppppppppppppppppppppppppppppppppp  ",
++"                                          ",
++"\4\35\7Back 910     Index 900     Next 912 \34",
++"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
+diff -r af23d23c278b util/alevt/vt912.out
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/vt912.out     Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,29 @@
++#ifndef HELP_HEADER
++"        \6AleVT Online Help System         ",
++"  \22`p0`0    p `0pppp                     ",
++"\4\35\22\177 \177j5`p  \177 j5 j5        \7   Version \34",
++"\4\35\22\177,\177j5\177.! +t>! j5        \7     1.7.0 \34",
++"  \22# #\42!\42#   \42   \42!              ",
++#else
++HELP_HEADER
++#endif
++"                                           ",
++"\6\15Starting alevt-cap:                   ",
++"\6\15Starting alevt-cap:                   ",
++"\24 ####################################   ",
++"\6 $\7alevt-cap\6[options]   Default:      ",
++"                                           ",
++"   -cs -charset          \6latin-1         ",
++"   \6<latin-1/2/koi8-r/                    ",
++"   \6iso8859-7>                            ",
++"   -f -format            \6ascii           ",
++"   \6<fmt,options>                         ",
++"   -f help -format help                    ",
++"   -h -help                                ",
++"   -n -name \6<filename>   ttext-%s.%e     ",
++"                                           ",
++"\24 pppppppppppppppppppppppppppppppppppp   ",
++"                                           ",
++"                                           ",
++"\4\35\7Back 911     Index 900     Next 913 \34",
++"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
+diff -r af23d23c278b util/alevt/vt913.out
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/vt913.out     Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,29 @@
++#ifndef HELP_HEADER
++"        \6AleVT Online Help System         ",
++"  \22`p0`0    p `0pppp                     ",
++"\4\35\22\177 \177j5`p  \177 j5 j5        \7   Version \34",
++"\4\35\22\177,\177j5\177.! +t>! j5        \7     1.7.0 \34",
++"  \22# #\42!\42#   \42   \42!              ",
++#else
++HELP_HEADER
++#endif
++"                                           ",
++"\6\15Starting alevt-cap:                   ",
++"\6\15Starting alevt-cap:                   ",
++"\24 ####################################   ",
++"\6 $\7alevt-cap\6[options] Default:        ",
++"                                           ",
++"    -s -sid\6<sid>       (none;dvb only)   ",
++"    -t -ttpid\6<ttpid>   (none;dvb only)   ",
++"    -to -timeout\6<secs> (none)            ",
++"    -v -vbi\6<vbidev>    /dev/vbi          ",
++"                       \6/dev/vbi0         ",
++"                       \6/dev/video0       ",
++"          \6/dev/dvb/adapter0/demux0       ",
++"                                           ",
++"                                           ",
++"\24 pppppppppppppppppppppppppppppppppppp   ",
++"                                           ",
++"                                           ",
++"\4\35\7Back 912     Index 900     Next 914 \34",
++"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
+diff -r af23d23c278b util/alevt/vt914.out
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/vt914.out     Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,29 @@
++#ifndef HELP_HEADER
++"        \6AleVT Online Help System         ",
++"  \22`p0`0    p `0pppp                     ",
++"\4\35\22\177 \177j5`p  \177 j5 j5        \7   Version \34",
++"\4\35\22\177,\177j5\177.! +t>! j5        \7     1.7.0 \34",
++"  \22# #\42!\42#   \42   \42!              ",
++#else
++HELP_HEADER
++#endif
++"                                           ",
++"\6\15Starting alevt-date:                  ",
++"\6\15Starting alevt-date:                  ",
++"\24 ####################################   ",
++"\6 $\7alevt-date\6[options]  Default:      ",
++"                                           ",
++"    -d -delta\6<max_secs>  7200 (2 hours)  ",
++"    -f -format\6<fmtstr>   %c              ",
++"    -h -help                               ",
++"    -s -set              \6off             ",
++"    -to -timeout\6<seconds>(none)          ",
++"    -v -vbi\6<vbidev>      /dev/vbi        ",
++"                         \6/dev/vbi0       ",
++"                         \6/dev/video0     ",
++"            \6/dev/dvb/adapter0/demux0     ",
++"\24 pppppppppppppppppppppppppppppppppppp   ",
++"                                           ",
++"                                           ",
++"\4\35\7Back 913     Index 900     Next 915 \34",
++"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
+diff -r af23d23c278b util/alevt/vt915.out
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/vt915.out     Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,29 @@
++#ifndef HELP_HEADER
++"        \6AleVT Online Help System       ",
++"  \22`p0`0    p `0pppp                   ",
++"\4\35\22\177 \177j5`p  \177 j5 j5           \7Version \34",
++"\4\35\22\177,\177j5\177.! +t>! j5           \7  1.7.0 \34",
++"  \22# #\42!\42#   \42   \42!            ",
++#else
++HELP_HEADER
++#endif
++"                                         ",
++"\6\15QuickClick:                         ",
++"\6\15QuickClick:                         ",
++"\24 #################################### ",
++"\6   100 200 300 400 500 600 700 800     ",
++"\6   101 201 301 401 501 601 701 801     ",
++"\6   110 210 310 410 510 610 710 810     ",
++"\6   120\006220 320 420 520 620 720 820  ",
++"\6   130 230 330 430 530 630 730 830     ",
++"\6   140\006240 340 440 540 640 740 840  ",
++"\6   150 250 350 450 550 650 750 850     ",
++"\6   160\006260 360 460 560 660 760 860  ",
++"\6   170 270 370 470 570 670 770 870     ",
++"\6   180\006280 380 480 580 680 780 880  ",
++"\6   190 290 390 490 590 690 790 890     ",
++"\24 pppppppppppppppppppppppppppppppppppp ",
++"                                         ",
++"                                         ",
++"\4\35\7             Index 900              \34",
++"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
+diff -r af23d23c278b util/alevt/vtxt-iso8859-7.bdf
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/vtxt-iso8859-7.bdf    Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,5768 @@
++STARTFONT 2.1
++FONT -alevt-teletext-medium-r-normal--16-1-75-75-c-90-fontspecific-1
++SIZE 1 75 75
++FONTBOUNDINGBOX 9 16 0 -4
++STARTPROPERTIES 10
++POINT_SIZE 1
++PIXEL_SIZE 16
++RESOLUTION_X 75
++RESOLUTION_Y 75
++FONT_ASCENT 12
++FONT_DESCENT 4
++AVERAGE_WIDTH 90
++SPACING "C"
++_XMBDFED_INFO "Edited with xmbdfed 4.5."
++FONT "vtxt"
++ENDPROPERTIES
++CHARS 250
++STARTCHAR char0
++ENCODING 0
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 1
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char2
++ENCODING 2
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 3
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char0
++ENCODING 4
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++F000
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 5
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char2
++ENCODING 6
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++F000
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 7
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++F000
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char0
++ENCODING 8
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 9
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char2
++ENCODING 10
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 11
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char0
++ENCODING 12
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 13
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char2
++ENCODING 14
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 15
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char0
++ENCODING 16
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++F000
++F000
++F000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 17
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++0000
++0000
++0000
++0000
++F000
++F000
++F000
++0000
++0000
++ENDCHAR
++STARTCHAR char2
++ENCODING 18
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++0000
++0000
++0000
++0000
++F000
++F000
++F000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 19
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++0000
++0000
++0000
++0000
++F000
++F000
++F000
++0000
++0000
++ENDCHAR
++STARTCHAR char0
++ENCODING 20
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 21
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++ENDCHAR
++STARTCHAR char2
++ENCODING 22
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 23
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++ENDCHAR
++STARTCHAR char0
++ENCODING 24
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++F000
++F000
++F000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 25
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++F000
++F000
++F000
++0000
++0000
++ENDCHAR
++STARTCHAR char2
++ENCODING 26
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++F000
++F000
++F000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 27
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++F000
++F000
++F000
++0000
++0000
++ENDCHAR
++STARTCHAR char0
++ENCODING 28
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++F000
++F000
++F000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 29
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++F000
++F000
++F000
++0000
++0000
++ENDCHAR
++STARTCHAR char2
++ENCODING 30
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++F000
++F000
++F000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 31
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++F000
++F000
++F000
++0000
++0000
++ENDCHAR
++STARTCHAR char32
++ENCODING 32
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char33
++ENCODING 33
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1800
++3C00
++3C00
++3C00
++1800
++1800
++1800
++0000
++1800
++1800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char34
++ENCODING 34
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++6600
++6600
++6600
++2400
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char35
++ENCODING 35
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++3600
++3600
++7F00
++3600
++3600
++3600
++7F00
++3600
++3600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char36
++ENCODING 36
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0C00
++0C00
++3E00
++6300
++6100
++6000
++3E00
++0300
++0300
++4300
++6300
++3E00
++0C00
++0C00
++0000
++0000
++ENDCHAR
++STARTCHAR char37
++ENCODING 37
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++6100
++6300
++0600
++0C00
++1800
++3000
++6300
++4300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char38
++ENCODING 38
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1C00
++3600
++3600
++1C00
++3B00
++6E00
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char39
++ENCODING 39
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++3000
++3000
++3000
++6000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char40
++ENCODING 40
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0C00
++1800
++3000
++3000
++3000
++3000
++3000
++3000
++1800
++0C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char41
++ENCODING 41
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3000
++1800
++0C00
++0C00
++0C00
++0C00
++0C00
++0C00
++1800
++3000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char42
++ENCODING 42
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++6600
++3C00
++FF00
++3C00
++6600
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char43
++ENCODING 43
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++1800
++1800
++7E00
++1800
++1800
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char44
++ENCODING 44
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++1800
++1800
++1800
++3000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char45
++ENCODING 45
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++7F00
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char46
++ENCODING 46
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++1800
++1800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char47
++ENCODING 47
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0100
++0300
++0600
++0C00
++1800
++3000
++6000
++4000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char48
++ENCODING 48
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3C00
++6600
++C300
++C300
++DB00
++DB00
++C300
++C300
++6600
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char49
++ENCODING 49
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1800
++3800
++7800
++1800
++1800
++1800
++1800
++1800
++1800
++7E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char50
++ENCODING 50
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++0300
++0600
++0C00
++1800
++3000
++6000
++6300
++7F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char51
++ENCODING 51
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++0300
++0300
++1E00
++0300
++0300
++0300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char52
++ENCODING 52
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0600
++0E00
++1E00
++3600
++6600
++7F00
++0600
++0600
++0600
++0F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char53
++ENCODING 53
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7F00
++6000
++6000
++6000
++7E00
++0300
++0300
++0300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char54
++ENCODING 54
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1C00
++3000
++6000
++6000
++7E00
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char55
++ENCODING 55
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7F00
++6300
++0300
++0300
++0600
++0C00
++1800
++1800
++1800
++1800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char56
++ENCODING 56
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++6300
++6300
++3E00
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char57
++ENCODING 57
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++6300
++6300
++3F00
++0300
++0300
++0300
++0600
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char58
++ENCODING 58
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++1800
++1800
++0000
++0000
++0000
++1800
++1800
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char59
++ENCODING 59
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++1800
++1800
++0000
++0000
++0000
++1800
++1800
++1800
++3000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char60
++ENCODING 60
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0600
++0C00
++1800
++3000
++6000
++3000
++1800
++0C00
++0600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char61
++ENCODING 61
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++7E00
++0000
++0000
++7E00
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char62
++ENCODING 62
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++6000
++3000
++1800
++0C00
++0600
++0C00
++1800
++3000
++6000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char63
++ENCODING 63
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++6300
++0600
++0C00
++0C00
++0C00
++0000
++0C00
++0C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char64
++ENCODING 64
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++3E00
++6300
++6300
++6F00
++6F00
++6F00
++6E00
++6000
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char65
++ENCODING 65
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0800
++1C00
++3600
++6300
++6300
++7F00
++6300
++6300
++6300
++6300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char66
++ENCODING 66
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7E00
++3300
++3300
++3300
++3E00
++3300
++3300
++3300
++3300
++7E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char67
++ENCODING 67
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1E00
++3300
++6100
++6000
++6000
++6000
++6000
++6100
++3300
++1E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char68
++ENCODING 68
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7C00
++3600
++3300
++3300
++3300
++3300
++3300
++3300
++3600
++7C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char69
++ENCODING 69
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7F00
++3300
++3100
++3400
++3C00
++3400
++3000
++3100
++3300
++7F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char70
++ENCODING 70
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7F00
++3300
++3100
++3400
++3C00
++3400
++3000
++3000
++3000
++7800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char71
++ENCODING 71
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1E00
++3300
++6100
++6000
++6000
++6F00
++6300
++6300
++3300
++1D00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char72
++ENCODING 72
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++6300
++6300
++6300
++6300
++7F00
++6300
++6300
++6300
++6300
++6300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char73
++ENCODING 73
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3C00
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char74
++ENCODING 74
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0F00
++0600
++0600
++0600
++0600
++0600
++6600
++6600
++6600
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char75
++ENCODING 75
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7300
++3300
++3300
++3600
++3C00
++3C00
++3600
++3300
++3300
++7300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char76
++ENCODING 76
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7800
++3000
++3000
++3000
++3000
++3000
++3000
++3100
++3300
++7F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char77
++ENCODING 77
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++C300
++E700
++FF00
++FF00
++DB00
++C300
++C300
++C300
++C300
++C300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char78
++ENCODING 78
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++6300
++7300
++7B00
++7F00
++6F00
++6700
++6300
++6300
++6300
++6300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char79
++ENCODING 79
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char80
++ENCODING 80
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7E00
++3300
++3300
++3300
++3E00
++3000
++3000
++3000
++3000
++7800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char81
++ENCODING 81
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++6300
++6300
++6300
++6300
++6300
++6B00
++6F00
++3E00
++0600
++0700
++0000
++0000
++ENDCHAR
++STARTCHAR char82
++ENCODING 82
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7E00
++3300
++3300
++3300
++3E00
++3600
++3300
++3300
++3300
++7300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char83
++ENCODING 83
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++6300
++3000
++1C00
++0600
++0300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char84
++ENCODING 84
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++FF00
++DB00
++9900
++1800
++1800
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char85
++ENCODING 85
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char86
++ENCODING 86
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++C300
++C300
++C300
++C300
++C300
++C300
++C300
++6600
++3C00
++1800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char87
++ENCODING 87
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++C300
++C300
++C300
++C300
++C300
++DB00
++DB00
++FF00
++6600
++6600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char88
++ENCODING 88
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++C300
++C300
++6600
++3C00
++1800
++1800
++3C00
++6600
++C300
++C300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char89
++ENCODING 89
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++C300
++C300
++C300
++6600
++3C00
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char90
++ENCODING 90
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++FF00
++C300
++8600
++0C00
++1800
++3000
++6000
++C100
++C300
++FF00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char91
++ENCODING 91
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3C00
++3000
++3000
++3000
++3000
++3000
++3000
++3000
++3000
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char92
++ENCODING 92
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++4000
++6000
++7000
++3800
++1C00
++0E00
++0700
++0300
++0100
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char93
++ENCODING 93
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3C00
++0C00
++0C00
++0C00
++0C00
++0C00
++0C00
++0C00
++0C00
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char94
++ENCODING 94
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0800
++1C00
++3600
++6300
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char95
++ENCODING 95
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++FF80
++0000
++0000
++ENDCHAR
++STARTCHAR char96
++ENCODING 96
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++3000
++3000
++1800
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char97
++ENCODING 97
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3C00
++0600
++3E00
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char98
++ENCODING 98
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7000
++3000
++3000
++3C00
++3600
++3300
++3300
++3300
++3300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char99
++ENCODING 99
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3E00
++6300
++6000
++6000
++6000
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char100
++ENCODING 100
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0E00
++0600
++0600
++1E00
++3600
++6600
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char101
++ENCODING 101
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3E00
++6300
++7F00
++6000
++6000
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char102
++ENCODING 102
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1C00
++3600
++3200
++3000
++7800
++3000
++3000
++3000
++3000
++7800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char103
++ENCODING 103
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3B00
++6600
++6600
++6600
++6600
++6600
++3E00
++0600
++6600
++3C00
++0000
++ENDCHAR
++STARTCHAR char104
++ENCODING 104
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7000
++3000
++3000
++3600
++3B00
++3300
++3300
++3300
++3300
++7300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char105
++ENCODING 105
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1800
++1800
++0000
++3800
++1800
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char106
++ENCODING 106
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0600
++0600
++0000
++0E00
++0600
++0600
++0600
++0600
++0600
++0600
++6600
++6600
++3C00
++0000
++ENDCHAR
++STARTCHAR char107
++ENCODING 107
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7000
++3000
++3000
++3300
++3600
++3C00
++3C00
++3600
++3300
++7300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char108
++ENCODING 108
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3800
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char109
++ENCODING 109
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++E600
++FF00
++DB00
++DB00
++DB00
++DB00
++DB00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char110
++ENCODING 110
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++6E00
++3300
++3300
++3300
++3300
++3300
++3300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char111
++ENCODING 111
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3E00
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char112
++ENCODING 112
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++6E00
++3300
++3300
++3300
++3300
++3300
++3E00
++3000
++3000
++3000
++0000
++ENDCHAR
++STARTCHAR char113
++ENCODING 113
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3B00
++6600
++6600
++6600
++6600
++6600
++3E00
++0600
++0600
++0600
++0000
++ENDCHAR
++STARTCHAR char114
++ENCODING 114
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++6E00
++3B00
++3300
++3000
++3000
++3000
++7800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char115
++ENCODING 115
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3E00
++6300
++3000
++1C00
++0600
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char116
++ENCODING 116
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0800
++1800
++1800
++7E00
++1800
++1800
++1800
++1800
++1B00
++0E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char117
++ENCODING 117
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++6600
++6600
++6600
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char118
++ENCODING 118
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++C300
++C300
++C300
++C300
++6600
++3C00
++1800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char119
++ENCODING 119
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++C300
++C300
++C300
++DB00
++DB00
++FF00
++6600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char120
++ENCODING 120
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++C300
++6600
++3C00
++1800
++3C00
++6600
++C300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char121
++ENCODING 121
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++6300
++6300
++6300
++6300
++6300
++6300
++3F00
++0300
++0600
++0C00
++0000
++ENDCHAR
++STARTCHAR char122
++ENCODING 122
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++7F00
++6600
++0C00
++1800
++3000
++6300
++7F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char123
++ENCODING 123
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0E00
++1800
++1800
++1800
++7000
++1800
++1800
++1800
++1800
++0E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char124
++ENCODING 124
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char125
++ENCODING 125
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7000
++1800
++1800
++1800
++0E00
++1800
++1800
++1800
++1800
++7000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char126
++ENCODING 126
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3B00
++6E00
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char127
++ENCODING 127
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++7F00
++7F00
++7F00
++7F00
++7F00
++7F00
++7F00
++7F00
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char0
++ENCODING 128
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0F80
++0F80
++0F80
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 129
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++0000
++0000
++0000
++0000
++0F80
++0F80
++0F80
++0000
++0000
++ENDCHAR
++STARTCHAR char2
++ENCODING 130
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++0000
++0000
++0000
++0000
++0F80
++0F80
++0F80
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 131
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++0000
++0000
++0000
++0000
++0F80
++0F80
++0F80
++0000
++0000
++ENDCHAR
++STARTCHAR char0
++ENCODING 132
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++F000
++F000
++F000
++F000
++F000
++F000
++0F80
++0F80
++0F80
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 133
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++0F80
++0F80
++0F80
++0000
++0000
++ENDCHAR
++STARTCHAR char2
++ENCODING 134
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++F000
++F000
++F000
++F000
++F000
++F000
++0F80
++0F80
++0F80
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 135
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++F000
++F000
++F000
++F000
++F000
++F000
++0F80
++0F80
++0F80
++0000
++0000
++ENDCHAR
++STARTCHAR char0
++ENCODING 136
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 137
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++ENDCHAR
++STARTCHAR char2
++ENCODING 138
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 139
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++ENDCHAR
++STARTCHAR char0
++ENCODING 140
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0F80
++0F80
++0F80
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 141
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0F80
++0F80
++0F80
++0000
++0000
++ENDCHAR
++STARTCHAR char2
++ENCODING 142
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0F80
++0F80
++0F80
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 143
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0F80
++0F80
++0F80
++0000
++0000
++ENDCHAR
++STARTCHAR char0
++ENCODING 144
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++FF80
++FF80
++FF80
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 145
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++0000
++0000
++0000
++0000
++FF80
++FF80
++FF80
++0000
++0000
++ENDCHAR
++STARTCHAR char2
++ENCODING 146
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++0000
++0000
++0000
++0000
++FF80
++FF80
++FF80
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 147
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++0000
++0000
++0000
++0000
++FF80
++FF80
++FF80
++0000
++0000
++ENDCHAR
++STARTCHAR char0
++ENCODING 148
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++F000
++F000
++F000
++F000
++F000
++F000
++FF80
++FF80
++FF80
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 149
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++FF80
++FF80
++FF80
++0000
++0000
++ENDCHAR
++STARTCHAR char2
++ENCODING 150
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++F000
++F000
++F000
++F000
++F000
++F000
++FF80
++FF80
++FF80
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 151
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++F000
++F000
++F000
++F000
++F000
++F000
++FF80
++FF80
++FF80
++0000
++0000
++ENDCHAR
++STARTCHAR char0
++ENCODING 152
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++FF80
++FF80
++FF80
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 153
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++FF80
++FF80
++FF80
++0000
++0000
++ENDCHAR
++STARTCHAR char2
++ENCODING 154
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++FF80
++FF80
++FF80
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 155
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++FF80
++FF80
++FF80
++0000
++0000
++ENDCHAR
++STARTCHAR char0
++ENCODING 156
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 157
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++ENDCHAR
++STARTCHAR char2
++ENCODING 158
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 159
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++ENDCHAR
++STARTCHAR U+00A0 NO-BREAK SPACE
++ENCODING 160
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+02BD MODIFIER LETTER REVERSED COMMA
++ENCODING 161
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++1800
++1000
++1000
++0800
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+02BC MODIFIER LETTER APOSTROPHE
++ENCODING 162
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++1800
++0800
++0800
++1000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+00A3 POUND SIGN
++ENCODING 163
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0E00
++1000
++1000
++1000
++7C00
++1000
++1000
++1000
++3E00
++6100
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+00A6 BROKEN BAR
++ENCODING 166
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0800
++0800
++0800
++0800
++0000
++0000
++0800
++0800
++0800
++0800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+00A7 SECTION SIGN
++ENCODING 167
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3C00
++4200
++4000
++3C00
++4200
++4200
++3C00
++0200
++4200
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+00A8 DIAERESIS
++ENCODING 168
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++2400
++2400
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+00A9 COPYRIGHT SIGN
++ENCODING 169
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3C00
++4200
++9900
++A500
++A100
++A100
++A500
++9900
++4200
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
++ENCODING 171
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++1200
++1200
++2400
++2400
++4800
++2400
++2400
++1200
++1200
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+00AC NOT SIGN
++ENCODING 172
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++7E00
++0200
++0200
++0200
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+00AD SOFT HYPHEN
++ENCODING 173
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++7E00
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+2015 HORIZONTAL BAR
++ENCODING 175
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++FF00
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+00B0 DEGREE SIGN
++ENCODING 176
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++1000
++2800
++2800
++1000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+00B1 PLUS-MINUS SIGN
++ENCODING 177
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0800
++0800
++0800
++7F00
++0800
++0800
++0800
++0000
++7F00
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+00B2 SUPERSCRIPT TWO
++ENCODING 178
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++1C00
++2200
++0200
++1C00
++2000
++2000
++3E00
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+00B3 SUPERSCRIPT THREE
++ENCODING 179
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++1C00
++2200
++0200
++1C00
++0200
++2200
++1C00
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+0384 GREEK TONOS
++ENCODING 180
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++1000
++1000
++1000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+0385 GREEK DIALYTIKA TONOS
++ENCODING 181
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++1000
++1000
++1000
++4400
++4400
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+0386 GREEK CAPITAL LETTER ALPHA WITH TONOS
++ENCODING 182
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++4000
++4000
++0000
++1800
++2400
++2400
++4200
++4200
++7E00
++4200
++4200
++4200
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+00B7 MIDDLE DOT
++ENCODING 183
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++1800
++1800
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+0388 GREEK CAPITAL LETTER EPSILON WITH TONOS
++ENCODING 184
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++4000
++4000
++0000
++7E00
++4000
++4000
++4000
++7C00
++4000
++4000
++4000
++7E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+0389 GREEK CAPITAL LETTER ETA WITH TONOS
++ENCODING 185
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++4000
++4000
++0000
++4200
++4200
++4200
++4200
++7E00
++4200
++4200
++4200
++4200
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+038A GREEK CAPITAL LETTER IOTA WITH TONOS
++ENCODING 186
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++4000
++4000
++0000
++3E00
++0800
++0800
++0800
++0800
++0800
++0800
++0800
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
++ENCODING 187
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++4800
++4800
++2400
++2400
++1200
++2400
++2400
++4800
++4800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+038C GREEK CAPITAL LETTER OMICRON WITH TONOS
++ENCODING 188
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++4000
++4000
++0000
++3C00
++4200
++4200
++4200
++4200
++4200
++4200
++4200
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+00BD VULGAR FRACTION ONE HALF
++ENCODING 189
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++2200
++6200
++2400
++2800
++2800
++1400
++1A00
++2200
++4400
++4E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+038E GREEK CAPITAL LETTER UPSILON WITH TONOS
++ENCODING 190
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++4000
++4000
++0000
++4100
++4100
++2200
++2200
++1400
++0800
++0800
++0800
++0800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+038F GREEK CAPITAL LETTER OMEGA WITH TONOS
++ENCODING 191
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++4000
++4000
++0000
++3E00
++4100
++4100
++4100
++4100
++2200
++1400
++1400
++7700
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+0390 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
++ENCODING 192
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++1000
++5400
++4400
++0000
++1000
++1000
++1000
++1000
++1000
++1000
++0C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+0391 GREEK CAPITAL LETTER ALPHA
++ENCODING 193
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1800
++2400
++2400
++4200
++4200
++7E00
++4200
++4200
++4200
++4200
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+0392 GREEK CAPITAL LETTER BETA
++ENCODING 194
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7C00
++4200
++4200
++4200
++7C00
++4200
++4200
++4200
++4200
++7C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+0393 GREEK CAPITAL LETTER GAMMA
++ENCODING 195
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7E00
++4000
++4000
++4000
++4000
++4000
++4000
++4000
++4000
++4000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+0394 GREEK CAPITAL LETTER DELTA
++ENCODING 196
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0800
++0800
++1400
++1400
++2200
++2200
++2200
++4100
++4100
++7F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+0395 GREEK CAPITAL LETTER EPSILON
++ENCODING 197
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7E00
++4000
++4000
++4000
++7C00
++4000
++4000
++4000
++4000
++7E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+0396 GREEK CAPITAL LETTER ZETA
++ENCODING 198
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7E00
++0200
++0200
++0400
++0800
++1000
++2000
++4000
++4000
++7E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+0397 GREEK CAPITAL LETTER ETA
++ENCODING 199
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++4200
++4200
++4200
++4200
++7E00
++4200
++4200
++4200
++4200
++4200
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+0398 GREEK CAPITAL LETTER THETA
++ENCODING 200
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3C00
++4200
++4200
++4200
++7E00
++4200
++4200
++4200
++4200
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+0399 GREEK CAPITAL LETTER IOTA
++ENCODING 201
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++0800
++0800
++0800
++0800
++0800
++0800
++0800
++0800
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+039A GREEK CAPITAL LETTER KAPPA
++ENCODING 202
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++4200
++4400
++4800
++5000
++6000
++6000
++5000
++4800
++4400
++4200
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+039B GREEK CAPITAL LETTER LAMDA
++ENCODING 203
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0800
++0800
++1400
++1400
++2200
++2200
++2200
++4100
++4100
++4100
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+039C GREEK CAPITAL LETTER MU
++ENCODING 204
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++4200
++4200
++6600
++6600
++5A00
++5A00
++4200
++4200
++4200
++4200
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+039D GREEK CAPITAL LETTER NU
++ENCODING 205
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++4200
++6200
++6200
++5200
++5200
++4A00
++4A00
++4600
++4600
++4200
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+039E GREEK CAPITAL LETTER XI
++ENCODING 206
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7E00
++0000
++0000
++0000
++3C00
++0000
++0000
++0000
++0000
++7E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+039F GREEK CAPITAL LETTER OMICRON
++ENCODING 207
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3C00
++4200
++4200
++4200
++4200
++4200
++4200
++4200
++4200
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03A0 GREEK CAPITAL LETTER PI
++ENCODING 208
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7F00
++2200
++2200
++2200
++2200
++2200
++2200
++2200
++2200
++2200
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03A1 GREEK CAPITAL LETTER RHO
++ENCODING 209
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7C00
++4200
++4200
++4200
++7C00
++4000
++4000
++4000
++4000
++4000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03A3 GREEK CAPITAL LETTER SIGMA
++ENCODING 211
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7E00
++4000
++2000
++1000
++0800
++0800
++1000
++2000
++4000
++7E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03A4 GREEK CAPITAL LETTER TAU
++ENCODING 212
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7F00
++0800
++0800
++0800
++0800
++0800
++0800
++0800
++0800
++0800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03A5 GREEK CAPITAL LETTER UPSILON
++ENCODING 213
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++4100
++4100
++2200
++2200
++1400
++0800
++0800
++0800
++0800
++0800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03A6 GREEK CAPITAL LETTER PHI
++ENCODING 214
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1C00
++0800
++3E00
++4900
++4900
++4900
++4900
++3E00
++0800
++1C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03A7 GREEK CAPITAL LETTER CHI
++ENCODING 215
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++4200
++4200
++2400
++2400
++1800
++1800
++2400
++2400
++4200
++4200
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03A8 GREEK CAPITAL LETTER PSI
++ENCODING 216
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++4900
++4900
++4900
++4900
++4900
++3E00
++0800
++0800
++0800
++0800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03A9 GREEK CAPITAL LETTER OMEGA
++ENCODING 217
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++4100
++4100
++4100
++4100
++4100
++2200
++1400
++1400
++7700
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03AA GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
++ENCODING 218
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++2400
++2400
++0000
++3E00
++0800
++0800
++0800
++0800
++0800
++0800
++0800
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03AB GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
++ENCODING 219
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++2400
++2400
++0000
++4100
++4100
++2200
++2200
++1400
++0800
++0800
++0800
++0800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03AC GREEK SMALL LETTER ALPHA WITH TONOS
++ENCODING 220
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++1000
++1000
++0000
++0000
++3200
++4A00
++4400
++4400
++4400
++4400
++4A00
++3200
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03AD GREEK SMALL LETTER EPSILON WITH TONOS
++ENCODING 221
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++1000
++1000
++0000
++0000
++3E00
++4000
++4000
++3C00
++4000
++4000
++4000
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03AE GREEK SMALL LETTER ETA WITH TONOS
++ENCODING 222
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++1000
++1000
++0000
++0000
++5C00
++6200
++4200
++4200
++4200
++4200
++4200
++4200
++0200
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03AF GREEK SMALL LETTER IOTA WITH TONOS
++ENCODING 223
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++1000
++1000
++0000
++0000
++1000
++1000
++1000
++1000
++1000
++1000
++1000
++0C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03B0 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
++ENCODING 224
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++1000
++1000
++4400
++4400
++0000
++4200
++4200
++4200
++4200
++4200
++4200
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03B1 GREEK SMALL LETTER ALPHA
++ENCODING 225
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++3200
++4A00
++4400
++4400
++4400
++4400
++4A00
++3200
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03B2 GREEK SMALL LETTER BETA
++ENCODING 226
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3800
++4400
++4400
++4400
++7C00
++4200
++4200
++4200
++6200
++5C00
++4000
++4000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03B3 GREEK SMALL LETTER GAMMA
++ENCODING 227
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++3100
++4900
++0A00
++0400
++0800
++0800
++1000
++1000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03B4 GREEK SMALL LETTER DELTA
++ENCODING 228
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1C00
++2000
++2000
++2000
++1800
++2400
++4200
++4200
++4200
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03B5 GREEK SMALL LETTER EPSILON
++ENCODING 229
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++3C00
++4200
++4000
++3C00
++4000
++4000
++4200
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03B6 GREEK SMALL LETTER ZETA
++ENCODING 230
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++2000
++2000
++1C00
++0800
++1000
++2000
++2000
++2000
++2000
++1C00
++0200
++1C00
++0000
++0000
++ENDCHAR
++STARTCHAR U+03B7 GREEK SMALL LETTER ETA
++ENCODING 231
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++5C00
++6200
++4200
++4200
++4200
++4200
++4200
++4200
++0200
++0200
++0000
++0000
++ENDCHAR
++STARTCHAR U+03B8 GREEK SMALL LETTER THETA
++ENCODING 232
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1800
++2400
++2400
++4200
++7E00
++4200
++4200
++2400
++2400
++1800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03B9 GREEK SMALL LETTER IOTA
++ENCODING 233
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++1000
++1000
++1000
++1000
++1000
++1000
++1000
++0C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03BA GREEK SMALL LETTER KAPPA
++ENCODING 234
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++2200
++2400
++2800
++3000
++3000
++2800
++2400
++2200
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03BB GREEK SMALL LETTER LAMDA
++ENCODING 235
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++2000
++2000
++1000
++1000
++0800
++1800
++2400
++2400
++4200
++4200
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03BC GREEK SMALL LETTER MU
++ENCODING 236
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++4200
++4200
++4200
++4200
++6600
++6600
++5A00
++4200
++4000
++4000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03BD GREEK SMALL LETTER NU
++ENCODING 237
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++4200
++4200
++4200
++4400
++4400
++4800
++5000
++6000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03BE GREEK SMALL LETTER XI
++ENCODING 238
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++4000
++4000
++3C00
++4000
++4000
++3C00
++4000
++4000
++3C00
++0200
++0200
++3C00
++0000
++0000
++ENDCHAR
++STARTCHAR U+03BF GREEK SMALL LETTER OMICRON
++ENCODING 239
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++3C00
++4200
++4200
++4200
++4200
++4200
++4200
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03C0 GREEK SMALL LETTER PI
++ENCODING 240
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++7E00
++2400
++2400
++2400
++2400
++2400
++2400
++2400
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03C1 GREEK SMALL LETTER RHO
++ENCODING 241
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++3C00
++4200
++4200
++4200
++4200
++4200
++6200
++5C00
++4000
++4000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03C2 GREEK SMALL LETTER FINAL SIGMA
++ENCODING 242
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++1E00
++2000
++4000
++4000
++4000
++2000
++1C00
++0200
++0200
++1C00
++0000
++0000
++ENDCHAR
++STARTCHAR U+03C3 GREEK SMALL LETTER SIGMA
++ENCODING 243
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++3F00
++4800
++4400
++4400
++4400
++4400
++4400
++3800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03C4 GREEK SMALL LETTER TAU
++ENCODING 244
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++7E00
++1000
++1000
++1000
++1000
++1000
++1000
++0C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03C5 GREEK SMALL LETTER UPSILON
++ENCODING 245
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++4200
++4200
++4200
++4200
++4200
++4200
++4200
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03C6 GREEK SMALL LETTER PHI
++ENCODING 246
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++3E00
++4900
++4900
++4900
++4900
++4900
++4900
++3E00
++0800
++0800
++0000
++0000
++ENDCHAR
++STARTCHAR U+03C7 GREEK SMALL LETTER CHI
++ENCODING 247
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++4200
++4200
++2400
++2400
++1800
++1800
++2400
++2400
++4200
++4200
++0000
++0000
++ENDCHAR
++STARTCHAR U+03C8 GREEK SMALL LETTER PSI
++ENCODING 248
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++4900
++4900
++4900
++4900
++4900
++3E00
++0800
++0800
++0000
++0000
++ENDCHAR
++STARTCHAR U+03C9 GREEK SMALL LETTER OMEGA
++ENCODING 249
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++2200
++4100
++4100
++4900
++4900
++4900
++4900
++3600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03CA GREEK SMALL LETTER IOTA WITH DIALYTIKA
++ENCODING 250
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++2400
++2400
++0000
++0000
++1000
++1000
++1000
++1000
++1000
++1000
++1000
++0C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03CB GREEK SMALL LETTER UPSILON WITH DIALYTIKA
++ENCODING 251
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++2400
++2400
++0000
++0000
++4200
++4200
++4200
++4200
++4200
++4200
++4200
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03CC GREEK SMALL LETTER OMICRON WITH TONOS
++ENCODING 252
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++1000
++1000
++0000
++0000
++3C00
++4200
++4200
++4200
++4200
++4200
++4200
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03CD GREEK SMALL LETTER UPSILON WITH TONOS
++ENCODING 253
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++1000
++1000
++0000
++0000
++4200
++4200
++4200
++4200
++4200
++4200
++4200
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR U+03CE GREEK SMALL LETTER OMEGA WITH TONOS
++ENCODING 254
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0800
++0800
++0000
++0000
++2200
++4100
++4100
++4900
++4900
++4900
++4900
++3600
++0000
++0000
++0000
++0000
++ENDCHAR
++ENDFONT
+diff -r af23d23c278b util/alevt/vtxt-koi8.bdf
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/vtxt-koi8.bdf Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,5906 @@
++STARTFONT 2.1
++FONT -alevt-teletext-medium-r-normal--16-1-75-75-c-90-fontspecific-1
++SIZE 1 75 75
++FONTBOUNDINGBOX 9 16 0 -4
++STARTPROPERTIES 10
++POINT_SIZE 1
++PIXEL_SIZE 16
++RESOLUTION_X 75
++RESOLUTION_Y 75
++FONT_ASCENT 12
++FONT_DESCENT 4
++AVERAGE_WIDTH 90
++SPACING "C"
++_XMBDFED_INFO "Edited with xmbdfed 3.0."
++FONT "vtxt"
++ENDPROPERTIES
++CHARS 256
++STARTCHAR char0
++ENCODING 0
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 1
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char2
++ENCODING 2
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 3
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char0
++ENCODING 4
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++F000
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 5
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char2
++ENCODING 6
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++F000
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 7
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++F000
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char0
++ENCODING 8
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 9
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char2
++ENCODING 10
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 11
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char0
++ENCODING 12
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 13
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char2
++ENCODING 14
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 15
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char0
++ENCODING 16
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char1
++ENCODING 17
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++0000
++0000
++0000
++0000
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char2
++ENCODING 18
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++0000
++0000
++0000
++0000
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char1
++ENCODING 19
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++0000
++0000
++0000
++0000
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char0
++ENCODING 20
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char1
++ENCODING 21
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char2
++ENCODING 22
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char1
++ENCODING 23
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char0
++ENCODING 24
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char1
++ENCODING 25
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char2
++ENCODING 26
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char1
++ENCODING 27
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char0
++ENCODING 28
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char1
++ENCODING 29
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char2
++ENCODING 30
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char1
++ENCODING 31
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char32
++ENCODING 32
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char33
++ENCODING 33
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1800
++3C00
++3C00
++3C00
++1800
++1800
++1800
++0000
++1800
++1800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char34
++ENCODING 34
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++6600
++6600
++6600
++2400
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char35
++ENCODING 35
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++3600
++3600
++7F00
++3600
++3600
++3600
++7F00
++3600
++3600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char36
++ENCODING 36
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0C00
++0C00
++3E00
++6300
++6100
++6000
++3E00
++0300
++0300
++4300
++6300
++3E00
++0C00
++0C00
++0000
++0000
++ENDCHAR
++STARTCHAR char37
++ENCODING 37
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++6100
++6300
++0600
++0C00
++1800
++3000
++6300
++4300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char38
++ENCODING 38
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1C00
++3600
++3600
++1C00
++3B00
++6E00
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char39
++ENCODING 39
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++3000
++3000
++3000
++6000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char40
++ENCODING 40
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0C00
++1800
++3000
++3000
++3000
++3000
++3000
++3000
++1800
++0C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char41
++ENCODING 41
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3000
++1800
++0C00
++0C00
++0C00
++0C00
++0C00
++0C00
++1800
++3000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char42
++ENCODING 42
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++6600
++3C00
++FF00
++3C00
++6600
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char43
++ENCODING 43
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++1800
++1800
++7E00
++1800
++1800
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char44
++ENCODING 44
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++1800
++1800
++1800
++3000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char45
++ENCODING 45
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++7F00
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char46
++ENCODING 46
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++1800
++1800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char47
++ENCODING 47
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0100
++0300
++0600
++0C00
++1800
++3000
++6000
++4000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char48
++ENCODING 48
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3C00
++6600
++C300
++C300
++DB00
++DB00
++C300
++C300
++6600
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char49
++ENCODING 49
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1800
++3800
++7800
++1800
++1800
++1800
++1800
++1800
++1800
++7E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char50
++ENCODING 50
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++0300
++0600
++0C00
++1800
++3000
++6000
++6300
++7F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char51
++ENCODING 51
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++0300
++0300
++1E00
++0300
++0300
++0300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char52
++ENCODING 52
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0600
++0E00
++1E00
++3600
++6600
++7F00
++0600
++0600
++0600
++0F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char53
++ENCODING 53
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7F00
++6000
++6000
++6000
++7E00
++0300
++0300
++0300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char54
++ENCODING 54
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1C00
++3000
++6000
++6000
++7E00
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char55
++ENCODING 55
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7F00
++6300
++0300
++0300
++0600
++0C00
++1800
++1800
++1800
++1800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char56
++ENCODING 56
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++6300
++6300
++3E00
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char57
++ENCODING 57
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++6300
++6300
++3F00
++0300
++0300
++0300
++0600
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char58
++ENCODING 58
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++1800
++1800
++0000
++0000
++0000
++1800
++1800
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char59
++ENCODING 59
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++1800
++1800
++0000
++0000
++0000
++1800
++1800
++1800
++3000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char60
++ENCODING 60
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0600
++0C00
++1800
++3000
++6000
++3000
++1800
++0C00
++0600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char61
++ENCODING 61
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++7E00
++0000
++0000
++7E00
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char62
++ENCODING 62
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++6000
++3000
++1800
++0C00
++0600
++0C00
++1800
++3000
++6000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char63
++ENCODING 63
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++6300
++0600
++0C00
++0C00
++0C00
++0000
++0C00
++0C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char64
++ENCODING 64
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++3E00
++6300
++6300
++6F00
++6F00
++6F00
++6E00
++6000
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char65
++ENCODING 65
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0800
++1C00
++3600
++6300
++6300
++7F00
++6300
++6300
++6300
++6300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char66
++ENCODING 66
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7E00
++3300
++3300
++3300
++3E00
++3300
++3300
++3300
++3300
++7E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char67
++ENCODING 67
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1E00
++3300
++6100
++6000
++6000
++6000
++6000
++6100
++3300
++1E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char68
++ENCODING 68
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7C00
++3600
++3300
++3300
++3300
++3300
++3300
++3300
++3600
++7C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char69
++ENCODING 69
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7F00
++3300
++3100
++3400
++3C00
++3400
++3000
++3100
++3300
++7F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char70
++ENCODING 70
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7F00
++3300
++3100
++3400
++3C00
++3400
++3000
++3000
++3000
++7800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char71
++ENCODING 71
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1E00
++3300
++6100
++6000
++6000
++6F00
++6300
++6300
++3300
++1D00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char72
++ENCODING 72
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++6300
++6300
++6300
++6300
++7F00
++6300
++6300
++6300
++6300
++6300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char73
++ENCODING 73
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3C00
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char74
++ENCODING 74
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0F00
++0600
++0600
++0600
++0600
++0600
++6600
++6600
++6600
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char75
++ENCODING 75
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7300
++3300
++3300
++3600
++3C00
++3C00
++3600
++3300
++3300
++7300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char76
++ENCODING 76
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7800
++3000
++3000
++3000
++3000
++3000
++3000
++3100
++3300
++7F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char77
++ENCODING 77
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++C300
++E700
++FF00
++FF00
++DB00
++C300
++C300
++C300
++C300
++C300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char78
++ENCODING 78
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++6300
++7300
++7B00
++7F00
++6F00
++6700
++6300
++6300
++6300
++6300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char79
++ENCODING 79
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char80
++ENCODING 80
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7E00
++3300
++3300
++3300
++3E00
++3000
++3000
++3000
++3000
++7800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char81
++ENCODING 81
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++6300
++6300
++6300
++6300
++6300
++6B00
++6F00
++3E00
++0600
++0700
++0000
++0000
++ENDCHAR
++STARTCHAR char82
++ENCODING 82
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7E00
++3300
++3300
++3300
++3E00
++3600
++3300
++3300
++3300
++7300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char83
++ENCODING 83
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++6300
++3000
++1C00
++0600
++0300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char84
++ENCODING 84
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++FF00
++DB00
++9900
++1800
++1800
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char85
++ENCODING 85
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char86
++ENCODING 86
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++C300
++C300
++C300
++C300
++C300
++C300
++C300
++6600
++3C00
++1800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char87
++ENCODING 87
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++C300
++C300
++C300
++C300
++C300
++DB00
++DB00
++FF00
++6600
++6600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char88
++ENCODING 88
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++C300
++C300
++6600
++3C00
++1800
++1800
++3C00
++6600
++C300
++C300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char89
++ENCODING 89
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++C300
++C300
++C300
++6600
++3C00
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char90
++ENCODING 90
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++FF00
++C300
++8600
++0C00
++1800
++3000
++6000
++C100
++C300
++FF00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char91
++ENCODING 91
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3C00
++3000
++3000
++3000
++3000
++3000
++3000
++3000
++3000
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char92
++ENCODING 92
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++4000
++6000
++7000
++3800
++1C00
++0E00
++0700
++0300
++0100
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char93
++ENCODING 93
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3C00
++0C00
++0C00
++0C00
++0C00
++0C00
++0C00
++0C00
++0C00
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char94
++ENCODING 94
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0800
++1C00
++3600
++6300
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char95
++ENCODING 95
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++FF80
++0000
++0000
++ENDCHAR
++STARTCHAR char96
++ENCODING 96
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++3000
++3000
++1800
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char97
++ENCODING 97
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3C00
++0600
++3E00
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char98
++ENCODING 98
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7000
++3000
++3000
++3C00
++3600
++3300
++3300
++3300
++3300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char99
++ENCODING 99
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3E00
++6300
++6000
++6000
++6000
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char100
++ENCODING 100
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0E00
++0600
++0600
++1E00
++3600
++6600
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char101
++ENCODING 101
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3E00
++6300
++7F00
++6000
++6000
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char102
++ENCODING 102
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1C00
++3600
++3200
++3000
++7800
++3000
++3000
++3000
++3000
++7800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char103
++ENCODING 103
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3B00
++6600
++6600
++6600
++6600
++6600
++3E00
++0600
++6600
++3C00
++0000
++ENDCHAR
++STARTCHAR char104
++ENCODING 104
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7000
++3000
++3000
++3600
++3B00
++3300
++3300
++3300
++3300
++7300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char105
++ENCODING 105
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1800
++1800
++0000
++3800
++1800
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char106
++ENCODING 106
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0600
++0600
++0000
++0E00
++0600
++0600
++0600
++0600
++0600
++0600
++6600
++6600
++3C00
++0000
++ENDCHAR
++STARTCHAR char107
++ENCODING 107
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7000
++3000
++3000
++3300
++3600
++3C00
++3C00
++3600
++3300
++7300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char108
++ENCODING 108
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3800
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char109
++ENCODING 109
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++E600
++FF00
++DB00
++DB00
++DB00
++DB00
++DB00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char110
++ENCODING 110
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++6E00
++3300
++3300
++3300
++3300
++3300
++3300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char111
++ENCODING 111
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3E00
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char112
++ENCODING 112
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++6E00
++3300
++3300
++3300
++3300
++3300
++3E00
++3000
++3000
++7800
++0000
++ENDCHAR
++STARTCHAR char113
++ENCODING 113
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3B00
++6600
++6600
++6600
++6600
++6600
++3E00
++0600
++0600
++0F00
++0000
++ENDCHAR
++STARTCHAR char114
++ENCODING 114
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++6E00
++3B00
++3300
++3000
++3000
++3000
++7800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char115
++ENCODING 115
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3E00
++6300
++3000
++1C00
++0600
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char116
++ENCODING 116
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0800
++1800
++1800
++7E00
++1800
++1800
++1800
++1800
++1B00
++0E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char117
++ENCODING 117
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++6600
++6600
++6600
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char118
++ENCODING 118
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++C300
++C300
++C300
++C300
++6600
++3C00
++1800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char119
++ENCODING 119
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++C300
++C300
++C300
++DB00
++DB00
++FF00
++6600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char120
++ENCODING 120
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++C300
++6600
++3C00
++1800
++3C00
++6600
++C300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char121
++ENCODING 121
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++6300
++6300
++6300
++6300
++6300
++6300
++3F00
++0300
++0600
++7C00
++0000
++ENDCHAR
++STARTCHAR char122
++ENCODING 122
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++7F00
++6600
++0C00
++1800
++3000
++6300
++7F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char123
++ENCODING 123
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0E00
++1800
++1800
++1800
++7000
++1800
++1800
++1800
++1800
++0E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char124
++ENCODING 124
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char125
++ENCODING 125
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7000
++1800
++1800
++1800
++0E00
++1800
++1800
++1800
++1800
++7000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char126
++ENCODING 126
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3B00
++6E00
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char127
++ENCODING 127
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++7F00
++7F00
++7F00
++7F00
++7F00
++7F00
++7F00
++7F00
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char0
++ENCODING 128
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char1
++ENCODING 129
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++0000
++0000
++0000
++0000
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char2
++ENCODING 130
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++0000
++0000
++0000
++0000
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char1
++ENCODING 131
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++0000
++0000
++0000
++0000
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char0
++ENCODING 132
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++F000
++F000
++F000
++F000
++F000
++F000
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char1
++ENCODING 133
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char2
++ENCODING 134
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++F000
++F000
++F000
++F000
++F000
++F000
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char1
++ENCODING 135
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++F000
++F000
++F000
++F000
++F000
++F000
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char0
++ENCODING 136
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char1
++ENCODING 137
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char2
++ENCODING 138
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char1
++ENCODING 139
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char0
++ENCODING 140
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char1
++ENCODING 141
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char2
++ENCODING 142
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char1
++ENCODING 143
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char0
++ENCODING 144
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char1
++ENCODING 145
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++0000
++0000
++0000
++0000
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char2
++ENCODING 146
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++0000
++0000
++0000
++0000
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char1
++ENCODING 147
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++0000
++0000
++0000
++0000
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char0
++ENCODING 148
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++F000
++F000
++F000
++F000
++F000
++F000
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char1
++ENCODING 149
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char2
++ENCODING 150
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++F000
++F000
++F000
++F000
++F000
++F000
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char1
++ENCODING 151
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++F000
++F000
++F000
++F000
++F000
++F000
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char0
++ENCODING 152
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char1
++ENCODING 153
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char2
++ENCODING 154
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char1
++ENCODING 155
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char0
++ENCODING 156
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char1
++ENCODING 157
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char2
++ENCODING 158
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char1
++ENCODING 159
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char160
++ENCODING 160
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++0880
++0880
++0880
++0880
++FF80
++0880
++0880
++0880
++0880
++0880
++FF80
++0880
++0880
++0880
++0880
++ENDCHAR
++STARTCHAR char161
++ENCODING 161
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1800
++1800
++0000
++1800
++1800
++1800
++3C00
++3C00
++3C00
++1800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char162
++ENCODING 162
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++1800
++1800
++7E00
++C300
++C000
++C000
++C000
++C300
++7E00
++1800
++1800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char163
++ENCODING 163
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++1C00
++3600
++3200
++3000
++7800
++3000
++3000
++3000
++3000
++7300
++7E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char164
++ENCODING 164
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++4100
++6300
++3E00
++6300
++6300
++6300
++6300
++3E00
++6300
++4100
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char165
++ENCODING 165
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++C300
++6600
++3C00
++1800
++FF00
++1800
++FF00
++1800
++1800
++1800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char166
++ENCODING 166
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++6600
++6600
++6600
++6600
++6600
++6600
++6600
++6600
++6600
++6600
++6600
++6600
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char167
++ENCODING 167
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++3E00
++6300
++3000
++1C00
++3600
++6300
++6300
++3600
++1C00
++0600
++6300
++3E00
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char168
++ENCODING 168
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3C00
++7E00
++DB00
++FF00
++BD00
++C300
++E700
++FF00
++7E00
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char169
++ENCODING 169
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++4100
++5D00
++5100
++5100
++5D00
++4100
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char170
++ENCODING 170
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++3800
++0C00
++3C00
++6400
++3C00
++0000
++7C00
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char171
++ENCODING 171
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++1800
++3000
++7F00
++7F00
++3000
++1800
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char172
++ENCODING 172
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1800
++3C00
++7E00
++5A00
++1800
++1800
++1800
++1800
++1800
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char173
++ENCODING 173
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++FF80
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char174
++ENCODING 174
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++4100
++5D00
++5500
++5900
++5500
++4100
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char175
++ENCODING 175
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++7F00
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char176
++ENCODING 176
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++1C00
++3600
++3600
++1C00
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char177
++ENCODING 177
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++1800
++1800
++7E00
++1800
++1800
++0000
++0000
++7E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char178
++ENCODING 178
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++3800
++6C00
++1800
++3000
++6400
++7C00
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char179
++ENCODING 179
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++7C00
++0C00
++1800
++0C00
++6C00
++3800
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char180
++ENCODING 180
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++1800
++3000
++6000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char181
++ENCODING 181
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++6600
++6600
++6600
++6600
++6600
++7E00
++6300
++6000
++C000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char182
++ENCODING 182
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7F00
++DB00
++DB00
++DB00
++7B00
++1B00
++1B00
++1B00
++1B00
++1B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char183
++ENCODING 183
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++1800
++1800
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char184
++ENCODING 184
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0080
++0100
++0300
++0600
++0C00
++1C00
++3000
++7F00
++7700
++0E00
++1C00
++1800
++3000
++6000
++8000
++0000
++ENDCHAR
++STARTCHAR char185
++ENCODING 185
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++3000
++7000
++3000
++3000
++3000
++7800
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char186
++ENCODING 186
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++3800
++6C00
++4400
++6C00
++3800
++0000
++7C00
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char187
++ENCODING 187
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0C00
++0600
++7F00
++7F00
++0600
++0C00
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char188
++ENCODING 188
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++6000
++6000
++6100
++6300
++6600
++0C00
++1800
++3300
++6700
++4B00
++1F00
++0300
++0300
++0000
++0000
++ENDCHAR
++STARTCHAR char189
++ENCODING 189
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++6000
++6000
++6100
++6300
++6600
++0C00
++1800
++3000
++6700
++4D80
++0300
++0600
++0F80
++0000
++0000
++ENDCHAR
++STARTCHAR char190
++ENCODING 190
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++7800
++1800
++3900
++1B00
++7600
++0C00
++1800
++3300
++6700
++4B00
++1F00
++0300
++0300
++0000
++0000
++ENDCHAR
++STARTCHAR char191
++ENCODING 191
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1800
++1800
++0000
++1800
++1800
++3000
++6000
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char238
++ENCODING 192
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++CE00
++DB00
++DB00
++FB00
++DB00
++DB00
++CE00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char160
++ENCODING 193
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++7800
++0C00
++7C00
++CC00
++CC00
++CC00
++7600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char161
++ENCODING 194
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0200
++0600
++3C00
++6000
++6000
++7C00
++6600
++6600
++6600
++6600
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char230
++ENCODING 195
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++CC00
++CC00
++CC00
++CC00
++CC00
++CC00
++FE00
++0600
++0600
++0000
++0000
++ENDCHAR
++STARTCHAR char164
++ENCODING 196
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++1E00
++3600
++3600
++6600
++6600
++6600
++FF00
++C300
++C300
++0000
++0000
++ENDCHAR
++STARTCHAR char165
++ENCODING 197
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++7C00
++C600
++FE00
++C000
++C000
++C600
++7C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char228
++ENCODING 198
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++3C00
++1800
++7E00
++DB00
++DB00
++DB00
++DB00
++7E00
++1800
++1800
++3C00
++0000
++ENDCHAR
++STARTCHAR char163
++ENCODING 199
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++7E00
++3200
++3200
++3000
++3000
++3000
++7800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char229
++ENCODING 200
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++C600
++6C00
++3800
++3800
++3800
++6C00
++C600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char168
++ENCODING 201
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++C600
++C600
++CE00
++D600
++E600
++C600
++C600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char169
++ENCODING 202
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++3800
++3800
++C600
++C600
++CE00
++D600
++E600
++C600
++C600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char170
++ENCODING 203
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++E600
++6C00
++7800
++7800
++6C00
++6600
++E600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char171
++ENCODING 204
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++1E00
++3600
++6600
++6600
++6600
++6600
++6600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char172
++ENCODING 205
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++C600
++EE00
++FE00
++FE00
++D600
++D600
++C600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char173
++ENCODING 206
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++C600
++C600
++C600
++FE00
++C600
++C600
++C600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char174
++ENCODING 207
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++7C00
++C600
++C600
++C600
++C600
++C600
++7C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char175
++ENCODING 208
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++FE00
++C600
++C600
++C600
++C600
++C600
++C600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char239
++ENCODING 209
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++7E00
++CC00
++CC00
++FC00
++6C00
++CC00
++CE00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char224
++ENCODING 210
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++DC00
++6600
++6600
++6600
++6600
++6600
++7C00
++6000
++6000
++F000
++0000
++ENDCHAR
++STARTCHAR char225
++ENCODING 211
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++7C00
++C600
++C000
++C000
++C000
++C600
++7C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char226
++ENCODING 212
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++7E00
++5A00
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char227
++ENCODING 213
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++C600
++C600
++C600
++C600
++C600
++7E00
++0600
++0600
++C600
++7C00
++0000
++ENDCHAR
++STARTCHAR char166
++ENCODING 214
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++D600
++D600
++5400
++7C00
++5400
++D600
++D600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char162
++ENCODING 215
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++FC00
++6600
++6600
++7C00
++6600
++6600
++FC00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char236
++ENCODING 216
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++F000
++6000
++6000
++7C00
++6600
++6600
++FC00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char235
++ENCODING 217
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++C600
++C600
++C600
++F600
++DE00
++DE00
++F600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char167
++ENCODING 218
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3C00
++6600
++0600
++0C00
++0600
++6600
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char232
++ENCODING 219
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++D600
++D600
++D600
++D600
++D600
++D600
++FE00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char237
++ENCODING 220
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3C00
++6600
++0600
++1E00
++0600
++6600
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char233
++ENCODING 221
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++D600
++D600
++D600
++D600
++D600
++D600
++FE00
++0300
++0300
++0000
++0000
++ENDCHAR
++STARTCHAR char231
++ENCODING 222
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++C600
++C600
++C600
++C600
++7E00
++0600
++0600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char234
++ENCODING 223
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++F800
++B000
++3000
++3E00
++3300
++3300
++7E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char158
++ENCODING 224
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++CE00
++DB00
++DB00
++DB00
++FB00
++DB00
++DB00
++DB00
++DB00
++CE00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char128
++ENCODING 225
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1E00
++3600
++6600
++C600
++C600
++FE00
++C600
++C600
++C600
++C600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char129
++ENCODING 226
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++FE00
++6200
++6200
++6000
++7C00
++6600
++6600
++6600
++6600
++FC00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char150
++ENCODING 227
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++CC00
++CC00
++CC00
++CC00
++CC00
++CC00
++CC00
++CC00
++CC00
++FE00
++0600
++0600
++0000
++0000
++ENDCHAR
++STARTCHAR char132
++ENCODING 228
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1E00
++3600
++6600
++6600
++6600
++6600
++6600
++6600
++6600
++FF00
++C300
++8100
++0000
++0000
++ENDCHAR
++STARTCHAR char133
++ENCODING 229
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++FE00
++6600
++6200
++6800
++7800
++6800
++6000
++6200
++6600
++FE00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char148
++ENCODING 230
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++3C00
++1800
++7E00
++DB00
++DB00
++DB00
++DB00
++DB00
++7E00
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char131
++ENCODING 231
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++FE00
++6200
++6200
++6000
++6000
++6000
++6000
++6000
++6000
++F000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char149
++ENCODING 232
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++C600
++C600
++6C00
++7C00
++3800
++3800
++7C00
++6C00
++C600
++C600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char136
++ENCODING 233
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++C600
++C600
++CE00
++CE00
++D600
++E600
++E600
++C600
++C600
++C600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char137
++ENCODING 234
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++3800
++3800
++C600
++C600
++CE00
++CE00
++D600
++E600
++E600
++C600
++C600
++C600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char138
++ENCODING 235
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++E600
++6600
++6C00
++6C00
++7800
++7800
++6C00
++6C00
++6600
++E600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char139
++ENCODING 236
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1E00
++3600
++6600
++C600
++C600
++C600
++C600
++C600
++C600
++C600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char140
++ENCODING 237
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++C600
++EE00
++FE00
++FE00
++D600
++C600
++C600
++C600
++C600
++C600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char141
++ENCODING 238
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++C600
++C600
++C600
++C600
++FE00
++C600
++C600
++C600
++C600
++C600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char142
++ENCODING 239
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7C00
++C600
++C600
++C600
++C600
++C600
++C600
++C600
++C600
++7C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char143
++ENCODING 240
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++FE00
++C600
++C600
++C600
++C600
++C600
++C600
++C600
++C600
++C600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char159
++ENCODING 241
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3F00
++6600
++6600
++6600
++3E00
++3E00
++6600
++6600
++6600
++E700
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char144
++ENCODING 242
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++FC00
++6600
++6600
++6600
++7C00
++6000
++6000
++6000
++6000
++F000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char145
++ENCODING 243
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3C00
++6600
++C200
++C000
++C000
++C000
++C000
++C200
++6600
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char146
++ENCODING 244
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7E00
++5A00
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char147
++ENCODING 245
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++C600
++C600
++C600
++C600
++C600
++7E00
++0600
++0600
++C600
++7C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char134
++ENCODING 246
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++D600
++D600
++5400
++5400
++7C00
++7C00
++5400
++D600
++D600
++D600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char130
++ENCODING 247
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++FC00
++6600
++6600
++6600
++7C00
++6600
++6600
++6600
++6600
++FC00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char156
++ENCODING 248
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++F000
++6000
++6000
++6000
++7C00
++6600
++6600
++6600
++6600
++FC00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char155
++ENCODING 249
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++C300
++C300
++C300
++C300
++F300
++DB00
++DB00
++DB00
++DB00
++F300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char135
++ENCODING 250
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7C00
++C600
++0600
++0600
++3C00
++0600
++0600
++0600
++C600
++7C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char152
++ENCODING 251
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++DB00
++DB00
++DB00
++DB00
++DB00
++DB00
++DB00
++DB00
++DB00
++FF00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char157
++ENCODING 252
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7C00
++C600
++0600
++2600
++3E00
++2600
++0600
++0600
++C600
++7C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char153
++ENCODING 253
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++DB00
++DB00
++DB00
++DB00
++DB00
++DB00
++DB00
++DB00
++DB00
++FF00
++0300
++0300
++0000
++0000
++ENDCHAR
++STARTCHAR char151
++ENCODING 254
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++C600
++C600
++C600
++C600
++C600
++7E00
++0600
++0600
++0600
++0600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char154
++ENCODING 255
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++F800
++B000
++3000
++3000
++3C00
++3600
++3600
++3600
++3600
++7C00
++0000
++0000
++0000
++0000
++ENDCHAR
++ENDFONT
+diff -r af23d23c278b util/alevt/vtxt-latin-1.bdf
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/vtxt-latin-1.bdf      Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,5906 @@
++STARTFONT 2.1
++FONT -alevt-teletext-medium-r-normal--16-1-75-75-c-90-fontspecific-1
++SIZE 1 75 75
++FONTBOUNDINGBOX 9 16 0 -4
++STARTPROPERTIES 10
++POINT_SIZE 1
++PIXEL_SIZE 16
++RESOLUTION_X 75
++RESOLUTION_Y 75
++FONT_ASCENT 12
++FONT_DESCENT 4
++AVERAGE_WIDTH 90
++SPACING "C"
++_XMBDFED_INFO "Edited with xmbdfed 2.4."
++FONT "vtxt"
++ENDPROPERTIES
++CHARS 256
++STARTCHAR char0
++ENCODING 0
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 1
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char2
++ENCODING 2
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 3
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char0
++ENCODING 4
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++F000
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 5
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char2
++ENCODING 6
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++F000
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 7
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++F000
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char0
++ENCODING 8
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 9
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char2
++ENCODING 10
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 11
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char0
++ENCODING 12
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 13
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char2
++ENCODING 14
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 15
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char0
++ENCODING 16
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char1
++ENCODING 17
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++0000
++0000
++0000
++0000
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char2
++ENCODING 18
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++0000
++0000
++0000
++0000
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char1
++ENCODING 19
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++0000
++0000
++0000
++0000
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char0
++ENCODING 20
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char1
++ENCODING 21
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char2
++ENCODING 22
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char1
++ENCODING 23
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char0
++ENCODING 24
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char1
++ENCODING 25
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char2
++ENCODING 26
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char1
++ENCODING 27
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char0
++ENCODING 28
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char1
++ENCODING 29
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char2
++ENCODING 30
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char1
++ENCODING 31
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char32
++ENCODING 32
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char33
++ENCODING 33
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1800
++3C00
++3C00
++3C00
++1800
++1800
++1800
++0000
++1800
++1800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char34
++ENCODING 34
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++6600
++6600
++6600
++2400
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char35
++ENCODING 35
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++3600
++3600
++7F00
++3600
++3600
++3600
++7F00
++3600
++3600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char36
++ENCODING 36
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0C00
++0C00
++3E00
++6300
++6100
++6000
++3E00
++0300
++0300
++4300
++6300
++3E00
++0C00
++0C00
++0000
++0000
++ENDCHAR
++STARTCHAR char37
++ENCODING 37
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++6100
++6300
++0600
++0C00
++1800
++3000
++6300
++4300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char38
++ENCODING 38
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1C00
++3600
++3600
++1C00
++3B00
++6E00
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char39
++ENCODING 39
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++3000
++3000
++3000
++6000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char40
++ENCODING 40
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0C00
++1800
++3000
++3000
++3000
++3000
++3000
++3000
++1800
++0C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char41
++ENCODING 41
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3000
++1800
++0C00
++0C00
++0C00
++0C00
++0C00
++0C00
++1800
++3000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char42
++ENCODING 42
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++6600
++3C00
++FF00
++3C00
++6600
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char43
++ENCODING 43
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++1800
++1800
++7E00
++1800
++1800
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char44
++ENCODING 44
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++1800
++1800
++1800
++3000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char45
++ENCODING 45
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++7F00
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char46
++ENCODING 46
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++1800
++1800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char47
++ENCODING 47
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0100
++0300
++0600
++0C00
++1800
++3000
++6000
++4000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char48
++ENCODING 48
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3C00
++6600
++C300
++C300
++DB00
++DB00
++C300
++C300
++6600
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char49
++ENCODING 49
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1800
++3800
++7800
++1800
++1800
++1800
++1800
++1800
++1800
++7E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char50
++ENCODING 50
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++0300
++0600
++0C00
++1800
++3000
++6000
++6300
++7F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char51
++ENCODING 51
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++0300
++0300
++1E00
++0300
++0300
++0300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char52
++ENCODING 52
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0600
++0E00
++1E00
++3600
++6600
++7F00
++0600
++0600
++0600
++0F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char53
++ENCODING 53
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7F00
++6000
++6000
++6000
++7E00
++0300
++0300
++0300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char54
++ENCODING 54
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1C00
++3000
++6000
++6000
++7E00
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char55
++ENCODING 55
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7F00
++6300
++0300
++0300
++0600
++0C00
++1800
++1800
++1800
++1800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char56
++ENCODING 56
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++6300
++6300
++3E00
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char57
++ENCODING 57
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++6300
++6300
++3F00
++0300
++0300
++0300
++0600
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char58
++ENCODING 58
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++1800
++1800
++0000
++0000
++0000
++1800
++1800
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char59
++ENCODING 59
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++1800
++1800
++0000
++0000
++0000
++1800
++1800
++1800
++3000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char60
++ENCODING 60
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0600
++0C00
++1800
++3000
++6000
++3000
++1800
++0C00
++0600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char61
++ENCODING 61
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++7E00
++0000
++0000
++7E00
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char62
++ENCODING 62
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++6000
++3000
++1800
++0C00
++0600
++0C00
++1800
++3000
++6000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char63
++ENCODING 63
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++6300
++0600
++0C00
++0C00
++0C00
++0000
++0C00
++0C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char64
++ENCODING 64
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++3E00
++6300
++6300
++6F00
++6F00
++6F00
++6E00
++6000
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char65
++ENCODING 65
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0800
++1C00
++3600
++6300
++6300
++7F00
++6300
++6300
++6300
++6300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char66
++ENCODING 66
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7E00
++3300
++3300
++3300
++3E00
++3300
++3300
++3300
++3300
++7E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char67
++ENCODING 67
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1E00
++3300
++6100
++6000
++6000
++6000
++6000
++6100
++3300
++1E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char68
++ENCODING 68
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7C00
++3600
++3300
++3300
++3300
++3300
++3300
++3300
++3600
++7C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char69
++ENCODING 69
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7F00
++3300
++3100
++3400
++3C00
++3400
++3000
++3100
++3300
++7F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char70
++ENCODING 70
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7F00
++3300
++3100
++3400
++3C00
++3400
++3000
++3000
++3000
++7800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char71
++ENCODING 71
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1E00
++3300
++6100
++6000
++6000
++6F00
++6300
++6300
++3300
++1D00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char72
++ENCODING 72
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++6300
++6300
++6300
++6300
++7F00
++6300
++6300
++6300
++6300
++6300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char73
++ENCODING 73
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3C00
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char74
++ENCODING 74
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0F00
++0600
++0600
++0600
++0600
++0600
++6600
++6600
++6600
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char75
++ENCODING 75
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7300
++3300
++3300
++3600
++3C00
++3C00
++3600
++3300
++3300
++7300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char76
++ENCODING 76
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7800
++3000
++3000
++3000
++3000
++3000
++3000
++3100
++3300
++7F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char77
++ENCODING 77
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++C300
++E700
++FF00
++FF00
++DB00
++C300
++C300
++C300
++C300
++C300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char78
++ENCODING 78
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++6300
++7300
++7B00
++7F00
++6F00
++6700
++6300
++6300
++6300
++6300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char79
++ENCODING 79
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char80
++ENCODING 80
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7E00
++3300
++3300
++3300
++3E00
++3000
++3000
++3000
++3000
++7800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char81
++ENCODING 81
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++6300
++6300
++6300
++6300
++6300
++6B00
++6F00
++3E00
++0600
++0700
++0000
++0000
++ENDCHAR
++STARTCHAR char82
++ENCODING 82
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7E00
++3300
++3300
++3300
++3E00
++3600
++3300
++3300
++3300
++7300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char83
++ENCODING 83
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++6300
++3000
++1C00
++0600
++0300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char84
++ENCODING 84
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++FF00
++DB00
++9900
++1800
++1800
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char85
++ENCODING 85
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char86
++ENCODING 86
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++C300
++C300
++C300
++C300
++C300
++C300
++C300
++6600
++3C00
++1800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char87
++ENCODING 87
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++C300
++C300
++C300
++C300
++C300
++DB00
++DB00
++FF00
++6600
++6600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char88
++ENCODING 88
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++C300
++C300
++6600
++3C00
++1800
++1800
++3C00
++6600
++C300
++C300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char89
++ENCODING 89
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++C300
++C300
++C300
++6600
++3C00
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char90
++ENCODING 90
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++FF00
++C300
++8600
++0C00
++1800
++3000
++6000
++C100
++C300
++FF00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char91
++ENCODING 91
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3C00
++3000
++3000
++3000
++3000
++3000
++3000
++3000
++3000
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char92
++ENCODING 92
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++4000
++6000
++7000
++3800
++1C00
++0E00
++0700
++0300
++0100
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char93
++ENCODING 93
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3C00
++0C00
++0C00
++0C00
++0C00
++0C00
++0C00
++0C00
++0C00
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char94
++ENCODING 94
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0800
++1C00
++3600
++6300
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char95
++ENCODING 95
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++FF80
++0000
++0000
++ENDCHAR
++STARTCHAR char96
++ENCODING 96
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++3000
++3000
++1800
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char97
++ENCODING 97
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3C00
++0600
++3E00
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char98
++ENCODING 98
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7000
++3000
++3000
++3C00
++3600
++3300
++3300
++3300
++3300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char99
++ENCODING 99
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3E00
++6300
++6000
++6000
++6000
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char100
++ENCODING 100
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0E00
++0600
++0600
++1E00
++3600
++6600
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char101
++ENCODING 101
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3E00
++6300
++7F00
++6000
++6000
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char102
++ENCODING 102
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1C00
++3600
++3200
++3000
++7800
++3000
++3000
++3000
++3000
++7800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char103
++ENCODING 103
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3B00
++6600
++6600
++6600
++6600
++6600
++3E00
++0600
++6600
++3C00
++0000
++ENDCHAR
++STARTCHAR char104
++ENCODING 104
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7000
++3000
++3000
++3600
++3B00
++3300
++3300
++3300
++3300
++7300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char105
++ENCODING 105
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1800
++1800
++0000
++3800
++1800
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char106
++ENCODING 106
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0600
++0600
++0000
++0E00
++0600
++0600
++0600
++0600
++0600
++0600
++6600
++6600
++3C00
++0000
++ENDCHAR
++STARTCHAR char107
++ENCODING 107
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7000
++3000
++3000
++3300
++3600
++3C00
++3C00
++3600
++3300
++7300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char108
++ENCODING 108
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3800
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char109
++ENCODING 109
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++E600
++FF00
++DB00
++DB00
++DB00
++DB00
++DB00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char110
++ENCODING 110
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++6E00
++3300
++3300
++3300
++3300
++3300
++3300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char111
++ENCODING 111
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3E00
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char112
++ENCODING 112
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++6E00
++3300
++3300
++3300
++3300
++3300
++3E00
++3000
++3000
++7800
++0000
++ENDCHAR
++STARTCHAR char113
++ENCODING 113
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3B00
++6600
++6600
++6600
++6600
++6600
++3E00
++0600
++0600
++0F00
++0000
++ENDCHAR
++STARTCHAR char114
++ENCODING 114
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++6E00
++3B00
++3300
++3000
++3000
++3000
++7800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char115
++ENCODING 115
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3E00
++6300
++3000
++1C00
++0600
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char116
++ENCODING 116
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0800
++1800
++1800
++7E00
++1800
++1800
++1800
++1800
++1B00
++0E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char117
++ENCODING 117
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++6600
++6600
++6600
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char118
++ENCODING 118
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++C300
++C300
++C300
++C300
++6600
++3C00
++1800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char119
++ENCODING 119
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++C300
++C300
++C300
++DB00
++DB00
++FF00
++6600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char120
++ENCODING 120
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++C300
++6600
++3C00
++1800
++3C00
++6600
++C300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char121
++ENCODING 121
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++6300
++6300
++6300
++6300
++6300
++6300
++3F00
++0300
++0600
++7C00
++0000
++ENDCHAR
++STARTCHAR char122
++ENCODING 122
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++7F00
++6600
++0C00
++1800
++3000
++6300
++7F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char123
++ENCODING 123
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0E00
++1800
++1800
++1800
++7000
++1800
++1800
++1800
++1800
++0E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char124
++ENCODING 124
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char125
++ENCODING 125
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7000
++1800
++1800
++1800
++0E00
++1800
++1800
++1800
++1800
++7000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char126
++ENCODING 126
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3B00
++6E00
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char127
++ENCODING 127
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++7F00
++7F00
++7F00
++7F00
++7F00
++7F00
++7F00
++7F00
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char0
++ENCODING 128
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char1
++ENCODING 129
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++0000
++0000
++0000
++0000
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char2
++ENCODING 130
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++0000
++0000
++0000
++0000
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char1
++ENCODING 131
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++0000
++0000
++0000
++0000
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char0
++ENCODING 132
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++F000
++F000
++F000
++F000
++F000
++F000
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char1
++ENCODING 133
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char2
++ENCODING 134
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++F000
++F000
++F000
++F000
++F000
++F000
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char1
++ENCODING 135
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++F000
++F000
++F000
++F000
++F000
++F000
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char0
++ENCODING 136
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char1
++ENCODING 137
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char2
++ENCODING 138
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char1
++ENCODING 139
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char0
++ENCODING 140
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char1
++ENCODING 141
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char2
++ENCODING 142
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char1
++ENCODING 143
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char0
++ENCODING 144
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char1
++ENCODING 145
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++0000
++0000
++0000
++0000
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char2
++ENCODING 146
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++0000
++0000
++0000
++0000
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char1
++ENCODING 147
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++0000
++0000
++0000
++0000
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char0
++ENCODING 148
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++F000
++F000
++F000
++F000
++F000
++F000
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char1
++ENCODING 149
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char2
++ENCODING 150
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++F000
++F000
++F000
++F000
++F000
++F000
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char1
++ENCODING 151
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++F000
++F000
++F000
++F000
++F000
++F000
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char0
++ENCODING 152
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char1
++ENCODING 153
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char2
++ENCODING 154
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char1
++ENCODING 155
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char0
++ENCODING 156
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char1
++ENCODING 157
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char2
++ENCODING 158
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char1
++ENCODING 159
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char160
++ENCODING 160
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++0880
++0880
++0880
++0880
++FF80
++0880
++0880
++0880
++0880
++0880
++FF80
++0880
++0880
++0880
++0880
++ENDCHAR
++STARTCHAR char161
++ENCODING 161
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1800
++1800
++0000
++1800
++1800
++1800
++3C00
++3C00
++3C00
++1800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char162
++ENCODING 162
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++1800
++1800
++7E00
++C300
++C000
++C000
++C000
++C300
++7E00
++1800
++1800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char163
++ENCODING 163
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++1C00
++3600
++3200
++3000
++7800
++3000
++3000
++3000
++3000
++7300
++7E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char164
++ENCODING 164
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++4100
++6300
++3E00
++6300
++6300
++6300
++6300
++3E00
++6300
++4100
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char165
++ENCODING 165
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++C300
++6600
++3C00
++1800
++FF00
++1800
++FF00
++1800
++1800
++1800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char166
++ENCODING 166
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++6600
++6600
++6600
++6600
++6600
++6600
++6600
++6600
++6600
++6600
++6600
++6600
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char167
++ENCODING 167
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++3E00
++6300
++3000
++1C00
++3600
++6300
++6300
++3600
++1C00
++0600
++6300
++3E00
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char168
++ENCODING 168
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3C00
++7E00
++DB00
++FF00
++BD00
++C300
++E700
++FF00
++7E00
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char169
++ENCODING 169
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++4100
++5D00
++5100
++5100
++5D00
++4100
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char170
++ENCODING 170
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++3800
++0C00
++3C00
++6400
++3C00
++0000
++7C00
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char171
++ENCODING 171
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++1800
++3000
++7F00
++7F00
++3000
++1800
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char172
++ENCODING 172
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1800
++3C00
++7E00
++5A00
++1800
++1800
++1800
++1800
++1800
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char173
++ENCODING 173
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++FF80
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char174
++ENCODING 174
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++4100
++5D00
++5500
++5900
++5500
++4100
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char175
++ENCODING 175
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++7F00
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char176
++ENCODING 176
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++1C00
++3600
++3600
++1C00
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char177
++ENCODING 177
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++1800
++1800
++7E00
++1800
++1800
++0000
++0000
++7E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char178
++ENCODING 178
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++3800
++6C00
++1800
++3000
++6400
++7C00
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char179
++ENCODING 179
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++7C00
++0C00
++1800
++0C00
++6C00
++3800
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char180
++ENCODING 180
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++1800
++3000
++6000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char181
++ENCODING 181
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++6600
++6600
++6600
++6600
++6600
++7E00
++6300
++6000
++C000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char182
++ENCODING 182
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7F00
++DB00
++DB00
++DB00
++7B00
++1B00
++1B00
++1B00
++1B00
++1B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char183
++ENCODING 183
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++1800
++1800
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char184
++ENCODING 184
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0080
++0100
++0300
++0600
++0C00
++1C00
++3000
++7F00
++7700
++0E00
++1C00
++1800
++3000
++6000
++8000
++0000
++ENDCHAR
++STARTCHAR char185
++ENCODING 185
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++3000
++7000
++3000
++3000
++3000
++7800
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char186
++ENCODING 186
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++3800
++6C00
++4400
++6C00
++3800
++0000
++7C00
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char187
++ENCODING 187
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0C00
++0600
++7F00
++7F00
++0600
++0C00
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char188
++ENCODING 188
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++6000
++6000
++6100
++6300
++6600
++0C00
++1800
++3300
++6700
++4B00
++1F00
++0300
++0300
++0000
++0000
++ENDCHAR
++STARTCHAR char189
++ENCODING 189
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++6000
++6000
++6100
++6300
++6600
++0C00
++1800
++3000
++6700
++4D80
++0300
++0600
++0F80
++0000
++0000
++ENDCHAR
++STARTCHAR char190
++ENCODING 190
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++7800
++1800
++3900
++1B00
++7600
++0C00
++1800
++3300
++6700
++4B00
++1F00
++0300
++0300
++0000
++0000
++ENDCHAR
++STARTCHAR char191
++ENCODING 191
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1800
++1800
++0000
++1800
++1800
++3000
++6000
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char192
++ENCODING 192
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++1800
++0C00
++0800
++1C00
++3600
++6300
++6300
++7F00
++6300
++6300
++6300
++6300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char193
++ENCODING 193
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0C00
++1800
++0800
++1C00
++3600
++6300
++6300
++7F00
++6300
++6300
++6300
++6300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char194
++ENCODING 194
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++1C00
++3600
++0800
++1C00
++3600
++6300
++6300
++7F00
++6300
++6300
++6300
++6300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char195
++ENCODING 195
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++3B00
++6E00
++0000
++1C00
++3600
++6300
++6300
++7F00
++6300
++6300
++6300
++6300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char196
++ENCODING 196
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++6300
++0000
++0800
++1C00
++3600
++6300
++6300
++7F00
++6300
++6300
++6300
++6300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char197
++ENCODING 197
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++1C00
++1400
++1C00
++1C00
++3600
++6300
++6300
++7F00
++6300
++6300
++6300
++6300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char198
++ENCODING 198
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1F00
++3600
++6600
++6600
++7F00
++6600
++6600
++6600
++6600
++6700
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char199
++ENCODING 199
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++1E00
++3300
++6100
++6000
++6000
++6000
++6100
++3300
++1E00
++0600
++0300
++3E00
++0000
++ENDCHAR
++STARTCHAR char200
++ENCODING 200
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++1800
++0C00
++7F00
++3300
++3100
++3400
++3C00
++3400
++3000
++3100
++3300
++7F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char201
++ENCODING 201
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0C00
++1800
++7F00
++3300
++3100
++3400
++3C00
++3400
++3000
++3100
++3300
++7F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char202
++ENCODING 202
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++1C00
++3600
++7F00
++3300
++3100
++3400
++3C00
++3400
++3000
++3100
++3300
++7F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char203
++ENCODING 203
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++6300
++0000
++7F00
++3300
++3100
++3400
++3C00
++3400
++3000
++3100
++3300
++7F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char204
++ENCODING 204
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++3000
++1800
++0000
++3C00
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char205
++ENCODING 205
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0C00
++1800
++0000
++3C00
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char206
++ENCODING 206
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++3C00
++6600
++0000
++3C00
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char207
++ENCODING 207
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++6600
++0000
++3C00
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char208
++ENCODING 208
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3C00
++3600
++3300
++3300
++7B00
++7B00
++3300
++3300
++3600
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char209
++ENCODING 209
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++3B00
++6E00
++6300
++7300
++7B00
++7F00
++6F00
++6700
++6300
++6300
++6300
++6300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char210
++ENCODING 210
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++3000
++1800
++3E00
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char211
++ENCODING 211
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0600
++0C00
++3E00
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char212
++ENCODING 212
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++1C00
++3600
++3E00
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char213
++ENCODING 213
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++3B00
++6E00
++3E00
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char214
++ENCODING 214
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++6300
++0000
++3E00
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char215
++ENCODING 215
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++6300
++3600
++1C00
++0800
++1C00
++3600
++6300
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char216
++ENCODING 216
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0100
++0300
++3E00
++6700
++6700
++6F00
++6B00
++6B00
++7B00
++7300
++7300
++3E00
++6000
++4000
++0000
++0000
++ENDCHAR
++STARTCHAR char217
++ENCODING 217
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++3000
++1800
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char218
++ENCODING 218
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0600
++0C00
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char219
++ENCODING 219
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++1C00
++1400
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char220
++ENCODING 220
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++6300
++0000
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char221
++ENCODING 221
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++1800
++3000
++C300
++C300
++C300
++6600
++3C00
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char222
++ENCODING 222
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++7800
++3000
++3E00
++3300
++3300
++3300
++3E00
++3000
++3000
++3000
++3000
++7800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char223
++ENCODING 223
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1C00
++3600
++6300
++6700
++6E00
++6C00
++6600
++6300
++6B00
++6E00
++6000
++4000
++0000
++0000
++ENDCHAR
++STARTCHAR char224
++ENCODING 224
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++3000
++1800
++0C00
++0000
++3C00
++0600
++3E00
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char225
++ENCODING 225
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0C00
++1800
++3000
++0000
++3C00
++0600
++3E00
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char226
++ENCODING 226
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0800
++1C00
++3600
++0000
++3C00
++0600
++3E00
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char227
++ENCODING 227
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3B00
++6E00
++0000
++3C00
++0600
++3E00
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char228
++ENCODING 228
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++6600
++0000
++0000
++3C00
++0600
++3E00
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char229
++ENCODING 229
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++1C00
++3600
++1C00
++0000
++3C00
++0600
++3E00
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char230
++ENCODING 230
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++6E00
++3B00
++1B00
++7E00
++D800
++DC00
++7700
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char231
++ENCODING 231
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3E00
++6300
++6000
++6000
++6000
++6300
++3E00
++0C00
++0600
++3C00
++0000
++ENDCHAR
++STARTCHAR char232
++ENCODING 232
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++3000
++1800
++0C00
++0000
++3E00
++6300
++7F00
++6000
++6000
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char233
++ENCODING 233
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0600
++0C00
++1800
++0000
++3E00
++6300
++7F00
++6000
++6000
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char234
++ENCODING 234
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0800
++1C00
++3600
++0000
++3E00
++6300
++7F00
++6000
++6000
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char235
++ENCODING 235
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++6300
++0000
++0000
++3E00
++6300
++7F00
++6000
++6000
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char236
++ENCODING 236
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++6000
++3000
++1800
++0000
++3800
++1800
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char237
++ENCODING 237
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0600
++0C00
++1800
++0000
++3800
++1800
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char238
++ENCODING 238
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++1800
++3C00
++6600
++0000
++3800
++1800
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char239
++ENCODING 239
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++6600
++0000
++0000
++3800
++1800
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char100
++ENCODING 240
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0E00
++0600
++0F00
++0600
++3E00
++6600
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char241
++ENCODING 241
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3B00
++6E00
++0000
++6E00
++3300
++3300
++3300
++3300
++3300
++3300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char242
++ENCODING 242
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++3000
++1800
++0C00
++0000
++3E00
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char243
++ENCODING 243
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0C00
++1800
++3000
++0000
++3E00
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char244
++ENCODING 244
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0800
++1C00
++3600
++0000
++3E00
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char245
++ENCODING 245
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3B00
++6E00
++0000
++3E00
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char246
++ENCODING 246
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++6300
++0000
++0000
++3E00
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char247
++ENCODING 247
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++1800
++1800
++0000
++7E00
++0000
++1800
++1800
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char248
++ENCODING 248
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0100
++0300
++3E00
++6700
++6F00
++6B00
++7B00
++7300
++3E00
++6000
++4000
++0000
++0000
++ENDCHAR
++STARTCHAR char249
++ENCODING 249
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++3000
++1800
++0C00
++0000
++6600
++6600
++6600
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char250
++ENCODING 250
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0C00
++1800
++3000
++0000
++6600
++6600
++6600
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char251
++ENCODING 251
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++1800
++3C00
++6600
++0000
++6600
++6600
++6600
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char252
++ENCODING 252
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++6600
++0000
++0000
++6600
++6600
++6600
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char253
++ENCODING 253
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0C00
++1800
++3000
++0000
++6300
++6300
++6300
++6300
++6300
++6300
++3F00
++0300
++0600
++7C00
++0000
++ENDCHAR
++STARTCHAR char254
++ENCODING 254
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++7800
++3000
++3E00
++3300
++3300
++3300
++3300
++3300
++3E00
++3000
++3000
++7800
++0000
++ENDCHAR
++STARTCHAR char255
++ENCODING 255
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++6300
++0000
++0000
++6300
++6300
++6300
++6300
++6300
++6300
++3F00
++0300
++0600
++7C00
++0000
++ENDCHAR
++ENDFONT
+diff -r af23d23c278b util/alevt/vtxt-latin-2.bdf
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/vtxt-latin-2.bdf      Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,5906 @@
++STARTFONT 2.1
++FONT -alevt-teletext-medium-r-normal--16-1-75-75-c-90-fontspecific-2
++SIZE 1 75 75
++FONTBOUNDINGBOX 9 16 0 -4
++STARTPROPERTIES 10
++POINT_SIZE 1
++PIXEL_SIZE 16
++RESOLUTION_X 75
++RESOLUTION_Y 75
++FONT_ASCENT 12
++FONT_DESCENT 4
++AVERAGE_WIDTH 90
++SPACING "C"
++_XMBDFED_INFO "Edited with xmbdfed 3.3."
++FONT "vtxt"
++ENDPROPERTIES
++CHARS 256
++STARTCHAR char0
++ENCODING 0
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 1
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char2
++ENCODING 2
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 3
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char0
++ENCODING 4
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++F000
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 5
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char2
++ENCODING 6
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++F000
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 7
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++F000
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char0
++ENCODING 8
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 9
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char2
++ENCODING 10
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 11
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char0
++ENCODING 12
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 13
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char2
++ENCODING 14
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char1
++ENCODING 15
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char0
++ENCODING 16
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char1
++ENCODING 17
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++0000
++0000
++0000
++0000
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char2
++ENCODING 18
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++0000
++0000
++0000
++0000
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char1
++ENCODING 19
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++0000
++0000
++0000
++0000
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char0
++ENCODING 20
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char1
++ENCODING 21
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char2
++ENCODING 22
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char1
++ENCODING 23
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char0
++ENCODING 24
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char1
++ENCODING 25
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char2
++ENCODING 26
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char1
++ENCODING 27
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char0
++ENCODING 28
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char1
++ENCODING 29
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char2
++ENCODING 30
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char1
++ENCODING 31
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++F000
++F000
++F000
++F000
++F000
++ENDCHAR
++STARTCHAR char32
++ENCODING 32
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char33
++ENCODING 33
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1800
++3C00
++3C00
++3C00
++1800
++1800
++1800
++0000
++1800
++1800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char34
++ENCODING 34
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++6600
++6600
++6600
++2400
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char35
++ENCODING 35
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++3600
++3600
++7F00
++3600
++3600
++3600
++7F00
++3600
++3600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char36
++ENCODING 36
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0C00
++0C00
++3E00
++6300
++6100
++6000
++3E00
++0300
++0300
++4300
++6300
++3E00
++0C00
++0C00
++0000
++0000
++ENDCHAR
++STARTCHAR char37
++ENCODING 37
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++6100
++6300
++0600
++0C00
++1800
++3000
++6300
++4300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char38
++ENCODING 38
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1C00
++3600
++3600
++1C00
++3B00
++6E00
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char39
++ENCODING 39
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++3000
++3000
++3000
++6000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char40
++ENCODING 40
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0C00
++1800
++3000
++3000
++3000
++3000
++3000
++3000
++1800
++0C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char41
++ENCODING 41
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3000
++1800
++0C00
++0C00
++0C00
++0C00
++0C00
++0C00
++1800
++3000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char42
++ENCODING 42
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++6600
++3C00
++FF00
++3C00
++6600
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char43
++ENCODING 43
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++1800
++1800
++7E00
++1800
++1800
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char44
++ENCODING 44
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++1800
++1800
++1800
++3000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char45
++ENCODING 45
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++7F00
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char46
++ENCODING 46
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++1800
++1800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char47
++ENCODING 47
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0100
++0300
++0600
++0C00
++1800
++3000
++6000
++4000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char48
++ENCODING 48
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3C00
++6600
++C300
++C300
++DB00
++DB00
++C300
++C300
++6600
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char49
++ENCODING 49
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1800
++3800
++7800
++1800
++1800
++1800
++1800
++1800
++1800
++7E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char50
++ENCODING 50
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++0300
++0600
++0C00
++1800
++3000
++6000
++6300
++7F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char51
++ENCODING 51
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++0300
++0300
++1E00
++0300
++0300
++0300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char52
++ENCODING 52
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0600
++0E00
++1E00
++3600
++6600
++7F00
++0600
++0600
++0600
++0F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char53
++ENCODING 53
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7F00
++6000
++6000
++6000
++7E00
++0300
++0300
++0300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char54
++ENCODING 54
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1C00
++3000
++6000
++6000
++7E00
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char55
++ENCODING 55
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7F00
++6300
++0300
++0300
++0600
++0C00
++1800
++1800
++1800
++1800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char56
++ENCODING 56
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++6300
++6300
++3E00
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char57
++ENCODING 57
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++6300
++6300
++3F00
++0300
++0300
++0300
++0600
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char58
++ENCODING 58
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++1800
++1800
++0000
++0000
++0000
++1800
++1800
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char59
++ENCODING 59
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++1800
++1800
++0000
++0000
++0000
++1800
++1800
++1800
++3000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char60
++ENCODING 60
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0600
++0C00
++1800
++3000
++6000
++3000
++1800
++0C00
++0600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char61
++ENCODING 61
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++7E00
++0000
++0000
++7E00
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char62
++ENCODING 62
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++6000
++3000
++1800
++0C00
++0600
++0C00
++1800
++3000
++6000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char63
++ENCODING 63
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++6300
++0600
++0C00
++0C00
++0C00
++0000
++0C00
++0C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char64
++ENCODING 64
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++3E00
++6300
++6300
++6F00
++6F00
++6F00
++6E00
++6000
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char65
++ENCODING 65
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0800
++1C00
++3600
++6300
++6300
++7F00
++6300
++6300
++6300
++6300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char66
++ENCODING 66
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7E00
++3300
++3300
++3300
++3E00
++3300
++3300
++3300
++3300
++7E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char67
++ENCODING 67
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1E00
++3300
++6100
++6000
++6000
++6000
++6000
++6100
++3300
++1E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char68
++ENCODING 68
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7C00
++3600
++3300
++3300
++3300
++3300
++3300
++3300
++3600
++7C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char69
++ENCODING 69
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7F00
++3300
++3100
++3400
++3C00
++3400
++3000
++3100
++3300
++7F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char70
++ENCODING 70
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7F00
++3300
++3100
++3400
++3C00
++3400
++3000
++3000
++3000
++7800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char71
++ENCODING 71
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1E00
++3300
++6100
++6000
++6000
++6F00
++6300
++6300
++3300
++1D00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char72
++ENCODING 72
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++6300
++6300
++6300
++6300
++7F00
++6300
++6300
++6300
++6300
++6300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char73
++ENCODING 73
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3C00
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char74
++ENCODING 74
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0F00
++0600
++0600
++0600
++0600
++0600
++6600
++6600
++6600
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char75
++ENCODING 75
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7300
++3300
++3300
++3600
++3C00
++3C00
++3600
++3300
++3300
++7300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char76
++ENCODING 76
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7800
++3000
++3000
++3000
++3000
++3000
++3000
++3100
++3300
++7F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char77
++ENCODING 77
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++C300
++E700
++FF00
++FF00
++DB00
++C300
++C300
++C300
++C300
++C300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char78
++ENCODING 78
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++6300
++7300
++7B00
++7F00
++6F00
++6700
++6300
++6300
++6300
++6300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char79
++ENCODING 79
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char80
++ENCODING 80
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7E00
++3300
++3300
++3300
++3E00
++3000
++3000
++3000
++3000
++7800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char81
++ENCODING 81
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++6300
++6300
++6300
++6300
++6300
++6B00
++6F00
++3E00
++0600
++0700
++0000
++0000
++ENDCHAR
++STARTCHAR char82
++ENCODING 82
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7E00
++3300
++3300
++3300
++3E00
++3600
++3300
++3300
++3300
++7300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char83
++ENCODING 83
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++6300
++3000
++1C00
++0600
++0300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char84
++ENCODING 84
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++FF00
++DB00
++9900
++1800
++1800
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char85
++ENCODING 85
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char86
++ENCODING 86
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++C300
++C300
++C300
++C300
++C300
++C300
++C300
++6600
++3C00
++1800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char87
++ENCODING 87
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++C300
++C300
++C300
++C300
++C300
++DB00
++DB00
++FF00
++6600
++6600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char88
++ENCODING 88
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++C300
++C300
++6600
++3C00
++1800
++1800
++3C00
++6600
++C300
++C300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char89
++ENCODING 89
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++C300
++C300
++C300
++6600
++3C00
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char90
++ENCODING 90
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++FF00
++C300
++8600
++0C00
++1800
++3000
++6000
++C100
++C300
++FF00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char91
++ENCODING 91
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3C00
++3000
++3000
++3000
++3000
++3000
++3000
++3000
++3000
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char92
++ENCODING 92
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++4000
++6000
++7000
++3800
++1C00
++0E00
++0700
++0300
++0100
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char93
++ENCODING 93
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3C00
++0C00
++0C00
++0C00
++0C00
++0C00
++0C00
++0C00
++0C00
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char94
++ENCODING 94
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0800
++1C00
++3600
++6300
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char95
++ENCODING 95
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++FF80
++0000
++0000
++ENDCHAR
++STARTCHAR char96
++ENCODING 96
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++3000
++3000
++1800
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char97
++ENCODING 97
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3C00
++0600
++3E00
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char98
++ENCODING 98
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7000
++3000
++3000
++3C00
++3600
++3300
++3300
++3300
++3300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char99
++ENCODING 99
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3E00
++6300
++6000
++6000
++6000
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char100
++ENCODING 100
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0E00
++0600
++0600
++1E00
++3600
++6600
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char101
++ENCODING 101
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3E00
++6300
++7F00
++6000
++6000
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char102
++ENCODING 102
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1C00
++3600
++3200
++3000
++7800
++3000
++3000
++3000
++3000
++7800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char103
++ENCODING 103
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3B00
++6600
++6600
++6600
++6600
++6600
++3E00
++0600
++6600
++3C00
++0000
++ENDCHAR
++STARTCHAR char104
++ENCODING 104
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7000
++3000
++3000
++3600
++3B00
++3300
++3300
++3300
++3300
++7300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char105
++ENCODING 105
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1800
++1800
++0000
++3800
++1800
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char106
++ENCODING 106
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0600
++0600
++0000
++0E00
++0600
++0600
++0600
++0600
++0600
++0600
++6600
++6600
++3C00
++0000
++ENDCHAR
++STARTCHAR char107
++ENCODING 107
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7000
++3000
++3000
++3300
++3600
++3C00
++3C00
++3600
++3300
++7300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char108
++ENCODING 108
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3800
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char109
++ENCODING 109
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++E600
++FF00
++DB00
++DB00
++DB00
++DB00
++DB00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char110
++ENCODING 110
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++6E00
++3300
++3300
++3300
++3300
++3300
++3300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char111
++ENCODING 111
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3E00
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char112
++ENCODING 112
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++6E00
++3300
++3300
++3300
++3300
++3300
++3E00
++3000
++3000
++7800
++0000
++ENDCHAR
++STARTCHAR char113
++ENCODING 113
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3B00
++6600
++6600
++6600
++6600
++6600
++3E00
++0600
++0600
++0F00
++0000
++ENDCHAR
++STARTCHAR char114
++ENCODING 114
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++6E00
++3B00
++3300
++3000
++3000
++3000
++7800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char115
++ENCODING 115
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3E00
++6300
++3000
++1C00
++0600
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char116
++ENCODING 116
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0800
++1800
++1800
++7E00
++1800
++1800
++1800
++1800
++1B00
++0E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char117
++ENCODING 117
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++6600
++6600
++6600
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char118
++ENCODING 118
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++C300
++C300
++C300
++C300
++6600
++3C00
++1800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char119
++ENCODING 119
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++C300
++C300
++C300
++DB00
++DB00
++FF00
++6600
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char120
++ENCODING 120
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++C300
++6600
++3C00
++1800
++3C00
++6600
++C300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char121
++ENCODING 121
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++6300
++6300
++6300
++6300
++6300
++6300
++3F00
++0300
++0600
++7C00
++0000
++ENDCHAR
++STARTCHAR char122
++ENCODING 122
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++7F00
++6600
++0C00
++1800
++3000
++6300
++7F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char123
++ENCODING 123
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0E00
++1800
++1800
++1800
++7000
++1800
++1800
++1800
++1800
++0E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char124
++ENCODING 124
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char125
++ENCODING 125
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7000
++1800
++1800
++1800
++0E00
++1800
++1800
++1800
++1800
++7000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char126
++ENCODING 126
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3B00
++6E00
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char127
++ENCODING 127
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++7F00
++7F00
++7F00
++7F00
++7F00
++7F00
++7F00
++7F00
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char0
++ENCODING 128
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char1
++ENCODING 129
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++0000
++0000
++0000
++0000
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char2
++ENCODING 130
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++0000
++0000
++0000
++0000
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char1
++ENCODING 131
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++0000
++0000
++0000
++0000
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char0
++ENCODING 132
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++F000
++F000
++F000
++F000
++F000
++F000
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char1
++ENCODING 133
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char2
++ENCODING 134
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++F000
++F000
++F000
++F000
++F000
++F000
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char1
++ENCODING 135
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++F000
++F000
++F000
++F000
++F000
++F000
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char0
++ENCODING 136
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char1
++ENCODING 137
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char2
++ENCODING 138
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char1
++ENCODING 139
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char0
++ENCODING 140
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char1
++ENCODING 141
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char2
++ENCODING 142
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char1
++ENCODING 143
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++0F80
++0F80
++0F80
++0F80
++0F80
++ENDCHAR
++STARTCHAR char0
++ENCODING 144
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char1
++ENCODING 145
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++0000
++0000
++0000
++0000
++0000
++0000
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char2
++ENCODING 146
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++0000
++0000
++0000
++0000
++0000
++0000
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char1
++ENCODING 147
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++0000
++0000
++0000
++0000
++0000
++0000
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char0
++ENCODING 148
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++F000
++F000
++F000
++F000
++F000
++F000
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char1
++ENCODING 149
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++F000
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char2
++ENCODING 150
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++F000
++F000
++F000
++F000
++F000
++F000
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char1
++ENCODING 151
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++F000
++F000
++F000
++F000
++F000
++F000
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char0
++ENCODING 152
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char1
++ENCODING 153
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char2
++ENCODING 154
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char1
++ENCODING 155
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++0F80
++0F80
++0F80
++0F80
++0F80
++0F80
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char0
++ENCODING 156
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char1
++ENCODING 157
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++F000
++F000
++F000
++F000
++F000
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char2
++ENCODING 158
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0F80
++0F80
++0F80
++0F80
++0F80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char1
++ENCODING 159
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++FF80
++ENDCHAR
++STARTCHAR char160
++ENCODING 160
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++FF80
++0880
++0880
++0880
++0880
++FF80
++0880
++0880
++0880
++0880
++0880
++FF80
++0880
++0880
++0880
++0880
++ENDCHAR
++STARTCHAR char65
++ENCODING 161
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0800
++1C00
++3600
++6300
++6300
++7F00
++6300
++6300
++6300
++6300
++0600
++0300
++0000
++0000
++ENDCHAR
++STARTCHAR char162
++ENCODING 162
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++6600
++3C00
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char76
++ENCODING 163
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7800
++3000
++3000
++3C00
++3800
++3000
++7000
++F100
++3300
++7F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char164
++ENCODING 164
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++4100
++6300
++3E00
++6300
++6300
++6300
++6300
++3E00
++6300
++4100
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char76
++ENCODING 165
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7B00
++3300
++3600
++3000
++3000
++3000
++3000
++3100
++3300
++7F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char83
++ENCODING 166
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0C00
++1800
++3E00
++6300
++6300
++3000
++1C00
++0600
++0300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char167
++ENCODING 167
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++3E00
++6300
++3000
++1C00
++3600
++6300
++6300
++3600
++1C00
++0600
++6300
++3E00
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char196
++ENCODING 168
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++6300
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char169
++ENCODING 169
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++6600
++3C00
++3E00
++6300
++6300
++3000
++1C00
++0600
++0300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char83
++ENCODING 170
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3E00
++6300
++6300
++3000
++1C00
++0600
++0300
++6300
++6300
++3E00
++0600
++0300
++3E00
++0000
++ENDCHAR
++STARTCHAR char171
++ENCODING 171
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++6600
++3C00
++FF00
++DB00
++9900
++1800
++1800
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char90
++ENCODING 172
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0C00
++1800
++FF00
++C300
++8600
++0C00
++1800
++3000
++6000
++C100
++C300
++FF00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char173
++ENCODING 173
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++FF80
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char174
++ENCODING 174
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++6600
++3C00
++FF00
++C300
++8600
++0C00
++1800
++3000
++6000
++C100
++C300
++FF00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char90
++ENCODING 175
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++FF00
++C300
++8600
++0C00
++7E00
++3000
++6000
++C100
++C300
++FF00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char176
++ENCODING 176
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++1C00
++3600
++3600
++1C00
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char97
++ENCODING 177
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3C00
++0600
++3E00
++6600
++6600
++6600
++3B00
++0600
++0300
++0000
++0000
++ENDCHAR
++STARTCHAR char97
++ENCODING 178
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0C00
++1800
++0E00
++0000
++0000
++ENDCHAR
++STARTCHAR char108
++ENCODING 179
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3800
++1800
++1E00
++1C00
++1800
++3800
++7800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char180
++ENCODING 180
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++1800
++3000
++6000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char108
++ENCODING 181
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3980
++1980
++1B00
++1800
++1800
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char115
++ENCODING 182
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0600
++0C00
++0000
++3E00
++6300
++3000
++1C00
++0600
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char171
++ENCODING 183
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++6600
++3C00
++1800
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char184
++ENCODING 184
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0080
++0100
++0300
++0600
++0C00
++1C00
++3000
++7F00
++7700
++0E00
++1C00
++1800
++3000
++6000
++8000
++0000
++ENDCHAR
++STARTCHAR char185
++ENCODING 185
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++3600
++1C00
++3E00
++6300
++3000
++1C00
++0600
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char115
++ENCODING 186
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3E00
++6300
++3000
++1C00
++0600
++6300
++3E00
++0300
++1E00
++0000
++0000
++ENDCHAR
++STARTCHAR char187
++ENCODING 187
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0180
++0980
++1B00
++1800
++7E00
++1800
++1800
++1800
++1800
++1B00
++0E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char122
++ENCODING 188
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0600
++0C00
++0000
++7F00
++6600
++0C00
++1800
++3000
++6300
++7F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char189
++ENCODING 189
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++3300
++6600
++CC00
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char190
++ENCODING 190
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++6600
++3C00
++7F00
++6600
++0C00
++1800
++3000
++6300
++7F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char122
++ENCODING 191
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0C00
++0C00
++0000
++7F00
++6600
++0C00
++1800
++3000
++6300
++7F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char82
++ENCODING 192
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0600
++0C00
++7E00
++3300
++3300
++3300
++3E00
++3600
++3300
++3300
++3300
++7300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char193
++ENCODING 193
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0300
++0600
++0000
++1C00
++3600
++6300
++6300
++7F00
++6300
++6300
++6300
++6300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char194
++ENCODING 194
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++1C00
++3600
++0800
++1C00
++3600
++6300
++6300
++7F00
++6300
++6300
++6300
++6300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char195
++ENCODING 195
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++6300
++3E00
++0000
++1C00
++3600
++6300
++6300
++7F00
++6300
++6300
++6300
++6300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char196
++ENCODING 196
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++6300
++0000
++0800
++1C00
++3600
++6300
++6300
++7F00
++6300
++6300
++6300
++6300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char76
++ENCODING 197
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0C00
++1800
++7C00
++3000
++3000
++3000
++3000
++3000
++3000
++3100
++3300
++7F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char67
++ENCODING 198
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0600
++0C00
++1E00
++3300
++6100
++6000
++6000
++6000
++6000
++6100
++3300
++1E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char199
++ENCODING 199
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++1E00
++3300
++6100
++6000
++6000
++6000
++6100
++3300
++1E00
++0600
++0300
++3E00
++0000
++ENDCHAR
++STARTCHAR char200
++ENCODING 200
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++3300
++1E00
++1E00
++3300
++6100
++6000
++6000
++6000
++6000
++6100
++3300
++1E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char201
++ENCODING 201
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0C00
++1800
++7F00
++3300
++3100
++3400
++3C00
++3400
++3000
++3100
++3300
++7F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char202
++ENCODING 202
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++7F00
++3300
++3100
++3400
++3C00
++3400
++3000
++3100
++3300
++7F00
++0C00
++0600
++0000
++0000
++ENDCHAR
++STARTCHAR char203
++ENCODING 203
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++6300
++0000
++7F00
++3300
++3100
++3400
++3C00
++3400
++3000
++3100
++3300
++7F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char204
++ENCODING 204
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++3300
++1E00
++7F00
++3300
++3100
++3400
++3C00
++3400
++3000
++3100
++3300
++7F00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char205
++ENCODING 205
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0C00
++1800
++0000
++3C00
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char206
++ENCODING 206
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++3C00
++6600
++0000
++3C00
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char207
++ENCODING 207
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++6600
++3C00
++7C00
++3600
++3300
++3300
++3300
++3300
++3300
++3300
++3600
++7C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char208
++ENCODING 208
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3C00
++3600
++3300
++3300
++7B00
++7B00
++3300
++3300
++3600
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char78
++ENCODING 209
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0C00
++1800
++6300
++7300
++7B00
++7F00
++6F00
++6700
++6300
++6300
++6300
++6300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char210
++ENCODING 210
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++6600
++3C00
++6300
++7300
++7B00
++7F00
++6F00
++6700
++6300
++6300
++6300
++6300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char211
++ENCODING 211
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0600
++0C00
++3E00
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char212
++ENCODING 212
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++1C00
++3600
++3E00
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char213
++ENCODING 213
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++3300
++6600
++3E00
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char214
++ENCODING 214
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++6300
++0000
++3E00
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char215
++ENCODING 215
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++6300
++3600
++1C00
++0800
++1C00
++3600
++6300
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char216
++ENCODING 216
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++6600
++3C00
++7E00
++3300
++3300
++3300
++3E00
++3600
++3300
++3300
++3300
++7300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char217
++ENCODING 217
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0800
++1400
++6B00
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char218
++ENCODING 218
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0600
++0C00
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char219
++ENCODING 219
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++1B00
++3600
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char220
++ENCODING 220
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++6300
++0000
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char221
++ENCODING 221
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++1800
++3000
++C300
++C300
++C300
++6600
++3C00
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char84
++ENCODING 222
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++FF00
++DB00
++9900
++1800
++1800
++1800
++1800
++1800
++1800
++3C00
++0600
++3C00
++0000
++0000
++ENDCHAR
++STARTCHAR char223
++ENCODING 223
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++1C00
++3600
++6300
++6700
++6E00
++6C00
++6600
++6300
++6B00
++6E00
++6000
++4000
++0000
++0000
++ENDCHAR
++STARTCHAR char224
++ENCODING 224
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0C00
++1800
++6E00
++3B00
++3300
++3000
++3000
++3000
++7800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char225
++ENCODING 225
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0C00
++1800
++3000
++0000
++3C00
++0600
++3E00
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char226
++ENCODING 226
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0800
++1C00
++3600
++0000
++3C00
++0600
++3E00
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char227
++ENCODING 227
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++6600
++3C00
++0000
++3C00
++0600
++3E00
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char228
++ENCODING 228
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++6600
++0000
++0000
++3C00
++0600
++3E00
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char108
++ENCODING 229
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0C00
++1800
++0000
++3800
++1800
++1800
++1800
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char99
++ENCODING 230
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0600
++0C00
++0000
++3E00
++6300
++6000
++6000
++6000
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char231
++ENCODING 231
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3E00
++6300
++6000
++6000
++6000
++6300
++3E00
++0C00
++0600
++3C00
++0000
++ENDCHAR
++STARTCHAR char232
++ENCODING 232
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++6600
++3C00
++3E00
++6300
++6000
++6000
++6000
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char233
++ENCODING 233
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0600
++0C00
++1800
++0000
++3E00
++6300
++7F00
++6000
++6000
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char234
++ENCODING 234
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++0000
++3E00
++6300
++7F00
++6000
++6000
++6300
++3E00
++1800
++0E00
++0000
++0000
++ENDCHAR
++STARTCHAR char235
++ENCODING 235
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++6300
++0000
++0000
++3E00
++6300
++7F00
++6000
++6000
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char236
++ENCODING 236
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++3300
++1E00
++3E00
++6300
++7F00
++6000
++6000
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char237
++ENCODING 237
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0600
++0C00
++1800
++0000
++3800
++1800
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char238
++ENCODING 238
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++1800
++3C00
++6600
++0000
++3800
++1800
++1800
++1800
++1800
++1800
++3C00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char239
++ENCODING 239
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++6000
++6E00
++3600
++0600
++1E00
++3600
++6600
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char100
++ENCODING 240
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0E00
++0600
++0F00
++0600
++3E00
++6600
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char241
++ENCODING 241
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0600
++0C00
++0000
++6E00
++3300
++3300
++3300
++3300
++3300
++3300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char242
++ENCODING 242
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++3300
++1E00
++6E00
++3300
++3300
++3300
++3300
++3300
++3300
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char243
++ENCODING 243
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0600
++0C00
++0000
++3E00
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char244
++ENCODING 244
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0800
++1C00
++3600
++0000
++3E00
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char245
++ENCODING 245
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3300
++6600
++0000
++3E00
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char246
++ENCODING 246
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++6300
++0000
++0000
++3E00
++6300
++6300
++6300
++6300
++6300
++3E00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char247
++ENCODING 247
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++0000
++1800
++1800
++0000
++7E00
++0000
++1800
++1800
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char248
++ENCODING 248
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0000
++3300
++1E00
++6E00
++3B00
++3300
++3000
++3000
++3000
++7800
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char249
++ENCODING 249
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++1800
++2400
++2400
++1800
++6600
++6600
++6600
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char250
++ENCODING 250
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0C00
++1800
++3000
++0000
++6600
++6600
++6600
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char251
++ENCODING 251
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++3300
++6600
++0000
++6600
++6600
++6600
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char252
++ENCODING 252
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++6600
++0000
++0000
++6600
++6600
++6600
++6600
++6600
++6600
++3B00
++0000
++0000
++0000
++0000
++ENDCHAR
++STARTCHAR char253
++ENCODING 253
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0C00
++1800
++3000
++0000
++6300
++6300
++6300
++6300
++6300
++6300
++3F00
++0300
++0600
++7C00
++0000
++ENDCHAR
++STARTCHAR char116
++ENCODING 254
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0000
++0800
++1800
++1800
++7E00
++1800
++1800
++1800
++1800
++1B00
++0E00
++0300
++1E00
++0000
++0000
++ENDCHAR
++STARTCHAR char255
++ENCODING 255
++SWIDTH 8640 0
++DWIDTH 9 0
++BBX 9 16 0 -4
++BITMAP
++0000
++0C00
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++0000
++ENDCHAR
++ENDFONT
+diff -r af23d23c278b util/alevt/xio.c
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/xio.c Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,1156 @@
++#include <stdio.h>
++#include <unistd.h>
++#include <stdlib.h>
++#include <string.h>
++#include <fcntl.h>
++#include <signal.h>
++#include <X11/Xlib.h>
++#include <X11/Xutil.h>
++#include <X11/Xatom.h>
++#define XK_MISCELLANY
++#define XK_LATIN1
++#include <X11/keysymdef.h>
++#include <sys/time.h>
++#include "vt.h"
++#include "misc.h"
++#include "dllist.h"
++#include "xio.h"
++#include "fdset.h"
++#include "lang.h"
++#include "icon.xbm"
++#include "font.h"
++
++#define WW (W*CW) /* pixel width of window */
++#define WH (H*CH) /* pixel hegiht of window */
++#define NO_SEL 999 /* sel_y1 value if no selection */
++#define SEL_MIN_TIME 500 /* anything shorter is a click */
++
++static struct dl_head dpys[1]; /* list of all displays */
++static void xio_timer(void *data, int fd);
++static void handle_event(struct xio *xio, int fd);
++
++
++static int timer_init(int argc, char **argv)
++{
++    int p[2], timer_pid, i;
++
++    if (pipe(p) == -1)
++    return -1;
++
++    signal(SIGPIPE, SIG_DFL);
++    timer_pid = fork();
++    if (timer_pid == -1)
++    return -1;
++    if (timer_pid > 0)
++    {
++    fdset_add_fd(fds, p[0], xio_timer, 0);
++    close(p[1]);
++    return 0;
++    }
++
++    close(p[0]);
++    for (i = 0; i < 32; ++i)
++    if (p[1] != i)
++    close(i);
++    memcpy(argv[0], "Timer", 6);
++
++    for (;;)
++    {
++    usleep(300000);
++    write(p[1], "*", 1);
++    }
++}
++
++
++static int local_init(int argc, char **argv)
++{
++    static int inited = 0;
++
++    if (inited)
++      return 0;
++
++    if (timer_init(argc, argv) == -1)
++      return -1;
++
++    dl_init(dpys);
++
++    inited = 1;
++    return 0;
++}
++
++
++static int get_colors(struct xio *xio)
++{
++    int i;
++    XColor c;
++
++    static short rgb[][3] =
++    {
++      { 0x0000,0x0000,0x0000 },
++      { 0xffff,0x0000,0x0000 },
++      { 0x0000,0xffff,0x0000 },
++      { 0xffff,0xffff,0x0000 },
++      { 0x0000,0x0000,0xffff },
++      { 0xffff,0x0000,0xffff },
++      { 0x0000,0xffff,0xffff },
++      { 0xffff,0xffff,0xffff },
++      { 0x7fff,0x7fff,0x7fff },
++      { 0x7fff,0x0000,0x0000 },
++      { 0x0000,0x7fff,0x0000 },
++      { 0x7fff,0x7fff,0x0000 },
++      { 0x0000,0x0000,0x7fff },
++      { 0x7fff,0x0000,0x7fff },
++      { 0x0000,0x7fff,0x7fff },
++      { 0x3fff,0x3fff,0x3fff },
++    };
++
++    for (i = 0; i < 16; ++i)
++    {
++      c.red = rgb[i][0];
++      c.green = rgb[i][1];
++      c.blue = rgb[i][2];
++      if (XAllocColor(xio->dpy, xio->cmap, &c) == 0)
++          return -1;
++      xio->color[i] = c.pixel;
++    }
++    return 0;
++}
++
++
++static int get_fonts(struct xio *xio)
++{
++    GC gc;
++    int i;
++    unsigned char *font_bits;
++    switch(latin1) {
++        case LATIN1: font_bits=font1_bits; break;
++        case LATIN2: font_bits=font2_bits; break;
++        case KOI8: font_bits=font3_bits; break;
++        case GREEK: font_bits=font4_bits; break;
++        default: font_bits=font1_bits; break;
++    }
++
++    xio->font[0] = XCreateBitmapFromData(xio->dpy, xio->root,
++                                       font_bits, font_width, font_height);
++    xio->font[1] = XCreatePixmap(xio->dpy, xio->root,
++                                      font_width, font_height*2, 1);
++    gc = XCreateGC(xio->dpy, xio->font[0], 0, 0);
++    for (i = 0; i < font_height; ++i)
++    {
++      XCopyArea(xio->dpy, xio->font[0], xio->font[1], gc, 0, i,
++                                                  font_width, 1, 0, i*2);
++      XCopyArea(xio->dpy, xio->font[0], xio->font[1], gc, 0, i,
++                                                  font_width, 1, 0, i*2+1);
++    }
++    XFreeGC(xio->dpy, gc);
++    return 0;
++}
++
++
++static void xlib_conn_watch(Display *dpy, void *fds, int fd, int open_flag, void *data)
++{
++    if (open_flag)
++      fdset_add_fd(fds, fd, XProcessInternalConnection, dpy);
++    else
++      fdset_del_fd(fds, fd);
++}
++
++
++struct xio * xio_open_dpy(char *dpy, int argc, char **argv)
++{
++    XClassHint classhint[1];
++    struct xio *xio;
++
++    if (local_init(argc, argv) == -1)
++      goto fail1;
++    
++    if (not(xio = malloc(sizeof(*xio))))
++      goto fail1;
++
++    if (not(xio->dpy = XOpenDisplay(dpy)))
++      goto fail2;
++
++    xio->fd = ConnectionNumber(xio->dpy);
++    xio->argc = argc;
++    xio->argv = argv;
++    dl_init(xio->windows);
++    xio->screen = DefaultScreen(xio->dpy);
++    xio->depth = DefaultDepth(xio->dpy, xio->screen);
++    xio->width = DisplayWidth(xio->dpy, xio->screen);
++    xio->height = DisplayHeight(xio->dpy, xio->screen);
++    xio->root = DefaultRootWindow(xio->dpy);
++    xio->cmap = DefaultColormap(xio->dpy, xio->screen);
++    xio->xa_del_win = XInternAtom(xio->dpy, "WM_DELETE_WINDOW", False);
++    xio->xa_targets = XInternAtom(xio->dpy, "TARGETS", False);
++    xio->xa_timestamp = XInternAtom(xio->dpy, "TIMESTAMP", False);
++    xio->xa_multiple = XInternAtom(xio->dpy, "MULTIPLE", False);
++    xio->xa_text = XInternAtom(xio->dpy, "TEXT", False);
++
++    if (get_colors(xio) == -1)
++      goto fail3;
++
++    if (get_fonts(xio) == -1)
++      goto fail3;
++
++    if (fdset_add_fd(fds, xio->fd, handle_event, xio) == -1)
++      goto fail3;
++    
++    XAddConnectionWatch(xio->dpy, PTR xlib_conn_watch, PTR fds);
++      
++    xio->icon = XCreateBitmapFromData(xio->dpy, xio->root,
++                                      icon_bits, icon_width, icon_height);
++
++    xio->group_leader = XCreateSimpleWindow(xio->dpy, xio->root,
++                                                      0, 0, 1, 1, 0, 0, 0);
++    XSetCommand(xio->dpy, xio->group_leader, xio->argv, xio->argc);
++    classhint->res_name = "VTLeader";
++    classhint->res_class = "AleVT";
++    XSetClassHint(xio->dpy, xio->group_leader, classhint);
++
++    dl_insert_first(dpys, xio->node);
++    return xio;
++
++fail4:
++    fdset_del_fd(fds, xio->fd);
++fail3:
++    XCloseDisplay(xio->dpy);
++fail2:
++    free(xio);
++fail1:
++    return 0;
++}
++
++
++static void set_user_geometry(struct xio_win *xw, char *geom, XSizeHints *sh, int bwidth)
++{
++    static int gravs[] = { NorthWestGravity, NorthEastGravity,
++                         SouthWestGravity, SouthEastGravity };
++    int f, g = 0;
++
++    f = XParseGeometry(geom, &sh->x, &sh->y, &sh->width, &sh->height);
++
++    if (f & WidthValue)
++      sh->width = sh->base_width + sh->width * sh->width_inc;
++    if (f & HeightValue)
++      sh->height = sh->base_height + sh->height * sh->height_inc;
++    if (f & XNegative)
++      g+=1, sh->x = xw->xio->width + sh->x - sh->width - bwidth;
++    if (f & YNegative)
++      g+=2, sh->y = xw->xio->height + sh->y - sh->height - bwidth;
++
++    sh->width = bound(sh->min_width, sh->width, sh->max_width);
++    sh->height = bound(sh->min_height, sh->height, sh->max_height);
++
++    if (f & (WidthValue | HeightValue))
++      sh->flags |= USSize;
++    if (f & (XValue | YValue))
++      sh->flags |= USPosition | PWinGravity;
++
++    sh->win_gravity = gravs[g];
++}
++
++
++struct xio_win * xio_open_win(struct xio *xio, char *geom)
++{
++    struct xio_win *xw;
++    XSetWindowAttributes attr;
++    XGCValues gcval;
++    XSizeHints sizehint[1];
++    XClassHint classhint[1];
++    XWMHints wmhint[1];
++
++    if (not(xw = malloc(sizeof(*xw))))
++      goto fail1;
++
++    xw->xio = xio;
++
++    sizehint->flags = PSize | PBaseSize | PMinSize | PMaxSize | PResizeInc;
++    sizehint->x = sizehint->y = 0;
++    sizehint->width_inc = CW;
++    sizehint->height_inc = CH;
++    sizehint->base_width = 0;
++    sizehint->base_height = 0;
++    sizehint->min_width = 11*CW;
++    sizehint->min_height = 1*CH;
++    sizehint->max_width = sizehint->width = WW + CW;
++    sizehint->max_height = sizehint->height = WH;
++    set_user_geometry(xw, geom, sizehint, 1);
++
++    attr.background_pixel = xio->color[0];
++    attr.event_mask = KeyPressMask |
++                       ButtonPressMask|ButtonReleaseMask|Button1MotionMask |
++                       ExposureMask;
++    xw->win = XCreateWindow(xio->dpy, xio->root,
++              sizehint->x, sizehint->y, sizehint->width, sizehint->height, 1,
++                      CopyFromParent, CopyFromParent, CopyFromParent,
++                      CWBackPixel|CWEventMask, &attr);
++
++    classhint->res_name = "VTPage";
++    classhint->res_class = "AleVT";
++
++    wmhint->flags = InputHint | StateHint | WindowGroupHint | IconPixmapHint;
++    wmhint->input = True;
++    wmhint->initial_state = NormalState; //IconicState;
++    wmhint->window_group = xio->group_leader;
++    wmhint->icon_pixmap = xio->icon;
++
++    XSetWMProperties(xio->dpy, xw->win, 0,0, 0,0, sizehint, wmhint, classhint);
++    XSetWMProtocols(xio->dpy, xw->win, &xio->xa_del_win, 1);
++
++    xw->title[0] = 0;
++    xio_title(xw, "AleVT"); // will be reset pretty soon
++
++    gcval.graphics_exposures = False;
++    xw->gc = XCreateGC(xio->dpy, xw->win, GCGraphicsExposures, &gcval);
++
++    xw->tstamp = CurrentTime;
++    xw->fg = xw->bg = -1;     /* unknown colors */
++
++    xw->curs_x = xw->curs_y = 999;    // no cursor
++
++    xw->sel_y1 = NO_SEL;      /* no selection area */
++    xw->sel_start_t = 0;      /* no selection-drag active */
++    xw->sel_set_t = 0;                /* not selection owner */
++    xw->sel_pixmap = 0;               /* no selection pixmap yet */
++
++    xio_clear_win(xw);
++    xw->blink_on = xw->reveal = 0;
++
++    xw->handler = 0;
++
++    XMapWindow(xio->dpy, xw->win);
++    dl_insert_first(xio->windows, xw->node);
++    return xw;
++
++fail2:
++    free(xw);
++fail1:
++    return 0;
++}
++
++
++void xio_close_win(struct xio_win *xw, int dpy_too)
++{
++    struct xio *xio = xw->xio;
++
++    XDestroyWindow(xio->dpy, xw->win);
++    dl_remove(xw->node);
++    free(xw);
++
++    if (dpy_too && dl_empty(xio->windows))
++      xio_close_dpy(xio);
++}
++
++
++void xio_close_dpy(struct xio *xio)
++{
++    while (not dl_empty(xio->windows))
++      xio_close_win((struct xio_win *)xio->windows->first, 0);
++
++    XDestroyWindow(xio->dpy, xio->group_leader);
++    XRemoveConnectionWatch(xio->dpy, PTR xlib_conn_watch, PTR fds);
++    fdset_del_fd(fds, xio->fd);
++    dl_remove(xio->node);
++    free(xio);
++}
++
++
++void xio_set_handler(struct xio_win *xw, void *handler, void *data)
++{
++    xw->handler = handler;
++    xw->data = data;
++}
++
++
++void xio_title(struct xio_win *xw, char *title)
++{
++    char buf[sizeof(xw->title) + 32];
++
++    if (strlen(title) >= sizeof(xw->title))
++      return; //TODO: trimm...
++    if (strcmp(xw->title, title) == 0)
++      return;
++
++    strcpy(xw->title, title);
++    sprintf(buf, "AleVT " VERSION "    %s", xw->title);
++    XStoreName(xw->xio->dpy, xw->win, buf);
++    XSetIconName(xw->xio->dpy, xw->win, xw->title);
++}
++
++
++void xio_clear_win(struct xio_win *xw)
++{
++    memset(xw->ch, ' ', sizeof(xw->ch));
++    xw->dheight = xw->blink = xw->concealed = 0;
++    xw->hidden = xw->lhidden = 0;
++    xw->modified = ALL_LINES;
++}
++
++
++void xio_put_line(struct xio_win *xw, int y, u8 *data)
++{
++    u8 *p = xw->ch + y*W;
++    u8 *ep = p + W;
++    lbits yb = 1 << y;
++    lbits x = xw->dheight;
++
++    if (y < 0 || y >= H)
++      return;
++
++    if (memcmp(data, p, ep - p) == 0)
++      return;
++
++    xw->modified |= yb;
++    xw->blink &= ~yb;
++    xw->dheight &= ~yb;
++    xw->concealed &= ~yb;
++
++    while (p < ep)
++      switch (*p++ = *data++)
++      {
++          case 0x08:
++              xw->blink |= yb;
++              break;
++          case 0x0d:
++              if (y < H-1)
++                  xw->dheight |= yb;
++              break;
++          case 0x18:
++              xw->concealed |= yb;
++              break;
++      }
++
++    if ((xw->dheight ^ x) & yb) // dheight has changed, recalc hidden
++    {
++      xw->hidden &= yb*2 - 1;
++      for (; yb & ALL_LINES/2; yb *= 2)
++          if (~xw->hidden & xw->dheight & yb)
++              xw->hidden |= yb*2;
++    }
++}
++
++
++void xio_put_str(struct xio_win *xw, int y, u8 *str)
++{
++    u8 buf[W];
++    int l;
++    l = strlen(str);
++    if (l < W)
++    {
++      memcpy(buf, str, l);
++      memset(buf + l, ' ', W - l);
++    }
++    else
++      memcpy(buf, str, W);
++    xio_put_line(xw, y, buf);
++}
++
++
++static void dirty(struct xio_win *xw, int y1, int y2) // mark [y1,y2[ dirty
++{
++    if (y1 >= 0 && y1 < H && y1 < y2)
++    {
++      if (y2 > H)
++          y2 = H;
++      if (xw->hidden & (1 << y1))
++          y1--;
++      while (y1 < y2)
++          xw->modified |= 1 << y1++;
++    }
++}
++
++
++int xio_get_line(struct xio_win *xw, int y, u8 *data)
++{
++    if (y < 0 || y >= H)
++      return -1;
++    if (xw->hidden & (1 << y))
++      y--;
++    memcpy(data, xw->ch + y*W, 40);
++    return 0;
++}
++
++
++void xio_set_cursor(struct xio_win *xw, int x, int y)
++{
++    if (xw->curs_y >= 0 && xw->curs_y < H)
++      dirty(xw, xw->curs_y, xw->curs_y + 1);
++    if (x >= 0 && x < W && y >= 0 && y < H)
++      dirty(xw, y, y + 1);
++    else
++      x = y = 999;
++    xw->curs_x = x;
++    xw->curs_y = y;
++}
++
++
++static inline void draw_char(struct xio_win *xw, Window win, int fg, int bg,
++    int c, int dbl, int x, int y, int ry)
++{
++    struct xio *xio = xw->xio;
++
++    if (fg != xw->fg)
++      XSetForeground(xio->dpy, xw->gc, xio->color[xw->fg = fg]);
++    if (bg != xw->bg)
++      XSetBackground(xio->dpy, xw->gc, xio->color[xw->bg = bg]);
++
++    if (dbl)
++    {
++      XCopyPlane(xio->dpy, xio->font[1], win, xw->gc,
++                              c%32*CW, c/32*CH*2, CW, CH*2, x*CW, y*CH, 1);
++    }
++    else
++    {
++      XCopyPlane(xio->dpy, xio->font[0], win, xw->gc,
++                                  c%32*CW, c/32*CH, CW, CH, x*CW, y*CH, 1);
++      if (xw->dheight & (1<<ry))
++          XCopyPlane(xio->dpy, xio->font[0], win, xw->gc,
++                          ' '%32*CW, ' '/32*CH, CW, CH, x*CW, y*CH+CH, 1);
++    }
++}
++
++static void draw_cursor(struct xio_win *xw, int x, int y, int dbl)
++{
++    struct xio *xio = xw->xio;
++
++    if (xw->blink_on)
++      XSetForeground(xio->dpy, xw->gc, xio->color[xw->fg = xw->bg ^ 8]);
++    XDrawRectangle(xio->dpy, xw->win, xw->gc, x * CW, y * CH, CW-1,
++              (dbl ? 2*CH : CH)-1);
++}
++
++
++void xio_update_win(struct xio_win *xw)
++{
++    u8 *p = xw->ch;
++    lbits yb, redraw;
++    int x, y, c;
++
++    if (xw->modified == 0)
++      return;
++
++    redraw = xw->modified; // all modified lines
++    redraw |= xw->lhidden; // all previously hidden lines
++    redraw &= ~xw->hidden;
++
++    xw->lhidden = xw->hidden;
++    xw->modified = 0;
++
++    if (redraw == 0)
++      return;
++
++    for (yb = 1, y = 0; y < H; ++y, yb *= 2)
++      if (redraw & yb)
++      {
++          int fg = 7, bg = 0, _fg, _bg;
++          int dbl = 0, blk = 0, con = 0, gfx = 0, sep = 0, hld = 0;
++          int last_ch = ' ';
++
++          for (x = 0; x < W; ++x)
++          {
++              switch (c = *p++)
++              {
++                  case 0x00 ... 0x07: /* alpha + foreground color */
++                      fg = c & 7;
++                      gfx = 0;
++                      con = 0;
++                      goto ctrl;
++                  case 0x08: /* flash */
++                      blk = not xw->blink_on;
++                      goto ctrl;
++                  case 0x09: /* steady */
++                      blk = 0;
++                      goto ctrl;
++                  case 0x0a: /* end box */
++                  case 0x0b: /* start box */
++                      goto ctrl;
++                  case 0x0c: /* normal height */
++                      dbl = 0;
++                      goto ctrl;
++                  case 0x0d: /* double height */
++                      dbl = y < H-1;
++                      goto ctrl;
++                  case 0x10 ... 0x17: /* graphics + foreground color */
++                      fg = c & 7;
++                      gfx = 1;
++                      con = 0;
++                      goto ctrl;
++                  case 0x18: /* conceal display */
++                      con = not xw->reveal;
++                      goto ctrl;
++                  case 0x19: /* contiguous graphics */
++                      sep = 0;
++                      goto ctrl;
++                  case 0x1a: /* separate graphics */
++                      sep = 1;
++                      goto ctrl;
++                  case 0x1c: /* black background */
++                      bg = 0;
++                      goto ctrl;
++                  case 0x1d: /* new background */
++                      bg = fg;
++                      goto ctrl;
++                  case 0x1e: /* hold graphics */
++                      hld = 1;
++                      goto ctrl;
++                  case 0x1f: /* release graphics */
++                      hld = 0;
++                      goto ctrl;
++
++                  case 0x0e: /* SO (reserved, double width) */
++                  case 0x0f: /* SI (reserved, double size) */
++                      c= ' '; break;
++                  case 0x1b: /* ESC (reserved) */
++                      c = ' ';
++                      break;
++
++                  ctrl:
++                      c = ' ';
++                      if (hld && gfx)
++                          c = last_ch;
++                      break;
++
++                  case 0x80 ... 0x9f: /* these aren't used */
++                      c = BAD_CHAR;
++                      break;
++
++                  default: /* mapped to selected font */
++                      break;
++              }
++
++              if (gfx && (c & 0xa0) == 0x20)
++              {
++                  last_ch = c;
++                  c += (c & 0x40) ? 32 : -32;
++              }
++
++              _fg = fg;
++              _bg = bg;
++              if (blk)
++                  _fg |= 8;
++              if (y >= xw->sel_y1 && y < xw->sel_y2 &&
++                  x >= xw->sel_x1 && x < xw->sel_x2)
++                  _bg |= 8;
++              if (con)
++                  _fg = _bg;
++              
++              draw_char(xw, xw->win, _fg, _bg, c, dbl, x, y, y);
++
++              if (y == xw->curs_y && x == xw->curs_x)
++                  draw_cursor(xw, xw->curs_x, xw->curs_y, dbl);
++
++              if (xw->sel_pixmap && (_bg & 8))
++                  draw_char(xw, xw->sel_pixmap, con ? bg : fg, bg, c, dbl,
++                                          x - xw->sel_x1, y - xw->sel_y1, y);
++          }
++      }
++      else
++          p += 40;
++}
++
++
++static void for_all_windows(void (*func)(struct xio_win *xw), struct xio_win *except)
++{
++    struct xio *xio, *vtn;
++    struct xio_win *xw, *vwn;
++
++    for (xio = PTR dpys->first; vtn = PTR xio->node->next; xio = vtn)
++      for (xw = PTR xio->windows->first; vwn = PTR xw->node->next; xw = vwn)
++          if (xw != except)
++              func(xw);
++}
++
++
++int xio_set_concealed(struct xio_win *xw, int on)
++{
++    on = !!on;
++    if (xw->reveal == on)
++      return on;
++
++    xw->reveal = on;
++    xw->modified |= xw->concealed;
++    return !on;
++}
++
++
++static void sel_set(struct xio_win *xw, int x1, int y1, int x2, int y2)
++{
++    int t;
++
++    x1 = bound(0, x1, W-1);
++    y1 = bound(0, y1, H-1);
++    x2 = bound(0, x2, W-1);
++    y2 = bound(0, y2, H-1);
++
++    if (x1 > x2)
++      t = x1, x1 = x2, x2 = t;
++    if (y1 > y2)
++      t = y1, y1 = y2, y2 = t;
++
++    dirty(xw, xw->sel_y1, xw->sel_y2);
++
++    if (xw->hidden & (1 << y1))
++      y1--;
++    if (xw->hidden & (2 << y2))
++      y2++;
++
++    xw->sel_x1 = x1;
++    xw->sel_y1 = y1;
++    xw->sel_x2 = x2 + 1;
++    xw->sel_y2 = y2 + 1;
++    dirty(xw, xw->sel_y1, xw->sel_y2);
++}
++
++
++static void sel_abort(struct xio_win *xw)
++{
++    if (xw->sel_set_t)
++      XSetSelectionOwner(xw->xio->dpy, XA_PRIMARY, None, xw->sel_set_t);
++    if (xw->sel_y1 != NO_SEL)
++      dirty(xw, xw->sel_y1, xw->sel_y2);
++    xw->sel_y1 = NO_SEL;
++    xw->sel_set_t = 0;
++    xw->sel_start_t = 0;
++}
++
++
++static void sel_start(struct xio_win *xw, int x, int y, Time t)
++{
++    sel_abort(xw);
++    xw->sel_start_x = x;
++    xw->sel_start_y = y;
++    xw->sel_start_t = t;
++}
++
++
++static void sel_move(struct xio_win *xw, int x, int y, Time t)
++{
++    if (xw->sel_start_t == 0)
++      return;
++    if (xw->sel_y1 == NO_SEL)
++      if (t - xw->sel_start_t < SEL_MIN_TIME)
++          if (x == xw->sel_start_x)
++              if (y == xw->sel_start_y)
++                  return;
++    sel_set(xw, xw->sel_start_x, xw->sel_start_y, x, y);
++}
++
++
++static int sel_end(struct xio_win *xw, int x, int y, Time t)
++{
++    sel_move(xw, x, y, t);
++    xw->sel_start_t = 0;
++
++    if (xw->sel_y1 == NO_SEL)
++      return 0;
++
++    for_all_windows(sel_abort, xw);
++    XSetSelectionOwner(xw->xio->dpy, XA_PRIMARY, xw->win, t);
++    if (XGetSelectionOwner(xw->xio->dpy, XA_PRIMARY) == xw->win)
++      xw->sel_set_t = t;
++    else
++      sel_abort(xw);
++    return 1;
++}
++
++
++static int sel_convert2ascii(struct xio_win *xw, u8 *buf)
++{
++    u8 *d = buf;
++    int x, y, nl = 0;
++
++    for (y = xw->sel_y1; y < xw->sel_y2; y++)
++    {
++      u8 *s = xw->ch + y * W;
++      int gfx = 0, con = 0;
++
++      if (~xw->hidden & (1 << y))
++      {
++          for (x = 0; x < xw->sel_x2; ++x)
++          {
++              int ch, c = ' ';
++              switch (ch = *s++)
++              {
++                  case 0x00 ... 0x07:
++                      gfx = con = 0;
++                      break;
++                  case 0x10 ... 0x17:
++                      gfx = 1, con = 0;
++                      break;
++                  case 0x18:
++                      con = not xw->reveal;
++                      break;
++                  case 0xa0 ... 0xff:
++                  case 0x20 ... 0x7f:
++                      if (not con)
++                          if (gfx && ch != ' ' && (ch & 0xa0) == 0x20)
++                              c = '#';
++                          else if (ch == 0x7f)
++                              c = '*';
++                          else
++                              c = ch;
++                      break;
++              }
++              if (x >= xw->sel_x1)
++              {
++                  if (nl)
++                      *d++ = '\n', nl = 0;
++                  *d++ = c;
++              }
++          }
++          nl = 1;
++      }
++    }
++    *d = 0; // not necessary
++    return d - buf;
++}
++
++
++static Pixmap sel_convert2pixmap(struct xio_win *xw)
++{
++    struct xio *xio = xw->xio;
++    Pixmap pm;
++
++    if (xw->sel_y1 == NO_SEL)
++    return None;
++
++    pm = XCreatePixmap(xio->dpy, xio->root, (xw->sel_x2 - xw->sel_x1) * CW,
++                                          (xw->sel_y2 - xw->sel_y1) * CH,
++                                                               xio->depth);
++    xw->sel_pixmap = pm;
++    dirty(xw, xw->sel_y1, xw->sel_y2);
++    xio_update_win(xw);
++    xw->sel_pixmap = 0;
++
++    return pm;
++}
++
++
++static int sel_do_conv(struct xio_win *xw, Window w, Atom type, Atom prop)
++{
++    struct xio *xio = xw->xio;
++
++    if (type == xio->xa_targets)
++    {
++      u32 atoms[6];
++
++      atoms[0] = XA_STRING;
++      atoms[1] = xio->xa_text;
++      atoms[2] = XA_PIXMAP;
++      atoms[3] = XA_COLORMAP;
++      atoms[4] = xio->xa_multiple;
++      atoms[5] = xio->xa_timestamp;
++      XChangeProperty(xio->dpy, w, prop, type,
++                              32, PropModeReplace, PTR atoms, NELEM(atoms));
++    }
++    else if (type == xio->xa_timestamp)
++    {
++      u32 t = xw->sel_set_t;
++
++      XChangeProperty(xio->dpy, w, prop, type, 32, PropModeReplace, PTR &t, 1);
++    }
++    else if (type == XA_COLORMAP)
++    {
++      u32 t = xio->cmap;
++
++      XChangeProperty(xio->dpy, w, prop, type, 32, PropModeReplace, PTR &t, 1);
++    }
++    else if (type == XA_STRING || type == xio->xa_text)
++    {
++      u8 buf[H * (W+1)];
++      int len;
++
++      len = sel_convert2ascii(xw, buf);
++
++      XChangeProperty(xio->dpy, w, prop, type, 8, PropModeReplace, buf, len);
++    }
++    else if (type == XA_PIXMAP || type == XA_DRAWABLE)
++    {
++      Pixmap pm;
++
++      pm = sel_convert2pixmap(xw);
++
++      XChangeProperty(xio->dpy, w, prop, type, 32, PropModeReplace, PTR &pm, 1);
++    }
++    else if (type == xio->xa_multiple)
++    {
++      u32 *atoms, ty, fo, i;
++      unsigned long n, b;
++
++      if (prop != None)
++      {
++          if (Success == XGetWindowProperty(xio->dpy, w, prop, 0, 1024, 0,
++                      AnyPropertyType, PTR &ty, PTR &fo, &n, &b, PTR &atoms))
++          {
++              if (fo == 32 && n%2 == 0)
++              {
++                  for (i = 0; i < n; i += 2)
++                      if (sel_do_conv(xw, w, atoms[i], atoms[i+1]) == None)
++                          atoms[i] = None;
++              }
++              XChangeProperty(xio->dpy, w, prop, type, 32, PropModeReplace,
++                                                               PTR atoms, n);
++              XFree(atoms);
++          }
++      }
++    }
++    else
++      return None;
++    return prop;
++}
++
++
++static void sel_send(struct xio_win *xw, XSelectionRequestEvent *req)
++{
++    XSelectionEvent ev[1];
++
++    if (req->property == None)
++      req->property = req->target;
++
++    ev->type = SelectionNotify;
++    ev->requestor = req->requestor;
++    ev->selection = req->selection;
++    ev->target = req->target;
++    ev->property = sel_do_conv(xw, req->requestor, req->target, req->property);
++    ev->time = req->time;
++    XSendEvent(xw->xio->dpy, req->requestor, False, 0, PTR ev);
++}
++
++
++static void sel_retrieve(struct xio_win *xw, Window w, Atom prop, int del)
++{
++    u8 *data;
++    u32 ty, fo;
++    unsigned long n, b;
++    struct xio *xio = xw->xio;
++
++    if (prop == None)
++      return;
++
++    if (Success == XGetWindowProperty(xio->dpy, w, prop, 0, 1024, del,
++                      AnyPropertyType, PTR &ty, PTR &fo, &n, &b, PTR &data))
++    {
++      if (fo == 8 && n != 0)
++      {
++          struct vt_event vtev[1];
++
++          vtev->resource = xw;
++          vtev->type = EV_SELECTION;
++          vtev->i1 = n;
++          vtev->p1 = data;
++          xw->handler(xw->data, vtev);
++      }
++      XFree(data);
++    }
++}
++
++
++void xio_cancel_selection(struct xio_win *xw)
++{
++    sel_abort(xw);
++}
++
++
++void xio_query_selection(struct xio_win *xw)
++{
++    struct xio *xio = xw->xio;
++
++    if (XGetSelectionOwner(xio->dpy, XA_PRIMARY) == None)
++      sel_retrieve(xw, xio->root, XA_CUT_BUFFER0, False);
++    else
++    {
++      XDeleteProperty(xio->dpy, xw->win, XA_STRING);
++      XConvertSelection(xio->dpy, XA_PRIMARY, XA_STRING,
++                                          XA_STRING, xw->win, xw->tstamp);
++    }
++}
++
++
++void xio_set_selection(struct xio_win *xw, int x1, int y1, int x2, int y2)
++{
++    sel_start(xw, x1, y1, xw->tstamp - SEL_MIN_TIME);
++    sel_end(xw, x2, y2, xw->tstamp);
++}
++
++
++static void handle_event(struct xio *xio, int fd)
++{
++    struct xio_win *xw;
++    struct vt_event vtev[1];
++    XEvent ev[1];
++
++    XNextEvent(xio->dpy, ev);
++
++    for (xw = PTR xio->windows->first; xw->node->next; xw = PTR xw->node->next)
++      if (xw->win == ev->xany.window)
++          break;
++    if (xw->node->next == 0)
++      return;
++
++    vtev->resource = xw;
++
++    switch(ev->type)
++    {
++      case Expose:
++      {
++          int y1 = ev->xexpose.y / CH;
++          int y2 = (ev->xexpose.y + ev->xexpose.height + CH-1) / CH;
++
++          dirty(xw, y1, y2);
++          break;
++      }
++      case ClientMessage:
++      {
++          vtev->type = EV_CLOSE;
++          if (ev->xclient.format == 32)
++              if ((Atom)ev->xclient.data.l[0] == xio->xa_del_win)
++                  xw->handler(xw->data, vtev);
++          break;
++      }
++      case KeyPress:
++      {
++          unsigned char ch;
++          KeySym k;
++
++          xw->tstamp = ev->xkey.time;
++          vtev->type = EV_KEY;
++          vtev->i1 = 0;
++          vtev->i2 = (ev->xkey.state & ShiftMask) != 0;
++          if (XLookupString(&ev->xkey, &ch, 1, &k, 0))
++              vtev->i1 = ch;
++          else
++              switch (k)
++              {
++                  case XK_Left:       vtev->i1 = KEY_LEFT;    break;
++                  case XK_Right:      vtev->i1 = KEY_RIGHT;   break;
++                  case XK_Up:         vtev->i1 = KEY_UP;      break;
++                  case XK_Down:       vtev->i1 = KEY_DOWN;    break;
++                  case XK_Prior:      vtev->i1 = KEY_PUP;     break;
++                  case XK_Next:       vtev->i1 = KEY_PDOWN;   break;
++                  case XK_Delete:     vtev->i1 = KEY_DEL;     break;
++                  case XK_Insert:     vtev->i1 = KEY_INS;     break;
++                  case XK_F1:         vtev->i1 = KEY_F(1);    break;
++                  case XK_F2:         vtev->i1 = KEY_F(2);    break;
++                  case XK_F3:         vtev->i1 = KEY_F(3);    break;
++                  case XK_F4:         vtev->i1 = KEY_F(4);    break;
++                  case XK_F5:         vtev->i1 = KEY_F(5);    break;
++                  case XK_F6:         vtev->i1 = KEY_F(6);    break;
++                  case XK_F7:         vtev->i1 = KEY_F(7);    break;
++                  case XK_F8:         vtev->i1 = KEY_F(8);    break;
++                  case XK_F9:         vtev->i1 = KEY_F(9);    break;
++                  case XK_F10:        vtev->i1 = KEY_F(10);   break;
++                  case XK_F11:        vtev->i1 = KEY_F(11);   break;
++                  case XK_F12:        vtev->i1 = KEY_F(12);   break;
++              }
++          if (vtev->i1)
++              xw->handler(xw->data, vtev);
++          break;
++      }
++      case ButtonPress:
++      {
++          xw->tstamp = ev->xkey.time;
++          ev->xbutton.x /= CW;
++          ev->xbutton.y /= CH;
++          if (ev->xbutton.button == Button1)
++              sel_start(xw, ev->xbutton.x, ev->xbutton.y, ev->xbutton.time);
++          break;
++      }
++      case MotionNotify:
++      {
++          xw->tstamp = ev->xkey.time;
++          ev->xmotion.x /= CW;
++          ev->xmotion.y /= CH;
++          if (ev->xmotion.state & Button1Mask)
++              sel_move(xw, ev->xmotion.x, ev->xmotion.y, ev->xmotion.time);
++          break;
++      }
++      case ButtonRelease:
++      {
++          xw->tstamp = ev->xkey.time;
++          ev->xbutton.x /= CW;
++          ev->xbutton.y /= CH;
++          if (ev->xbutton.button == Button1)
++              if (sel_end(xw, ev->xbutton.x, ev->xbutton.y, ev->xbutton.time))
++                  break;
++
++          vtev->type = EV_MOUSE;
++          vtev->i1 = ev->xbutton.button;
++          vtev->i2 = (ev->xbutton.state & ShiftMask) != 0;
++          vtev->i3 = ev->xbutton.x;
++          vtev->i4 = ev->xbutton.y;
++          if (vtev->i3 >= 0 && vtev->i3 < W && vtev->i4 >= 0 && vtev->i4 < H)
++              xw->handler(xw->data, vtev);
++          break;
++      }
++      case SelectionClear:
++      {
++      // may be our own Owner=None due to sel_start
++          if (xw->sel_set_t && ev->xselectionclear.time >= xw->sel_set_t)
++          {
++              xw->sel_set_t = 0; // no need to reset owner
++              sel_abort(xw);
++          }
++          break;
++      }
++      case SelectionRequest:
++      {
++          sel_send(xw, &ev->xselectionrequest);
++          break;
++      }
++      case SelectionNotify:
++      {
++          sel_retrieve(xw, ev->xselection.requestor, ev->xselection.property, True);
++          break;
++      }
++      default:
++              break;
++    }
++}
++
++
++static void switch_blink_state(struct xio_win *xw)
++{
++    xw->blink_on = !xw->blink_on;
++    xw->modified |= xw->blink;
++    dirty(xw, xw->curs_y, xw->curs_y + 1);
++}
++
++
++static void send_timer_event(struct xio_win *xw)
++{
++    struct vt_event vtev[1];
++    vtev->type = EV_TIMER;
++    xw->handler(xw->data, vtev);
++}
++
++
++static void xio_timer(void *data, int fd)
++{
++    char buf[64];
++    read(fd, buf, sizeof(buf));
++    for_all_windows(switch_blink_state, 0);
++    for_all_windows(send_timer_event, 0);
++}
++
++
++void xio_event_loop(void)
++{
++    struct xio *xio, *vtn;
++    int f;
++
++    while (not dl_empty(dpys))
++    {
++      do
++      {
++          for_all_windows(xio_update_win, 0);
++          f = 0;
++          for (xio = PTR dpys->first; vtn = PTR xio->node->next; xio = vtn)
++              while (XPending(xio->dpy))
++              {
++                  handle_event(xio, xio->fd);
++                  f++;
++              }
++      } while (f);
++      fdset_select(fds, -1);
++    }
++}
+diff -r af23d23c278b util/alevt/xio.h
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/alevt/xio.h Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,80 @@
++#ifndef VTXIO_H
++#define VTXIO_H
++
++#include <X11/Xlib.h>
++#include "vt.h"
++#include "dllist.h"
++
++typedef u32 lbits;
++#define ALL_LINES ((1ul << H) - 1)
++
++/* one xio per display */
++struct xio
++{
++    struct dl_node node[1];
++    int argc;
++    char **argv;
++    Display *dpy;                     /* display connection */
++    int fd;                           /* the displays file descriptor */
++    Atom xa_del_win;                  /* WM_DELETE_WINDOW atom */
++    Atom xa_targets;                  /* TARGETS atom (selection) */
++    Atom xa_timestamp;                        /* TIMESTAMP atom (selection) */
++    Atom xa_text;                     /* TEXT atom (selection) */
++    Atom xa_multiple;                 /* MULTIPLE atom (selection) */
++    Window group_leader;              /* unmapped window */
++    int screen;                               /* DefaultScreen */
++    int width, height;                        /* DisplayWidth/Height */
++    int depth;                                /* DefaultDepth */
++    Window root;                      /* DefaultRoot */
++    Colormap cmap;
++    int color[16];                    /* 8 normal, 8 dim intensity */
++    Pixmap font[2];                   /* normal, dbl-height */
++    Pixmap icon;                      /* icon pixmap */
++    struct dl_head windows[1];                /* all windows on this display */
++};
++
++/* one vt_win per window */
++struct xio_win
++{
++    struct dl_node node[1];
++    struct xio *xio;                  /* display */
++    Window win;                               /* the drawing window */
++    Time tstamp;                      /* timestamp of last user event */
++    GC gc;                            /* it's graphics context */
++    u8 ch[H*W];                               /* the page contents */
++    lbits modified, hidden, lhidden;  /* states for each line */
++    lbits dheight, blink, concealed;  /* attributes for each line */
++    int fg, bg;                               /* current foreground/background */
++    int blink_on;                     /* blinking on */
++    int reveal;                               /* reveal concealed text */
++    void (*handler)(void *data, struct vt_event *ev); /* event-handler */
++    void *data;                               /* data for the event-handler */
++    int curs_x, curs_y;                       /* cursor position */
++    u8 title[32];                     /* the user title */
++    // selection support
++    int sel_start_x, sel_start_y;
++    Time sel_start_t;
++    Time sel_set_t;                   /* time we got selection owner */
++    int sel_x1, sel_y1, sel_x2, sel_y2;       /* selected area */
++    Pixmap sel_pixmap;                        /* for pixmap-selection requests */
++};
++
++struct xio *xio_open_dpy(char *dpy, int argc, char **argv);
++struct xio_win *xio_open_win(struct xio *xio, char *geom);
++void xio_close_win(struct xio_win *xw, int dpy_too);
++void xio_close_dpy(struct xio *xio);
++void xio_set_handler(struct xio_win *xw, void *handler, void *data);
++void xio_clear_win(struct xio_win *xw);
++void xio_put_line(struct xio_win *xw, int line, u8 *data);
++void xio_put_str(struct xio_win *xw, int line, u8 *c_str);
++int xio_get_line(struct xio_win *xw, int line, u8 *data);
++int xio_set_concealed(struct xio_win *xw, int on);
++void xio_update_win(struct xio_win *xw);
++void xio_fd_handler(int fd, void *handler, void *data);
++void xio_cancel_selection(struct xio_win *xw);
++void xio_query_selection(struct xio_win *xw);
++void xio_set_selection(struct xio_win *xw, int x1, int y1, int x2, int y2);
++void xio_set_cursor(struct xio_win *xw, int x, int y);
++void xio_event_loop(void);
++void xio_title(struct xio_win *xw, char *title);
++#endif
+diff -r af23d23c278b util/femon/femon.c
+--- a/util/femon/femon.c       Sat Jun 20 16:47:55 2009 +0200
++++ b/util/femon/femon.c       Tue Dec 21 12:13:28 2010 +0100
+@@ -42,14 +42,21 @@
+ static char *usage_str =
+     "\nusage: femon [options]\n"
+     "     -H        : human readable output\n"
++    "     -A        : Acoustical mode. A sound indicates the signal quality.\n"
++    "     -r        : If 'Acoustical mode' is active it tells the application\n"
++    "                 is called remotely via ssh. The sound is heard on the 'real'\n"
++    "                 machine but. The user has to be root.\n"
+     "     -a number : use given adapter (default 0)\n"
+     "     -f number : use given frontend (default 0)\n"
+     "     -c number : samples to take (default 0 = infinite)\n\n";
++int sleep_time=1000000;
++int acoustical_mode=0;
++int remote=0;
+ static void usage(void)
+ {
+-      fprintf(stderr, usage_str);
++      fprintf(stderr, "%s", usage_str);
+       exit(1);
+ }
+@@ -59,6 +66,27 @@
+ {
+       struct dvbfe_info fe_info;
+       unsigned int samples = 0;
++      FILE *ttyFile=NULL;
++      
++      // We dont write the "beep"-codes to stdout but to /dev/tty1.
++      // This is neccessary for Thin-Client-Systems or Streaming-Boxes
++      // where the computer does not have a monitor and femon is called via ssh.
++      if(acoustical_mode)
++      {
++          if(remote)
++          {
++              ttyFile=fopen("/dev/tty1","w");
++              if(!ttyFile)
++              {
++                  fprintf(stderr, "Could not open /dev/tty1. No access rights?\n");
++                  exit(-1);
++              }
++          }
++          else
++          {
++              ttyFile=stdout;
++          }
++      }
+       do {
+               if (dvbfe_get_info(fe, FE_STATUS_PARAMS, &fe_info, DVBFE_INFO_QUERYTYPE_IMMEDIATE, 0) != FE_STATUS_PARAMS) {
+@@ -94,12 +122,24 @@
+               if (fe_info.lock)
+                       printf("FE_HAS_LOCK");
++              // create beep if acoustical_mode enabled
++              if(acoustical_mode)
++              {
++                  int signal=(fe_info.signal_strength * 100) / 0xffff;
++                  fprintf( ttyFile, "\033[10;%d]\a", 500+(signal*2));
++                  // printf("Variable : %d\n", signal);
++                  fflush(ttyFile);
++              }
++
+               printf("\n");
+               fflush(stdout);
+-              usleep(1000000);
++              usleep(sleep_time);
+               samples++;
+       } while ((!count) || (count-samples));
+-
++      
++      if(ttyFile)
++          fclose(ttyFile);
++      
+       return 0;
+ }
+@@ -148,7 +188,7 @@
+       int human_readable = 0;
+       int opt;
+-       while ((opt = getopt(argc, argv, "Ha:f:c:")) != -1) {
++       while ((opt = getopt(argc, argv, "rAHa:f:c:")) != -1) {
+               switch (opt)
+               {
+               default:
+@@ -166,6 +206,15 @@
+               case 'H':
+                       human_readable = 1;
+                       break;
++              case 'A':
++                      // Acoustical mode: we have to reduce the delay between
++                      // checks in order to hear nice sound
++                      sleep_time=5000;
++                      acoustical_mode=1;
++                      break;
++              case 'r':
++                      remote=1;
++                      break;
+               }
+       }
+diff -r af23d23c278b util/gotox/Makefile
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/gotox/Makefile      Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,17 @@
++# Makefile for linuxtv.org dvb-apps/util/gotox
++
++binaries = gotox
++
++inst_bin = $(binaries)
++
++CPPFLAGS += -I../../lib
++LDFLAGS  += -L../../lib/libdvbapi
++LDFLAGS  += -L../../lib/libdvbsec
++LDLIBS   += -ldvbapi
++LDLIBS   += -ldvbsec
++
++.PHONY: all
++
++all: $(binaries)
++
++include ../../Make.rules
+diff -r af23d23c278b util/gotox/gotox.c
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/gotox/gotox.c       Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,145 @@
++/*
++ *  Copyright (C) 2006 by Michel Verbraak <michel@verbraak.org>
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the
++ *  Free Software Foundation, Inc.,
++ *  59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
++ */
++
++
++#ifdef HAVE_CONFIG_H
++#include <config.h>
++#endif
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <unistd.h>
++#include <libdvbapi/dvbfe.h>
++#include <libdvbsec/dvbsec_api.h>
++
++static char *usage_str =
++      "\nusage: gotox [options] -d <angle>\n"
++      "         Goto the specified angle. Positive value for East rotation\n"
++      "         Negative value for West rotation on Northern Hemisphere.\n"
++      "     -d degrees : Angle to turn to in degrees (default 0)\n"
++      "     -a number : use given adapter (default 0)\n"
++      "     -f number : use given frontend (default 0)\n"
++      "     -t seconds : leave power on to rotor for at least specified seconds of time (default 30)\n\n";
++
++int main(int argc, char *argv[])
++{
++      struct dvbfe_handle *fe;
++      unsigned int adapter = 0, frontend = 0;
++      double angle = 0;
++      int opt;
++      unsigned int sleepcount = 30;
++      static char *weststr = "west";
++      static char *eaststr = "east";
++
++      while ((opt = getopt(argc, argv, "ha:f:t:d:")) != -1) {
++
++              switch (opt){
++              case '?':
++              case 'h':
++              default:
++                      fprintf(stderr, "%s", usage_str);
++                      return EXIT_SUCCESS; 
++
++              case 'a':
++                      adapter = strtoul(optarg, NULL, 0);
++                      break;
++
++              case 'f':
++                      frontend = strtoul(optarg, NULL, 0);
++                      break;
++
++              case 't':
++                      sleepcount = strtoul(optarg, NULL, 0);
++                      break;
++
++              case 'd':
++                      angle = strtod(optarg, NULL);
++                      break;
++              }
++      }
++
++      printf("Will try to rotate %s to %.2f degrees.\n", (angle < 0.0) ? weststr : eaststr, angle );
++
++      fe = dvbfe_open(adapter, frontend, 0);
++      if (fe == NULL) {
++              fprintf(stderr, "Could not open frontend %d on adapter %d.\n", frontend, adapter);
++              exit(1);
++      }
++
++      if (dvbfe_set_voltage(fe, DVBFE_SEC_VOLTAGE_OFF) != 0) {
++              fprintf(stderr, "Could not turn off power.\n");
++              dvbfe_close(fe);
++              return 1;
++      }
++      else
++              printf("Power OFF.\n");
++
++      sleep(1);
++
++      if (dvbfe_set_voltage(fe, DVBFE_SEC_VOLTAGE_18) != 0) {
++              fprintf(stderr, "Could not turn on power.\n");
++              dvbfe_close(fe);
++              return 1;
++      }
++      else
++              printf("Power on to 18V.\n");
++
++      sleep(1);
++
++      if (abs(angle) == 0.0) {
++
++              if (dvbsec_diseqc_goto_satpos_preset(fe, DISEQC_ADDRESS_POLAR_AZIMUTH_POSITIONER, 0) != 0) {
++                      fprintf(stderr, "Could not goto 0.\n");
++                      dvbfe_close(fe);
++                      return 2;
++              } else {
++                      printf("Going to home base 0 degrees.\n");
++              }
++      } else {
++
++              if (dvbsec_diseqc_goto_rotator_bearing(fe, DISEQC_ADDRESS_POLAR_AZIMUTH_POSITIONER, angle) != 0) {
++                      fprintf(stderr, "Could not rotate.\n");
++                      dvbfe_close(fe);
++                      return 2;
++              }
++      }
++
++      while (sleepcount != 0) {
++              printf("%d: Rotating to %.2f.\r", sleepcount, angle);
++              fflush(NULL);
++              sleepcount--;
++              sleep(1);
++      }
++
++      printf("\nRotated.\n");
++
++      if (dvbfe_set_voltage(fe, DVBFE_SEC_VOLTAGE_OFF) != 0) {
++              fprintf(stderr, "Could not turn off power.\n");
++              dvbfe_close(fe);
++              return 1;
++      }
++      else
++              printf("Power OFF.\n");
++
++      sleep(1);
++
++      dvbfe_close(fe);
++
++      return EXIT_SUCCESS;
++}
+diff -r af23d23c278b util/scan/dvb-c/at-Kabel-Braunau
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-c/at-Kabel-Braunau Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,26 @@
++# Kabel Braunau
++# freq sr fec mod
++C 386000000 6900000 NONE QAM64
++C 394000000 6875000 NONE QAM64
++C 402000000 6875000 NONE QAM64
++C 410000000 6875000 NONE QAM64
++C 418000000 6875000 NONE QAM64
++C 426000000 6875000 NONE QAM64
++C 434000000 6875000 NONE QAM64
++C 458000000 6875000 NONE QAM64
++C 466000000 6900000 NONE QAM64
++C 474000000 6900000 NONE QAM64
++C 482000000 6111000 NONE QAM64
++C 490000000 6111000 NONE QAM64
++C 498000000 6875000 NONE QAM64
++C 506000000 6111000 NONE QAM64
++C 514000000 6111000 NONE QAM64
++C 522000000 6428000 NONE QAM128
++C 530000000 6428000 NONE QAM128
++C 546000000 6875000 NONE QAM64
++C 554000000 6875000 NONE QAM64
++C 562000000 6875000 NONE QAM64
++C 570000000 6111000 NONE QAM64
++C 578000000 6900000 NONE QAM256
++C 586000000 6900000 NONE QAM256
++C 594000000 6875000 NONE QAM64
+diff -r af23d23c278b util/scan/dvb-c/at-Kabelsignal
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-c/at-Kabelsignal   Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,38 @@
++# kabelsignal
++# freq sr fec mod
++C 314000000 6900000 NONE QAM256
++C 322000000 6900000 NONE QAM256
++C 330000000 6900000 NONE QAM256
++C 338000000 6900000 NONE QAM256
++C 346000000 6900000 NONE QAM256
++C 354000000 6900000 NONE QAM256
++C 362000000 6900000 NONE QAM256
++C 370000000 6900000 NONE QAM256
++C 378000000 6900000 NONE QAM256
++C 386000000 6900000 NONE QAM256
++C 394000000 6900000 NONE QAM256
++C 402000000 6900000 NONE QAM256
++C 410000000 6900000 NONE QAM256
++C 418000000 6900000 NONE QAM256
++C 426000000 6900000 NONE QAM256
++C 434000000 6900000 NONE QAM256
++C 442000000 6900000 NONE QAM256
++C 450000000 6900000 NONE QAM256
++C 666000000 6900000 NONE QAM256
++C 674000000 6900000 NONE QAM256
++C 682000000 6900000 NONE QAM256
++C 690000000 6900000 NONE QAM256
++C 698000000 6900000 NONE QAM256
++C 706000000 6900000 NONE QAM256
++C 714000000 6900000 NONE QAM256
++C 722000000 6900000 NONE QAM256
++C 730000000 6900000 NONE QAM256
++C 738000000 6900000 NONE QAM256
++C 746000000 6900000 NONE QAM256
++C 762000000 6900000 NONE QAM256
++C 770000000 6900000 NONE QAM256
++C 778000000 6900000 NONE QAM256
++C 786000000 6900000 NONE QAM256
++C 794000000 6900000 NONE QAM256
++C 802000000 6900000 NONE QAM256
++C 810000000 6900000 NONE QAM256
+diff -r af23d23c278b util/scan/dvb-c/at-KarrerNet
+--- a/util/scan/dvb-c/at-KarrerNet     Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-c/at-KarrerNet     Tue Dec 21 12:13:28 2010 +0100
+@@ -1,18 +1,26 @@
+ # Kabel St. Florian bei Linz/AT KarrerNet
+ # 2009-01-10
+ # freq sr fec mod
+-C 418000000 6900000 NONE QAM64
+-C 426000000 6900000 NONE QAM64
+-C 434000000 6900000 NONE QAM64
+ C 442000000 6900000 NONE QAM64
+-C 450000000 6900000 NONE QAM64
+ C 458000000 6900000 NONE QAM64
+ C 466000000 6900000 NONE QAM64
+ C 474000000 6900000 NONE QAM64
+ C 482000000 6900000 NONE QAM64
++C 490000000 6900000 NONE QAM64
++C 498000000 6900000 NONE QAM64
++C 506000000 6900000 NONE QAM64
++C 514000000 6900000 NONE QAM64
+ C 522000000 6900000 NONE QAM64
+ C 530000000 6900000 NONE QAM64
+ C 538000000 6900000 NONE QAM64
++C 546000000 6900000 NONE QAM64
++C 554000000 6900000 NONE QAM64
++C 562000000 6900000 NONE QAM64
++C 570000000 6900000 NONE QAM64
+ C 578000000 6900000 NONE QAM64
+-C 402000000 6900000 NONE QAM256
++C 586000000 6900000 NONE QAM64
++C 610000000 6900000 NONE QAM64
++C 386000000 6900000 NONE QAM256
++C 394000000 6900000 NONE QAM256
+ C 410000000 6900000 NONE QAM256
++C 434000000 6900000 NONE QAM256
+diff -r af23d23c278b util/scan/dvb-c/de-Primacom
+--- a/util/scan/dvb-c/de-Primacom      Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-c/de-Primacom      Tue Dec 21 12:13:28 2010 +0100
+@@ -1,6 +1,9 @@
+ # Primacom
+ # freq sr fec mod
+ C 121000000 6900000 NONE QAM64
++C 129000000 6900000 NONE QAM256
++C 137000000 6900000 NONE QAM256
++C 145000000 6900000 NONE QAM256
+ C 306000000 6900000 NONE QAM64
+ C 314000000 6900000 NONE QAM64
+ C 322000000 6900000 NONE QAM64
+@@ -13,6 +16,8 @@
+ C 378000000 6900000 NONE QAM256
+ C 386000000 6900000 NONE QAM256
+ C 394000000 6900000 NONE QAM256
++C 402000000 6900000 NONE QAM256
++C 410000000 6900000 NONE QAM256
+ C 418000000 6900000 NONE QAM256
+ C 434000000 6900000 NONE QAM64
+ C 442000000 6900000 NONE QAM64
+diff -r af23d23c278b util/scan/dvb-c/de-Unitymedia
+--- a/util/scan/dvb-c/de-Unitymedia    Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-c/de-Unitymedia    Tue Dec 21 12:13:28 2010 +0100
+@@ -1,35 +1,36 @@
+ # Unitymedia
+-# Created from http://www.unitymedia.de/service/tv/frequenzen.html
+-# and http://blob.unitymedia.de/Download/Unitymedia_Senderlineup_digital_2008-05-28.pdf
++# Created from http://www.unitymedia.de/service/soforthilfe/frequenzen.html
++# and http://www.unitymedia.de/images/UnityDigitalTV_Lineup_01-07-2009.pdf
+ # freq sr fec mod
+ C 113000000 6900000 NONE QAM256
+ C 121000000 6900000 NONE QAM256
+-C 338000000 6900000 NONE QAM256
+ C 346000000 6900000 NONE QAM256
+ C 354000000 6900000 NONE QAM64
+ C 362000000 6900000 NONE QAM64
+ C 370000000 6900000 NONE QAM64
+ C 378000000 6900000 NONE QAM64
+ C 386000000 6900000 NONE QAM64
+-C 394000000 6900000 NONE QAM256
++C 394000000 6900000 NONE QAM64
+ C 402000000 6900000 NONE QAM256
+ C 410000000 6900000 NONE QAM256
+ C 418000000 6900000 NONE QAM256
+ C 426000000 6900000 NONE QAM256
+ C 434000000 6900000 NONE QAM256
+-C 442000000 6900000 NONE QAM64
+-C 450000000 6900000 NONE QAM64
++C 442000000 6900000 NONE QAM256
++C 450000000 6900000 NONE QAM256
+ C 458000000 6900000 NONE QAM256
+ C 466000000 6900000 NONE QAM256
+-C 474000000 6900000 NONE QAM64
+ C 522000000 6900000 NONE QAM256
+ C 530000000 6900000 NONE QAM256
+ C 538000000 6900000 NONE QAM256
++C 546000000 6900000 NONE QAM256
+ C 554000000 6900000 NONE QAM256
+ C 562000000 6900000 NONE QAM256
+ C 570000000 6900000 NONE QAM256
+-C 610000000 6900000 NONE QAM64
+ C 650000000 6900000 NONE QAM256
+ C 658000000 6900000 NONE QAM256
+ C 666000000 6900000 NONE QAM256
+ C 674000000 6900000 NONE QAM256
++C 682000000 6900000 NONE QAM256
++C 690000000 6900000 NONE QAM256
++C 698000000 6900000 NONE QAM256
+diff -r af23d23c278b util/scan/dvb-c/de-komro-Rosenheim
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-c/de-komro-Rosenheim       Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,30 @@
++# komro (Rosenheim)
++# freq sr fec mod
++C 113000000 6900000 NONE QAM64
++C 121000000 6900000 NONE QAM64
++C 338000000 6900000 NONE QAM256
++C 394000000 6900000 NONE QAM256
++C 450000000 6900000 NONE QAM64
++C 458000000 6900000 NONE QAM64
++C 466000000 6900000 NONE QAM64
++C 522000000 6900000 NONE QAM256
++C 530000000 6900000 NONE QAM256
++C 602000000 6900000 NONE QAM256
++C 610000000 6900000 NONE QAM256
++C 626000000 6900000 NONE QAM256
++C 642000000 6900000 NONE QAM256
++C 650000000 6900000 NONE QAM256
++C 658000000 6900000 NONE QAM64
++C 666000000 6900000 NONE QAM64
++C 682000000 6900000 NONE QAM64
++C 690000000 6900000 NONE QAM256
++C 698000000 6900000 NONE QAM256
++C 706000000 6900000 NONE QAM256
++C 714000000 6900000 NONE QAM256
++C 722000000 6900000 NONE QAM256
++C 730000000 6900000 NONE QAM64
++C 738000000 6900000 NONE QAM64
++C 746000000 6900000 NONE QAM64
++C 754000000 6900000 NONE QAM64
++C 762000000 6900000 NONE QAM256
++C 778000000 6900000 NONE QAM64
+diff -r af23d23c278b util/scan/dvb-c/fi-Oulu
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-c/fi-Oulu  Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,19 @@
++# DVB-C Channels in Oulu (Finland)\r
++# dna network\r
++# freq      sr      fec  mod\r
++C 330000000 6875000 NONE QAM128 #mux1\r
++C 370000000 6875000 NONE QAM128 #mux2\r
++C 362000000 6875000 NONE QAM128 #mux3\r
++C 354000000 6875000 NONE QAM128 #mux4\r
++C 346000000 6875000 NONE QAM128 #mux5\r
++C 338000000 6875000 NONE QAM128 #mux6\r
++C 322000000 6875000 NONE QAM128 #mux7\r
++C 314000000 6875000 NONE QAM128 #mux8\r
++C 378000000 6875000 NONE QAM128 #mux9\r
++C 306000000 6875000 NONE QAM128 #mux10\r
++C 298000000 6875000 NONE QAM128 #mux11\r
++C 290000000 6875000 NONE QAM128 #mux12\r
++C 274000000 6875000 NONE QAM128 #mux13\r
++C 266000000 6875000 NONE QAM128 #mux14\r
++C 258000000 6875000 NONE QAM128 #mux15\r
++C 250000000 6875000 NONE QAM128 #mux16\r
+diff -r af23d23c278b util/scan/dvb-c/fi-Turku
+--- a/util/scan/dvb-c/fi-Turku Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-c/fi-Turku Tue Dec 21 12:13:28 2010 +0100
+@@ -3,6 +3,13 @@
+ C 146000000 6900000 NONE QAM128
+ C 154000000 6900000 NONE QAM128
+ C 162000000 6900000 NONE QAM128
++C 234000000 6900000 NONE QAM256
++C 242000000 6900000 NONE QAM256
++C 250000000 6900000 NONE QAM256
++C 258000000 6900000 NONE QAM256
++C 266000000 6900000 NONE QAM256
++C 290000000 6900000 NONE QAM128
++C 298000000 6900000 NONE QAM128
+ C 322000000 6900000 NONE QAM128
+ C 330000000 6900000 NONE QAM128
+ C 338000000 6900000 NONE QAM128
+@@ -14,4 +21,3 @@
+ C 418000000 6900000 NONE QAM128
+ C 426000000 6900000 NONE QAM128
+ C 442000000 6900000 NONE QAM128
+-C 354000000 6900000 NONE QAM256
+diff -r af23d23c278b util/scan/dvb-c/hu-Digikabel
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-c/hu-Digikabel     Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,21 @@
++# Digikabel, Hungary
++# For the following cities:
++#  Budapest, Dorog, Hatvan, Kiskunhalas, Debrecen, Szekesfehervar, Pecs,
++#  Veszprem, Dunaujvaros, Miskolc, Gyongyos, Tatabanya, Varpalota, Nagykanizsa,
++#  Salgotarjan, Batonyterenye, Szolnok, Szentistvan, Nyiregyhaza, Gyor,
++#  Szazhalombatta, Bekescsaba, Bekes, Eger, Komlo, Oroszlany
++# In some of the cities not all the frequencies are available.
++# freq sr fec mod
++C 354000000 6900000 NONE QAM256
++C 362000000 6900000 NONE QAM256
++C 370000000 6900000 NONE QAM256
++C 378000000 6900000 NONE QAM256
++C 386000000 6900000 NONE QAM256
++C 394000000 6900000 NONE QAM256
++C 402000000 6900000 NONE QAM256
++C 410000000 6900000 NONE QAM256
++C 762000000 6900000 NONE QAM256
++C 770000000 6900000 NONE QAM256
++C 778000000 6900000 NONE QAM256
++C 786000000 6900000 NONE QAM256
++C 794000000 6900000 NONE QAM256
+diff -r af23d23c278b util/scan/dvb-c/nl-REKAM-CAIW_Gouda
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-c/nl-REKAM-CAIW_Gouda      Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,4 @@
++# REKAM / Caiway, Gouda, Netherlands
++# freq sr fec mod
++C 163000000 6875000 NONE QAM64
++C 770000000 6900000 NONE QAM64
+diff -r af23d23c278b util/scan/dvb-c/se-comhem
+--- a/util/scan/dvb-c/se-comhem        Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-c/se-comhem        Tue Dec 21 12:13:28 2010 +0100
+@@ -1,3 +1,25 @@
+ # com hem
+ # freq sr fec mod
++C 289500000 6875000 NONE QAM64
++C 298000000 6875000 NONE QAM64
++C 306000000 6875000 NONE QAM64
++C 314000000 6875000 NONE QAM64
++C 322000000 6875000 NONE QAM64
++C 338000000 6875000 NONE QAM64
++C 346000000 6875000 NONE QAM64
++C 354000000 6875000 NONE QAM64
+ C 362000000 6875000 NONE QAM64
++C 370000000 6875000 NONE QAM64
++C 378000000 6875000 NONE QAM64
++C 386000000 6875000 NONE QAM64
++C 394000000 6875000 NONE QAM64
++C 402000000 6875000 NONE QAM64
++C 418000000 6875000 NONE QAM64
++C 434000000 6875000 NONE QAM64
++C 442000000 6875000 NONE QAM64
++C 450000000 6875000 NONE QAM64
++C 458000000 6875000 NONE QAM64
++C 714000000 6875000 NONE QAM64
++C 722000000 6875000 NONE QAM64
++C 738000000 6875000 NONE QAM64
++C 786000000 6875000 NONE QAM64
+diff -r af23d23c278b util/scan/dvb-s/Agila2_C-146.0E
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-s/Agila2_C-146.0E  Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,60 @@
++# Agila 2 @ 146.0E C-BAND
++# Generated by Pietro Casoar
++# 1st March 2009
++
++# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
++# freq pol sr fec
++
++# Viva Prime Channel
++S 3725000 H 2345000 3/4
++
++# Zoe Philippines
++S 3774000 V 3300000 3/4
++
++# Da Ai TV indonesia
++S 3791000 H 3100000 3/4
++
++# Trinity Broadcasting Multiplex
++S 3791000 V 10091000 5/6
++
++# Bayon TV
++S 3796000 H 3360000 3/4
++
++# White Springs TV
++S 3846000 H 6110000 3/4
++
++# TCT World
++S 3854000 H 2603000 5/6
++
++# CCTN
++S 3873000 V 2532000 3/4
++
++# NBN Philippines
++S 3875000 H 3000000 3/4
++
++# Al Masriyah
++S 3880000 H 2000000 3/4
++
++# Viva Entertainment Multiplex
++S 3887000 H 6716000 3/4
++
++# IBC13
++S 3896000 H 3000000 3/4
++
++# CTN Cambodia Multiplex
++S 3979000 V 9628000 3/4
++
++# Divya TV
++S 3990000 V 13330000 3/4
++
++# Familyland TV Network
++S 4164000 V 3735000 7/8
++
++# MTV Philippines
++S 4171000 V 3213000 3/4
++
++# The Old Path TV
++S 4183000 V 2170000 3/4
++
++# UNTV
++S 4188000 V 2170000 3/4
+diff -r af23d23c278b util/scan/dvb-s/Apstar6_C-134.0E
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-s/Apstar6_C-134.0E Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,15 @@
++# Apstar 6 @ 134.0E C-BAND
++# Generated by Pietro Casoar
++# 1st March 2009
++
++# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
++# freq pol sr fec
++
++# New Entertainment
++S 3766000 H 4285000 3/4
++
++# Test
++S 3840000 H 27500000 3/4
++
++# TV Nusantara
++S 3905000 H 3250000 3/4
+diff -r af23d23c278b util/scan/dvb-s/AsiaSat2_C-100.5E
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-s/AsiaSat2_C-100.5E        Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,51 @@
++# AsiaSat 2 100.5E C-BAND
++# Generated by Pietro Casoar
++# 1st March 2009
++
++# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
++# freq pol sr fec
++
++# Iris Sat Multiplex
++S 3660000 V 27500000 3/4
++
++# APTN Direct
++S 3706000 H 4167000 5/6
++
++# APTN Global Video Wire (MPEG-4 S/2)
++S 3732000 H 8889000 2/3
++
++# BYU TV
++S 3767000 V 6527000 1/2
++
++# AJK TV
++S 3778000 V 3333000 3/4
++
++# RTB International Brunei
++S 3786000 H 6000000 7/8
++
++# Shamshad TV
++S 3790000 V 2444000 3/4
++
++# FTV HD (MPEG-4 S/2)
++S 3794000 H 4640000 3/4
++
++# Arabsat ASBU Bouquet Multiplex
++S 3820000 V 27500000 3/4
++
++# Star TV Multiplex (MPEG-4 S/2)
++S 3840000 H 30000000 3/4
++
++# E Network Multiplex
++S 3880000 H 27500000 3/4
++
++# SatLink Multiplex
++S 3960000 H 27500000 3/4
++
++# Star TV Multiplex
++S 3980000 V 28100000 3/4
++
++# SatLink European Bouquet (MPEG-2 & MPEG-4 S2)
++S 4000000 H 28125000 3/4
++
++# Macau Satellite TV Multiplex
++S 4148000 V 11852000 3/4
+diff -r af23d23c278b util/scan/dvb-s/AsiaSat3S_C-105.5E
+--- a/util/scan/dvb-s/AsiaSat3S_C-105.5E       Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-s/AsiaSat3S_C-105.5E       Tue Dec 21 12:13:28 2010 +0100
+@@ -1,122 +1,102 @@
+ # AsiaSat 3S 105.5E C-BAND
+-# Generated by Xingbo Wang
+-# Apr 2, 2005
++# Generated by Pietro Casoar
++# 1st March 2009
+-# MPEG-2 QPSK
++# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+ # freq pol sr fec
+-# [encrypted] ZEE English, ZEE TV International, ZEE Movies, MX, ZEE TV SE Asia, ZEE TV Asia, Trendz
+-S 3700000 V 27500000 3/4
++# China Entertainment TV & Maharishi Veda Vision
++S 3680000 H 26670000 3/4
++
++# MediaCorp Channel News Asia
++S 3706000 H 6000000 3/4
+ # BTV World
+ S 3725000 V 4450000 3/4
+-# SAB TV
+-S 3743000 V 3300000 3/4
++# Galaxy TVB
++S 3729000 H 13650000 3/4
+-# AAJ TV
+-S 3750000 V 2820000 3/4
++# Zee Network
++S 3733000 V 6500000 3/4
+-# Arirang TV
+-S 3755150 V 4417900 7/8
++# Madani Channel
++S 3739000 V 2815000 3/4
+-# [encrypted] STAR Plus India, STAR Movies India, STAR News India, National Geographic India, STAR Gold, STAR Movies (Middle East)
+-# STAR Utsav
++# Fashion TV
++S 3746000 V 2625000 3/4
++
++# Aaj News
++S 3750000 V 2821000 3/4
++
++# Arirang Arab
++S 3755000 V 4418000 7/8
++
++# Globecast multiplex
++S 3760000 H 26000000 7/8
++
++# Star TV Multiplex
+ S 3780000 V 28100000 3/4
+-# Chinese Provincial TV: Guangxi, Shanxi, Anhui, Jiangsu, Heilongjiang
+-S 3806000 V 4420000 3/4
+-S 3813000 V 4420000 3/4
+-S 3820000 V 4420000 3/4
+-S 3827000 V 4420000 3/4
+-S 3834000 V 4420000 3/4
++# Airwaves Media Multiplex
++S 3786000 H 5700000 3/4
+-# [encrypted] ESPN Taiwan, STAR Sports Taiwan, ESPN Asia, STAR Sports South East Asia, STAR Sports India, ESPN India, ESPN Philippines
++# Zee Network Multiplex
++S 3820000 V 27500000 3/4
++
++# Star TV Multiplex
++S 3840000 H 26850000 7/8
++
++# Star TV Multiplex
+ S 3860000 V 27500000 3/4
+-# Dragon TV
+-S 3886000 V 4800000 3/4
++# B4U INDIA - MPEG-4 S/2 Multiplex
++S 3880000 H 27500000 3/4
+-# Shandong TV
+-S 3895000 V 6813000 3/4
++# Star TV Multiplex
++S 3940000 V 28100000 3/4
+-# CCTV-1(comprehensive), China National Radio Channel 1
+-S 3904000 V 4420000 7/8
++# Tuner International Multiplex
++S 3960000 H 28100000 3/4
+-# Jilin Provincial TV
+-S 3914500 V 4420000 3/4
+-
+-# [encrypted] A1, History, STAR Movies SEA/China, STAR World India, STAR Plus Pakistan, Channel[V] India, STAR Chinese Movies, CNBC India, STAR One, STAR Vijay
++# Star TV Multiplex
+ S 3980000 V 28100000 3/4
+-# Sahara One, Sahara Samay National, Sahara Samay Mumbai, Sahara Samay Uttar Pradesh, Sahara Samay Bihar, Sahara Samay Madhya Pradesh
++# Star TV Multiplex
++S 4000000 H 26850000 7/8
++
++# Sahara Samay Multiplex
+ S 4020000 V 27250000 3/4
+-# Tianjin TV
+-S 4046000 V 5950000 3/4
++# VOA Voice Of America Multiplex
++S 4040000 H 20400000 1/2
+-# PTV-1, PTV World, PTV Channel 3, AVT Khyber
++# Globecast Multiplex
++S 4071000 H 14240000 3/4
++
++# PTV Multiplex
+ S 4091000 V 13333000 3/4
+-# PTV National
+-S 4106000 V 3333300 3/4
++# Sun TV
++S 4095000 H 5554000 3/4
+-# Indus News
+-S 4115750 V 3333000 3/4
++# PTV Global USA
++S 4102000 V 2894000 3/4
+-# [encrypted] ZEE Biz, ZEE News, ZEE Cinema, ZEE Music, Alpha TV Punjabi, Alpha TV Gujarati, Alpha TV Bangla, Alpha TV Marathi, Smile TV
++# PTV Global UK & Europe
++S 4106000 V 2894000 3/4
++
++# Galaxy TVB Multiplex
++S 4111000 H 13650000 3/4
++
++# PTV Multiplex
++S 4114000 V 7000000 3/4
++
++# Eye TV Multiplex
++S 4129000 H 13600000 3/4
++
++# Zee Network Multiplex
+ S 4140000 V 27500000 3/4
+-# Chinese Provincial TV: Henan, Fujian, Jiangxi, Liaoning
+-S 4166000 V 4420000 3/4
+-S 4180000 V 4420000 3/4
+-S 4187000 V 4420000 3/4
+-S 4194000 V 4420000 3/4
+-
+-# CETV
+-S 3680000 H 26670000 3/4
+-
+-# Channel NewsAsia
+-S 3706000 H 6000000 3/4
+-
+-# Asia Plus
+-S 3715500 H 7000000 3/4
+-
+-# TVB 8, CETV
+-S 3729000 H 13650000 3/4
+-
+-# Network of the World, Bloomberg TV Asia, Indus Vision, Indus Music, Muslim TV Ahmadiyya, Living Asia Channel
+-# [encrypted] Filmazia
+-S 3760000 H 26000000 7/8
+-
+-# [encrypted] Fox News, Sky News, STAR Movies Int'l Taiwan, National Geographic Taiwan, STAR Chinese Channel, STAR Movies mandarin, Channel[V] Taiwan
+-S 3840000 H 26850000 7/8
+-
+-# STAR Sports Asia
+-# [encrypted] ESPN China, STAR Sports Hong Kong, ESPN Hong Kong
+-S 3920000 H 26750000 7/8
+-
+-# [encrypted] CNN International Asia, CNN Newsource, Cartoon Network Asia, Cartoon Network Taiwan, Cartoon Network Philippines, Cartoon Network Australia/New Zealand, TCM Australia, Boomerang
+-S 3960000 H 27500000 3/4
+-
+-# [encrypted] Phoenix Movies, star World Asia, Star Movies Int'l, Channel[V] International, National Geographic Regional
+-# Phoenix Chinese Channel, Phoenix Info News Channel, Xiong Kong Int'l, Xing Kong Regional, Channel[V](Greater China)
+-S 4000000 H 26850000 7/8
+-
+-# Chinese Provincial TV: Hubei, Sichuan
+-S 4034600 H 4420000 3/4
+-S 4051000 H 4420000 3/4
+-
+-# Chinese Provincial TV: Qinghai, Hunan
+-S 4067000 H 4420000 3/4
+-S 4082000 H 4420000 3/4
+-
+-# Sun TV
+-S 4094000 H 5555000 3/4
+-
+-# MATV, Horizon Channel
+-# [encrypted] Tian Ying Movies Channel, TVB Xing He Channel
+-S 4111000 H 13650000 3/4
+-
+-# CCTV Channel 4 (International), Channel 9 (English language), CCTV E&F
+-S 4129000 H 13240000 3/4
++# Geo TV Network Multiplex
++S 4180000 V 26666000 3/4
+diff -r af23d23c278b util/scan/dvb-s/Asiasat4_C-122.2E
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-s/Asiasat4_C-122.2E        Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,27 @@
++# Asiasat 4 @ 122.2E C-BAND
++# Generated by Pietro Casoar
++# 1st March 2009
++
++# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
++# freq pol sr fec
++
++# SITI Digital Network Multiplex
++S 3760000 H 27500000 3/4
++
++# SITI Digital Network Multiplex
++S 3820000 V 27500000 3/4
++
++# Henan Radio Multiplex
++S 3856000 H 2170000 3/4
++
++# SITI Digital Network Multiplex
++S 3880000 H 27500000 3/4
++
++# SITI Digital network Multiplex
++S 3920000 H 27500000 3/4
++
++# SITI Digital network Multiplex
++S 3960000 H 27500000 3/4
++
++# SITI Digital network Multiplex
++S 4180000 V 27500000 3/4
+diff -r af23d23c278b util/scan/dvb-s/Astra-23.5E
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-s/Astra-23.5E      Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,66 @@
++# Astra 23.5E
++# freq pol sr fec
++S 10758000 V 22000000 7/8
++S 10788000 V 22000000 5/6
++S 10802000 H 22000000 5/6
++S 10842000 V 13333000 5/6
++S 10862000 H 22000000 5/6
++# Astra2Connect
++# S2 10891250 H 22000000 3/4 AUTO 8PSK
++S 11475000 V 27500000 3/4
++S 11515000 H 27500000 3/4
++S2 11515000 V 28500000 9/10 AUTO QPSK
++S2 11555000 H 28500000 9/10 AUTO QPSK
++S2 11555000 V 28500000 9/10 AUTO QPSK
++S2 11592000 V 28500000 9/10 AUTO QPSK
++S2 11595000 H 28500000 9/10 AUTO QPSK
++S2 11635000 H 28500000 9/10 AUTO QPSK
++S2 11635000 V 28500000 9/10 AUTO QPSK
++S 11675000 H 27500000 3/4
++S2 11675000 V 28500000 9/10 AUTO QPSK
++S2 11719000 H 27500000 9/10 AUTO QPSK
++S 11739000 V 27500000 3/4
++# Astra2Connect
++# S2 11758000 H 27500000 5/6 AUTO 8PSK
++S2 11778000 V 27500000 9/10 AUTO QPSK
++S 11798000 H 27500000 3/4
++S2 11817000 V 27500000 9/10 AUTO QPSK
++S 11836000 H 29900000 3/4
++S2 11856000 V 27500000 5/6 AUTO QPSK
++S 11875000 H 27500000 3/4
++S 11914000 H 27500000 3/4
++# Astra2Connect
++# S2 11954000 H 27500000 3/4 AUTO 8PSK
++S 11992000 H 27500000 3/4
++S 12012000 V 27500000 3/4
++S2 12032000 H 27500000 9/10 AUTO QPSK
++S 12070000 H 27500000 3/4
++S2 12109000 H 27500000 9/10 AUTO QPSK
++# Astra2Connect
++# S2 12148000 H 27500000 3/4 AUTO 8PSK
++S 12168000 V 27500000 3/4
++# Astra2Connect
++# S2 12226000 H 27500000 3/5 AUTO 8PSK
++# Astra2Connect
++# S2 12304000 H 27500000 5/6 AUTO 8PSK
++# Astra2Connect
++# S2 12344000 H 28200000 5/6 AUTO 8PSK
++# Astra2Connect
++# S2 12382000 H 27500000 3/4 AUTO 8PSK
++S 12525000 H 27500000 3/4
++S 12525000 V 27500000 3/4
++S 12565000 H 27500000 2/3
++S 12565000 V 27500000 3/4
++S2 12605000 H 28500000 9/10 AUTO QPSK
++S2 12605000 V 28500000 9/10 AUTO QPSK
++S 12630000 V 6000000 3/4
++S 12631000 H 6666000 7/8
++S 12636000 V 2277000 5/6
++S 12641000 H 2220000 7/8
++S 12644000 H 2170000 3/4
++S 12649000 H 5600000 5/6
++S 12661000 H 2170000 5/6
++S 12685000 V 27500000 3/4
++S 12696000 H 3255000 1/2
++S 12711000 H 6111000 AUTO
++S 12725000 V 27500000 3/4
+diff -r af23d23c278b util/scan/dvb-s/Atlantic-Bird-3-5.0W
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-s/Atlantic-Bird-3-5.0W     Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,4 @@
++# Atlantic Bird 3 @ 5.0W
++# freq pol sr fec
++S 11096000 V 29950000 7/8
++S 11591000 V 20000000 2/3
+diff -r af23d23c278b util/scan/dvb-s/Chinastar1_C-87.5E
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-s/Chinastar1_C-87.5E       Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,15 @@
++# ChinaStar 1 @ 87.5E C-BAND
++# Generated by Pietro Casoar
++# 1st March 2009
++
++# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
++# freq pol sr fec
++
++# Myawady TV
++S 3734000 H 5925000 3/4
++
++# Zam TV Tests
++S 4076000 H 2532000 3/4
++
++# Test Card
++S 4081000 H 4687000 3/4
+diff -r af23d23c278b util/scan/dvb-s/Insat2E_C-83.0E
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-s/Insat2E_C-83.0E  Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,93 @@
++# Insat 2E @ 83.0E C-BAND
++# Generated by Pietro Casoar
++# 1st March 2009
++
++# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
++# freq pol sr fec
++
++# NE TV Multiplex
++S 3521000 V 8640000 3/4
++
++# NE TV Multiplex
++S 3537000 V 10800000 3/4
++
++# TV 9 Telugu
++S 3550000 V 3255000 3/4
++
++# S1 Channel
++S 3559000 V 3366000 3/4
++
++# TV 9 Kannada
++S 3581000 V 3255000 3/4
++
++# Jaya TV
++S 3593000 V 8680000 3/4
++
++# Tata Communications Multiplex
++S 3593000 V 9629000 3/4
++
++# Asianet Multiplex
++S 3643000 V 19531000 3/4
++
++# Amrita TV Middle East
++S 3678000 V 5926000 3/4
++
++# Mahaa TV
++S 3689000 V 2893000 3/4
++
++# Tata Communications Multiplex
++S 3696000 V 6111000 3/4
++
++# CNBC India
++S 3760000 V 6500000 3/4
++
++# Raj TV Network Multiplex
++S 3774000 V 13021000 3/4
++
++# UTVi TV
++S 3794000 V 3500000 3/5
++
++# PTC Multiplex (MPEG-4 S/2)
++S 3815000 V 6000000 3/4
++
++# Tata Communications Multiplex
++S 3845000 V 26043000 3/4
++
++# Indiavision
++S 3914000 V 3000000 3/4
++
++# Yes Indiavision
++S 3919000 V 3000000 3/4
++
++# Manorama News International
++S 3923000 V 3000000 3/4
++
++# Tata Communications Multiplex
++S 3934000 V 13021000 3/4
++
++# Raj Musix kanada
++S 3961000 V 6656000 3/4
++
++# TV 9 Multiplex
++S 3974000 V 13333000 3/4
++
++# Asianet Multiplex
++S 4010000 V 19531000 3/4
++
++# Tata Communications Multiplex
++S 4031000 V 7440000 7/8
++
++# RRSat Multiplex
++S 4042000 V 7420000 7/8
++
++# Tata Communications Multiplex
++S 4050000 V 5084000 7/8
++
++# DD national
++S 4070000 V 5000000 3/4
++
++# Indiasign Mulitplex
++S 4091000 V 9230000 7/8
++
++# News Live (MPEG-4 S/2)
++S 4100000 V 4700000 3/4
+diff -r af23d23c278b util/scan/dvb-s/Insat3A_C-93.5E
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-s/Insat3A_C-93.5E  Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,66 @@
++# Insat 3A @ 93.5E C-BAND
++# Generated by Pietro Casoar
++# 1st March 2009
++
++# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
++# freq pol sr fec
++
++# DD Bangla
++S 3732000 V 6250000 3/4
++
++# DD Punjab
++S 3740000 V 6250000 3/4
++
++# DD Gujarati
++S 3750000 V 6250000 3/4
++
++# DD Chandana
++S 3759000 V 6250000 3/4
++
++# DD Oriya
++S 3772000 V 6250000 3/4
++
++# DD kashir
++S 3782000 V 6250000 3/4
++
++# DD Sahyadri
++S 3791000 V 8600000 3/4
++
++# DD Malayalam
++S 3812000 V 6250000 3/4
++
++# DD Saptagiri
++S 3820000 V 6250000 3/4
++
++# DD podhigai
++S 3831000 V 8600000 3/4
++
++# DD Himachal Pradesh
++S 3932000 V 6250000 3/4
++
++# DD Jaipur
++S 3940000 V 6250000 3/4
++
++# Madhya Pradesh
++S 3950000 V 6250000 3/4
++
++# DD Uttar Pradesh
++S 3958000 V 6250000 3/4
++
++# DD North East
++S 4092000 V 6250000 3/4
++
++# DD Mizoram
++S 4101000 V 6250000 3/4
++
++# DD Tripura
++S 4109000 V 4250000 3/4
++
++# RTA Afghanistan
++S 4132000 V 4000000 3/4
++
++# RTA Afghanistan Nangarhar
++S 4136000 V 2000000 3/4
++
++# Ariana TV Network Multiplex
++S 4141000 V 5150000 3/4
+diff -r af23d23c278b util/scan/dvb-s/Insat4A_C-83.0E
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-s/Insat4A_C-83.0E  Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,93 @@
++# Insat 4A @ 83.0E C-BAND
++# Generated by Pietro Casoar
++# 1st March 2009
++
++# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
++# freq pol sr fec
++
++# NSTPL Multiplex
++S 3725000 H 26665000 3/4
++
++# Indiasign multiplex
++S 3756000 H 13333000 3/4
++
++# Star TV Multiplex
++S 3777000 H 10900000 3/4
++
++# Essel Shyam Multiplex
++S 3805000 H 28500000 7/8
++
++# Tarang TV Multiplex (MPEG-4 S/2)
++S 3841000 H 6920000 3/4
++
++# CTVN AKD Plus
++S 3853000 H 3265000 3/4
++
++# Kasthuri TV
++S 3857000 H 3462000 3/4
++
++# Kamyab TV
++S 3874000 H 3403000 3/4
++
++# Vanitha TV
++S 3892000 H 3300000 3/4
++
++# Essel Shayam Multiplex
++S 3898000 H 6800000 3/4
++
++# Channel 10 India
++S 3910000 H 3600000 7/8
++
++# Essel Shyam
++S 3923000 H 13000000 3/4
++
++# DY 365
++S 3949000 H 3225000 3/4
++
++# Multiplex
++S 3958000 H 9500000 7/8
++
++# Zee News Uttar Pradesh
++S 3976000 H 3200000 3/4
++
++# ETV Network Multiplex
++S 4004000 H 22220000 5/6
++
++# Essel Shyam
++S 4040000 H 7500000 7/8
++
++# Lamhas Multiplex
++S 4054000 H 13230000 3/4
++
++# Network 18 Multiplex
++S 4072000 H 6500000 3/4
++
++# IBN Lokmat
++S 4078000 H 3250000 3/4
++
++# Live India
++S 4087000 H 3300000 3/4
++
++# Mi Marathi
++S 4091000 H 3000000 3/4
++
++# BBS TV
++S 4100000 H 4750000 3/4
++
++# Manorama News
++S 4115000 H 5555000 3/4
++
++# BAG Films
++S 4134000 H 10600000 3/4
++
++# Zee Network Multiplex
++S 4151000 H 6500000 3/4
++
++# Zee Network Multiplex
++S 4161000 H 6500000 3/4
++
++# Lok Sabha TV
++S 4170000 H 6500000 3/4
++
++# Kolkata TV
++S 4180000 H 3233000 3/4
+diff -r af23d23c278b util/scan/dvb-s/Insat4B_C-93.5E
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-s/Insat4B_C-93.5E  Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,51 @@
++# Insat 4B @ 93.5E C-BAND
++# Generated by Pietro Casoar
++# 1st March 2009
++
++# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
++# freq pol sr fec
++
++# Doordarshan Multiplex
++S 3725000 H 27500000 3/4
++
++# DD Dehradun
++S 3750000 H 4250000 3/4
++
++# DD Raipur
++S 3762000 H 4250000 3/4
++
++# DD Ranchi
++S 3768000 H 4250000 3/4
++
++# DD Jammu
++S 3774000 H 4250000 3/4
++
++# DD Hissar
++S 3802000 H 4250000 3/4
++
++# DD Chandigarh
++S 3808000 H 4250000 3/4
++
++# DD Port Blair
++S 3822000 H 4250000 3/4
++
++# DD Bihar
++S 3832000 H 6250000 3/4
++
++# DD North East
++S 3841000 H 6250000 3/4
++
++# Sun network
++S 3885000 H 28000000 3/4
++
++# Doordarshan Multiplex
++S 3925000 H 27500000 3/4
++
++# Sakshi TV
++S 3950000 H 4440000 3/4
++
++# Tata Communications Multiplex
++S 4005000 H 25422000 7/8
++
++# Sun Network
++S 4045000 H 28000000 3/4
+diff -r af23d23c278b util/scan/dvb-s/Intelsat8_C-166.0E
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-s/Intelsat8_C-166.0E       Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,39 @@
++# Intelsat 8 @ 166.0E C-BAND
++# Generated by Pietro Casoar
++# 1st March 2009
++
++# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
++# freq pol sr fec
++
++# Viacom Multiplex
++S 3740000 H 27500000 2/3
++
++# South Korean Multiplex
++S 3790000 V 6510000 3/4
++
++# Arirang World
++S 3815000 V 4400000 3/4
++
++# Australian network Multiplex
++S 3829000 H 13238000 3/4
++
++# TVBS multiplex
++S 3833000 V 17500000 3/4
++
++# NBC Universal
++S 3900000 H 27500000 3/4
++
++# Intelsat multiplex
++S 3940000 H 27690000 7/8
++
++# China Radio multiplex
++S 3959000 V 3428000 3/4
++
++# NHK World network Multiplex
++S 4060000 H 16180000 1/2
++
++# Philippines Network TV Multiplex
++S 4122000 V 5554000 3/4
++
++# TAS Multiplex
++S 4130000 V 5800000 3/4
+diff -r af23d23c278b util/scan/dvb-s/JCSat3A_C-128.0E
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-s/JCSat3A_C-128.0E Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,18 @@
++# JCSAT 3A @ 128.0E C-BAND
++# Generated by Pietro Casoar
++# 1st March 2009
++
++# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
++# freq pol sr fec
++
++# TAS Multiplex
++S 3960000 V 30000000 5/6
++
++# TAS Multiplex
++S 4000000 V 30000000 5/6
++
++# Miraclenet
++S 4055000 V 3332000 3/4
++
++# TAS Multiplex
++S 4120000 V 30000000 5/6
+diff -r af23d23c278b util/scan/dvb-s/Measat3_C-91.5E
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-s/Measat3_C-91.5E  Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,54 @@
++# Measat 3 @ 91.5E C-BAND
++# Generated by Pietro Casoar
++# 1st March 2009
++
++# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
++# freq pol sr fec
++
++# Shop TV
++S 3629000 V 2200000 3/4
++
++# Aora TV Mulitplex
++S 3644000 H 22320000 3/4
++
++# Solar Entertainment
++S 3645000 V 19510000 3/4
++
++# National Geographic music
++S 3718000 V 1700000 7/8
++
++# DZRH TV Multiplex
++S 3721000 V 2170000 3/4
++
++# Ascent Media (MPEG-4 S/2)
++S 3751000 V 13330000 2/3
++
++# Globecast Multiplex (MPEG-4 S/2)
++S 3769000 V 14000000 3/4
++
++# HTV Multiplex
++S 3796000 V 7030000 3/4
++
++# Sky International
++S 3814000 V 6666000 3/4
++
++# Un-named Mulitplex
++S 3865000 V 3835000 3/4
++
++# RTM Multiplex
++S 3877000 V 12525000 7/8
++
++# RTM Sarawak Feeds
++S 3887000 V 3984000 3/4
++
++# Globecast Multiplex
++S 3920000 V 28000000 7/8
++
++# Ginx TV
++S 4113000 V 2960000 3/4
++
++# YR Asia TV
++S 4117000 V 2963000 3/4
++
++# All Sports Network (MPEG-4 S/2)
++S 4134000 V 7200000 3/4
+diff -r af23d23c278b util/scan/dvb-s/PalapaC2_C-113.0E
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-s/PalapaC2_C-113.0E        Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,39 @@
++# Palapa C2 @ 113.0E C-BAND
++# Generated by Pietro Casoar
++# 1st March 2009
++
++# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
++# freq pol sr fec
++
++# SCTV Jawa Timur
++S 3745000 H 3125000 3/4
++
++# SCTV
++S 3758000 H 4470000 3/4
++
++# TVRI Nasional
++S 3765000 H 5555000 3/4
++
++# RCTI
++S 3774000 H 6520000 3/4
++
++# KBS World Indonesia
++S 3836000 V 2097000 3/4
++
++# Bali TV
++S 3926000 H 4208000 3/4
++
++# TV One Indonesia
++S 4054000 H 5632000 3/4
++
++# ANTV Indonesia
++S 4055000 V 6510000 3/4
++
++# Indosiar
++S 4074000 V 6500000 3/4
++
++# Satelindo Multiplex
++S 4080000 H 28125000 3/4
++
++# TPI Indonesia
++S 4184000 V 6700000 3/4
+diff -r af23d23c278b util/scan/dvb-s/ST1_C-80.0E
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-s/ST1_C-80.0E      Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,27 @@
++# ST1 @ 88.0E C-BAND
++# Generated by Pietro Casoar
++# 1st March 2009
++
++# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
++# freq pol sr fec
++
++# GTV Multiplex
++S 3469000 V 30000000 3/4
++
++# ABTV Multiplex
++S 3521000 H 8332000 5/6
++
++# Videoland Multiplex
++S 3550000 V 30000000 3/4
++
++# GTV Multiplex
++S 3595000 H 30000000 3/4
++
++# Videoland multiplex
++S 3632000 V 30000000 3/4
++
++# Chungwa Telecom
++S 3671000 H 9256000 3/4
++
++# NTD TV Asia-Pacific
++S 3689000 H 3000000 3/4
+diff -r af23d23c278b util/scan/dvb-s/Telkom1_C-108.0E
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-s/Telkom1_C-108.0E Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,48 @@
++# Telkom 1 @ 108.0E C-BAND
++# Generated by Pietro Casoar
++# 1st March 2009
++
++# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
++# freq pol sr fec
++
++# Telkom Vision Multiplex
++S 3580000 H 28000000 3/4
++
++# Telkom Vision Multiplex
++S 3620000 H 28000000 3/4
++
++# Telkom Vision Multiplex
++S 3640000 V 28000000 3/4
++
++# TV Timor Leste
++S 3776000 H 4285000 3/4
++
++# TV Edukasi 1
++S 3785000 H 4000000 3/4
++
++# TVRI Kalbar
++S 3793000 H 3000000 3/4
++
++# TVRI Papua
++S 3797000 H 3900000 3/4
++
++# TV Edukasi 2
++S 3807000 H 4000000 3/4
++
++# Trans 7
++S 3990000 H 6000000 3/4
++
++# TVRI Aceh
++S 4015000 H 6000000 3/4
++
++# RCTI Jawa Timur
++S 4025000 H 3000000 3/4
++
++# Trans TV
++S 4084000 H 6000000 3/4
++
++# Papua TV
++S 4092000 H 3570000 3/4
++
++# JTV
++S 4097000 H 3125000 3/4
+diff -r af23d23c278b util/scan/dvb-s/Telstar10_C-76.5E
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-s/Telstar10_C-76.5E        Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,63 @@
++# Telstar 10 @ 76.5E C-BAND
++# Generated by Pietro Casoar
++# 1st March 2009
++
++# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
++# freq pol sr fec
++
++# Racing International
++S 3646000 H 5064000 3/4
++
++# Image Channel
++S 3655000 H 3214000 3/4
++
++# Globe Cast Asia multiplex
++S 3680000 H 27500000 3/4
++
++# UBI World TV Multiplex
++S 3760000 H 28066000 2/3
++
++# UBI World TV Multiplex
++S 3780000 V 28066000 2/3
++
++# Ekushey TV
++S 3787000 H 4600000 2/3
++
++# Diganta TV
++S 3793000 H 4340000 3/4
++
++# RRSat Global Network Multiplex
++S 3840000 H 27500000 3/4
++
++# Channel 1
++S 4003000 H 4080000 3/4
++
++# Boishakhi TV
++S 4009000 H 4300000 3/4
++
++# TV Maldives
++S 4030000 V 6312000 1/2
++
++# Channel I
++S 4034000 H 4300000 3/4
++
++# Bangla Vision
++S 4049000 H 3600000 3/4
++
++# Kantipur TV
++S 4056000 H 3214000 3/4
++
++# BBC World Service Multiplex
++S 4073000 H 13020000 1/2
++
++# MNC Indonesia
++S 4105000 H 3125000 3/4
++
++# NDTV Arabia
++S 4137000 H 2893000 3/4
++
++# Islamic TV
++S 4146000 H 3600000 3/4
++
++# Bangladesh Multiplex
++S 4173000 H 7400000 3/4
+diff -r af23d23c278b util/scan/dvb-s/Telstar18_C-138.0E
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-s/Telstar18_C-138.0E       Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,18 @@
++# Telstar 18 @ 138.0E C-BAND
++# Generated by Pietro Casoar
++# 1st March 2009
++
++# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
++# freq pol sr fec
++
++# I-Sky-Net Multiplex
++S 3599000 V 30000000 3/4
++
++# I-Sky-Net Multiplex
++S 3660000 V 30000000 3/4
++
++# LNTV Laos
++S 3704000 V 3034000 3/4
++
++# BBC World Service Multiplex
++S 4124000 V 3255000 1/2
+diff -r af23d23c278b util/scan/dvb-s/Thaicom1A_C-120.0E
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-s/Thaicom1A_C-120.0E       Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,24 @@
++# Thaicom 1A @ 120.0E C-BAND
++# Generated by Pietro Casoar
++# 1st March 2009
++
++# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
++# freq pol sr fec
++
++# TV3 Cambodia
++S 3725000 V 3255000 3/4
++
++# Panyapiwat
++S 3745000 V 2850000 5/6
++
++# CTN Cambodia Multiplex
++S 3854000 V 9628000 3/4
++
++# Kasikorn TV
++S 3881000 V 2000000 3/4
++
++# Bayon TV
++S 3916000 V 3359000 3/4
++
++# Radio Thailand Multiplex
++S 4135000 V 1808000 3/4
+diff -r af23d23c278b util/scan/dvb-s/Thaicom2_C-78.5E
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-s/Thaicom2_C-78.5E Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,33 @@
++# Thaicom 2 @ 78.5E C-BAND
++# Generated by Pietro Casoar
++# 1st March 2009
++
++# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
++# freq pol sr fec
++
++# BBTV Channel 7
++S 3764000 H 5900000 3/4
++
++# SBT TV
++S 3803000 H 1445000 7/8
++
++# MCOT Multiplex
++S 3888000 H 15625000 3/4
++
++# Royal Thai Army TV 5
++S 3905000 H 6250000 3/4
++
++# Thai TV Color Channel 3
++S 3967000 H 4551000 3/4
++
++# RU TV 1
++S 4003000 H 1085000 3/4
++
++# Ten TV & Rich Channel
++S 4016000 H 2305000 7/8
++
++# NBT TV
++S 4106000 H 4688000 3/4
++
++# Thai PBS
++S 4145000 H 4815000 3/4
+diff -r af23d23c278b util/scan/dvb-s/Thaicom5_C-78.5E
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-s/Thaicom5_C-78.5E Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,69 @@
++# Thaicom 5 @ 78.5E C-BAND
++# Generated by Pietro Casoar
++# 1st March 2009
++
++# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
++# freq pol sr fec
++
++# ETC India Multiplex
++S 3421000 V 6667000 3/4
++
++# Europe Media Port Multiplex
++S 3431000 H 13333000 3/4
++
++# Nepal TV Multiplex
++S 3432000 V 6667000 3/4
++
++# CTV9
++S 3448000 V 2222000 3/4
++
++# RRSat Global Network (MPEG-4 S/2)
++S 3450000 H 13333000 3/4
++
++# Avenues TV
++S 3454000 V 3333000 3/4
++
++# PSI Channel
++S 3460000 V 1538000 3/4
++
++# Sagarmatha TV
++S 3489000 V 3333000 3/4
++
++# Dhi TV
++S 3502000 V 4444000 2/3
++
++# Korean Central TV
++S 3504000 H 3367000 2/3
++
++# Gang Cartoon Channel
++S 3505000 V 1852000 3/4
++
++# Lao Star Channel
++S 3521000 V 2917000 3/4
++
++# Thaicom Multiplex
++S 3545000 V 30000000 5/6
++
++# RRSat Global Network
++S 3551000 H 13333000 3/4
++
++# VTV Maldives
++S 3562000 H 4444000 1/2
++
++# MRTV Multiplex
++S 3574000 H 7492000 2/3
++
++# Thaicom Multiplex
++S 3585000 V 26667000 3/4
++
++# Thaicom Multiplex
++S 3600000 H 26667000 3/4
++
++# MRTV Multiplex
++S 3617000 V 12500000 3/4
++
++# RRSat Global Network Multiplex
++S 3640000 H 28066000 3/4
++
++# TVK Cambodia
++S 3664000 H 3704000 3/4
+diff -r af23d23c278b util/scan/dvb-s/Vinasat1_C-132.0E
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-s/Vinasat1_C-132.0E        Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,12 @@
++# VINASAT 1 @ 132.0E C-BAND
++# Generated by Pietro Casoar
++# 1st March 2009
++
++# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
++# freq pol sr fec
++
++# VTV Multiplex (VTV 1, VTV 2, VTV 3, VTV 4, VTV6)
++S 3413000 V 9766000 3/4
++
++# VOV TV (Voice of VietNam)
++S 3529000 V 2500000 2/3
+diff -r af23d23c278b util/scan/dvb-t/au-Adelaide
+--- a/util/scan/dvb-t/au-Adelaide      Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/au-Adelaide      Tue Dec 21 12:13:28 2010 +0100
+@@ -10,3 +10,5 @@
+ T 219500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+ # SBS
+ T 564500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
++# 3D Trial Australia
++T 536625000 7MHz 3/4 NONE QAM16 8k 1/8 NONE
+diff -r af23d23c278b util/scan/dvb-t/au-AdelaideFoothills
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/au-AdelaideFoothills     Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,12 @@
++# Australia / Adelaide / Grenfell Street
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# ABC
++T 781625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Seven
++T 711500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Nine
++T 795500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Ten
++T 732500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# SBS
++T 760500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -r af23d23c278b util/scan/dvb-t/au-Ballarat
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/au-Ballarat      Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,12 @@
++# Australia / Ballarat
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# ABC
++T 620625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Prime
++T 655500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# WIN
++T 592625000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
++# SC
++T 613500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# SBS
++T 634625000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -r af23d23c278b util/scan/dvb-t/au-Bendigo
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/au-Bendigo       Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,41 @@
++# Australia / Bendigo (Mt Alexandria transmitters)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# ABC
++T 669500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++T 620500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++T 572500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++
++# Seven
++T 690500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++T 655500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++T 555250000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++
++# Nine
++T 576250000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++T 592500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++
++# Ten
++T 618250000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++
++# SBS
++T 529500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 634500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 534250000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
++
++# UNK1
++T 676500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# UNK2
++T 571500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++
++T 536625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++T 585625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++T 564500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++T 543500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++T 536500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++T 529500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++T 205500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++T 564500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++T 536625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++T 690500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++T 711500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++T 550500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+diff -r af23d23c278b util/scan/dvb-t/au-Brisbane
+--- a/util/scan/dvb-t/au-Brisbane      Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/au-Brisbane      Tue Dec 21 12:13:28 2010 +0100
+@@ -10,3 +10,5 @@
+ T 219500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+ # SBS
+ T 585625000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
++# 31 Digital
++T 599500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -r af23d23c278b util/scan/dvb-t/au-Devonport
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/au-Devonport     Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,19 @@
++# Australia / Tasmania / Devonport
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#
++# Brett S Hallett October 2009 , may not be complete !!
++#
++# ABC VHF 57
++T 730250000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# ABC Digital 45
++T 648500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# SBS VHF 54
++T 709250000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
++# SBS Digital 39
++T 606500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
++# SCTV
++T 613498000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# WIN
++T 627498000 7MHz 3/4 NONE QAM64 8k 1/8 NONE
++# TDT
++T 585498000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -r af23d23c278b util/scan/dvb-t/au-FraserCoast-Bundaberg
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/au-FraserCoast-Bundaberg Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,12 @@
++# Australia / QLD / Fraser Coast - Bundaberg / Mt Goonaneman
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# ABC VHF9A
++T 205625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# SBS UHF28
++T 529500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
++# Seven VHF7
++T 184625000 7MHz 2/3 NONE QAM64 8k 1/16 NONE
++# WIN Wide Bay VHF10
++T 212500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Southern Cross Ten VHF9
++T 198525000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+diff -r af23d23c278b util/scan/dvb-t/au-Goulburn-Rocky_Hill
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/au-Goulburn-Rocky_Hill   Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,19 @@
++# Australia / Goulburn / Rocky Hill
++#
++# Scanned 17/10/2009 - Alex Ferrara (alex@receptiveit.com.au)
++
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# ABC - netid (4112) tid (547) offset (+125Khz)
++T 725625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++
++# SBS - netid (12802) tid (848) offset (+125Khz)
++T 746625000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
++
++# WIN - netid (12915) tid (12922) offset (+125Khz)
++T 767625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++
++# Prime - netid (12929) tid (2462) offset (+125Khz)
++T 788625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++
++# TEN - netid (12812) tid (2055) offset (0Khz)
++T 809500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+diff -r af23d23c278b util/scan/dvb-t/au-Hervey_Bay-Ghost_Hill
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/au-Hervey_Bay-Ghost_Hill Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,16 @@
++# Australia / Hervey Bay / Ghost Hill
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#
++# ABC UHF56
++T 725500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Seven UHF59
++T 746500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Nine UHF62
++T 767625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Ten UHF68
++T 809500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# SBS UHF28
++T 529500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
++# SBS UHF34
++T 704500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -r af23d23c278b util/scan/dvb-t/au-SunshineCoast
+--- a/util/scan/dvb-t/au-SunshineCoast Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/au-SunshineCoast Tue Dec 21 12:13:28 2010 +0100
+@@ -3,7 +3,7 @@
+ # SBS36 SBS ***
+ T 585625000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+ # TNQ47 10 ***
+-T 662625000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 662625000 7MHz 3/4 NONE QAM64 8k 1/8 NONE
+ # ABQ62 ABC ***
+ T 767625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+ # STQ65 7 ***
+diff -r af23d23c278b util/scan/dvb-t/au-Sutherland
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/au-Sutherland    Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,20 @@
++# Australia / Sutherland
++#
++# Australia modulation params:
++# - http://www.dba.org.au/index.asp?sectionID=120
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#
++# North (Broadcast Site Escarpment Road BROKERS NOSE)
++# - http://www.dba.org.au/index.asp?query=true&sectionID=22&recLocation=Wollongong+%2D+North
++#
++#Channel 7 stations
++T 177500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++#Channel 9 bundle
++# T 191500000 7MHz AUTO AUTO AUTO AUTO AUTO AUTO
++#One and Channel 10
++T 219500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++#Aunty
++T 226500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++#SBS
++T 571500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+diff -r af23d23c278b util/scan/dvb-t/be-All
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/be-All   Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,8 @@
++# Belgium, whole country
++# Created from http://nl.wikipedia.org/wiki/DVB-T-frequenties
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
++T 506000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
++T 666000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE
++T 754000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE
++T 834000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE
+diff -r af23d23c278b util/scan/dvb-t/be-Brussels
+--- a/util/scan/dvb-t/be-Brussels      Sat Jun 20 16:47:55 2009 +0200
++++ /dev/null  Thu Jan 01 00:00:00 1970 +0000
+@@ -1,5 +0,0 @@
+-# Brussels - Belgium (Transmitters of the RTBF and the VRT)
+-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 754000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # RTBF
+-T 746000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # BE-TV
+-T 482000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # VRT
+diff -r af23d23c278b util/scan/dvb-t/be-Libramont
+--- a/util/scan/dvb-t/be-Libramont     Sat Jun 20 16:47:55 2009 +0200
++++ /dev/null  Thu Jan 01 00:00:00 1970 +0000
+@@ -1,10 +0,0 @@
+-# Libramont - Belgique
+-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-# Canal  7 191.5 MHz M6
+-# Canal 24 498.0 MHz RTL-TVI  Club-RTL  Plug-TV  RTL 4,5,7
+-# Canal 27 522.0 MHz RTL Lux, den 2ten RTL
+-# Canal 56 834.0 MHz RTBF 1,2,3 + radio
+-T 191500000 7MHz 1/2 NONE QAM64 8k 1/8 NONE
+-T 498000000 8MHz 1/2 NONE QAM64 8k 1/16 NONE
+-T 522000000 8MHz 1/2 NONE QAM64 8k 1/16 NONE
+-T 834000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
+diff -r af23d23c278b util/scan/dvb-t/be-Schoten
+--- a/util/scan/dvb-t/be-Schoten       Sat Jun 20 16:47:55 2009 +0200
++++ /dev/null  Thu Jan 01 00:00:00 1970 +0000
+@@ -1,3 +0,0 @@
+-# Schoten-Antwerpen - Belgie
+-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 778000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
+diff -r af23d23c278b util/scan/dvb-t/be-St_Pieters_Leeuw
+--- a/util/scan/dvb-t/be-St_Pieters_Leeuw      Sat Jun 20 16:47:55 2009 +0200
++++ /dev/null  Thu Jan 01 00:00:00 1970 +0000
+@@ -1,3 +0,0 @@
+-# St.-Pieters-Leeuw - Belgie
+-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 482000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
+diff -r af23d23c278b util/scan/dvb-t/be-Tournai
+--- a/util/scan/dvb-t/be-Tournai       Sat Jun 20 16:47:55 2009 +0200
++++ /dev/null  Thu Jan 01 00:00:00 1970 +0000
+@@ -1,3 +0,0 @@
+-# Tournai - Belgique
+-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 754000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -r af23d23c278b util/scan/dvb-t/ch-All
+--- a/util/scan/dvb-t/ch-All   Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/ch-All   Tue Dec 21 12:13:28 2010 +0100
+@@ -19,6 +19,7 @@
+ T 682000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
+ T 690000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
+ T 698000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
++T 706000000 8MHz 1/2 NONE QAM16 8k 1/4 NONE
+ T 714000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
+ T 722000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
+ T 722000000 8MHz 5/6 NONE QAM16 8k 1/8 NONE
+diff -r af23d23c278b util/scan/dvb-t/ch-Geneva
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/ch-Geneva        Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,16 @@
++# Switzerland, whole country
++# Created from http://www.broadcast.ch/portal.aspx?pid=705
++# and http://www.broadcast.ch/data_program_dvbt.aspx
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#  freq     bw   fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 570166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 578000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
++T 658166000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
++T 666166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 682166000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
++T 706000000 8MHz 1/2 NONE QAM16 8k 1/4 NONE
++T 746166000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
++T 770166000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
++T 794166000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
++T 818166000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
++T 850166000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+diff -r af23d23c278b util/scan/dvb-t/cz-All
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/cz-All   Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,41 @@
++# Czech Republic, whole country
++# Created from http://www.digizone.cz/texty/mapy-pokryti-multiplex-1-ceska-televize/
++# and http://www.digizone.cz/texty/mapy-pokryti-multiplex-2-radiokomunikace/
++# and http://www.digizone.cz/texty/mapy-pokryti-multiplex-3-czech-digital-group/
++# and http://www.digizone.cz/texty/mapy-pokryti-multiplex-4-telefonica-o2/
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 506000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 538000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 562000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 570000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 586000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 618000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 634000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 690000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 698000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 722000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 730000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 738000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 746000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 802000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 810000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 818000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 826000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+diff -r af23d23c278b util/scan/dvb-t/cz-Brno
+--- a/util/scan/dvb-t/cz-Brno  Sat Jun 20 16:47:55 2009 +0200
++++ /dev/null  Thu Jan 01 00:00:00 1970 +0000
+@@ -1,10 +0,0 @@
+-# DVB-T Brno (Brno, Czech Republic)
+-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-# MUX 1 Ceska televize
+-T 506000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+-# MUX 2 Ceske radiokomunikace
+-T 626000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+-# MUX 3 Czech Digital Group
+-T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+-# MUX 4 Telefonica O2
+-T 818000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -r af23d23c278b util/scan/dvb-t/cz-Domazlice
+--- a/util/scan/dvb-t/cz-Domazlice     Sat Jun 20 16:47:55 2009 +0200
++++ /dev/null  Thu Jan 01 00:00:00 1970 +0000
+@@ -1,3 +0,0 @@
+-# DVB-T Domažlice (Domažlice, Czech Republic)
+-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -r af23d23c278b util/scan/dvb-t/cz-Klet
+--- a/util/scan/dvb-t/cz-Klet  Sat Jun 20 16:47:55 2009 +0200
++++ /dev/null  Thu Jan 01 00:00:00 1970 +0000
+@@ -1,4 +0,0 @@
+-# DVB-T Ceske Budejovice (Klet, Czech Republic)
+-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-# CRa - Ceske radiokomunikace, TX Klet
+-T 698000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+diff -r af23d23c278b util/scan/dvb-t/cz-Ostrava
+--- a/util/scan/dvb-t/cz-Ostrava       Sat Jun 20 16:47:55 2009 +0200
++++ /dev/null  Thu Jan 01 00:00:00 1970 +0000
+@@ -1,3 +0,0 @@
+-# DVB-T Ostrava (Ostrava, Czech Republic)
+-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -r af23d23c278b util/scan/dvb-t/cz-Plzen
+--- a/util/scan/dvb-t/cz-Plzen Sat Jun 20 16:47:55 2009 +0200
++++ /dev/null  Thu Jan 01 00:00:00 1970 +0000
+@@ -1,8 +0,0 @@
+-# DVB-T Plzen (Pilsen, Czech Republic)
+-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-# MUX 1 Ceska televize
+-T 578000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+-# MUX 2 Ceske Radiokomunikace
+-T 690000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+-# MUX 3 Czech Digital Group
+-T 722000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+diff -r af23d23c278b util/scan/dvb-t/cz-Praha
+--- a/util/scan/dvb-t/cz-Praha Sat Jun 20 16:47:55 2009 +0200
++++ /dev/null  Thu Jan 01 00:00:00 1970 +0000
+@@ -1,7 +0,0 @@
+-# DVB-T Praha (Prague, Czech Republic)
+-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 634000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+-T 674000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+-T 730000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+-T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+-T 818000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -r af23d23c278b util/scan/dvb-t/de-Baden-Wuerttemberg
+--- a/util/scan/dvb-t/de-Baden-Wuerttemberg    Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/de-Baden-Wuerttemberg    Tue Dec 21 12:13:28 2010 +0100
+@@ -1,20 +1,19 @@
+ # DVB-T Baden-Württemberg
+ # Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+-T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 474000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH21: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
++T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
++T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+ T 514000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH26: Das Erste, arte, Phoenix, EinsPlus
+-T 522000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH27: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+-T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+-T 618000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH39: SWR-BW, BR, hr, WDR
+-T 626000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH40: SWR-BW, BR, hr, WDR
+-T 634000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH41: SWR-BW, BR, hr, WDR
++T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
++T 618000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH39: SWR-BW, Bayerisches Fernsehen, hr, WDR
++T 626000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH40: SWR-BW, Bayerisches Fernsehen, hr, WDR
++T 634000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH41: SWR-BW, Bayerisches Fernsehen, hr, WDR
+ T 650000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH43: Das Erste, arte, Phoenix, EinsPlus
+-T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH49: SWR-BW, BR, hr, WDR
+-T 706000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH50: Das Erste, arte, Phoenix, EinsPlus
+-                                            # CH50: SWR-BW, BR, hr, WDR
++T 666000000 8MHz 3/4 NONE QAM16 8k 1/8 NONE # CH45: RTL, RTL 2, Super RTL, VOX, RTL Crime, Passion [Sendenorm: MPEG-4]
++T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH49: SWR-BW, Bayerisches Fernsehen, hr, WDR
++T 706000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH50: SWR-BW, Bayerisches Fernsehen, hr, WDR
+ T 722000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH52: Das Erste, arte, Phoenix, EinsPlus
+-T 730000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH53: Das Erste, arte, Phoenix, EinsPlus
+-                                            # CH53: SWR-BW, BR, hr, WDR
+ T 738000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH54: Das Erste, arte, Phoenix, EinsPlus
++T 778000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH59: Das Erste, arte, Phoenix, EinsPlus
+ T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Das Erste, arte, Phoenix, EinsPlus
+diff -r af23d23c278b util/scan/dvb-t/de-Bayern
+--- a/util/scan/dvb-t/de-Bayern        Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/de-Bayern        Tue Dec 21 12:13:28 2010 +0100
+@@ -1,40 +1,40 @@
+ # DVB-T Bayern
+ # Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 184500000 7MHz 3/4 NONE QAM16 8k 1/4 NONE # CH06: Das Erste, arte, Phoenix, EinsPlus
+ T 191500000 7MHz 3/4 NONE QAM16 8k 1/4 NONE # CH07: Das Erste, arte, Phoenix, EinsPlus
+ T 212500000 7MHz 3/4 NONE QAM16 8k 1/4 NONE # CH10: Das Erste, arte, Phoenix, EinsPlus
+-T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+-T 506000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH25: BR, BRalpha, SWR, Das Erste
+-                                            # CH25: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+-T 522000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH27: BR, BRalpha, SWR, Das Erste
+-T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: BR, BRalpha, SWR, Das Erste
+-                                            # CH28: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
++T 506000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH25: Bayerisches Fernsehen, BR-alpha, SWR, EinsExtra
++                                            # CH25: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
++T 522000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH27: Bayerisches Fernsehen, BR-alpha, SWR, EinsExtra
++T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: Bayerisches Fernsehen, BR-alpha, SWR, EinsExtra
++                                            # CH28: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+ T 538000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH29: Das Erste, arte, Phoenix, EinsPlus
+ T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: Das Erste, arte, Phoenix, EinsPlus
+-T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+-T 578000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH34: RTL, RTL II, Super RTL, VOX
+-                                            # CH34: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+-T 586000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH35: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
++T 578000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH34: RTL, RTL 2, Super RTL, VOX
++                                            # CH34: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
++T 586000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH35: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+ T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: Das Erste, arte, Phoenix, EinsPlus
+-T 626000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH40: BR, BRalpha, hr, mdr
++T 618000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH39: Bayerisches Fernsehen, BR-alpha, SWR, EinsExtra
++T 626000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH40: Bayerisches Fernsehen, BR-alpha, MDR, hr
+                                             # CH40: Das Erste, arte, Phoenix, EinsPlus
+-T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+-T 658000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH44: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+-T 666000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH45: BR, BRalpha, hr, mdr
++T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
++T 658000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH44: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
++T 666000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH45: Bayerisches Fernsehen, BR-alpha, MDR, hr
+                                             # CH45: Das Erste, arte, Phoenix, EinsPlus
+-T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: BR, BRalpha, SWR, Das Erste
+-                                            # CH46: BR, BRalpha, hr, mdr
+-T 682000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH47: BR, BRalpha, hr, mdr
++T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: Bayerisches Fernsehen, BR-alpha, MDR, hr
++                                            # CH46: Bayerisches Fernsehen, BR-alpha, SWR, EinsExtra
++T 682000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH47: Bayerisches Fernsehen, BR-alpha, MDR, hr
+                                             # CH47: Das Erste, arte, Phoenix, EinsPlus
+-T 690000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH48: Pro7, Sat.1, Kabel1, N24
+-T 722000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH52: Pro7, Sat.1, Kabel1, N24
+-T 730000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH53: BR, BRalpha, SWR, Das Erste
+-                                            # CH53: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+-T 738000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH54: http://www.digitalfernsehen.de/news/news_769785.html
++T 690000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH48: Sat.1, ProSieben, Kabel1, N24
++T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH49: Das Erste, arte, Phoenix, EinsPlus
++T 722000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH52: ProSieben, Sat.1, Kabel1, N24
++T 730000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH53: Bayerisches Fernsehen, BR-alpha, SWR, EinsExtra
++                                            # CH53: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
++T 738000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH54: Das Erste, arte, Phoenix, EinsPlus
+ T 746000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH55: Das Erste, arte, Phoenix, EinsPlus
+-T 754000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH56: BR, BRalpha, SWR, Das Erste
+-T 770000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH58: Das Erste, arte, Phoenix, EinsPlus
+-T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Tele 5, Eurosport, MonA, Franken Fernsehen
+-T 834000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH66: RTL, RTL II, Super RTL, VOX
+-                                            # CH66: Tele 5, Eurosport, HSE 24, münchen.tv
++T 754000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH56: Bayerisches Fernsehen, BR-alpha, SWR, EinsExtra
++T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Tele 5, Channel21/ Euronews, Bibel TV, HSE 24, Franken Fernsehen
++T 834000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH66: RTL, RTL 2, Super RTL, VOX
++                                            # CH66: Tele 5, Channel21/ Euronews, Bibel TV, HSE 24, münchen.tv
+diff -r af23d23c278b util/scan/dvb-t/de-Berlin
+--- a/util/scan/dvb-t/de-Berlin        Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/de-Berlin        Tue Dec 21 12:13:28 2010 +0100
+@@ -1,11 +1,12 @@
+ # DVB-T Berlin
+ # Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 177500000 7MHz 3/4 NONE QAM16 8k 1/8 NONE # CH05: HSE 24/MONA, FAB, WDR, SWR
++T 177500000 7MHz 3/4 NONE QAM16 8k 1/8 NONE # CH05: Tele 5, HSE 24, WDR, SWR (BW / RP)
+ T 191500000 7MHz 2/3 NONE QAM16 8k 1/8 NONE # CH07: MDR, NDR, arte
+-T 506000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH25: RTL, RTL II, Super RTL, VOX
++T 506000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH25: RTL, RTL 2, Super RTL, VOX
+ T 522000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH27: Das Erste, RBB, Phoenix, EinsExtra
+-T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+-T 658000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH44: Pro7, Sat.1, Kabel1, N24
+-T 754000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH56: Eurosport, TV.B, DSF, Neun live
+-T 778000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH59: n-tv, EuroNews, + 26 Radioprogramme
++T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
++T 618000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH39: Das Vierte, Bibel.TV, QVC, Bayerisches Fernsehen
++T 658000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH44: ProSieben, Sat.1, Kabel1, N24
++T 754000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH56: Eurosport, TV.B, Sport1, 9Live
++T 778000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH59: n-tv, EuroNews / Channel 21 Shop, PLACE2BE + 8 Radioprogramme
+diff -r af23d23c278b util/scan/dvb-t/de-Brandenburg
+--- a/util/scan/dvb-t/de-Brandenburg   Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/de-Brandenburg   Tue Dec 21 12:13:28 2010 +0100
+@@ -1,7 +1,7 @@
+ # DVB-T Brandenburg
+ # Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+-T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
++T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+ T 730000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE # CH53: Das Erste, RBB, Phoenix, EinsExtra
+ T 762000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH57: MDR, NDR, arte
+diff -r af23d23c278b util/scan/dvb-t/de-Bremen
+--- a/util/scan/dvb-t/de-Bremen        Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/de-Bremen        Tue Dec 21 12:13:28 2010 +0100
+@@ -3,7 +3,7 @@
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+ T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: Das Erste (RB), RB TV (NDR NDS), arte, Phoenix
+ T 538000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH29: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
+-T 562000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH32: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+-T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: RTL, RTL II, Super RTL, VOX
+-T 666000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH45: Tele 5, Neun live, Eurosport, MONA/DMAX
+-T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH49: Pro7, Sat.1, Kabel1, N24
++T 562000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH32: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
++T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: RTL, RTL 2, Super RTL, VOX
++T 666000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH45: Tele 5, 9Live, Eurosport, MONA / Channel 21
++T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH49: ProSieben, Sat.1, Kabel1, N24
+diff -r af23d23c278b util/scan/dvb-t/de-Hamburg
+--- a/util/scan/dvb-t/de-Hamburg       Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/de-Hamburg       Tue Dec 21 12:13:28 2010 +0100
+@@ -1,16 +1,12 @@
+ # DVB-T Hamburg
+ # Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
++# CH36 entry from http://www.dvb-t-nord.de/programme/index.html
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+-T 490000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+-T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: NDR SH, WDR/NDR NDS, MDR/NDR MVP, BR/NDR HH
+-T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: Pro7, Sat.1, Kabel1, N24
+-T 546000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH30: Pro7, Sat.1, Kabel1, N24
++T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
++T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: NDR SH, WDR/NDR NDS, MDR/NDR MVP, BR Fernsehen/NDR HH
++T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ProSieben, Sat.1, Kabel1, N24
+ T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: Das Erste, arte, Phoenix, EinsExtra
+-T 570000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH33: Das Erste, arte, Phoenix, EinsExtra
+-T 626000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH40: RTL, RTL II, Super RTL, VOX
+-T 626000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH40: RTL, RTL II, Super RTL, VOX
+-T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: Neun live, HH1, BibelTV, Eurosport
+-T 674000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH46: Neun live, HH1, BibelTV, Eurosport
+-T 738000000 8MHz 1/2 NONE QAM64 8k 1/8 NONE # CH54: NDR HH, WDR/NDR NDS, MDR/NDR MVP, BR/NDR SH
+-T 738000000 8MHz 3/4 NONE QAM16 8k 1/8 NONE # CH54: NDR HH, WDR/NDR NDS, MDR/NDR MVP, BR/NDR SH
++T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: TELE 5, QVC, DAS VIERTE, Channel 21 / Euronews
++T 626000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH40: RTL, RTL 2, Super RTL, VOX
++T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: 9Live, HH1, Bibel.TV, Eurosport
++T 738000000 8MHz 1/2 NONE QAM64 8k 1/8 NONE # CH54: NDR HH, WDR/NDR NDS, MDR/NDR MVP, BR Fernsehen/NDR SH
+diff -r af23d23c278b util/scan/dvb-t/de-Hessen
+--- a/util/scan/dvb-t/de-Hessen        Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/de-Hessen        Tue Dec 21 12:13:28 2010 +0100
+@@ -1,19 +1,19 @@
+ # DVB-T Hessen
+ # Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 198500000 7MHz 2/3 NONE QAM16 8k 1/4 NONE # CH08: Phoenix, BR, SWR-RP
+-T 474000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH21: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+-T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+-T 498000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH24: Phoenix, BR, SWR-RP, WDR
+-T 506000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH25: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 198500000 7MHz 2/3 NONE QAM16 8k 1/4 NONE # CH08: Phoenix, Bayerisches Fernsehen, SWR-RP
++T 474000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH21: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
++T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
++T 498000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH24: Phoenix, Bayerisches Fernsehen, SWR-RP, WDR
++T 506000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH25: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+ T 562000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH32: Das Erste, hr, EinsExtra/arte
+-T 578000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH34: RTL, RTL II, Super RTL, VOX
++T 578000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH34: RTL, RTL 2, Super RTL, VOX
+ T 602000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH37: Das Erste, hr, EinsExtra/arte
+-T 618000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH39: Phoenix, BR, SWR-RP, mdr
+-T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 618000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH39: Phoenix, Bayerisches Fernsehen, SWR-RP, MDR
++T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+ T 650000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH43: Das Erste, hr, EinsExtra/arte
+-T 722000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH52: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+-T 730000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH53: BR, hr, SWR-BW, WDR
+-T 738000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH54: Pro7, Sat.1, Kabel1, N24
+-T 746000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH55: Phoenix, NDR, mdr, WDR
+-T 818000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH64: Tele5, Eurosport, rheinmaintv
++T 722000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH52: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
++T 730000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH53: Bayerisches Fernsehen, hr, SWR-BW, WDR
++T 738000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH54: ProSieben, Sat.1, Kabel1, N24
++T 746000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH55: Phoenix, NDR, MDR, WDR
++T 818000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH64: Tele5, Eurosport, rheinmaintv, Bibel.TV
+diff -r af23d23c278b util/scan/dvb-t/de-Mecklenburg-Vorpommern
+--- a/util/scan/dvb-t/de-Mecklenburg-Vorpommern        Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/de-Mecklenburg-Vorpommern        Tue Dec 21 12:13:28 2010 +0100
+@@ -2,11 +2,11 @@
+ # Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+ T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: Das Erste, NDR MVP, RBB, MDR/NDR SH
+-T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+ T 514000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH26: Das Erste, NDR MVP, RBB, MDR/NDR SH
+ T 538000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH29: Das Erste, NDR MVP, RBB, MDR/NDR SH
+ T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: Das Erste, NDR MVP, RBB, MDR/NDR SH
+-T 626000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH40: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+-T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+-T 714000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH51: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+-T 738000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH54: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 602000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH37: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
++T 626000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH40: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
++T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
++T 730000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH53: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+diff -r af23d23c278b util/scan/dvb-t/de-Niedersachsen
+--- a/util/scan/dvb-t/de-Niedersachsen Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/de-Niedersachsen Tue Dec 21 12:13:28 2010 +0100
+@@ -5,36 +5,35 @@
+ T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: Das Erste (RB), RB TV (NDR NDS), arte, Phoenix
+                                             # CH22: Das Erste, arte, Phoenix, EinsExtra
+                                             # CH22: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
+-T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+-T 498000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH24: RTL, RTL II, Super RTL, VOX
+-                                            # CH24: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+-T 522000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH27: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+-T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: Tele 5, NICK/Comedy Central, Eurosport, MONA/DMAX
++T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
++T 498000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH24: RTL, RTL 2, Super RTL, VOX
++T 514000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH26: Das Erste, arte, Phoenix, EinsExtra
++T 522000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH27: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
++T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: Tele 5, NICK / Comedy Central, Eurosport, MONA / Channel 21
+ T 538000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH29: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
+-T 562000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH32: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 554000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH31: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
++T 562000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH32: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+ T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: Das Erste, arte, Phoenix, EinsExtra
+-T 586000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH35: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 586000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH35: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+ T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
+ T 602000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH37: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
+-T 610000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH38: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 610000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH38: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+ T 634000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH41: Das Erste, arte, Phoenix, EinsExtra
+-T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: RTL, RTL II, Super RTL, VOX
+-                                            # CH42: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: RTL, RTL 2, Super RTL, VOX
++                                            # CH42: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+ T 650000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH43: Das Erste, arte, Phoenix, EinsExtra
+                                             # CH43: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
+-T 658000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH44: Pro7, Sat.1, Kabel1, N24
+-T 666000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH45: Tele 5, Neun live, Eurosport, MONA/DMAX
++T 658000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH44: ProSieben, Sat.1, Kabel1, N24
++T 666000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH45: Tele 5, 9Live, Eurosport, MONA / Channel 21
+ T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
+ T 682000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH47: Das Erste, arte, Phoenix, EinsExtra
+ T 690000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH48: Das Erste, arte, Phoenix, EinsExtra
+-T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH49: Pro7, Sat.1, Kabel1, N24
++T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH49: ProSieben, Sat.1, Kabel1, N24
+ T 706000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH50: Das Erste, arte, Phoenix, EinsExtra
+-T 714000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH51: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
+ T 746000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH55: Das Erste, arte, Phoenix, EinsExtra
+ T 754000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH56: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
+ T 770000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH58: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
+ T 778000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH59: Das Erste, arte, Phoenix, EinsExtra
+-                                            # CH59: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+-T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Tele 5, Comedy Central, Eurosport, MONA/DMAX
+-                                            # CH60: Tele 5, NICK/Comedy Central, Eurosport, MONA/DMAX
++                                            # CH59: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
++T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Tele 5, NICK / Comedy Central, Eurosport, MONA / Channel 21
+ T 826000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH65: Das Erste, arte, Phoenix, EinsExtra
+diff -r af23d23c278b util/scan/dvb-t/de-Nordrhein-Westfalen
+--- a/util/scan/dvb-t/de-Nordrhein-Westfalen   Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/de-Nordrhein-Westfalen   Tue Dec 21 12:13:28 2010 +0100
+@@ -5,13 +5,13 @@
+ T 482000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH22: WDR-Wuppertal, NDR/WDR-Düsseldorf, MDR, SWR
+ T 506000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH25: WDR-Dortmund, NDR/WDR-Essen, MDR, SWR
+ T 514000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH26: Das Erste, arte, Phoenix, EinsFestival
+-                                            # CH26: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++                                            # CH26: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+ T 522000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE # CH27: WDR-Siegen, NDR, MDR, SWR
+-T 538000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH29: RTL, RTL II, Super RTL, VOX
+-T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 538000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH29: RTL, RTL 2, Super RTL, VOX
++T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+ T 554000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE # CH31: WDR-Bielefeld, NDR/WDR-Siegen, MDR, SWR
+-T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+-T 586000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH35: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
++T 586000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH35: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+ T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: CNN, Eurosport, Tele5, VIVA
+ T 602000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE # CH37: WDR-Aachen, NDR/WDR-Köln, MDR, SWR
+ T 666000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE # CH45: WDR-Münster, NDR/WDR-Dortmund, MDR, SWR
+@@ -20,8 +20,8 @@
+ T 698000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE # CH49: WDR-Köln, MDR/WDR-Bonn, NDR/WDR-Aachen, SWR
+ T 706000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH50: Das Erste, arte, Phoenix, EinsFestival
+ T 722000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH52: CNN, Eurosport, Tele5, VIVA
+-T 730000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH53: Pro7, Sat.1, Kabel1, N24
+-T 746000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH55: Pro7, Sat.1, Kabel1, N24
++T 730000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH53: ProSieben, Sat.1, Kabel1, N24
++T 746000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH55: ProSieben, Sat.1, Kabel1, N24
+ T 762000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH57: WDR-Essen, NDR/WDR-Dortmund, MDR, SWR
+-T 778000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH59: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 778000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH59: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+ T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Das Erste, arte, Phoenix, EinsFestival
+diff -r af23d23c278b util/scan/dvb-t/de-Rheinland-Pfalz
+--- a/util/scan/dvb-t/de-Rheinland-Pfalz       Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/de-Rheinland-Pfalz       Tue Dec 21 12:13:28 2010 +0100
+@@ -1,12 +1,12 @@
+ # DVB-T Rheinland-Pfalz
+ # Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+-T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+-T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: SWR-RP, BR, hr, WDR
+-T 658000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH44: SWR-RP, BR, hr, WDR
++T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
++T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
++T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: SWR-RP, Bayerisches Fernsehen, hr, WDR
++T 658000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH44: SWR-RP, Bayerisches Fernsehen, hr, WDR
+ T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: Das Erste, arte, Phoenix, EinsPlus
+-T 690000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH48: SWR-RP, BR, hr, WDR
++T 690000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH48: SWR-RP, Bayerisches Fernsehen, hr, WDR
+ T 754000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH56: Das Erste, arte, Phoenix, EinsPlus
+ T 762000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH57: Das Erste, arte, Phoenix, EinsPlus
+ T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Das Erste, arte, Phoenix, EinsPlus
+diff -r af23d23c278b util/scan/dvb-t/de-Saarland
+--- a/util/scan/dvb-t/de-Saarland      Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/de-Saarland      Tue Dec 21 12:13:28 2010 +0100
+@@ -1,7 +1,7 @@
+ # DVB-T Saarland
+ # Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+ T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: Das Erste, SR Fernsehen, arte, Phoenix
+-T 658000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH44: SWR-RP, BR, hr, WDR
+-T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH49: SaarTV, Tele 5, QVC, BibelTV
++T 658000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH44: SWR-RP, Bayerisches Fernsehen, hr, WDR
++T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH49: Tele 5, QVC, Bibel.TV, freie Kapazität
+diff -r af23d23c278b util/scan/dvb-t/de-Sachsen
+--- a/util/scan/dvb-t/de-Sachsen       Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/de-Sachsen       Tue Dec 21 12:13:28 2010 +0100
+@@ -1,12 +1,14 @@
+ # DVB-T Sachsen
+ # Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 205500000 7MHz 2/3 NONE QAM64 8k 1/16 NONE # CH09: MDR-SN, rbb, BR, WDR
+-T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+ T 498000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH24: Das Erste, arte, Phoenix, EinsFestival
+ T 506000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH25: Das Erste, arte, Phoenix, EinsFestival
+-T 522000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH27: MDR-SN, rbb, BR, WDR
+-T 538000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH29: MDR-SN, rbb, BR, WDR
+-T 562000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH32: MDR-SN, rbb, BR, WDR
+-T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH27: MDR-SN, rbb, Bayerisches Fernsehen, WDR
++T 530000000 8MHz 3/4 NONE QAM16 8k 1/8 NONE # CH28: RTL, RTL 2, Super RTL, VOX, RTL Crime, Passion [Sendenorm: MPEG
++T 538000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH29: MDR-SN, rbb, Bayerisches Fernsehen, WDR
++T 554000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH31: LF Leipzg.Ferns., InfoTVLeipzig, BBCWorld, Bibel.TV, RadioLeipzig, RadioHoreb
++T 562000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH32: MDR-SN, rbb, Bayerisches Fernsehen, WDR
++T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH37: MDR-SN, rbb, Bayerisches Fernsehen, WDR
+ T 618000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH39: Das Erste, arte, Phoenix, EinsFestival
+diff -r af23d23c278b util/scan/dvb-t/de-Sachsen-Anhalt
+--- a/util/scan/dvb-t/de-Sachsen-Anhalt        Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/de-Sachsen-Anhalt        Tue Dec 21 12:13:28 2010 +0100
+@@ -1,12 +1,12 @@
+ # DVB-T Sachsen-Anhalt
+ # Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+ T 498000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH24: Das Erste, arte, Phoenix, EinsFestival
++T 530000000 8MHz 3/4 NONE QAM16 8k 1/8 NONE # CH28: RTL, RTL 2, Super RTL, VOX, RTL Crime, Passion [Sendenorm: MPEG-4]
+ T 538000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH29: Das Erste, arte, Phoenix, EinsFestival
+-T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+-T 554000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH31: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
++T 554000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH31: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+ T 578000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH34: MDR-ST, rbb, NDR, WDR
+-T 586000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH35: MDR-ST, rbb, NDR, WDR
+ T 610000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH38: MDR-ST, rbb, NDR, WDR
+ T 634000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH41: Das Erste, arte, Phoenix, EinsFestival
+diff -r af23d23c278b util/scan/dvb-t/de-Schleswig-Holstein
+--- a/util/scan/dvb-t/de-Schleswig-Holstein    Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/de-Schleswig-Holstein    Tue Dec 21 12:13:28 2010 +0100
+@@ -1,18 +1,18 @@
+ # DVB-T Schleswig-Holstein
+ # Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 474000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH21: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+-T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+-T 514000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH26: NDR SH, WDR/NDR NDS, MDR/NDR MVP, BR/NDR HH
+-T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: NDR SH, WDR/NDR NDS, MDR/NDR MVP, BR/NDR HH
+-T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: Pro7, Sat.1, Kabel1, N24
+-T 554000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH31: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 474000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH21: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
++T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
++T 498000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH24: NDR SH, WDR/NDR NDS, MDR/NDR MVP, BR Fernsehen/NDR HH
++T 514000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH26: Das Erste, arte, Phoenix, EinsExtra
++T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: NDR SH, WDR/NDR NDS, MDR/NDR MVP, BR Fernsehen/NDR HH
++T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ProSieben, Sat.1, Kabel1, N24
++T 554000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH31: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+ T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: Das Erste, arte, Phoenix, EinsExtra
+-T 586000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH35: Pro7, Sat.1, Kabel1, N24
+-T 618000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH39: NDR SH, WDR/NDR NDS, MDR/NDR MVP, BR/NDR HH
+-T 626000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH40: RTL, RTL II, Super RTL, VOX
+-T 666000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH45: RTL, RTL II, Super RTL, VOX
++T 586000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH35: ProSieben, Sat.1, Kabel1, N24
++T 618000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH39: NDR SH, WDR/NDR NDS, MDR/NDR MVP, BR Fernsehen/NDR HH
++T 626000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH40: RTL, RTL 2, Super RTL, VOX
++T 666000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH45: RTL, RTL 2, Super RTL, VOX
+ T 682000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH47: Das Erste, arte, Phoenix, EinsExtra
+-T 762000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH57: Neun live, Tele 5, Eurosport, MONA/DMAX
+-T 778000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH59: Neun live, Tele 5, Eurosport, MONA/DMAX
+-T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Das Erste, arte, Phoenix, EinsExtra
++T 762000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH57: 9Live, Tele 5, Eurosport, Bibel.TV
++T 778000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH59: 9Live, Tele 5, Eurosport, Bibel.TV
+diff -r af23d23c278b util/scan/dvb-t/de-Thueringen
+--- a/util/scan/dvb-t/de-Thueringen    Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/de-Thueringen    Tue Dec 21 12:13:28 2010 +0100
+@@ -2,9 +2,9 @@
+ # Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+ T 474000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH21: Das Erste, arte, Phoenix, EinsFestival
+-T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+ T 506000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH25: Das Erste, arte, Phoenix, EinsFestival
+-T 522000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH27: MDR-TH, rbb, hr, BR
+-T 690000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH48: MDR-TH, rbb, hr, BR
+-T 706000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH50: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH27: MDR-TH, rbb, hr, Bayerisches Fernsehen
++T 690000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH48: MDR-TH, rbb, hr, Bayerisches Fernsehen
++T 706000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH50: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+ T 730000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH53: Das Erste, arte, Phoenix, EinsFestival
+diff -r af23d23c278b util/scan/dvb-t/dk-All
+--- a/util/scan/dvb-t/dk-All   Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/dk-All   Tue Dec 21 12:13:28 2010 +0100
+@@ -2,16 +2,22 @@
+ # Created from http://www.digi-tv.dk/Indhold_og_tilbud/frekvenser.asp
+ # and http://www.digi-tv.dk/Sendenettets_opbygning/
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 482000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+ T 506000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+ T 538000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+ T 554000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+ T 602000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+ T 658000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+-T 682000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+-T 690000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 698000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+ T 714000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 730000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+ T 738000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+ T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+-T 826000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+-T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+diff -r af23d23c278b util/scan/dvb-t/es-Albacete
+--- a/util/scan/dvb-t/es-Albacete      Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/es-Albacete      Tue Dec 21 12:13:28 2010 +0100
+@@ -1,8 +1,14 @@
+-# Spain, Albacete
++# Spain, Albacete - Update 2010/08/12 (Freud)
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 59: La Primera, La 2, Canal 24H, Clan/TVE 50, RNE1, RNE Clásica, RNE 3
+-T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 63: CLMTV
+-T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 66: Veo, Veo 2, Net TV, Teledeporte
+-T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 67: Cuatro, CNN+, 40 Latino, La Sexta 1
+-T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 68: Telecinco, Telecinco Sport, Telecinco Estrellas, Fly Music
+-T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 69: Antena 3, Antena Neox, Antena Nova, La Sexta 2
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 37: La Regional, TCM, CRN
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 46: Sogecuatro, laSexta2, laSexta3 (Todos pendientes de asignar)
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 47: CNC, Vision6, ABTeVe, Punto Radio
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 50: Boing, La 10, MTV, Punto Radio
++T 730000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 53: Nitro, Marca TV, Veo13
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 56: TVE HD, Teledeporte, Pruebas TVE, RNE 1, RNE CLÁSICA, RNE 3
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 59: La 1, La 2, 24H, Clan, RNE1, RNE Clásica, RNE 3
++T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 63: CMT, CMT2, RCM
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 66: Veo7, Tienda en Veo, Intereconomía, AXN, Teledeporte, Radio Intereconomía, Radio Marca, esRadio, Vaughan Radio
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 67: Cuatro, CNN+, 40 Latino, Canal+ Dos, Canal Club, LaSexta, SER, 40 Principales, Cadena Dial
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 68: Telecinco, La Siete, FDF, CincoShop, Disney Channel, Punto Radio
++T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 69: Antena 3, Neox, Nova, Gol Televisión, Onda Cero, Europa FM, Onda Melodía 
+diff -r af23d23c278b util/scan/dvb-t/es-Alfabia
+--- a/util/scan/dvb-t/es-Alfabia       Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/es-Alfabia       Tue Dec 21 12:13:28 2010 +0100
+@@ -1,5 +1,8 @@
+ # DVB-T Alfabia, Mallorca, Balearic Islands, Spain.
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # TV3 Cat, 3/24, 33, Super3/300
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # TV Mallorca, Canal 4
++T 634000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Popular TV, TEVEi
+ T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C.63: 24h, 50 aniv., ClanTV, La 2, TVE1; RNE 1, RNE 3, RNE C; Digitext, EPG, Lanzadera.
+ T 826000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C.65: IB3, Aprenda Ingles TV
+ T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C.66: NetTV, Teledeporte, VeoTV1, VeoTV2.
+diff -r af23d23c278b util/scan/dvb-t/es-BaixoMinho
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/es-BaixoMinho    Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,16 @@
++# file automatically generated by w_scan
++# (http://wirbel.htpc-forum.de/w_scan/index2.html)
++#! <w_scan> 20090528 1 0 OFDM ES </w_scan>
++#------------------------------------------------------------------------------
++# location and provider: Baixo Minho, Pontevedra (Spain)
++# date (yyyy-mm-dd)    : 2009-07-11
++# provided by (opt)    : neonmann@gmail.com
++#
++# T[2] <freq> <bw> <fec_hi> <fec_lo> <mod> <tm> <guard> <hi> [# comment]
++#------------------------------------------------------------------------------
++T 834000000 8MHz  2/3 NONE    QAM64   8k  1/4 NONE      # SFN
++T 842000000 8MHz  2/3 NONE    QAM64   8k  1/4 NONE
++T 850000000 8MHz  2/3 NONE    QAM64   8k  1/4 NONE      # SFN
++T 858000000 8MHz  2/3 NONE    QAM64   8k  1/4 NONE
++T 770000000 8MHz  2/3 NONE    QAM64   8k  1/4 NONE      # RAR Pontevedra
++T 810000000 8MHz  2/3 NONE    QAM64   8k  1/4 NONE      # RGE GALICIA
+diff -r af23d23c278b util/scan/dvb-t/es-Collserola
+--- a/util/scan/dvb-t/es-Collserola    Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/es-Collserola    Tue Dec 21 12:13:28 2010 +0100
+@@ -1,10 +1,12 @@
+ # DVB-T Collserola (Barcelona)
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 514000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     #c26: BTV
+-T 570000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     #c33: CityTV
+-T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     #c61: TV3, K3/33, 3/24, 300
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     #c26: BTV, TV Badalona, TV L'Hospitalet, TV del Besòs, COM Ràdio, Ràdio Ciutat Badalona, Ràdio L'Hospitalet
++T 570000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     #c33: 8TV, Barça TV, EDC3, 105TV, RAC 1, RAC 105
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     #c43: TV3HD, 3/24, Canal 9, IB3, Catalunya Música, iCat FM
++T 690000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     #c48: Urbe TV, Canal Català, 25 TV, Localia, Ona FM, Onda Rambla, Sensació Ràdio
++T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     #c61: TV3, 33, 3/24, K3/300, Catalunya Ràdio, Catalunya Informació
+ T 818000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     #c64: TVE1, TVE2, TVE 24H, Clan/TVE 50 Años, RNE1, RNEC, RNE3
+-T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     #c66: Veo TV, Veo2, Net TV, Teledeporte
+-T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     #c67: Cuatro, CNN+, 40 Latino, La Sexta1
+-T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     #c68: Telecino, T5 Sport, T5 Estrellas, Fly Music
+-T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     #c69: Antena 3, Antena.Neox, Antena.Nova, La Sexta2
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     #c66: Veo7, Sony TV en Veo, Tienda en Veo, Intereconomía, Teledeporte, Radio Intereconomía, Radio Marca
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     #c67: Cuatro, CNN+, 40 Latino, La Sexta, Ser, 40 Principales, Cadena Dial
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     #c68: Telecino, La Siete, FDF, CincoShop, Disney Channel, Punto Radio
++T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     #c69: Antena 3, Antena.Neox, Antena.Nova, Hogar 10, Onda Cero, Europa FM, Onda Melodía
+diff -r af23d23c278b util/scan/dvb-t/es-Granada
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/es-Granada       Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,8 @@
++# Spain, Granada
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+diff -r af23d23c278b util/scan/dvb-t/es-Las_Palmas
+--- a/util/scan/dvb-t/es-Las_Palmas    Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/es-Las_Palmas    Tue Dec 21 12:13:28 2010 +0100
+@@ -1,8 +1,18 @@
+-# Funciona correctamente en Las Palmas de Gran Canaria (24-4-2007)
++# Funciona correctamente en Las Palmas de Gran Canaria (25-09-2010)
++# 
++# Revisada y corregida por el Grupo de Usuarios de Linux de Canarias
++# http://www.gulic.org
++#
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 530000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 28: TVE HD, Teledeporte, RNE Clásica, RNE 3
++T 562000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 32: Boing, Telecinco HD, La 10, MTV, Punto Radio
++T 586000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 35: Sogecuatro, LaSexta2, LaSexta3
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 38: Nitro, Antena 3 HD, Marca TV, Veo13
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 44: Canal 7 Gran Canaria, TIC Canal 8, Canal 4, RTI
++T 722000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 52: Localia, Nueve TV, Nueve Radio
+ T 786000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 60: TVE1, TVE2, 24H TVE, Clan/TVE, RNE, RNEC, RNE3, Lanzadera, EPG, Digitext, Meteo, Bolsa, Trafico, Empleat
+-T 826000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 65: TV C, TV C2
+-T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 66: Net TV, Teledeporte, Veo TV1, SETenVeo, Radio Intereconomía Lanzadera, EPG, Digitext, Meteo, Bolsa, Trafico, Empleat
+-T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 67: CNN+, Cuatro, La Sexta 1, 40 Latino TV, EPG Soge V2 5
+-T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 68: Fly Music, Punto Radio, Tele 5, Tele 5 Estrellas, Tele 5 Sport
+-T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 69: Antena 3, Antena.Neox, Antena.Nova, Telehit, Onda Cero, Europa FM, Onda Melodia, A3Lanzadera, A3Portal, EPGA3, A3Ticker
++T 826000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 65: TV C, TV C2, Antena 3 Canarias, Popular TV, Canarias Radio, Cope, Cadena 100, Radio ECCA, Lanzadera, Ticker, Piloto TDT
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 66: Veo7, Tienda en Veo, AXN, Intereconomia, Teledeporte, Radio Intereconomia, Radio Marca, esRadio, Vaughan Radio, Canal Ingeniería, GUIDE Plus +, C66Gancho, C66Lanzadera, C66EPG, EpgNet
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 67: Cuatro, CNN+, Canal+ Dos, Canal Club, laSexta, SER, 40 Principales, Cadena Dial, Lanzadera, EPG TDT, Ticker, Lanzadera, Noticias, EPG
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 68: Telecinco, La Siete, FDF, CincoShop, Disney Channel, T5Lanzadera, T5Digitext, Noticias, Tiempo, Bolsa, Tráfico
++T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 69: Antena 3, Neox, Nova, Gol Televisión, Onda Cero, Europa FM, Onda Melodía, tvtv DIGITAL, A3Lanzadera, A3Portal, A3EPG, A3Ticker, T-seniority, Gol Bar
+diff -r af23d23c278b util/scan/dvb-t/es-Pamplona
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/es-Pamplona      Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,9 @@
++# DVB-T Pamplona
++# T freq bw fec_hi fec_lo mod transm-mode guard-interval hierarchy
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 802000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+diff -r af23d23c278b util/scan/dvb-t/es-SC_Tenerife
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/es-SC_Tenerife   Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,18 @@
++# Funciona correctamente en Santa Cruz de Tenerife (25-09-2010)
++# 
++# Revisada y corregida por el Grupo de Usuarios de Linux de Canarias
++# http://www.gulic.org
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 490000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # C23
++T 498000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # C24
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # C26
++T 538000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # C29
++T 666000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # C45
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # C56
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # C59
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # C60
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # C66
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # C67
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # C68
++T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # C69
+diff -r af23d23c278b util/scan/dvb-t/es-Sevilla
+--- a/util/scan/dvb-t/es-Sevilla       Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/es-Sevilla       Tue Dec 21 12:13:28 2010 +0100
+@@ -1,7 +1,22 @@
+-# DVB-T Sevilla (Andalucia)                   by x2 15 Agosto 2006
++# DVB-T Sevilla (Spain) by x2 15-agos-2010, modificado 15-ago-2010
++#                                    thanks to http://www.tdt1.com
++#         thanks to http://wirbel.htpc-forum.de/w_scan/index2.html
+ # T freq bw fec_hi fec_lo mod transm-mode guard-interval hierarchy
++T 570000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE                  # C33
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE                  # C36
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE                  # C38
++T 634000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE                  # C41
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE                  # C44
++T 666000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE                  # C45
++T 698000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE                  # C49
++T 722000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE                  # C52
++T 738000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE                  # C54
++T 746000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE                  # C55
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE                  # C56
+ T 762000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE                  # C57
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE                  # C59
+ T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE                  # C61
++T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE                  # C63
+ T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE                  # C66
+ T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE                  # C67
+ T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE                  # C68
+diff -r af23d23c278b util/scan/dvb-t/es-Vitoria-Gasteiz
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/es-Vitoria-Gasteiz       Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,8 @@
++# Channel names in use at 2009/07/12, in Channel 66 [fffe] is a scrambled channel.
++# In the generated *channels.conf file could be necesary to change Intereconomía, Radio Intereconomía, ONDA MELODÍA to Intereconomia, Radio Intereconomia, ONDA MELODIA for Totem to work well.
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 58: ETB1, ETB2, ETB3, ETBSAT, Euskadi Irratia, Gaztea, EiTB Irratia, Radio Euskadi, Radio Vitoria
++T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 63: La 1, La 2, 24h, Clan, RNE1, RNEC, RNE3
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 66: Teledeporte, Canal Ingenieria, VEO7, SONY TV en VEO, Tienda en VEO, GUIDE PLUS+, Intereconomía, Radio Intereconomía, [fffe], RADIO MARCA
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 67: laSexta, CUATRO, CNN+, 40 LATINO, CANAL CLUB, SER, 40 PRINCIPALES, CADENA DIAL
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 68: Telecinco, FDF, LaSiete, Disney Channel, Cincoshop
++T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 69: ANTENA 3, ANTENA.NEOX, ANTENA.NOVA, ONDA CERO, EUROPA FM, ONDA MELODÍA, HOGAR 10
+diff -r af23d23c278b util/scan/dvb-t/fi-Smedsbole
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/fi-Smedsbole     Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,13 @@
++#------------------------------------------------------------------------------
++# file automatically generated by w_scan
++# (http://wirbel.htpc-forum.de/w_scan/index2.html)
++#! <w_scan> 20090808 2 0 OFDM FI </w_scan>
++#------------------------------------------------------------------------------
++# location and provider: Åland Smedsböle/Sund
++# date (yyyy-mm-dd)    : 2009-12-23
++# provided by (opt)    : k.hampf@gmail.com
++#
++# T[2] <freq> <bw> <fec_hi> <fec_lo> <mod> <tm> <guard> <hi> [# comment]
++#------------------------------------------------------------------------------
++T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE # Åland Network
++T 586000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE # Åland Network
+diff -r af23d23c278b util/scan/dvb-t/fr-Boulogne
+--- a/util/scan/dvb-t/fr-Boulogne      Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/fr-Boulogne      Tue Dec 21 12:13:28 2010 +0100
+@@ -1,24 +1,21 @@
+ # Boulogne - France (DVB-T transmitter of Boulogne ( MontLambert ) )
+ # Boulogne - France (signal DVB-T transmis depuis l'émetteur de MontLambert )
+ #
+-# ATTENTION ! Ce fichier a ete construit automatiquement a partir
+-# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
+-# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# Si vous constatez des problemes et voulez apporter des
+ # modifications au fichier, envoyez le fichier modifie a
+-# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
+-# ou a l'auteur du fichier :
+-# Nicolas Estre <n_estre@yahoo.fr>
++# l'adresse linux-media@vger.kernel.org (depot des fichiers d'init dvb)
+ #
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+ #### Boulogne - MontLambert ####
++# (Boulogne sur mer)
+ #R1
++T 530000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
+ T 586000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+-#R2
+-T 626000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+ #R3
+-T 666000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++T 634000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+ #R4
+-T 690000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++T 658000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+ #R5
+ T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+ #R6
+diff -r af23d23c278b util/scan/dvb-t/fr-Brest
+--- a/util/scan/dvb-t/fr-Brest Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/fr-Brest Tue Dec 21 12:13:28 2010 +0100
+@@ -2,8 +2,8 @@
+ # Emetteur du Roch Tredudon
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+ T 546000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE
+-T 482000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE
+-T 506000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE
+-T 490000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE
+-T 530000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE
+-T 514000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE
++T 578000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE
++T 586000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE
++T 618000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE
++T 650000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE
++T 770000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE
+diff -r af23d23c278b util/scan/dvb-t/fr-Chambery
+--- a/util/scan/dvb-t/fr-Chambery      Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/fr-Chambery      Tue Dec 21 12:13:28 2010 +0100
+@@ -1,30 +1,24 @@
+-# Chambéry - France (DVB-T transmitter of Chambéry ( Nondéfini ) )
+-# Chambéry - France (signal DVB-T transmis depuis l'émetteur de Nondéfini )
++# Chambery - France (DVB-T transmitter of Chambery )
++# Chambery - France (signal DVB-T transmis depuis l'emetteur de Chambery )
+ #
+-# ATTENTION ! Ce fichier a ete construit automatiquement a partir
+-# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
+-# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# Ce fichier a ete ecrit par Yann Soubeyrand (04/2010)
++# Si vous constatez des problemes et voulez apporter des
+ # modifications au fichier, envoyez le fichier modifie a
+ # l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
+-# ou a l'auteur du fichier :
++# ou au mainteneur du fichier :
+ # Nicolas Estre <n_estre@yahoo.fr>
+ #
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-#### Chambéry - Nondéfini ####
+-#R1
+-#T FREQ1 8MHz AUTO NONE QAM64 8k AUTO NONE
+-#R2
+-#T FREQ2 8MHz AUTO NONE QAM64 8k AUTO NONE
+-#R3
+-#T FREQ3 8MHz AUTO NONE QAM64 8k AUTO NONE
+-#R4
+-#T FREQ4 8MHz AUTO NONE QAM64 8k AUTO NONE
+-#R5
+-#T FREQ5 8MHz AUTO NONE QAM64 8k AUTO NONE
+-#R6
+-#T FREQ6 8MHz AUTO NONE QAM64 8k AUTO NONE
+-##############################################################
+-# en Avril 2006, l'emetteur pour Chambéry n'etait pas defini
+-#  Vous devez donc modifier les frequences manuellement.
+-# SVP Renvoyez le fichier mis a jour aux contacts ci-dessus.
+-##############################################################
++#### Chambery - Defini par Alex le 23/05/2008 pour l'emetteur des monts
++# R1 canal 62
++T 802167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# R2 canal 48
++T 690167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# R3 canal 51
++T 714167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# R4 canal 54
++T 738167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# R5 canal 59
++T 778167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# R6 canal 47
++T 682167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -r af23d23c278b util/scan/dvb-t/fr-Laval
+--- a/util/scan/dvb-t/fr-Laval Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/fr-Laval Tue Dec 21 12:13:28 2010 +0100
+@@ -12,14 +12,14 @@
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+ #### Laval - MontRochard ####
+ #R1
+-T 778000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+ #R2
+-T 610000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++T 570000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+ #R3
+-T 754000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+ #R4
+-T 794000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+ #R5
+-T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+ #R6
+-T 802000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -r af23d23c278b util/scan/dvb-t/fr-Lille
+--- a/util/scan/dvb-t/fr-Lille Sat Jun 20 16:47:55 2009 +0200
++++ /dev/null  Thu Jan 01 00:00:00 1970 +0000
+@@ -1,30 +0,0 @@
+-# Lille - France (DVB-T transmitter of Lille ( Nondéfini ) )
+-# Lille - France (signal DVB-T transmis depuis l'émetteur de Nondéfini )
+-#
+-# ATTENTION ! Ce fichier a ete construit automatiquement a partir
+-# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
+-# en Avril 2006. Si vous constatez des problemes et voulez apporter des
+-# modifications au fichier, envoyez le fichier modifie a
+-# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
+-# ou a l'auteur du fichier :
+-# Nicolas Estre <n_estre@yahoo.fr>
+-#
+-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-#### Lille - Nondéfini ####
+-#R1
+-#T FREQ1 8MHz AUTO NONE QAM64 8k AUTO NONE
+-#R2
+-#T FREQ2 8MHz AUTO NONE QAM64 8k AUTO NONE
+-#R3
+-#T FREQ3 8MHz AUTO NONE QAM64 8k AUTO NONE
+-#R4
+-#T FREQ4 8MHz AUTO NONE QAM64 8k AUTO NONE
+-#R5
+-#T FREQ5 8MHz AUTO NONE QAM64 8k AUTO NONE
+-#R6
+-#T FREQ6 8MHz AUTO NONE QAM64 8k AUTO NONE
+-##############################################################
+-# en Avril 2006, l'emetteur pour Lille n'etait pas defini
+-#  Vous devez donc modifier les frequences manuellement.
+-# SVP Renvoyez le fichier mis a jour aux contacts ci-dessus.
+-##############################################################
+diff -r af23d23c278b util/scan/dvb-t/fr-Lille-Bouvigny
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/fr-Lille-Bouvigny        Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,26 @@
++# Lille - France (DVB-T transmitter of Lille ( Bouvigny ) )
++# Lille - France (signal DVB-T transmis depuis l'emetteur de Bouvigny )
++#
++# Fichier construit par Romain Bajeux (05/2010)
++# Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou au mainteneur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Lille - Bouvigny ####
++#R1
++T 490167000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 690167000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 514167000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 546167000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 554167000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 586167000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#Belge
++T 754167000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -r af23d23c278b util/scan/dvb-t/fr-LilleT2
+--- a/util/scan/dvb-t/fr-LilleT2       Sat Jun 20 16:47:55 2009 +0200
++++ /dev/null  Thu Jan 01 00:00:00 1970 +0000
+@@ -1,13 +0,0 @@
+-# Lille - France (DVB-T transmitter of Lambersart)
+-#offset of 167000 for Cinergy T2. Other type of card users need to replace 167 by 000
+-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-#R2
+-T 538167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+-#R4
+-T 546167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+-#R3
+-T 562167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+-#R6
+-T 586167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+-#R1
+-T 594167000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+diff -r af23d23c278b util/scan/dvb-t/fr-Montbeliard
+--- a/util/scan/dvb-t/fr-Montbeliard   Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/fr-Montbeliard   Tue Dec 21 12:13:28 2010 +0100
+@@ -1,18 +1,18 @@
+-# Montbéliard - France (DVB-T transmitter of Montbéliard "Fort Lachaux" )
+-# Montbéliard - France (signal DVB-T transmis depuis l'émetteur de Fort Lachaux )
++# Montbéliard - France (DVB-T transmitter of Montbéliard "Fort Lachaux", since 16 nov. 2010)
++# Montbéliard - France (signal DVB-T transmis depuis l'émetteur de Fort Lachaux, à compter du 16/11/2010)
+ #
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-# multiplex R1 (GR1), canal 29V + offset 167000 : FRANCE 2 SD , FRANCE 5 , ARTE SD , La Chaîne Parlementaire/Public Sénat , FRANCE 3 , FRANCE 3 Franche-Comté
++# multiplex R4 (MULTI4), canal 58V + offset 167000 : ARTE HD , PARIS PREMIERE, M6 SD , W9 et NT1
++T 490167000 8MHz AUTO NONE QAM64 8k AUTO NONE
++# multiplex R6 (SMR6), canal 26V + offset 167000 : TF1 SD , NRJ 12 , EUROSPORT, LCI, TMC et TF6
++T 514167000 8MHz AUTO NONE QAM64 8k AUTO NONE
++# multiplex R5 (MR5), canal 29 : TF1 HD , France 2 HD et M6HD
+ T 538167000 8MHz AUTO NONE QAM64 8k AUTO NONE
+-# multiplex R3 (CNH), canal 43V + offset 167000 : CANAL+ , CANAL+HD , CANAL+ CINEMA , CANAL+ SPORT , PLANETE , CANAL J et TPS STAR
+-T 650167000 8MHz AUTO NONE QAM64 8k AUTO NONE
+-# multiplex R2 (NTN), canal 55V + offset 167000 : DIRECT 8 , BFM TV , I>TELE , FRANCE 4 , VIRGIN 17 , GULLI et France 4
+-T 746167000 8MHz AUTO NONE QAM64 8k AUTO NONE
+-# multiplex R6 (SMR6), canal 32V + offset 167000 : TF1 SD , NRJ 12 , TMC , EUROSPORT , LCI et TF6
+-T 562167000 8MHz AUTO NONE QAM64 8k AUTO NONE
+-# Télévision Suisse, canal 56V + offset 000000 : TSR1 , TSR2 , TSI1 et SF 1
++# multiplex R2 (NTN), canal 55V + offset 167000 : Direct 8 , BFM TV , i>TELE , DirectStar , Gulli et France 4
++T 658167000 8MHz AUTO NONE QAM64 8k AUTO NONE
++# multiplex R3 (CNH), canal 54V + offset 167000 : CANAL+ , CANAL+ CINEMA , CANAL+ SPORT , PLANETE et TPS STAR
++T 738167000 8MHz AUTO NONE QAM64 8k AUTO NONE
++# Télévision Suisse, canal 56V + offset 000000 : SF1, TSR1 , TSR2 et RSI LA 1
+ T 754000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+-# multiplex R4 (MULTI4), canal 58V + offset 167000 : ARTE HD , PARIS PREMIERE, M6 SD , W9 , NT1
+-T 770167000 8MHz AUTO NONE QAM64 8k AUTO NONE
+-# multiplex R5 (???), canal ??? : TF1 HD , FRANCE 2 HD, M6 HD
+-# canal d'émission pas encore défini (février 2009)
++# multiplex R1 (GR1), canal 60V + offset 167000 : France 2 SD , France 5 , France Ô , LCP et France 3
++T 786167000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -r af23d23c278b util/scan/dvb-t/fr-Nantes
+--- a/util/scan/dvb-t/fr-Nantes        Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/fr-Nantes        Tue Dec 21 12:13:28 2010 +0100
+@@ -1,8 +1,9 @@
+ # Nantes - France
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 498000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+-T 506000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+-T 522000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+-T 530000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+-T 658000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+-T 802000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 682000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++T 490000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++T 546000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++T 658000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++T 538000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++T 754000000 8MHz AUTO NONE QAM16 8k AUTO NONE
+diff -r af23d23c278b util/scan/dvb-t/fr-Poitiers
+--- a/util/scan/dvb-t/fr-Poitiers      Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/fr-Poitiers      Tue Dec 21 12:13:28 2010 +0100
+@@ -12,14 +12,12 @@
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+ #### Poitiers - Agglomération ####
+ #R1
+-T 706000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++T 506000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+ #R2
+-T 778000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++T 546000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+ #R3
+-T 802000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++T 722000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+ #R4
+-T 730000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+-#R5
++T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6 (no R5)
+ T 754000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+-#R6
+-T 794000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -r af23d23c278b util/scan/dvb-t/fr-Reims
+--- a/util/scan/dvb-t/fr-Reims Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/fr-Reims Tue Dec 21 12:13:28 2010 +0100
+@@ -1,25 +1,21 @@
+ # Reims - France (DVB-T transmitter of Reims ( Hautvillers ) )
+ # Reims - France (signal DVB-T transmis depuis l'émetteur de Hautvillers )
+ #
+-# ATTENTION ! Ce fichier a ete construit automatiquement a partir
+-# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
+-# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# Si vous constatez des problemes et voulez apporter des
+ # modifications au fichier, envoyez le fichier modifie a
+ # l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
+-# ou a l'auteur du fichier :
+-# Nicolas Estre <n_estre@yahoo.fr>
+ #
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+ #### Reims - Hautvillers ####
+ #R1
+-T 562000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++T 626000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+ #R2
+-T 554000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++T 650000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+ #R3
+-T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++T 666000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+ #R4
+-T 578000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++T 674000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+ #R5
+-T 666000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++T 730000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+ #R6
+-T 642000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++T 754000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -r af23d23c278b util/scan/dvb-t/fr-Rochefort-sur-mer
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/fr-Rochefort-sur-mer     Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,14 @@
++# TNT à Rochefort (17)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++
++#multiplex 6 ( TF1 LCI Eurosport TF6 NRJ12 TMC )
++T 498166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++
++#multiplex 4 ( M6 W9 NT1 Paris Première ARTE HD )
++T 738166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++
++#multiplex 1 ( France 2 France 3 France 5 ARTE LCP Chaîne locale ou France Ô )
++T 602166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++
++#multiplex 2 ( Direct 8 France 4 BFM TV Virgin 17 Gulli i>Télé  )
++T 778167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -r af23d23c278b util/scan/dvb-t/fr-Tours
+--- a/util/scan/dvb-t/fr-Tours Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/fr-Tours Tue Dec 21 12:13:28 2010 +0100
+@@ -1,25 +1,11 @@
+-# Tours - France (DVB-T transmitter of Tours ( Chissay ) )
+-# Tours - France (signal DVB-T transmis depuis l'émetteur de Chissay )
+-#
+-# ATTENTION ! Ce fichier a ete construit automatiquement a partir
+-# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
+-# en Avril 2006. Si vous constatez des problemes et voulez apporter des
+-# modifications au fichier, envoyez le fichier modifie a
+-# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
+-# ou a l'auteur du fichier :
+-# Nicolas Estre <n_estre@yahoo.fr>
++# Tours (Chissay) - France
++# Initial DVB-T tuning as of 19 october 2010
+ #
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-#### Tours - Chissay ####
+-#R1
+-T 578000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+-#R2
+-T 610000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+-#R3
+-T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+-#R4
+-T 690000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+-#R5
+-T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+-#R6
+-T 714000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++T 498000000 8MHz AUTO NONE AUTO AUTO AUTO NONE
++T 578000000 8MHz AUTO NONE AUTO AUTO AUTO NONE
++T 602000000 8MHz AUTO NONE AUTO AUTO AUTO NONE
++T 610000000 8MHz AUTO NONE AUTO AUTO AUTO NONE
++T 690000000 8MHz AUTO NONE AUTO AUTO AUTO NONE
++T 714000000 8MHz AUTO NONE AUTO AUTO AUTO NONE
++
+diff -r af23d23c278b util/scan/dvb-t/gr-Athens
+--- a/util/scan/dvb-t/gr-Athens        Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/gr-Athens        Tue Dec 21 12:13:28 2010 +0100
+@@ -1,3 +1,5 @@
+ # Initial scan config for Digital DVB-T (Ert) in Athens Greece
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 674000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE     # Digea DVB-T
++T 682000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE     # Digea DVB-T
+ T 690000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+diff -r af23d23c278b util/scan/dvb-t/hr-All
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/hr-All   Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,30 @@
++# Croatia, whole country
++# Created from http://www.oiv.hr/broadcasting/tables/dtv_hr.aspx
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 474000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE # D1 MUXD
++T 490000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE # D2 MUXA
++T 506000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE # D4 MUXA
++T 530000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE # D5 MUXA, D9 MUXD
++T 538000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE # D5 MUXD
++T 546000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE # D6 MUXA
++T 554000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE # D7 MUXD
++T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE # D1 MUXC
++T 570000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE # D8 MUXA
++T 578000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE # D8 MUXD
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE # D5 MUXC
++T 594000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE # D3 MUXD
++T 610000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE # D1 MUXA
++T 618000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE # D2 MUXB
++T 642000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE # D4 MUXD
++T 658000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE # D1 MUXB, D3 MUXA
++T 666000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # SLO MUXA
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE # D8 MUXC
++T 674000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE # D8 MUXD
++T 690000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE # D3 MUXB, D4 MUXB
++T 714000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE # D7 MUXA, D9 MUXA
++T 730000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE # D5 MUXB, D8 MUXB
++T 738000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE # D6 MUXB
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE # D4 MUXC
++T 762000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE # Tusti Vrh MUXD
++T 770000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE # D2 MUXD
++T 778000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE # D7 MUXB, D9 MUXB
+diff -r af23d23c278b util/scan/dvb-t/hr-Zagreb
+--- a/util/scan/dvb-t/hr-Zagreb        Sat Jun 20 16:47:55 2009 +0200
++++ /dev/null  Thu Jan 01 00:00:00 1970 +0000
+@@ -1,3 +0,0 @@
+-# DVB-T Hamburg
+-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 522000000 8MHz 3/4 NONE AUTO 8k 1/32 NONE     # CH27:
+diff -r af23d23c278b util/scan/dvb-t/hu-Budapest
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/hu-Budapest      Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,8 @@
++# Hungary / Budapest
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# A1.multiplex UHF-55:
++# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
++T 746000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
++# C.multiplex UHF-62:
++# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
++T 802000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+diff -r af23d23c278b util/scan/dvb-t/hu-Debrecen
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/hu-Debrecen      Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,8 @@
++# Hungary / Debrecen
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# A1.multiplex UHF-46:
++# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
++T 714000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
++# C.multiplex UHF-62:
++# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
++T 802000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+diff -r af23d23c278b util/scan/dvb-t/hu-Gyor
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/hu-Gyor  Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,8 @@
++# Hungary / Gyor
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# A1.multiplex UHF-42:
++# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
++T 642000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
++# C.multiplex UHF-61:
++# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
++T 794000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+diff -r af23d23c278b util/scan/dvb-t/hu-Kabhegy
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/hu-Kabhegy       Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,8 @@
++# Hungary / Kabhegy
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# C.multiplex UHF-61:
++# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
++T 794000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
++# A2.multiplex UHF-64:
++# MTV-1 HD Sopron, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
++T 818000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+diff -r af23d23c278b util/scan/dvb-t/hu-Kekes
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/hu-Kekes Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,8 @@
++# Hungary / Kekes
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# A1.multiplex UHF-44:
++# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
++T 658000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
++# C.multiplex UHF-69:
++# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
++T 858000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+diff -r af23d23c278b util/scan/dvb-t/hu-Kiskoros
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/hu-Kiskoros      Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,8 @@
++# Hungary / Kiskoros
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# A1.multiplex UHF-45:
++# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
++T 666000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
++# C.multiplex UHF-68:
++# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
++T 850000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+diff -r af23d23c278b util/scan/dvb-t/hu-Nagykanizsa-Ujudvar
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/hu-Nagykanizsa-Ujudvar   Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,8 @@
++# Hungary / Nagykanizsa / Ujudvar
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# A1.multiplex UHF-24:
++# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
++T 498000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
++# C.multiplex UHF-65:
++# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
++T 826000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+diff -r af23d23c278b util/scan/dvb-t/hu-Pecs
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/hu-Pecs  Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,8 @@
++# Hungary / Pecs
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# A1.multiplex UHF-52:
++# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
++T 722000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
++# C.multiplex UHF-67:
++# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
++T 842000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+diff -r af23d23c278b util/scan/dvb-t/hu-Szeged
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/hu-Szeged        Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,8 @@
++# Hungary / Szeged
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# A1.multiplex UHF-60:
++# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
++T 786000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
++# C.multiplex UHF-65:
++# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
++T 826000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+diff -r af23d23c278b util/scan/dvb-t/hu-Szentes
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/hu-Szentes       Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,8 @@
++# Hungary / Szentes
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# A3.multiplex UHF-60:
++# MTV-1 HD Szeged, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
++T 786000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
++# C.multiplex UHF-65:
++# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
++T 826000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+diff -r af23d23c278b util/scan/dvb-t/hu-Tokaj
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/hu-Tokaj Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,8 @@
++# Hungary / Tokaj
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# A1.multiplex UHF-68:
++# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
++T 850000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
++# C.multiplex UHF-63:
++# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
++T 810000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+diff -r af23d23c278b util/scan/dvb-t/hu-Uzd
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/hu-Uzd   Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,8 @@
++# Hungary / Uzd
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# A1.multiplex UHF-52:
++# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
++T 722000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
++# C.multiplex UHF-67:
++# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
++T 842000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+diff -r af23d23c278b util/scan/dvb-t/hu-Vasvar-Hegyhatsal
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/hu-Vasvar-Hegyhatsal     Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,8 @@
++# Hungary / Vasvar / Hegyhatsal
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# A1.multiplex UHF-58:
++# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
++T 770000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
++# C.multiplex UHF-68:
++# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
++T 850000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+diff -r af23d23c278b util/scan/dvb-t/il-All
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/il-All   Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,5 @@
++# Israel, Israel Broadcasting Authority's transmitters
++# Generated from list in http://www.iba.org.il/reception/
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 514000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE
++T 538000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE
+diff -r af23d23c278b util/scan/dvb-t/ir-Tehran
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/ir-Tehran        Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,4 @@
++# DVB-T Tehran
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE # IRIB-TV1/2/3/4/5, IRINN, AMOUZESH, QURAN-TV
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE # PRESS TV, AL-ALAM, AL-KOUSAR, JAAMEJAM 1, IRIB MOSTANAD, IRIB OSTANI
+diff -r af23d23c278b util/scan/dvb-t/is-Reykjavik
+--- a/util/scan/dvb-t/is-Reykjavik     Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/is-Reykjavik     Tue Dec 21 12:13:28 2010 +0100
+@@ -1,13 +1,29 @@
+-# Initial scan config for Digital Ísland in Iceland
+-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 682000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+-T 690000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+-T 698000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+-T 706000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+-T 714000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+-T 738000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+-T 754000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+-T 762000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+-T 778000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+-T 794000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+-T 818000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#------------------------------------------------------------------------------
++# file automatically generated by w_scan
++# (http://wirbel.htpc-forum.de/w_scan/index2.html)
++#! <w_scan> 20100316 1 0 OFDM IS </w_scan>
++#------------------------------------------------------------------------------
++# location and provider: <add description here>
++# date (yyyy-mm-dd)    : 2010-10-22
++# provided by (opt)    : <your name or email here>
++#
++# T[2] <freq> <bw> <fec_hi> <fec_lo> <mod> <tm> <guard> <hi> [# comment]
++#------------------------------------------------------------------------------
++T 522000000 8MHz  2/3 NONE    QAM64   8k 1/16 NONE
++T 530000000 8MHz  2/3 NONE    QAM64   8k 1/16 NONE    # Vodafone
++T 538000000 8MHz  2/3 NONE    QAM64   8k 1/16 NONE
++T 674000000 8MHz  2/3 NONE    QAM64   8k 1/32 NONE    # Vodafone
++T 770000000 8MHz  1/2 NONE    QAM64   2k 1/32 NONE    # Vodafone
++T 690000000 8MHz  2/3 NONE    QAM64   8k 1/32 NONE    # Vodafone
++T 722000000 8MHz  2/3 NONE    QAM64   8k 1/32 NONE    # Vodafone
++T 738000000 8MHz  1/2 NONE     QPSK   2k 1/32 NONE    # Vodafone
++T 754000000 8MHz  2/3 NONE    QAM64   8k 1/32 NONE    # Vodafone
++T 762000000 8MHz  2/3 NONE    QAM64   8k 1/32 NONE    # Vodafone
++T 778000000 8MHz  2/3 NONE    QAM64   8k 1/32 NONE    # Vodafone
++T 818000000 8MHz  2/3 NONE    QAM64   8k 1/32 NONE    # Vodafone
++T 714000000 8MHz  2/3 NONE    QAM64   8k 1/32 NONE    # Vodafone
++T 682000000 8MHz  2/3 NONE    QAM64   8k 1/32 NONE    # Vodafone
++T 698000000 8MHz  2/3 NONE    QAM64   8k 1/32 NONE    # Vodafone
++T 706000000 8MHz  2/3 NONE    QAM64   8k 1/32 NONE    # Vodafone
++T 794000000 8MHz  2/3 NONE    QAM64   8k 1/32 NONE    # Vodafone
++T 802000000 8MHz  2/3 NONE    QAM64   8k 1/32 NONE    # Vodafone
+diff -r af23d23c278b util/scan/dvb-t/it-Milano
+--- a/util/scan/dvb-t/it-Milano        Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/it-Milano        Tue Dec 21 12:13:28 2010 +0100
+@@ -1,15 +1,49 @@
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+ # MUX-A RAI
+-T 818000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 800000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 490000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+ # MUX-B RAI
+ T 482000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+ # MUX-A MEDIASET
+ T 842000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+ # MUX-A MEDIASET-2
+ T 618000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MEDIASET LA 5 
++T 538000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+ # MUX La7/MTV
+-T 506000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 802000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+ # MUX DFREE
+ T 706000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+ # MUX DFREE 2
+ T 538000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX RETE A
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX STUDIO1
++T 184500000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX STUDIO NORD
++T 191500000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX VIDEO STAR NOVARA
++T 219500000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX TELENOVA
++T 474000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX TELE 7 LAGHI 
++T 495250000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX VIDEO BERGAMO
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX TELE MILANO
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# RETE 55
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# TELE LIBERTA'
++T 735250000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# RSI
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# TELE COLOR PRIMARETE
++T 783250000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# TELESTAR
++T 807250000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 810000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# TELECAMPIONE
++T 847250000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -r af23d23c278b util/scan/dvb-t/it-Montevergine
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/it-Montevergine  Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,18 @@
++# DVB-T Montevergine (Avellino) 83100
++# 12/12/2009 by Antonio Galasso anto1714@libero.it
++# (ricordati di mettere il lettore in posizione stop orima di iniziare la scansione dei canali)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# C-MUX
++T 177500000 7MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 482000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 498000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 530000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 554000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 690000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 698000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+diff -r af23d23c278b util/scan/dvb-t/lt-All
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/lt-All   Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,39 @@
++# Lithuania, whole country
++# Created from http://www.skaitmenine.lt/lt/skaitmenine_tv_lietuvoje/antzemine_dvb_t.html
++# Created by baruse@gmail.com
++
++# LRTC I tinklas
++T 482000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 22
++T 514000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 26
++T 618000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 39
++T 658000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 44
++T 682000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 47
++T 762000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 57
++T 770000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 58
++T 786000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 60
++T 794000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 61
++
++# LRTC II tinklas
++T 570000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 33
++T 610000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 38
++T 690000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 48
++T 738000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 54
++T 802000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 62
++T 810000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 63
++T 818000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 64
++
++# TEO LT I tinklas
++T 594000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 36
++T 706000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 50
++T 778000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 59
++T 826000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 65
++
++# TEO LT II tinklas
++T 474000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 21
++T 546000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 30
++T 730000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 53
++#T 786000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 60
++
++# Vilniui bonusas
++T 602000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 37
++#T 730000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 53
+diff -r af23d23c278b util/scan/dvb-t/ro-Bucharest
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/ro-Bucharest     Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,5 @@
++# Romania / Bucharest
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 546000000 8MHz 2/3 NONE QAM16 8k 1/16 NONE
++T 738000000 8MHz 2/3 NONE QAM64 8k 1/16 NONE # SRTV
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/16 NONE # SNR DVB-T
+diff -r af23d23c278b util/scan/dvb-t/se-Horby_Sallerup
+--- a/util/scan/dvb-t/se-Horby_Sallerup        Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/se-Horby_Sallerup        Tue Dec 21 12:13:28 2010 +0100
+@@ -2,6 +2,8 @@
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+ T 482000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+ T 506000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 570000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+ T 634000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 650000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+ T 818000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+ T 794000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+diff -r af23d23c278b util/scan/dvb-t/se-Ornskoldsvik_As
+--- a/util/scan/dvb-t/se-Ornskoldsvik_As       Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/se-Ornskoldsvik_As       Tue Dec 21 12:13:28 2010 +0100
+@@ -4,3 +4,4 @@
+ T 474000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+ T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+ T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -r af23d23c278b util/scan/dvb-t/se-Skelleftea
+--- a/util/scan/dvb-t/se-Skelleftea    Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/se-Skelleftea    Tue Dec 21 12:13:28 2010 +0100
+@@ -4,3 +4,4 @@
+ T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+ T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+ T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -r af23d23c278b util/scan/dvb-t/si-Ljubljana
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/si-Ljubljana     Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,5 @@
++# Slovenia / Ljubljana
++# MULTIPLEX A
++#------------------------------------------
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -r af23d23c278b util/scan/dvb-t/sk-BanskaBystrica
+--- a/util/scan/dvb-t/sk-BanskaBystrica        Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/sk-BanskaBystrica        Tue Dec 21 12:13:28 2010 +0100
+@@ -1,4 +1,11 @@
+ # DVB-T Banska Bystrica (Banska Bystrica, Slovak Republic)
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++# 1.st multiplex - on channel 65
++T 826000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++
++# 2.st multiplex (commercial) - on channel 51
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++
++# 3.st multiplex (public) - on channel 33
++T 570000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+diff -r af23d23c278b util/scan/dvb-t/sk-Bardejov
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/sk-Bardejov      Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,11 @@
++# DVB-T Bardejov (Bardejov, Slovak Republic)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++
++# 1.st multiplex - on channel 62
++T 802000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++
++# 2.st multiplex (commercial) - on channel 40
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++
++# 3.st multiplex (public) - on channel 54
++T 738000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+diff -r af23d23c278b util/scan/dvb-t/sk-Bratislava
+--- a/util/scan/dvb-t/sk-Bratislava    Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/sk-Bratislava    Tue Dec 21 12:13:28 2010 +0100
+@@ -1,4 +1,11 @@
+ # DVB-T Bratislava (Bratislava, Slovak Republic)
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 834000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++# 1.st multiplex - on channel 66
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++
++# 2.st multiplex (commercial) - on channel 56
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++
++# 3.st multiplex (public) - on channel 27
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+diff -r af23d23c278b util/scan/dvb-t/sk-Kosice
+--- a/util/scan/dvb-t/sk-Kosice        Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/sk-Kosice        Tue Dec 21 12:13:28 2010 +0100
+@@ -1,4 +1,11 @@
+ # DVB-T Kosice (Kosice, Slovak Republic)
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++# 1.st multiplex - on channel 64
++T 818000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++
++# 2.st multiplex (commercial) - on channel 59
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++
++# 3.st multiplex (public) - on channel 25
++T 506000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+diff -r af23d23c278b util/scan/dvb-t/sk-Michalovce
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/sk-Michalovce    Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,11 @@
++# DVB-T Michalovce (Michalovce, Slovak Republic)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++
++# 1.st multiplex - on channel 64
++T 818000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++
++# 2.st multiplex (commercial) - on channel 59
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++
++# 3.st multiplex (public) - on channel 25
++T 506000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+diff -r af23d23c278b util/scan/dvb-t/sk-Namestovo
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/sk-Namestovo     Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,11 @@
++# DVB-T Namestovo (Namestovo, Slovak Republic)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++
++# 1.st multiplex - on channel 68
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++
++# 2.st multiplex (commercial) - on channel 59
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++
++# 3.st multiplex (public) - on channel 26
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+diff -r af23d23c278b util/scan/dvb-t/sk-Poprad
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/sk-Poprad        Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,11 @@
++# DVB-T Poprad (Poprad, Slovak Republic)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++
++# 1.st multiplex - on channel 66
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++
++# 2.st multiplex (commercial) - on channel 55
++T 746000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++
++# 3.st multiplex (public) - on channel 24
++T 498000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+diff -r af23d23c278b util/scan/dvb-t/sk-RimavskaSobota
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/sk-RimavskaSobota        Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,11 @@
++# DVB-T Rimavska Sobota (Rimavska Sobota, Slovak Republic)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++
++# 1.st multiplex - on channel 61
++T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++
++# 2.st multiplex (commercial) - on channel 27
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++
++# 3.st multiplex (public) - on channel 54
++T 738000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+diff -r af23d23c278b util/scan/dvb-t/sk-Trencin
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/sk-Trencin       Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,12 @@
++# DVB-T Trencin (Trencin, Slovak Republic)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++
++# 1.st multiplex - on channel 69
++T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++
++# 2.st multiplex (commercial) - on channel 52/56
++T 722000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++
++# 3.st multiplex (public) - on channel 57
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+diff -r af23d23c278b util/scan/dvb-t/sk-VelkyKrtis
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/sk-VelkyKrtis    Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,11 @@
++# DVB-T Velky Krtis (Velky Krtis, Slovak Republic)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++
++# 1.st multiplex - on channel 65
++T 826000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++
++# 2.st multiplex (commercial) - on channel 60
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++
++# 3.st multiplex (public) - on channel 33
++T 570000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+diff -r af23d23c278b util/scan/dvb-t/sk-Zilina
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/sk-Zilina        Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,11 @@
++# DVB-T Zilina (Zilina, Slovak Republic)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++
++# 1.st multiplex - on channel 68
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++
++# 2.st multiplex (commercial) - on channel 52
++T 722000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++
++# 3.st multiplex (public) - on channel 32
++T 562000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+diff -r af23d23c278b util/scan/dvb-t/uk-Aberdare
+--- a/util/scan/dvb-t/uk-Aberdare      Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/uk-Aberdare      Tue Dec 21 12:13:28 2010 +0100
+@@ -2,9 +2,14 @@
+ # Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
+ # and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 530167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+-T 562167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
+-T 489833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
+-T 513833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+-T 538167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+-T 570167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++
++T 474167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 482167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 497833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 506167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 521833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 530167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++
++
++#C21+ C22+    C24-    C25+    C27-    C28+
++
+diff -r af23d23c278b util/scan/dvb-t/uk-Redruth
+--- a/util/scan/dvb-t/uk-Redruth       Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/uk-Redruth       Tue Dec 21 12:13:28 2010 +0100
+@@ -2,9 +2,12 @@
+ # Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
+ # and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 618000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+-T 642167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
+-T 666167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
+-T 697833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 474167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 497833000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 506167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 521833000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 634167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+ T 650167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+-T 705833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 658167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 690000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -r af23d23c278b util/scan/dvb-t/uk-StocklandHill
+--- a/util/scan/dvb-t/uk-StocklandHill Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/uk-StocklandHill Tue Dec 21 12:13:28 2010 +0100
+@@ -1,10 +1,9 @@
+ # UK, Stockland Hill
+-# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
+-# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# http://www.ukfree.tv/txdetail.php?a=ST222014
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 481833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+-T 529833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
+-T 505833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
+-T 561833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+-T 546167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+-T 578167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 514167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE     # PSB1
++T 490167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE     # PSB2
++#T 538167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE     # PSB3 (DVB-T2)
++T 505833000 8MHz 2/3 NONE QAM64 8k 1/32 NONE     # COM4
++T 481833000 8MHz 2/3 NONE QAM64 8k 1/32 NONE     # COM5
++T 529833000 8MHz 2/3 NONE QAM64 8k 1/32 NONE     # COM6
+diff -r af23d23c278b util/scan/dvb-t/uk-Storeton
+--- a/util/scan/dvb-t/uk-Storeton      Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/uk-Storeton      Tue Dec 21 12:13:28 2010 +0100
+@@ -2,9 +2,12 @@
+ # Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
+ # and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 546167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+-T 578167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
+-T 490167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
+-T 514167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+-T 538167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+-T 570167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 490000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 506000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 530000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 538000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 730000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -r af23d23c278b util/scan/dvb-t/uk-WinterHill
+--- a/util/scan/dvb-t/uk-WinterHill    Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/dvb-t/uk-WinterHill    Tue Dec 21 12:13:28 2010 +0100
+@@ -1,13 +1,9 @@
+ # UK, Winter Hill
+-# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
+-# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# Populated by J. Hornsby from a scan of active multiplexes
++# UK, Winter Hill B Ceased broadcasting on 02 December 2009
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 754167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+-T 834167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
+-T 850167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
+-T 842167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+-T 786167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+-T 810167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+-# UK, Winter Hill B
+-T 650000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+-T 626000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 746000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 794000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 801833000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -r af23d23c278b util/scan/dvb-t/vn-Thaibinh
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/scan/dvb-t/vn-Thaibinh      Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,5 @@
++# Thaibinh - Vietnam - DVB-T by VTC
++# contributed by Pham Thanh Nam <phamthanhnam.ptn@gmail.com>
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 626000000 8MHz 3/4 NONE QAM64 2k 1/32 NONE
++T 634000000 8MHz 3/4 NONE QAM64 2k 1/32 NONE
+diff -r af23d23c278b util/scan/scan.c
+--- a/util/scan/scan.c Sat Jun 20 16:47:55 2009 +0200
++++ b/util/scan/scan.c Tue Dec 21 12:13:28 2010 +0100
+@@ -236,6 +236,17 @@
+ static void copy_transponder(struct transponder *d, struct transponder *s)
+ {
++      struct list_head *pos;
++      struct service *service;
++
++      if (d->transport_stream_id != s->transport_stream_id) {
++              /* propagate change to any already allocated services */
++              list_for_each(pos, &d->services) {
++                      service = list_entry(pos, struct service, list);
++                      service->transport_stream_id = s->transport_stream_id;
++              }
++      }
++
+       d->network_id = s->network_id;
+       d->original_network_id = s->original_network_id;
+       d->transport_stream_id = s->transport_stream_id;
+diff -r af23d23c278b util/szap/Makefile
+--- a/util/szap/Makefile       Sat Jun 20 16:47:55 2009 +0200
++++ b/util/szap/Makefile       Tue Dec 21 12:13:28 2010 +0100
+@@ -1,6 +1,6 @@
+ # Makefile for linuxtv.org dvb-apps/util/szap
+-objects  = lnb.o
++objects  = lnb.o util.o
+ binaries = azap  \
+            czap  \
+diff -r af23d23c278b util/szap/azap.c
+--- a/util/szap/azap.c Sat Jun 20 16:47:55 2009 +0200
++++ b/util/szap/azap.c Tue Dec 21 12:13:28 2010 +0100
+@@ -13,6 +13,8 @@
+ #include <linux/dvb/frontend.h>
+ #include <linux/dvb/dmx.h>
++#include "util.h"
++
+ static char FRONTEND_DEV [80];
+ static char DEMUX_DEV [80];
+@@ -209,31 +211,6 @@
+ static
+-int set_pesfilter (int fd, int pid, dmx_pes_type_t type, int dvr)
+-{
+-        struct dmx_pes_filter_params pesfilter;
+-
+-        if (pid <= 0 || pid >= 0x1fff)
+-                return 0;
+-
+-        pesfilter.pid = pid;
+-        pesfilter.input = DMX_IN_FRONTEND;
+-        pesfilter.output = dvr ? DMX_OUT_TS_TAP : DMX_OUT_DECODER;
+-        pesfilter.pes_type = type;
+-        pesfilter.flags = DMX_IMMEDIATE_START;
+-
+-        if (ioctl(fd, DMX_SET_PES_FILTER, &pesfilter) < 0) {
+-                PERROR ("ioctl(DMX_SET_PES_FILTER) for %s PID failed",
+-                        type == DMX_PES_AUDIO ? "Audio" :
+-                        type == DMX_PES_VIDEO ? "Video" : "??");
+-                return -1;
+-        }
+-
+-        return 0;
+-}
+-
+-
+-static
+ int setup_frontend (int fe_fd, struct dvb_frontend_parameters *frontend)
+ {
+       struct dvb_frontend_info fe_info;
+diff -r af23d23c278b util/szap/czap.c
+--- a/util/szap/czap.c Sat Jun 20 16:47:55 2009 +0200
++++ b/util/szap/czap.c Tue Dec 21 12:13:28 2010 +0100
+@@ -13,6 +13,8 @@
+ #include <linux/dvb/frontend.h>
+ #include <linux/dvb/dmx.h>
++#include "util.h"
++
+ static char FRONTEND_DEV [80];
+ static char DEMUX_DEV [80];
+@@ -118,7 +120,7 @@
+ int parse(const char *fname, int list_channels, int chan_no, const char *channel,
+-        struct dvb_frontend_parameters *frontend, int *vpid, int *apid)
++        struct dvb_frontend_parameters *frontend, int *vpid, int *apid, int *sid)
+ {
+       FILE *f;
+       char *chan;
+@@ -141,10 +143,10 @@
+       }
+       printf("%3d %s", chan_no, chan);
+-      if ((sscanf(chan, "%a[^:]:%d:%a[^:]:%d:%a[^:]:%a[^:]:%d:%d\n",
++      if ((sscanf(chan, "%m[^:]:%d:%m[^:]:%d:%m[^:]:%m[^:]:%d:%d:%d\n",
+                               &name, &frontend->frequency,
+                               &inv, &frontend->u.qam.symbol_rate,
+-                              &fec, &mod, vpid, apid) != 8)
++                              &fec, &mod, vpid, apid, sid) != 9)
+                       || !name || !inv || !fec | !mod) {
+               ERROR("cannot parse service data");
+               return -3;
+@@ -165,10 +167,10 @@
+               ERROR("modulation field syntax '%s'", mod);
+               return -6;
+       }
+-      printf("%3d %s: f %d, s %d, i %d, fec %d, qam %d, v %#x, a %#x\n",
++      printf("%3d %s: f %d, s %d, i %d, fec %d, qam %d, v %#x, a %#x, s %#x \n",
+                       chan_no, name, frontend->frequency, frontend->u.qam.symbol_rate,
+                       frontend->inversion, frontend->u.qam.fec_inner,
+-                      frontend->u.qam.modulation, *vpid, *apid);
++                      frontend->u.qam.modulation, *vpid, *apid, *sid);
+       free(name);
+       free(inv);
+       free(fec);
+@@ -178,31 +180,6 @@
+ }
+-
+-static
+-int set_pesfilter (int fd, int pid, dmx_pes_type_t type, int dvr)
+-{
+-      struct dmx_pes_filter_params pesfilter;
+-
+-      if (pid <= 0 || pid >= 0x1fff)
+-              return 0;
+-
+-      pesfilter.pid = pid;
+-      pesfilter.input = DMX_IN_FRONTEND;
+-      pesfilter.output = dvr ? DMX_OUT_TS_TAP : DMX_OUT_DECODER;
+-      pesfilter.pes_type = type;
+-      pesfilter.flags = DMX_IMMEDIATE_START;
+-
+-      if (ioctl(fd, DMX_SET_PES_FILTER, &pesfilter) < 0) {
+-              PERROR ("ioctl(DMX_SET_PES_FILTER) for %s PID failed",
+-                      type == DMX_PES_AUDIO ? "Audio" :
+-                      type == DMX_PES_VIDEO ? "Video" : "??");
+-              return -1;
+-      }
+-
+-      return 0;
+-}
+-
+ static
+ int setup_frontend(int fe_fd, struct dvb_frontend_parameters *frontend)
+ {
+@@ -264,9 +241,20 @@
+ }
+-static const char *usage = "\nusage: %s [-a adapter_num] [-f frontend_id] [-d demux_id] [-c conf_file] [ -H ] {<channel name>| -n channel_num} [-x]\n"
+-      "   or: %s [-c conf_file]  -l\n\n";
+-
++static const char *usage =
++    "\nusage: %s [options]  -l\n"
++    "         list known channels\n"
++    "       %s [options] {-n channel-number|channel_name}\n"
++    "         zap to channel via number or full name (case insensitive)\n"
++    "     -a number : use given adapter (default 0)\n"
++    "     -f number : use given frontend (default 0)\n"
++    "     -d number : use given demux (default 0)\n"
++    "     -c file   : read channels list from 'file'\n"
++    "     -x        : exit after tuning\n"
++    "     -H        : human readable output\n"
++    "     -r        : set up /dev/dvb/adapterX/dvr0 for TS recording\n"
++    "     -p        : add pat and pmt to TS recording (implies -r)\n"
++;
+ int main(int argc, char **argv)
+ {
+@@ -275,12 +263,12 @@
+       char *confname = NULL;
+       char *channel = NULL;
+       int adapter = 0, frontend = 0, demux = 0, dvr = 0;
+-      int vpid, apid;
+-      int frontend_fd, video_fd, audio_fd;
++      int vpid, apid, sid, pmtpid = 0;
++      int frontend_fd, video_fd, audio_fd, pat_fd, pmt_fd;
+       int opt, list_channels = 0, chan_no = 0;
+-      int human_readable = 0;
++      int human_readable = 0, rec_psi = 0;
+-      while ((opt = getopt(argc, argv, "Hln:hrn:a:f:d:c:x")) != -1) {
++      while ((opt = getopt(argc, argv, "Hln:hrn:a:f:d:c:x:p")) != -1) {
+               switch (opt) {
+               case 'a':
+                       adapter = strtoul(optarg, NULL, 0);
+@@ -300,6 +288,9 @@
+               case 'n':
+                       chan_no = strtoul(optarg, NULL, 0);
+                       break;
++              case 'p':
++                      rec_psi = 1;
++                      break;
+               case 'x':
+                       exit_after_tuning = 1;
+                       break;
+@@ -352,7 +343,7 @@
+       memset(&frontend_param, 0, sizeof(struct dvb_frontend_parameters));
+-      if (parse(confname, list_channels, chan_no, channel, &frontend_param, &vpid, &apid))
++      if (parse(confname, list_channels, chan_no, channel, &frontend_param, &vpid, &apid, &sid))
+               return -1;
+       if (list_channels)
+               return 0;
+@@ -365,6 +356,28 @@
+       if (setup_frontend(frontend_fd, &frontend_param) < 0)
+               return -1;
++      if (rec_psi) {
++              pmtpid = get_pmt_pid(DEMUX_DEV, sid);
++              if (pmtpid <= 0) {
++                      fprintf(stderr,"couldn't find pmt-pid for sid %04x\n",sid);
++                      return -1;
++              }
++
++              if ((pat_fd = open(DEMUX_DEV, O_RDWR)) < 0) {
++                      perror("opening pat demux failed");
++                      return -1;
++              }
++              if (set_pesfilter(pat_fd, 0, DMX_PES_OTHER, dvr) < 0)
++                      return -1;
++
++              if ((pmt_fd = open(DEMUX_DEV, O_RDWR)) < 0) {
++                      perror("opening pmt demux failed");
++                      return -1;
++              }
++              if (set_pesfilter(pmt_fd, pmtpid, DMX_PES_OTHER, dvr) < 0)
++                      return -1;
++      }
++
+       if ((video_fd = open(DEMUX_DEV, O_RDWR)) < 0) {
+               PERROR("failed opening '%s'", DEMUX_DEV);
+               return -1;
+@@ -383,6 +396,8 @@
+       check_frontend (frontend_fd, human_readable);
++      close (pat_fd);
++      close (pmt_fd);
+       close (audio_fd);
+       close (video_fd);
+       close (frontend_fd);
+diff -r af23d23c278b util/szap/szap.c
+--- a/util/szap/szap.c Sat Jun 20 16:47:55 2009 +0200
++++ b/util/szap/szap.c Tue Dec 21 12:13:28 2010 +0100
+@@ -48,6 +48,7 @@
+ #include <linux/dvb/dmx.h>
+ #include <linux/dvb/audio.h>
+ #include "lnb.h"
++#include "util.h"
+ #ifndef TRUE
+ #define TRUE (1==1)
+@@ -92,94 +93,6 @@
+     "     -p        : add pat and pmt to TS recording (implies -r)\n"
+     "                 or -n numbers for zapping\n";
+-static int set_demux(int dmxfd, int pid, int pes_type, int dvr)
+-{
+-   struct dmx_pes_filter_params pesfilter;
+-
+-   if (pid < 0 || pid >= 0x1fff) /* ignore this pid to allow radio services */
+-         return TRUE;
+-
+-   if (dvr) {
+-      int buffersize = 64 * 1024;
+-      if (ioctl(dmxfd, DMX_SET_BUFFER_SIZE, buffersize) == -1)
+-        perror("DMX_SET_BUFFER_SIZE failed");
+-   }
+-
+-   pesfilter.pid = pid;
+-   pesfilter.input = DMX_IN_FRONTEND;
+-   pesfilter.output = dvr ? DMX_OUT_TS_TAP : DMX_OUT_DECODER;
+-   pesfilter.pes_type = pes_type;
+-   pesfilter.flags = DMX_IMMEDIATE_START;
+-
+-   if (ioctl(dmxfd, DMX_SET_PES_FILTER, &pesfilter) == -1) {
+-      fprintf(stderr, "DMX_SET_PES_FILTER failed "
+-            "(PID = 0x%04x): %d %m\n", pid, errno);
+-      return FALSE;
+-   }
+-
+-   return TRUE;
+-}
+-
+-int get_pmt_pid(char *dmxdev, int sid)
+-{
+-   int patfd, count;
+-   int pmt_pid = 0;
+-   int patread = 0;
+-   int section_length;
+-   unsigned char buft[4096];
+-   unsigned char *buf = buft;
+-   struct dmx_sct_filter_params f;
+-
+-   memset(&f, 0, sizeof(f));
+-   f.pid = 0;
+-   f.filter.filter[0] = 0x00;
+-   f.filter.mask[0] = 0xff;
+-   f.timeout = 0;
+-   f.flags = DMX_IMMEDIATE_START | DMX_CHECK_CRC;
+-
+-   if ((patfd = open(dmxdev, O_RDWR)) < 0) {
+-      perror("openening pat demux failed");
+-      return -1;
+-   }
+-
+-   if (ioctl(patfd, DMX_SET_FILTER, &f) == -1) {
+-      perror("ioctl DMX_SET_FILTER failed");
+-      close(patfd);
+-      return -1;
+-   }
+-
+-   while (!patread){
+-      if (((count = read(patfd, buf, sizeof(buft))) < 0) && errno == EOVERFLOW)
+-         count = read(patfd, buf, sizeof(buft));
+-      if (count < 0) {
+-         perror("read_sections: read error");
+-         close(patfd);
+-         return -1;
+-      }
+-
+-      section_length = ((buf[1] & 0x0f) << 8) | buf[2];
+-      if (count != section_length + 3)
+-         continue;
+-
+-      buf += 8;
+-      section_length -= 8;
+-
+-      patread = 1; /* assumes one section contains the whole pat */
+-      while (section_length > 0) {
+-         int service_id = (buf[0] << 8) | buf[1];
+-         if (service_id == sid) {
+-            pmt_pid = ((buf[2] & 0x1f) << 8) | buf[3];
+-            section_length = 0;
+-         }
+-         buf += 4;
+-         section_length -= 4;
+-     }
+-   }
+-
+-   close(patfd);
+-   return pmt_pid;
+-}
+-
+ struct diseqc_cmd {
+    struct dvb_diseqc_master_cmd cmd;
+    uint32_t wait;
+@@ -390,10 +303,10 @@
+    if (diseqc(fefd, sat_no, pol, hiband))
+       if (do_tune(fefd, ifreq, sr))
+-       if (set_demux(dmxfdv, vpid, DMX_PES_VIDEO, dvr))
++       if (set_pesfilter(dmxfdv, vpid, DMX_PES_VIDEO, dvr))
+           if (audiofd >= 0)
+              (void)ioctl(audiofd, AUDIO_SET_BYPASS_MODE, bypass);
+-          if (set_demux(dmxfda, apid, DMX_PES_AUDIO, dvr)) {
++          if (set_pesfilter(dmxfda, apid, DMX_PES_AUDIO, dvr)) {
+              if (rec_psi) {
+                 pmtpid = get_pmt_pid(dmxdev, sid);
+                 if (pmtpid < 0) {
+@@ -403,8 +316,8 @@
+                    fprintf(stderr,"couldn't find pmt-pid for sid %04x\n",sid);
+                    result = FALSE;
+                 }
+-                if (set_demux(patfd, 0, DMX_PES_OTHER, dvr))
+-                   if (set_demux(pmtfd, pmtpid, DMX_PES_OTHER, dvr))
++                if (set_pesfilter(patfd, 0, DMX_PES_OTHER, dvr))
++                   if (set_pesfilter(pmtfd, pmtpid, DMX_PES_OTHER, dvr))
+                       result = TRUE;
+                 } else {
+                   result = TRUE;
+diff -r af23d23c278b util/szap/tzap.c
+--- a/util/szap/tzap.c Sat Jun 20 16:47:55 2009 +0200
++++ b/util/szap/tzap.c Tue Dec 21 12:13:28 2010 +0100
+@@ -35,6 +35,8 @@
+ #include <linux/dvb/frontend.h>
+ #include <linux/dvb/dmx.h>
++#include "util.h"
++
+ static char FRONTEND_DEV [80];
+ static char DEMUX_DEV [80];
+ static char DVR_DEV [80];
+@@ -269,7 +271,8 @@
+ int parse(const char *fname, const char *channel,
+-        struct dvb_frontend_parameters *frontend, int *vpid, int *apid)
++        struct dvb_frontend_parameters *frontend, int *vpid, int *apid,
++        int *sid)
+ {
+       int fd;
+       int err;
+@@ -343,7 +346,11 @@
+       if ((err = try_parse_int(fd, apid, "Audio PID")))
+               return -13;
+-
++      
++      if ((err = try_parse_int(fd, sid, "Service ID")))
++          return -14;
++      
++      
+       close(fd);
+       return 0;
+@@ -351,31 +358,6 @@
+ static
+-int set_pesfilter (int fd, int pid, dmx_pes_type_t type, int dvr)
+-{
+-        struct dmx_pes_filter_params pesfilter;
+-
+-        if (pid <= 0 || pid >= 0x1fff)
+-                return 0;
+-
+-        pesfilter.pid = pid;
+-        pesfilter.input = DMX_IN_FRONTEND;
+-        pesfilter.output = dvr ? DMX_OUT_TS_TAP : DMX_OUT_DECODER;
+-        pesfilter.pes_type = type;
+-        pesfilter.flags = DMX_IMMEDIATE_START;
+-
+-        if (ioctl(fd, DMX_SET_PES_FILTER, &pesfilter) < 0) {
+-                PERROR ("ioctl(DMX_SET_PES_FILTER) for %s PID failed",
+-                        type == DMX_PES_AUDIO ? "Audio" :
+-                        type == DMX_PES_VIDEO ? "Video" : "??");
+-                return -1;
+-        }
+-
+-        return 0;
+-}
+-
+-
+-static
+ int setup_frontend (int fe_fd, struct dvb_frontend_parameters *frontend)
+ {
+       struct dvb_frontend_info fe_info;
+@@ -503,6 +485,7 @@
+     "     -c file   : read channels list from 'file'\n"
+     "     -x        : exit after tuning\n"
+     "     -r        : set up /dev/dvb/adapterX/dvr0 for TS recording\n"
++    "     -p        : add pat and pmt to TS recording (implies -r)\n"
+     "     -s        : only print summary\n"
+     "     -S        : run silently (no output)\n"
+     "     -H        : human readable output\n"
+@@ -519,15 +502,16 @@
+       char *confname = NULL;
+       char *channel = NULL;
+       int adapter = 0, frontend = 0, demux = 0, dvr = 0;
+-      int vpid, apid;
++      int vpid, apid, sid, pmtpid = 0;
++      int pat_fd, pmt_fd;
+       int frontend_fd, audio_fd = 0, video_fd = 0, dvr_fd, file_fd;
+       int opt;
+       int record = 0;
+       int frontend_only = 0;
+       char *filename = NULL;
+-      int human_readable = 0;
++      int human_readable = 0, rec_psi = 0;
+-      while ((opt = getopt(argc, argv, "H?hrxRsFSn:a:f:d:c:t:o:")) != -1) {
++      while ((opt = getopt(argc, argv, "H?hrpxRsFSn:a:f:d:c:t:o:")) != -1) {
+               switch (opt) {
+               case 'a':
+                       adapter = strtoul(optarg, NULL, 0);
+@@ -548,6 +532,9 @@
+               case 'r':
+                       dvr = 1;
+                       break;
++              case 'p':
++                      rec_psi = 1;
++                      break;
+               case 'x':
+                       exit_after_tuning = 1;
+                       break;
+@@ -610,7 +597,7 @@
+       memset(&frontend_param, 0, sizeof(struct dvb_frontend_parameters));
+-      if (parse (confname, channel, &frontend_param, &vpid, &apid))
++      if (parse (confname, channel, &frontend_param, &vpid, &apid, &sid))
+               return -1;
+       if ((frontend_fd = open(FRONTEND_DEV, O_RDWR)) < 0) {
+@@ -624,6 +611,28 @@
+       if (frontend_only)
+               goto just_the_frontend_dude;
++      if (rec_psi) {
++          pmtpid = get_pmt_pid(DEMUX_DEV, sid);
++          if (pmtpid <= 0) {
++              fprintf(stderr,"couldn't find pmt-pid for sid %04x\n",sid);
++              return -1;
++          }
++
++          if ((pat_fd = open(DEMUX_DEV, O_RDWR)) < 0) {
++              perror("opening pat demux failed");
++              return -1;
++          }
++          if (set_pesfilter(pat_fd, 0, DMX_PES_OTHER, dvr) < 0)
++              return -1;
++
++          if ((pmt_fd = open(DEMUX_DEV, O_RDWR)) < 0) {
++              perror("opening pmt demux failed");
++              return -1;
++          }
++          if (set_pesfilter(pmt_fd, pmtpid, DMX_PES_OTHER, dvr) < 0)
++              return -1;
++      }
++
+         if ((video_fd = open(DEMUX_DEV, O_RDWR)) < 0) {
+                 PERROR("failed opening '%s'", DEMUX_DEV);
+                 return -1;
+@@ -689,6 +698,8 @@
+               check_frontend (frontend_fd, human_readable);
+       }
++      close (pat_fd);
++      close (pmt_fd);
+       close (audio_fd);
+       close (video_fd);
+       close (frontend_fd);
+diff -r af23d23c278b util/szap/util.c
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/szap/util.c Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,126 @@
++/*
++ * util functions for various ?zap implementations
++ *
++ * Copyright (C) 2001 Johannes Stezenbach (js@convergence.de)
++ * for convergence integrated media
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <string.h>
++#include <unistd.h>
++#include <stdio.h>
++#include <errno.h>
++
++#include <sys/ioctl.h>
++#include <sys/types.h>
++#include <sys/stat.h>
++#include <fcntl.h>
++
++#include <linux/dvb/frontend.h>
++#include <linux/dvb/dmx.h>
++
++
++int set_pesfilter(int dmxfd, int pid, int pes_type, int dvr)
++{
++    struct dmx_pes_filter_params pesfilter;
++
++    /* ignore this pid to allow radio services */
++    if (pid < 0 ||
++      pid >= 0x1fff ||
++      (pid == 0 && pes_type != DMX_PES_OTHER))
++      return 0;
++
++    if (dvr) {
++      int buffersize = 64 * 1024;
++      if (ioctl(dmxfd, DMX_SET_BUFFER_SIZE, buffersize) == -1)
++          perror("DMX_SET_BUFFER_SIZE failed");
++    }
++
++    pesfilter.pid = pid;
++    pesfilter.input = DMX_IN_FRONTEND;
++    pesfilter.output = dvr ? DMX_OUT_TS_TAP : DMX_OUT_DECODER;
++    pesfilter.pes_type = pes_type;
++    pesfilter.flags = DMX_IMMEDIATE_START;
++
++    if (ioctl(dmxfd, DMX_SET_PES_FILTER, &pesfilter) == -1) {
++      fprintf(stderr, "DMX_SET_PES_FILTER failed "
++      "(PID = 0x%04x): %d %m\n", pid, errno);
++      return -1;
++    }
++
++    return 0;
++}
++
++
++int get_pmt_pid(char *dmxdev, int sid)
++{
++    int patfd, count;
++    int pmt_pid = 0;
++    int patread = 0;
++    int section_length;
++    unsigned char buft[4096];
++    unsigned char *buf = buft;
++    struct dmx_sct_filter_params f;
++
++    memset(&f, 0, sizeof(f));
++    f.pid = 0;
++    f.filter.filter[0] = 0x00;
++    f.filter.mask[0] = 0xff;
++    f.timeout = 0;
++    f.flags = DMX_IMMEDIATE_START | DMX_CHECK_CRC;
++
++    if ((patfd = open(dmxdev, O_RDWR)) < 0) {
++      perror("openening pat demux failed");
++      return -1;
++    }
++
++    if (ioctl(patfd, DMX_SET_FILTER, &f) == -1) {
++      perror("ioctl DMX_SET_FILTER failed");
++      close(patfd);
++      return -1;
++    }
++
++    while (!patread){
++      if (((count = read(patfd, buf, sizeof(buft))) < 0) && errno == EOVERFLOW)
++          count = read(patfd, buf, sizeof(buft));
++      if (count < 0) {
++          perror("read_sections: read error");
++          close(patfd);
++          return -1;
++      }
++      
++      section_length = ((buf[1] & 0x0f) << 8) | buf[2];
++      if (count != section_length + 3)
++          continue;
++      
++      buf += 8;
++      section_length -= 8;
++      
++      patread = 1; /* assumes one section contains the whole pat */
++      while (section_length > 0) {
++          int service_id = (buf[0] << 8) | buf[1];
++          if (service_id == sid) {
++              pmt_pid = ((buf[2] & 0x1f) << 8) | buf[3];
++              section_length = 0;
++          }
++          buf += 4;
++          section_length -= 4;
++      }
++    }
++
++    close(patfd);
++    return pmt_pid;
++}
+diff -r af23d23c278b util/szap/util.h
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ b/util/szap/util.h Tue Dec 21 12:13:28 2010 +0100
+@@ -0,0 +1,24 @@
++/*
++ * util functions for various ?zap implementations
++ *
++ * Copyright (C) 2001 Johannes Stezenbach (js@convergence.de)
++ * for convergence integrated media
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++int set_pesfilter(int dmxfd, int pid, int pes_type, int dvr);
++
++int get_pmt_pid(char *dmxdev, int sid);
diff --git a/meta-openvuplus/recipes-enigma2/dvbtools/dvb-apps-1.1.1/update-to-trunk.diff b/meta-openvuplus/recipes-enigma2/dvbtools/dvb-apps-1.1.1/update-to-trunk.diff
new file mode 100644 (file)
index 0000000..55c3419
--- /dev/null
@@ -0,0 +1,84321 @@
+update to:
+
+changeset 1281:af23d23c278b
+
+update scan files for several satellites
+submitted by kosava gmail.com
+author Christoph Pfister <pfister@linuxtv.org>
+date   Sat Jun 20 16:47:55 2009 +0200 (18 months ago)
+parents        291041ebe58f
+children       6d6dad45d8ef
+COPYING                                                             |  339 
+ COPYING.LGPL                                                        |  502 +
+ INSTALL                                                             |   26 
+ Make.rules                                                          |  104 
+ Makefile                                                            |   32 
+ README                                                              |   46 
+ TODO                                                                |    1 
+ include/audio.h                                                     |  140 
+ include/ca.h                                                        |   90 
+ include/dmx.h                                                       |  154 
+ include/frontend.h                                                  |  648 +
+ include/linux/dvb/audio.h                                           |  125 
+ include/linux/dvb/ca.h                                              |   91 
+ include/linux/dvb/dmx.h                                             |  181 
+ include/linux/dvb/frontend.h                                        |  267 
+ include/linux/dvb/net.h                                             |   41 
+ include/linux/dvb/osd.h                                             |  111 
+ include/linux/dvb/version.h                                         |   29 
+ include/linux/dvb/video.h                                           |  199 
+ include/net.h                                                       |   53 
+ include/osd.h                                                       |  142 
+ include/version.h                                                   |   29 
+ include/video.h                                                     |  277 
+ lib/Makefile                                                        |   11 
+ lib/libdvbapi/Makefile                                              |   25 
+ lib/libdvbapi/dvbaudio.c                                            |   50 
+ lib/libdvbapi/dvbaudio.h                                            |   55 
+ lib/libdvbapi/dvbca.c                                               |  159 
+ lib/libdvbapi/dvbca.h                                               |  135 
+ lib/libdvbapi/dvbdemux.c                                            |  255 
+ lib/libdvbapi/dvbdemux.h                                            |  204 
+ lib/libdvbapi/dvbfe.c                                               |  574 +
+ lib/libdvbapi/dvbfe.h                                               |  333 
+ lib/libdvbapi/dvbnet.c                                              |  104 
+ lib/libdvbapi/dvbnet.h                                              |   87 
+ lib/libdvbapi/dvbvideo.c                                            |   46 
+ lib/libdvbapi/dvbvideo.h                                            |   46 
+ lib/libdvbcfg/Makefile                                              |   18 
+ lib/libdvbcfg/dvbcfg_common.c                                       |  136 
+ lib/libdvbcfg/dvbcfg_common.h                                       |   37 
+ lib/libdvbcfg/dvbcfg_scanfile.c                                     |  282 
+ lib/libdvbcfg/dvbcfg_scanfile.h                                     |   61 
+ lib/libdvbcfg/dvbcfg_zapchannel.c                                   |  384 +
+ lib/libdvbcfg/dvbcfg_zapchannel.h                                   |   77 
+ lib/libdvbcfg/zapchannel.txt                                        |   72 
+ lib/libdvben50221/Makefile                                          |   49 
+ lib/libdvben50221/asn_1.c                                           |   83 
+ lib/libdvben50221/asn_1.h                                           |   41 
+ lib/libdvben50221/en50221_app_ai.c                                  |  191 
+ lib/libdvben50221/en50221_app_ai.h                                  |  136 
+ lib/libdvben50221/en50221_app_auth.c                                |  180 
+ lib/libdvben50221/en50221_app_auth.h                                |  123 
+ lib/libdvben50221/en50221_app_ca.c                                  |  631 +
+ lib/libdvben50221/en50221_app_ca.h                                  |  264 
+ lib/libdvben50221/en50221_app_datetime.c                            |  173 
+ lib/libdvben50221/en50221_app_datetime.h                            |  119 
+ lib/libdvben50221/en50221_app_dvb.c                                 |  282 
+ lib/libdvben50221/en50221_app_dvb.h                                 |  176 
+ lib/libdvben50221/en50221_app_epg.c                                 |  167 
+ lib/libdvben50221/en50221_app_epg.h                                 |  138 
+ lib/libdvben50221/en50221_app_lowspeed.c                            |  533 +
+ lib/libdvben50221/en50221_app_lowspeed.h                            |  219 
+ lib/libdvben50221/en50221_app_mmi.c                                 | 1397 +++
+ lib/libdvben50221/en50221_app_mmi.h                                 |  618 +
+ lib/libdvben50221/en50221_app_rm.c                                  |  307 
+ lib/libdvben50221/en50221_app_rm.h                                  |  187 
+ lib/libdvben50221/en50221_app_smartcard.c                           |  296 
+ lib/libdvben50221/en50221_app_smartcard.h                           |  200 
+ lib/libdvben50221/en50221_app_tags.h                                |  104 
+ lib/libdvben50221/en50221_app_teletext.c                            |  141 
+ lib/libdvben50221/en50221_app_teletext.h                            |  107 
+ lib/libdvben50221/en50221_app_utils.c                               |   38 
+ lib/libdvben50221/en50221_app_utils.h                               |  112 
+ lib/libdvben50221/en50221_errno.h                                   |   49 
+ lib/libdvben50221/en50221_session.c                                 | 1055 ++
+ lib/libdvben50221/en50221_session.h                                 |  232 
+ lib/libdvben50221/en50221_stdcam.c                                  |   54 
+ lib/libdvben50221/en50221_stdcam.h                                  |  102 
+ lib/libdvben50221/en50221_stdcam_hlci.c                             |  216 
+ lib/libdvben50221/en50221_stdcam_llci.c                             |  437 +
+ lib/libdvben50221/en50221_transport.c                               | 1296 +++
+ lib/libdvben50221/en50221_transport.h                               |  234 
+ lib/libdvbmisc/dvbmisc.h                                            |   72 
+ lib/libdvbsec/Makefile                                              |   17 
+ lib/libdvbsec/dvbsec_api.c                                          |  951 ++
+ lib/libdvbsec/dvbsec_api.h                                          |  436 +
+ lib/libdvbsec/dvbsec_cfg.c                                          |  366 +
+ lib/libdvbsec/dvbsec_cfg.h                                          |  203 
+ lib/libesg/Makefile                                                 |   27 
+ lib/libesg/TODO                                                     |   18 
+ lib/libesg/bootstrap/Makefile                                       |   24 
+ lib/libesg/bootstrap/access_descriptor.c                            |  115 
+ lib/libesg/bootstrap/access_descriptor.h                            |   86 
+ lib/libesg/bootstrap/provider_discovery_descriptor.c                |   50 
+ lib/libesg/bootstrap/provider_discovery_descriptor.h                |   59 
+ lib/libesg/encapsulation/Makefile                                   |   28 
+ lib/libesg/encapsulation/auxiliary_data.h                           |   62 
+ lib/libesg/encapsulation/container.c                                |  206 
+ lib/libesg/encapsulation/container.h                                |   94 
+ lib/libesg/encapsulation/data_repository.c                          |   53 
+ lib/libesg/encapsulation/data_repository.h                          |   59 
+ lib/libesg/encapsulation/fragment_management_information.c          |  118 
+ lib/libesg/encapsulation/fragment_management_information.h          |   96 
+ lib/libesg/encapsulation/string_repository.c                        |   54 
+ lib/libesg/encapsulation/string_repository.h                        |   60 
+ lib/libesg/representation/Makefile                                  |   26 
+ lib/libesg/representation/bim_decoder_init.h                        |   40 
+ lib/libesg/representation/encapsulated_bim_esg_xml_fragment.h       |   40 
+ lib/libesg/representation/encapsulated_textual_esg_xml_fragment.c   |   70 
+ lib/libesg/representation/encapsulated_textual_esg_xml_fragment.h   |   60 
+ lib/libesg/representation/init_message.c                            |  112 
+ lib/libesg/representation/init_message.h                            |   80 
+ lib/libesg/representation/textual_decoder_init.c                    |  128 
+ lib/libesg/representation/textual_decoder_init.h                    |  104 
+ lib/libesg/transport/Makefile                                       |   22 
+ lib/libesg/transport/session_partition_declaration.c                |  253 
+ lib/libesg/transport/session_partition_declaration.h                |  139 
+ lib/libesg/types.c                                                  |   37 
+ lib/libesg/types.h                                                  |   53 
+ lib/libesg/xml/provider_discovery_descriptor.xsd                    |   22 
+ lib/libucsi/Makefile                                                |   34 
+ lib/libucsi/atsc/Makefile                                           |   55 
+ lib/libucsi/atsc/ac3_descriptor.h                                   |  112 
+ lib/libucsi/atsc/atsc_text.c                                        |  743 ++
+ lib/libucsi/atsc/caption_service_descriptor.h                       |  137 
+ lib/libucsi/atsc/component_name_descriptor.h                        |   92 
+ lib/libucsi/atsc/content_advisory_descriptor.h                      |  235 
+ lib/libucsi/atsc/cvct_section.c                                     |   77 
+ lib/libucsi/atsc/cvct_section.h                                     |  228 
+ lib/libucsi/atsc/dcc_arriving_request_descriptor.h                  |  107 
+ lib/libucsi/atsc/dcc_departing_request_descriptor.h                 |  108 
+ lib/libucsi/atsc/dccsct_section.c                                   |  109 
+ lib/libucsi/atsc/dccsct_section.h                                   |  327 
+ lib/libucsi/atsc/dcct_section.c                                     |   96 
+ lib/libucsi/atsc/dcct_section.h                                     |  380 +
+ lib/libucsi/atsc/descriptor.h                                       |   68 
+ lib/libucsi/atsc/eit_section.c                                      |   71 
+ lib/libucsi/atsc/eit_section.h                                      |  191 
+ lib/libucsi/atsc/ett_section.c                                      |   42 
+ lib/libucsi/atsc/ett_section.h                                      |   91 
+ lib/libucsi/atsc/extended_channel_name_descriptor.h                 |   92 
+ lib/libucsi/atsc/genre_descriptor.h                                 |   82 
+ lib/libucsi/atsc/mgt_section.c                                      |   76 
+ lib/libucsi/atsc/mgt_section.h                                      |  215 
+ lib/libucsi/atsc/rc_descriptor.h                                    |   83 
+ lib/libucsi/atsc/rrt_section.c                                      |  108 
+ lib/libucsi/atsc/rrt_section.h                                      |  379 +
+ lib/libucsi/atsc/section.h                                          |   84 
+ lib/libucsi/atsc/service_location_descriptor.h                      |  141 
+ lib/libucsi/atsc/stt_section.c                                      |   42 
+ lib/libucsi/atsc/stt_section.h                                      |  105 
+ lib/libucsi/atsc/stuffing_descriptor.h                              |   82 
+ lib/libucsi/atsc/time_shifted_service_descriptor.h                  |  136 
+ lib/libucsi/atsc/tvct_section.c                                     |   81 
+ lib/libucsi/atsc/tvct_section.h                                     |  227 
+ lib/libucsi/atsc/types.c                                            |   71 
+ lib/libucsi/atsc/types.h                                            |  227 
+ lib/libucsi/crc32.c                                                 |   89 
+ lib/libucsi/crc32.h                                                 |   58 
+ lib/libucsi/descriptor.h                                            |  129 
+ lib/libucsi/dvb/Makefile                                            |  123 
+ lib/libucsi/dvb/ac3_descriptor.h                                    |   88 
+ lib/libucsi/dvb/adaptation_field_data_descriptor.h                  |   62 
+ lib/libucsi/dvb/ait_application_descriptor.h                        |  204 
+ lib/libucsi/dvb/ait_application_icons_descriptor.h                  |  157 
+ lib/libucsi/dvb/ait_application_name_descriptor.h                   |  145 
+ lib/libucsi/dvb/ait_external_application_authorisation_descriptor.h |  125 
+ lib/libucsi/dvb/ancillary_data_descriptor.h                         |   67 
+ lib/libucsi/dvb/announcement_support_descriptor.h                   |  219 
+ lib/libucsi/dvb/application_signalling_descriptor.h                 |  124 
+ lib/libucsi/dvb/bat_section.c                                       |   77 
+ lib/libucsi/dvb/bat_section.h                                       |  211 
+ lib/libucsi/dvb/bouquet_name_descriptor.h                           |   82 
+ lib/libucsi/dvb/ca_identifier_descriptor.h                          |   94 
+ lib/libucsi/dvb/cable_delivery_descriptor.h                         |   70 
+ lib/libucsi/dvb/cell_frequency_link_descriptor.h                    |  190 
+ lib/libucsi/dvb/cell_list_descriptor.h                              |  201 
+ lib/libucsi/dvb/component_descriptor.h                              |  147 
+ lib/libucsi/dvb/content_descriptor.h                                |  116 
+ lib/libucsi/dvb/content_identifier_descriptor.h                     |  233 
+ lib/libucsi/dvb/country_availability_descriptor.h                   |  120 
+ lib/libucsi/dvb/data_broadcast_descriptor.h                         |  139 
+ lib/libucsi/dvb/data_broadcast_id_descriptor.h                      |  221 
+ lib/libucsi/dvb/default_authority_descriptor.h                      |   82 
+ lib/libucsi/dvb/descriptor.h                                        |  230 
+ lib/libucsi/dvb/dit_section.c                                       |   32 
+ lib/libucsi/dvb/dit_section.h                                       |   54 
+ lib/libucsi/dvb/dsng_descriptor.h                                   |   80 
+ lib/libucsi/dvb/eit_section.c                                       |   63 
+ lib/libucsi/dvb/eit_section.h                                       |  160 
+ lib/libucsi/dvb/extended_event_descriptor.h                         |  232 
+ lib/libucsi/dvb/frequency_list_descriptor.h                         |  107 
+ lib/libucsi/dvb/int_section.c                                       |   79 
+ lib/libucsi/dvb/int_section.h                                       |  245 
+ lib/libucsi/dvb/ip_mac_platform_name_descriptor.h                   |   87 
+ lib/libucsi/dvb/ip_mac_platform_provider_name_descriptor.h          |   87 
+ lib/libucsi/dvb/ip_mac_stream_location_descriptor.h                 |   73 
+ lib/libucsi/dvb/linkage_descriptor.h                                |  480 +
+ lib/libucsi/dvb/local_time_offset_descriptor.h                      |  127 
+ lib/libucsi/dvb/mhp_data_broadcast_id_descriptor.h                  |  110 
+ lib/libucsi/dvb/mosaic_descriptor.h                                 |  324 
+ lib/libucsi/dvb/mpe_fec_section.h                                   |   73 
+ lib/libucsi/dvb/multilingual_bouquet_name_descriptor.h              |  145 
+ lib/libucsi/dvb/multilingual_component_descriptor.h                 |  149 
+ lib/libucsi/dvb/multilingual_network_name_descriptor.h              |  145 
+ lib/libucsi/dvb/multilingual_service_name_descriptor.h              |  197 
+ lib/libucsi/dvb/network_name_descriptor.h                           |   82 
+ lib/libucsi/dvb/nit_section.c                                       |   78 
+ lib/libucsi/dvb/nit_section.h                                       |  207 
+ lib/libucsi/dvb/nvod_reference_descriptor.h                         |  125 
+ lib/libucsi/dvb/parental_rating_descriptor.h                        |  135 
+ lib/libucsi/dvb/partial_transport_stream_descriptor.h               |   68 
+ lib/libucsi/dvb/pdc_descriptor.h                                    |   64 
+ lib/libucsi/dvb/private_data_specifier_descriptor.h                 |   63 
+ lib/libucsi/dvb/related_content_descriptor.h                        |   56 
+ lib/libucsi/dvb/rnt_rar_over_dvb_stream_descriptor.h                |  110 
+ lib/libucsi/dvb/rnt_rar_over_ip_descriptor.h                        |   87 
+ lib/libucsi/dvb/rnt_rnt_scan_descriptor.h                           |  125 
+ lib/libucsi/dvb/rst_section.c                                       |   47 
+ lib/libucsi/dvb/rst_section.h                                       |  110 
+ lib/libucsi/dvb/s2_satellite_delivery_descriptor.h                  |  116 
+ lib/libucsi/dvb/satellite_delivery_descriptor.h                     |   73 
+ lib/libucsi/dvb/scrambling_descriptor.h                             |   61 
+ lib/libucsi/dvb/sdt_section.c                                       |   60 
+ lib/libucsi/dvb/sdt_section.h                                       |  157 
+ lib/libucsi/dvb/section.h                                           |  108 
+ lib/libucsi/dvb/service_availability_descriptor.h                   |   98 
+ lib/libucsi/dvb/service_descriptor.h                                |  163 
+ lib/libucsi/dvb/service_identifier_descriptor.h                     |   82 
+ lib/libucsi/dvb/service_list_descriptor.h                           |  122 
+ lib/libucsi/dvb/service_move_descriptor.h                           |   67 
+ lib/libucsi/dvb/short_event_descriptor.h                            |  135 
+ lib/libucsi/dvb/short_smoothing_buffer_descriptor.h                 |   87 
+ lib/libucsi/dvb/sit_section.c                                       |   69 
+ lib/libucsi/dvb/sit_section.h                                       |  173 
+ lib/libucsi/dvb/st_section.c                                        |   29 
+ lib/libucsi/dvb/st_section.h                                        |   77 
+ lib/libucsi/dvb/stream_identifier_descriptor.h                      |   61 
+ lib/libucsi/dvb/stuffing_descriptor.h                               |   82 
+ lib/libucsi/dvb/subtitling_descriptor.h                             |  126 
+ lib/libucsi/dvb/target_ip_address_descriptor.h                      |  116 
+ lib/libucsi/dvb/target_ip_slash_descriptor.h                        |  116 
+ lib/libucsi/dvb/target_ip_source_slash_descriptor.h                 |  118 
+ lib/libucsi/dvb/target_ipv6_address_descriptor.h                    |  116 
+ lib/libucsi/dvb/target_ipv6_slash_descriptor.h                      |  116 
+ lib/libucsi/dvb/target_ipv6_source_slash_descriptor.h               |  118 
+ lib/libucsi/dvb/tdt_section.c                                       |   33 
+ lib/libucsi/dvb/tdt_section.h                                       |   54 
+ lib/libucsi/dvb/telephone_descriptor.h                              |  150 
+ lib/libucsi/dvb/teletext_descriptor.h                               |  127 
+ lib/libucsi/dvb/terrestrial_delivery_descriptor.h                   |   77 
+ lib/libucsi/dvb/time_shifted_event_descriptor.h                     |   65 
+ lib/libucsi/dvb/time_shifted_service_descriptor.h                   |   63 
+ lib/libucsi/dvb/time_slice_fec_identifier_descriptor.h              |   94 
+ lib/libucsi/dvb/tot_section.c                                       |   50 
+ lib/libucsi/dvb/tot_section.h                                       |   97 
+ lib/libucsi/dvb/transport_stream_descriptor.h                       |   82 
+ lib/libucsi/dvb/tva_container_section.c                             |   33 
+ lib/libucsi/dvb/tva_container_section.h                             |   90 
+ lib/libucsi/dvb/tva_id_descriptor.h                                 |  124 
+ lib/libucsi/dvb/types.c                                             |  270 
+ lib/libucsi/dvb/types.h                                             |  127 
+ lib/libucsi/dvb/vbi_data_descriptor.h                               |  186 
+ lib/libucsi/dvb/vbi_teletext_descriptor.h                           |  116 
+ lib/libucsi/endianops.h                                             |  128 
+ lib/libucsi/mpeg/Makefile                                           |   66 
+ lib/libucsi/mpeg/audio_stream_descriptor.h                          |   65 
+ lib/libucsi/mpeg/ca_descriptor.h                                    |   91 
+ lib/libucsi/mpeg/cat_section.c                                      |   34 
+ lib/libucsi/mpeg/cat_section.h                                      |   94 
+ lib/libucsi/mpeg/content_labelling_descriptor.h                     |  356 +
+ lib/libucsi/mpeg/copyright_descriptor.h                             |   89 
+ lib/libucsi/mpeg/data_stream_alignment_descriptor.h                 |   73 
+ lib/libucsi/mpeg/datagram_section.h                                 |   81 
+ lib/libucsi/mpeg/descriptor.h                                       |  102 
+ lib/libucsi/mpeg/external_es_id_descriptor.h                        |   63 
+ lib/libucsi/mpeg/fmc_descriptor.h                                   |  122 
+ lib/libucsi/mpeg/fmxbuffer_size_descriptor.h                        |   83 
+ lib/libucsi/mpeg/hierarchy_descriptor.h                             |   83 
+ lib/libucsi/mpeg/ibp_descriptor.h                                   |   65 
+ lib/libucsi/mpeg/iod_descriptor.h                                   |   87 
+ lib/libucsi/mpeg/iso_639_language_descriptor.h                      |  124 
+ lib/libucsi/mpeg/maximum_bitrate_descriptor.h                       |   64 
+ lib/libucsi/mpeg/metadata_descriptor.h                              |  472 +
+ lib/libucsi/mpeg/metadata_pointer_descriptor.h                      |  360 +
+ lib/libucsi/mpeg/metadata_section.c                                 |   27 
+ lib/libucsi/mpeg/metadata_section.h                                 |  122 
+ lib/libucsi/mpeg/metadata_std_descriptor.h                          |   72 
+ lib/libucsi/mpeg/mpeg4_audio_descriptor.h                           |   61 
+ lib/libucsi/mpeg/mpeg4_video_descriptor.h                           |   61 
+ lib/libucsi/mpeg/multiplex_buffer_descriptor.h                      |   65 
+ lib/libucsi/mpeg/multiplex_buffer_utilization_descriptor.h          |   67 
+ lib/libucsi/mpeg/muxcode_descriptor.h                               |   82 
+ lib/libucsi/mpeg/odsmt_section.c                                    |   80 
+ lib/libucsi/mpeg/odsmt_section.h                                    |  224 
+ lib/libucsi/mpeg/pat_section.c                                      |   46 
+ lib/libucsi/mpeg/pat_section.h                                      |  118 
+ lib/libucsi/mpeg/pmt_section.c                                      |   71 
+ lib/libucsi/mpeg/pmt_section.h                                      |  188 
+ lib/libucsi/mpeg/private_data_indicator_descriptor.h                |   63 
+ lib/libucsi/mpeg/registration_descriptor.h                          |   91 
+ lib/libucsi/mpeg/section.h                                          |   60 
+ lib/libucsi/mpeg/sl_descriptor.h                                    |   63 
+ lib/libucsi/mpeg/smoothing_buffer_descriptor.h                      |   66 
+ lib/libucsi/mpeg/std_descriptor.h                                   |   62 
+ lib/libucsi/mpeg/system_clock_descriptor.h                          |   65 
+ lib/libucsi/mpeg/target_background_grid_descriptor.h                |   66 
+ lib/libucsi/mpeg/tsdt_section.c                                     |   34 
+ lib/libucsi/mpeg/tsdt_section.h                                     |   94 
+ lib/libucsi/mpeg/types.h                                            |  127 
+ lib/libucsi/mpeg/video_stream_descriptor.h                          |  101 
+ lib/libucsi/mpeg/video_window_descriptor.h                          |   64 
+ lib/libucsi/section.h                                               |  253 
+ lib/libucsi/section_buf.c                                           |  173 
+ lib/libucsi/section_buf.h                                           |  124 
+ lib/libucsi/testrecord.txt                                          |  146 
+ lib/libucsi/transport_packet.c                                      |  256 
+ lib/libucsi/transport_packet.h                                      |  195 
+ lib/libucsi/types.h                                                 |   36 
+ libdvb2/README                                                      |   23 
+ test/Makefile                                                       |   64 
+ test/README                                                         |   11 
+ test/dia                                                            |    1 
+ test/diseqc.c                                                       |   19 
+ test/evtest.c                                                       |  251 
+ test/hex_dump.c                                                     |    1 
+ test/libdvbcfg/Makefile                                             |   12 
+ test/libdvbcfg/dvbcfg_test.c                                        |  100 
+ test/libdvbcfg/test_zapchannels.txt                                 |  446 +
+ test/libdvben50221/Makefile                                         |   14 
+ test/libdvben50221/test-app.c                                       |  854 ++
+ test/libdvben50221/test-session.c                                   |  171 
+ test/libdvben50221/test-transport.c                                 |  144 
+ test/libdvbsec/Makefile                                             |   12 
+ test/libdvbsec/dvbsec_test.c                                        |   85 
+ test/libdvbsec/test_sec.txt                                         |   28 
+ test/libesg/Makefile                                                |   12 
+ test/libesg/samples/ESGProviderDiscoveryDescriptor.xml              |   13 
+ test/libesg/testesg.c                                               |  563 +
+ test/libucsi/Makefile                                               |   13 
+ test/libucsi/testucsi.c                                             | 3528 ++++++++++
+ test/lnb.c                                                          |  101 
+ test/lnb.h                                                          |   22 
+ test/sendburst.c                                                    |   14 
+ test/set22k.c                                                       |   18 
+ test/setpid.c                                                       |   17 
+ test/setvoltage.c                                                   |   18 
+ test/szap2.c                                                        |  767 ++
+ test/test.c                                                         |   81 
+ test/test_audio.c                                                   |   41 
+ test/test_av.c                                                      |  100 
+ test/test_av_play.c                                                 |  516 +
+ test/test_dvr.c                                                     |    3 
+ test/test_dvr_play.c                                                |    1 
+ test/test_front.c                                                   |   37 
+ test/test_sec_ne.c                                                  |    7 
+ test/test_sections.c                                                |    3 
+ test/test_stc.c                                                     |    1 
+ test/test_stillimage.c                                              |    7 
+ test/test_switch.c                                                  |  106 
+ test/test_tt.c                                                      |    1 
+ test/test_vevent.c                                                  |    6 
+ test/test_video.c                                                   |   51 
+ test/video.c                                                        |   42 
+ util/Makefile                                                       |   25 
+ util/atsc_epg/Makefile                                              |   16 
+ util/atsc_epg/README                                                |   12 
+ util/atsc_epg/atsc_epg.c                                            | 1249 +++
+ util/av7110_loadkeys/Makefile                                       |   53 
+ util/av7110_loadkeys/README                                         |   15 
+ util/av7110_loadkeys/activy.rcmm                                    |    1 
+ util/av7110_loadkeys/av7110_loadkeys.c                              |   48 
+ util/av7110_loadkeys/evtest.c                                       |  177 
+ util/av7110_loadkeys/galaxis.rcmm                                   |    3 
+ util/av7110_loadkeys/generate-keynames.sh                           |   37 
+ util/av7110_loadkeys/hauppauge.rc5                                  |    1 
+ util/av7110_loadkeys/hauppauge2.rc5                                 |   40 
+ util/av7110_loadkeys/hauppauge_grey.rc5                             |    1 
+ util/av7110_loadkeys/input_fake.h                                   |   15 
+ util/av7110_loadkeys/philips1358.rc5                                |    5 
+ util/av7110_loadkeys/technotrend.rc5                                |   41 
+ util/dib3000-watch/Makefile                                         |   13 
+ util/dib3000-watch/README.dib3000-watch                             |   29 
+ util/dib3000-watch/dib-i2c.h                                        |   43 
+ util/dib3000-watch/dib3000-watch.c                                  |  296 
+ util/dib3000-watch/dib3000-watch.h                                  |   46 
+ util/dib3000-watch/dib3000.h                                        |   56 
+ util/dib3000-watch/make-i2c-dev                                     |    6 
+ util/dst-utils/Makefile                                             |   13 
+ util/dst-utils/dst_test.c                                           |  258 
+ util/dvbdate/Makefile                                               |   28 
+ util/dvbdate/dvbdate.c                                              |  282 
+ util/dvbnet/Makefile                                                |   32 
+ util/dvbnet/dvbnet.c                                                |  106 
+ util/dvbnet/net_start.pl                                            |    1 
+ util/dvbnet/version.h.in                                            |    1 
+ util/dvbscan/Makefile                                               |   22 
+ util/dvbscan/dvbscan.c                                              |  370 +
+ util/dvbscan/dvbscan.h                                              |  136 
+ util/dvbscan/dvbscan_atsc.c                                         |   30 
+ util/dvbscan/dvbscan_dvb.c                                          |   30 
+ util/dvbscan/dvbscan_structutils.c                                  |   99 
+ util/dvbtraffic/Makefile                                            |   17 
+ util/dvbtraffic/dvbtraffic.c                                        |  110 
+ util/femon/Makefile                                                 |   15 
+ util/femon/femon.c                                                  |  175 
+ util/gnutv/Makefile                                                 |   21 
+ util/gnutv/gnutv.c                                                  |  375 +
+ util/gnutv/gnutv.h                                                  |   37 
+ util/gnutv/gnutv_ca.c                                               |  404 +
+ util/gnutv/gnutv_ca.h                                               |   40 
+ util/gnutv/gnutv_data.c                                             |  483 +
+ util/gnutv/gnutv_data.h                                             |   39 
+ util/gnutv/gnutv_dvb.c                                              |  376 +
+ util/gnutv/gnutv_dvb.h                                              |   44 
+ util/lib/Makefile                                                   |   20 
+ util/lib/lnb.c                                                      |  101 
+ util/lib/lnb.h                                                      |   24 
+ util/scan/Makefile                                                  |   46 
+ util/scan/README                                                    |   26 
+ util/scan/atsc/us-ATSC-center-frequencies-8VSB                      |    1 
+ util/scan/atsc/us-NTSC-center-frequencies-8VSB                      |    1 
+ util/scan/atsc/us-NY-TWC-NYC                                        |   53 
+ util/scan/atsc_psip_section.c                                       |   62 
+ util/scan/atsc_psip_section.h                                       |   60 
+ util/scan/atsc_psip_section.pl                                      |   76 
+ util/scan/diseqc.c                                                  |    5 
+ util/scan/diseqc.h                                                  |    1 
+ util/scan/dump-vdr.c                                                |   13 
+ util/scan/dump-vdr.h                                                |    1 
+ util/scan/dump-zap.c                                                |    1 
+ util/scan/dump-zap.h                                                |    1 
+ util/scan/dvb-c/at-Innsbruck                                        |    8 
+ util/scan/dvb-c/at-KarrerNet                                        |   18 
+ util/scan/dvb-c/at-Liwest                                           |   31 
+ util/scan/dvb-c/at-SalzburgAG                                       |    8 
+ util/scan/dvb-c/be-IN.DI-Integan                                    |   16 
+ util/scan/dvb-c/ch-Rega-Sense                                       |   34 
+ util/scan/dvb-c/ch-Video2000                                        |    5 
+ util/scan/dvb-c/ch-Zuerich-cablecom                                 |    3 
+ util/scan/dvb-c/cz-Moravianet                                       |   24 
+ util/scan/dvb-c/de-Berlin                                           |    1 
+ util/scan/dvb-c/de-Kabel_BW                                         |   16 
+ util/scan/dvb-c/de-Muenchen                                         |   27 
+ util/scan/dvb-c/de-Primacom                                         |   23 
+ util/scan/dvb-c/de-Unitymedia                                       |   35 
+ util/scan/dvb-c/de-iesy                                             |   19 
+ util/scan/dvb-c/de-neftv                                            |   23 
+ util/scan/dvb-c/dk-Copenhagen-AFDK                                  |   11 
+ util/scan/dvb-c/dk-Odense                                           |   10 
+ util/scan/dvb-c/es-Euskaltel                                        |   19 
+ util/scan/dvb-c/fi-3ktv                                             |   23 
+ util/scan/dvb-c/fi-HTV                                              |    4 
+ util/scan/dvb-c/fi-Joensuu-Tikka                                    |   13 
+ util/scan/dvb-c/fi-TTV                                              |    4 
+ util/scan/dvb-c/fi-Turku                                            |   17 
+ util/scan/dvb-c/fi-jkl                                              |   10 
+ util/scan/dvb-c/fi-sonera                                           |   12 
+ util/scan/dvb-c/fr-noos-numericable                                 |   41 
+ util/scan/dvb-c/lu-Ettelbruck-ACE                                   |   20 
+ util/scan/dvb-c/nl-Ziggo                                            |   14 
+ util/scan/dvb-c/nl-Ziggo-Zwolle                                     |   26 
+ util/scan/dvb-c/no-Oslo-CanalDigital                                |   13 
+ util/scan/dvb-c/no-Oslo-Get                                         |   22 
+ util/scan/dvb-c/se-Gothnet                                          |   23 
+ util/scan/dvb-c/se-comhem                                           |    3 
+ util/scan/dvb-h/README                                              |    3 
+ util/scan/dvb-h/fi-Helsinki                                         |    2 
+ util/scan/dvb-h/fi-Oulu                                             |    2 
+ util/scan/dvb-h/fi-Oulu-Nokia-devel                                 |    4 
+ util/scan/dvb-h/fi-Turku                                            |    2 
+ util/scan/dvb-s/ABS1-75.0E                                          |   10 
+ util/scan/dvb-s/AMC1-103w                                           |    5 
+ util/scan/dvb-s/AMC2-85w                                            |    6 
+ util/scan/dvb-s/AMC3-87w                                            |   10 
+ util/scan/dvb-s/AMC4-101w                                           |   10 
+ util/scan/dvb-s/AMC5-79w                                            |    5 
+ util/scan/dvb-s/AMC6-72w                                            |   44 
+ util/scan/dvb-s/AMC9-83w                                            |   18 
+ util/scan/dvb-s/Amazonas-61.0W                                      |   54 
+ util/scan/dvb-s/Amos-4w                                             |   48 
+ util/scan/dvb-s/Anik-F1-107.3W                                      |    7 
+ util/scan/dvb-s/AsiaSat3S_C-105.5E                                  |  122 
+ util/scan/dvb-s/Astra-28.2E                                         |  186 
+ util/scan/dvb-s/Atlantic-Bird-1-12.5W                               |   30 
+ util/scan/dvb-s/BrasilSat-B1-75.0W                                  |   11 
+ util/scan/dvb-s/BrasilSat-B2-65.0W                                  |   34 
+ util/scan/dvb-s/BrasilSat-B3-84.0W                                  |   85 
+ util/scan/dvb-s/BrasilSat-B4-70.0W                                  |   39 
+ util/scan/dvb-s/Estrela-do-Sul-63.0W                                |   27 
+ util/scan/dvb-s/Eurobird1-28.5E                                     |    5 
+ util/scan/dvb-s/Eurobird9-9.0E                                      |   16 
+ util/scan/dvb-s/EutelsatW2-16E                                      |   59 
+ util/scan/dvb-s/Express-3A-11.0W                                    |    4 
+ util/scan/dvb-s/ExpressAM1-40.0E                                    |    5 
+ util/scan/dvb-s/ExpressAM2-80.0E                                    |   35 
+ util/scan/dvb-s/ExpressAM22-53.0E                                   |    9 
+ util/scan/dvb-s/Galaxy10R-123w                                      |   10 
+ util/scan/dvb-s/Galaxy11-91w                                        |   49 
+ util/scan/dvb-s/Galaxy25-97w                                        |   19 
+ util/scan/dvb-s/Galaxy26-93w                                        |   58 
+ util/scan/dvb-s/Galaxy27-129w                                       |    4 
+ util/scan/dvb-s/Galaxy28-89w                                        |   41 
+ util/scan/dvb-s/Galaxy3C-95w                                        |    4 
+ util/scan/dvb-s/Hispasat-30.0W                                      |   37 
+ util/scan/dvb-s/Hotbird-13.0E                                       |   93 
+ util/scan/dvb-s/IA5-97w                                             |   18 
+ util/scan/dvb-s/IA6-93w                                             |   61 
+ util/scan/dvb-s/IA7-129w                                            |    4 
+ util/scan/dvb-s/IA8-89w                                             |   34 
+ util/scan/dvb-s/Intel4-72.0E                                        |    6 
+ util/scan/dvb-s/Intel904-60.0E                                      |   13 
+ util/scan/dvb-s/Intelsat-1002-1.0W                                  |   20 
+ util/scan/dvb-s/Intelsat-11-43.0W                                   |    4 
+ util/scan/dvb-s/Intelsat-1R-45.0W                                   |   44 
+ util/scan/dvb-s/Intelsat-3R-43.0W                                   |   35 
+ util/scan/dvb-s/Intelsat-6B-43.0W                                   |   17 
+ util/scan/dvb-s/Intelsat-705-50.0W                                  |    7 
+ util/scan/dvb-s/Intelsat-707-53.0W                                  |    5 
+ util/scan/dvb-s/Intelsat-805-55.5W                                  |   67 
+ util/scan/dvb-s/Intelsat-9-58.0W                                    |   58 
+ util/scan/dvb-s/Intelsat-903-34.5W                                  |    7 
+ util/scan/dvb-s/Intelsat-905-24.5W                                  |    9 
+ util/scan/dvb-s/Intelsat-907-27.5W                                  |    9 
+ util/scan/dvb-s/NSS-10-37.5W                                        |   12 
+ util/scan/dvb-s/NSS-7-22.0W                                         |   25 
+ util/scan/dvb-s/NSS-806-40.5W                                       |  108 
+ util/scan/dvb-s/Nahuel-1-71.8W                                      |   11 
+ util/scan/dvb-s/Nilesat101+102-7.0W                                 |   41 
+ util/scan/dvb-s/OptusC1-156E                                        |   20 
+ util/scan/dvb-s/SBS6-74w                                            |    4 
+ util/scan/dvb-s/Satmex-5-116.8W                                     |   72 
+ util/scan/dvb-s/Satmex-6-113.0W                                     |   19 
+ util/scan/dvb-s/Sirius-5.0E                                         |   57 
+ util/scan/dvb-s/Telecom2-8.0W                                       |   17 
+ util/scan/dvb-s/Telstar12-15.0W                                     |   26 
+ util/scan/dvb-s/Thor-1.0W                                           |   32 
+ util/scan/dvb-s/Turksat-42.0E                                       |  104 
+ util/scan/dvb-s/Yamal201-90.0E                                      |   48 
+ util/scan/dvb-t/ad-Andorra                                          |    6 
+ util/scan/dvb-t/at-Official                                         |   24 
+ util/scan/dvb-t/au-Adelaide                                         |   12 
+ util/scan/dvb-t/au-Brisbane                                         |   12 
+ util/scan/dvb-t/au-Cairns                                           |   12 
+ util/scan/dvb-t/au-Canberra-Black-Mt                                |   12 
+ util/scan/dvb-t/au-Coonabarabran                                    |   16 
+ util/scan/dvb-t/au-Darwin                                           |    8 
+ util/scan/dvb-t/au-GoldCoast                                        |   21 
+ util/scan/dvb-t/au-Hobart                                           |   12 
+ util/scan/dvb-t/au-Mackay                                           |   14 
+ util/scan/dvb-t/au-Melbourne                                        |   12 
+ util/scan/dvb-t/au-Melbourne-Upwey                                  |   12 
+ util/scan/dvb-t/au-MidNorthCoast                                    |   22 
+ util/scan/dvb-t/au-Newcastle                                        |   12 
+ util/scan/dvb-t/au-Perth                                            |   12 
+ util/scan/dvb-t/au-Perth_Roleystone                                 |   12 
+ util/scan/dvb-t/au-SpencerGulf                                      |    8 
+ util/scan/dvb-t/au-SunshineCoast                                    |   12 
+ util/scan/dvb-t/au-Sydney_Kings_Cross                               |   14 
+ util/scan/dvb-t/au-Sydney_North_Shore                               |   16 
+ util/scan/dvb-t/au-Tamworth                                         |   38 
+ util/scan/dvb-t/au-Townsville                                       |   12 
+ util/scan/dvb-t/au-WaggaWagga                                       |   12 
+ util/scan/dvb-t/au-Wollongong                                       |   40 
+ util/scan/dvb-t/au-canberra                                         |    6 
+ util/scan/dvb-t/au-sydney_north_shore                               |   12 
+ util/scan/dvb-t/be-Brussels                                         |    5 
+ util/scan/dvb-t/be-Libramont                                        |   10 
+ util/scan/dvb-t/be-Schoten                                          |    3 
+ util/scan/dvb-t/be-St_Pieters_Leeuw                                 |    3 
+ util/scan/dvb-t/be-Tournai                                          |    3 
+ util/scan/dvb-t/ch-All                                              |   31 
+ util/scan/dvb-t/ch-Citycable                                        |   18 
+ util/scan/dvb-t/cz-Brno                                             |   10 
+ util/scan/dvb-t/cz-Domazlice                                        |    3 
+ util/scan/dvb-t/cz-Klet                                             |    4 
+ util/scan/dvb-t/cz-Ostrava                                          |    3 
+ util/scan/dvb-t/cz-Plzen                                            |    8 
+ util/scan/dvb-t/cz-Praha                                            |    7 
+ util/scan/dvb-t/de-Baden-Wuerttemberg                               |   20 
+ util/scan/dvb-t/de-Bayern                                           |   40 
+ util/scan/dvb-t/de-Berlin                                           |   12 
+ util/scan/dvb-t/de-Brandenburg                                      |    7 
+ util/scan/dvb-t/de-Bremen                                           |    9 
+ util/scan/dvb-t/de-Hamburg                                          |   16 
+ util/scan/dvb-t/de-Hessen                                           |   19 
+ util/scan/dvb-t/de-Mecklenburg-Vorpommern                           |   12 
+ util/scan/dvb-t/de-Niedersachsen                                    |   40 
+ util/scan/dvb-t/de-Nordrhein-Westfalen                              |   27 
+ util/scan/dvb-t/de-Rheinland-Pfalz                                  |   12 
+ util/scan/dvb-t/de-Saarland                                         |    7 
+ util/scan/dvb-t/de-Sachsen                                          |   12 
+ util/scan/dvb-t/de-Sachsen-Anhalt                                   |   12 
+ util/scan/dvb-t/de-Schleswig-Holstein                               |   18 
+ util/scan/dvb-t/de-Thueringen                                       |   10 
+ util/scan/dvb-t/dk-All                                              |   17 
+ util/scan/dvb-t/es-Albacete                                         |    8 
+ util/scan/dvb-t/es-Alfabia                                          |    8 
+ util/scan/dvb-t/es-Alicante                                         |    9 
+ util/scan/dvb-t/es-Alpicat                                          |    8 
+ util/scan/dvb-t/es-Asturias                                         |    8 
+ util/scan/dvb-t/es-Bilbao                                           |    6 
+ util/scan/dvb-t/es-Cadiz                                            |    8 
+ util/scan/dvb-t/es-Carceres                                         |   10 
+ util/scan/dvb-t/es-Collserola                                       |   12 
+ util/scan/dvb-t/es-Donostia                                         |   14 
+ util/scan/dvb-t/es-Huesca                                           |    8 
+ util/scan/dvb-t/es-Las_Palmas                                       |    8 
+ util/scan/dvb-t/es-Lugo                                             |    9 
+ util/scan/dvb-t/es-Madrid                                           |    8 
+ util/scan/dvb-t/es-Malaga                                           |    9 
+ util/scan/dvb-t/es-Muros-Noia                                       |    9 
+ util/scan/dvb-t/es-Mussara                                          |    8 
+ util/scan/dvb-t/es-Rocacorba                                        |    6 
+ util/scan/dvb-t/es-Santander                                        |    7 
+ util/scan/dvb-t/es-Santiago_de_Compostela                           |    9 
+ util/scan/dvb-t/es-Sevilla                                          |    8 
+ util/scan/dvb-t/es-Valencia                                         |    9 
+ util/scan/dvb-t/es-Valladolid                                       |    7 
+ util/scan/dvb-t/es-Vilamarxant                                      |    4 
+ util/scan/dvb-t/es-Zaragoza                                         |    7 
+ util/scan/dvb-t/fi-Aanekoski                                        |    6 
+ util/scan/dvb-t/fi-Aanekoski_Konginkangas                           |    5 
+ util/scan/dvb-t/fi-Ahtari                                           |    4 
+ util/scan/dvb-t/fi-Ala-Vuokki                                       |    4 
+ util/scan/dvb-t/fi-Alajarvi                                         |    5 
+ util/scan/dvb-t/fi-Ammansaari                                       |    4 
+ util/scan/dvb-t/fi-Anjalankoski                                     |    6 
+ util/scan/dvb-t/fi-Enontekio_Ahovaara_Raattama                      |    4 
+ util/scan/dvb-t/fi-Espoo                                            |    5 
+ util/scan/dvb-t/fi-Eurajoki                                         |    6 
+ util/scan/dvb-t/fi-Fiskars                                          |    6 
+ util/scan/dvb-t/fi-Haapavesi                                        |    6 
+ util/scan/dvb-t/fi-Hameenkyro_Kyroskoski                            |    5 
+ util/scan/dvb-t/fi-Hameenlinna_Painokangas                          |    5 
+ util/scan/dvb-t/fi-Hanko                                            |    5 
+ util/scan/dvb-t/fi-Hartola                                          |    4 
+ util/scan/dvb-t/fi-Heinavesi                                        |    4 
+ util/scan/dvb-t/fi-Heinola                                          |    6 
+ util/scan/dvb-t/fi-Hetta                                            |    4 
+ util/scan/dvb-t/fi-Houtskari                                        |    5 
+ util/scan/dvb-t/fi-Hyrynsalmi                                       |    4 
+ util/scan/dvb-t/fi-Hyrynsalmi_Kyparavaara                           |    4 
+ util/scan/dvb-t/fi-Hyrynsalmi_Paljakka                              |    4 
+ util/scan/dvb-t/fi-Hyvinkaa_Musta-Mannisto                          |    5 
+ util/scan/dvb-t/fi-Ii_Raiskio                                       |    4 
+ util/scan/dvb-t/fi-Iisalmi                                          |    4 
+ util/scan/dvb-t/fi-Ikaalinen                                        |    5 
+ util/scan/dvb-t/fi-Ikaalinen_Riitiala                               |    5 
+ util/scan/dvb-t/fi-Inari                                            |    4 
+ util/scan/dvb-t/fi-Inari_Janispaa                                   |    4 
+ util/scan/dvb-t/fi-Inari_Naatamo                                    |    4 
+ util/scan/dvb-t/fi-Ivalo_Saarineitamovaara                          |    4 
+ util/scan/dvb-t/fi-Jalasjarvi                                       |    5 
+ util/scan/dvb-t/fi-Jamsa_Kaipola                                    |    5 
+ util/scan/dvb-t/fi-Jamsa_Kuorevesi_Halli                            |    5 
+ util/scan/dvb-t/fi-Jamsa_Matkosvuori                                |    6 
+ util/scan/dvb-t/fi-Jamsa_Ouninpohja                                 |    4 
+ util/scan/dvb-t/fi-Jamsankoski                                      |    5 
+ util/scan/dvb-t/fi-Joensuu_Vestinkallio                             |    4 
+ util/scan/dvb-t/fi-Joroinen_Puukkola                                |    4 
+ util/scan/dvb-t/fi-Joutsa_Lankia                                    |    5 
+ util/scan/dvb-t/fi-Joutseno                                         |    6 
+ util/scan/dvb-t/fi-Juntusranta                                      |    4 
+ util/scan/dvb-t/fi-Juupajoki_Kopsamo                                |    4 
+ util/scan/dvb-t/fi-Jyvaskyla                                        |    6 
+ util/scan/dvb-t/fi-Jyvaskylan_mlk_Vaajakoski                        |    4 
+ util/scan/dvb-t/fi-Kaavi_Sivakkavaara_Luikonlahti                   |    4 
+ util/scan/dvb-t/fi-Kajaani_Pollyvaara                               |    4 
+ util/scan/dvb-t/fi-Kalajoki                                         |    4 
+ util/scan/dvb-t/fi-Kangaslampi                                      |    5 
+ util/scan/dvb-t/fi-Kangasniemi_Turkinmaki                           |    5 
+ util/scan/dvb-t/fi-Kankaanpaa                                       |    5 
+ util/scan/dvb-t/fi-Karigasniemi                                     |    4 
+ util/scan/dvb-t/fi-Karkkila                                         |    6 
+ util/scan/dvb-t/fi-Karstula                                         |    4 
+ util/scan/dvb-t/fi-Karvia                                           |    5 
+ util/scan/dvb-t/fi-Kaunispaa                                        |    4 
+ util/scan/dvb-t/fi-Kemijarvi_Suomutunturi                           |    4 
+ util/scan/dvb-t/fi-Kerimaki                                         |    6 
+ util/scan/dvb-t/fi-Keuruu                                           |    6 
+ util/scan/dvb-t/fi-Keuruu_Haapamaki                                 |    5 
+ util/scan/dvb-t/fi-Kihnio                                           |    5 
+ util/scan/dvb-t/fi-Kiihtelysvaara                                   |    4 
+ util/scan/dvb-t/fi-Kilpisjarvi                                      |    4 
+ util/scan/dvb-t/fi-Kittila_Sirkka_Levitunturi                       |    4 
+ util/scan/dvb-t/fi-Kolari_Vuolittaja                                |    4 
+ util/scan/dvb-t/fi-Koli                                             |    6 
+ util/scan/dvb-t/fi-Korpilahti_Vaarunvuori                           |    5 
+ util/scan/dvb-t/fi-Korppoo                                          |    5 
+ util/scan/dvb-t/fi-Kruunupyy                                        |    6 
+ util/scan/dvb-t/fi-Kuhmo_Iivantiira                                 |    4 
+ util/scan/dvb-t/fi-Kuhmo_Lentiira                                   |    4 
+ util/scan/dvb-t/fi-Kuhmo_Tikkasenmaki                               |    4 
+ util/scan/dvb-t/fi-Kuhmoinen                                        |    5 
+ util/scan/dvb-t/fi-Kuhmoinen_Harjunsalmi                            |    5 
+ util/scan/dvb-t/fi-Kuhmoinen_Puukkoinen                             |    4 
+ util/scan/dvb-t/fi-Kuopio                                           |    6 
+ util/scan/dvb-t/fi-Kustavi_Viherlahti                               |    5 
+ util/scan/dvb-t/fi-Kuttanen                                         |    4 
+ util/scan/dvb-t/fi-Kuusamo_Hamppulampi                              |    4 
+ util/scan/dvb-t/fi-Kyyjarvi_Noposenaho                              |    4 
+ util/scan/dvb-t/fi-Lahti                                            |    6 
+ util/scan/dvb-t/fi-Lapua                                            |    6 
+ util/scan/dvb-t/fi-Laukaa                                           |    5 
+ util/scan/dvb-t/fi-Laukaa_Vihtavuori                                |    5 
+ util/scan/dvb-t/fi-Lavia_Lavianjarvi                                |    4 
+ util/scan/dvb-t/fi-Lieksa_Vieki                                     |    5 
+ util/scan/dvb-t/fi-Lohja                                            |    6 
+ util/scan/dvb-t/fi-Loimaa                                           |    5 
+ util/scan/dvb-t/fi-Luhanka                                          |    5 
+ util/scan/dvb-t/fi-Luopioinen                                       |    5 
+ util/scan/dvb-t/fi-Mantta                                           |    5 
+ util/scan/dvb-t/fi-Mantyharju                                       |    4 
+ util/scan/dvb-t/fi-Mikkeli                                          |    6 
+ util/scan/dvb-t/fi-Muonio_Olostunturi                               |    4 
+ util/scan/dvb-t/fi-Nilsia                                           |    5 
+ util/scan/dvb-t/fi-Nilsia_Keski-Siikajarvi                          |    4 
+ util/scan/dvb-t/fi-Nilsia_Pisa                                      |    4 
+ util/scan/dvb-t/fi-Nokia                                            |    6 
+ util/scan/dvb-t/fi-Nokia_Siuro_Linnavuori                           |    5 
+ util/scan/dvb-t/fi-Nummi-Pusula_Hyonola                             |    5 
+ util/scan/dvb-t/fi-Nurmes_Kortevaara                                |    4 
+ util/scan/dvb-t/fi-Orivesi_Langelmaki_Talviainen                    |    4 
+ util/scan/dvb-t/fi-Oulu                                             |    6 
+ util/scan/dvb-t/fi-Padasjoki                                        |    5 
+ util/scan/dvb-t/fi-Padasjoki_Arrakoski                              |    5 
+ util/scan/dvb-t/fi-Paltamo_Kivesvaara                               |    4 
+ util/scan/dvb-t/fi-Parikkala                                        |    5 
+ util/scan/dvb-t/fi-Parkano                                          |    5 
+ util/scan/dvb-t/fi-Pello                                            |    4 
+ util/scan/dvb-t/fi-Pello_Ratasvaara                                 |    4 
+ util/scan/dvb-t/fi-Perho                                            |    5 
+ util/scan/dvb-t/fi-Pernaja                                          |    5 
+ util/scan/dvb-t/fi-Pieksamaki_Halkokumpu                            |    4 
+ util/scan/dvb-t/fi-Pihtipudas                                       |    5 
+ util/scan/dvb-t/fi-Porvoo_Suomenkyla                                |    5 
+ util/scan/dvb-t/fi-Posio                                            |    4 
+ util/scan/dvb-t/fi-Pudasjarvi                                       |    4 
+ util/scan/dvb-t/fi-Pudasjarvi_Iso-Syote                             |    4 
+ util/scan/dvb-t/fi-Pudasjarvi_Kangasvaara                           |    4 
+ util/scan/dvb-t/fi-Puolanka                                         |    5 
+ util/scan/dvb-t/fi-Pyhatunturi                                      |    4 
+ util/scan/dvb-t/fi-Pyhavuori                                        |    5 
+ util/scan/dvb-t/fi-Pylkonmaki_Karankajarvi                          |    4 
+ util/scan/dvb-t/fi-Raahe_Mestauskallio                              |    5 
+ util/scan/dvb-t/fi-Raahe_Piehinki                                   |    4 
+ util/scan/dvb-t/fi-Ranua_Haasionmaa                                 |    4 
+ util/scan/dvb-t/fi-Ranua_Leppiaho                                   |    4 
+ util/scan/dvb-t/fi-Rautavaara_Angervikko                            |    5 
+ util/scan/dvb-t/fi-Rautjarvi_Simpele                                |    4 
+ util/scan/dvb-t/fi-Ristijarvi                                       |    4 
+ util/scan/dvb-t/fi-Rovaniemi                                        |    5 
+ util/scan/dvb-t/fi-Rovaniemi_Ala-Nampa_Yli-Nampa_Rantalaki          |    4 
+ util/scan/dvb-t/fi-Rovaniemi_Kaihuanvaara                           |    4 
+ util/scan/dvb-t/fi-Rovaniemi_Karhuvaara_Marrasjarvi                 |    4 
+ util/scan/dvb-t/fi-Rovaniemi_Marasenkallio                          |    4 
+ util/scan/dvb-t/fi-Rovaniemi_Meltaus_Sorviselka                     |    4 
+ util/scan/dvb-t/fi-Rovaniemi_Sonka                                  |    4 
+ util/scan/dvb-t/fi-Ruka                                             |    5 
+ util/scan/dvb-t/fi-Ruovesi_Storminiemi                              |    5 
+ util/scan/dvb-t/fi-Saarijarvi                                       |    5 
+ util/scan/dvb-t/fi-Saarijarvi_Kalmari                               |    4 
+ util/scan/dvb-t/fi-Saarijarvi_Mahlu                                 |    4 
+ util/scan/dvb-t/fi-Salla_Hirvasvaara                                |    4 
+ util/scan/dvb-t/fi-Salla_Ihistysjanka                               |    4 
+ util/scan/dvb-t/fi-Salla_Naruska                                    |    4 
+ util/scan/dvb-t/fi-Salla_Sallatunturi                               |    4 
+ util/scan/dvb-t/fi-Salla_Sarivaara                                  |    4 
+ util/scan/dvb-t/fi-Salo_Isokyla                                     |    6 
+ util/scan/dvb-t/fi-Savukoski_Martti_Haarahonganmaa                  |    4 
+ util/scan/dvb-t/fi-Savukoski_Tanhua                                 |    4 
+ util/scan/dvb-t/fi-Siilinjarvi                                      |    5 
+ util/scan/dvb-t/fi-Sipoo_Norrkulla                                  |    5 
+ util/scan/dvb-t/fi-Sodankyla_Pittiovaara                            |    4 
+ util/scan/dvb-t/fi-Sulkava_Vaatalanmaki                             |    4 
+ util/scan/dvb-t/fi-Suomussalmi_Myllylahti                           |    4 
+ util/scan/dvb-t/fi-Sysma_Liikola                                    |    5 
+ util/scan/dvb-t/fi-Taivalkoski                                      |    4 
+ util/scan/dvb-t/fi-Taivalkoski_Taivalvaara                          |    4 
+ util/scan/dvb-t/fi-Tammela                                          |    6 
+ util/scan/dvb-t/fi-Tammisaari                                       |    5 
+ util/scan/dvb-t/fi-Tampere                                          |    4 
+ util/scan/dvb-t/fi-Tampere_Pyynikki                                 |    6 
+ util/scan/dvb-t/fi-Tervola                                          |    5 
+ util/scan/dvb-t/fi-Turku                                            |    5 
+ util/scan/dvb-t/fi-Utsjoki                                          |    4 
+ util/scan/dvb-t/fi-Utsjoki_Nuorgam_Njallavaara                      |    4 
+ util/scan/dvb-t/fi-Utsjoki_Nuorgam_raja                             |    4 
+ util/scan/dvb-t/fi-Utsjoki_Nuvvus                                   |    4 
+ util/scan/dvb-t/fi-Utsjoki_Outakoski                                |    4 
+ util/scan/dvb-t/fi-Utsjoki_Polvarniemi                              |    4 
+ util/scan/dvb-t/fi-Utsjoki_Rovisuvanto                              |    4 
+ util/scan/dvb-t/fi-Utsjoki_Tenola                                   |    4 
+ util/scan/dvb-t/fi-Uusikaupunki_Orivo                               |    5 
+ util/scan/dvb-t/fi-Vaala                                            |    4 
+ util/scan/dvb-t/fi-Vaasa                                            |    5 
+ util/scan/dvb-t/fi-Valtimo                                          |    4 
+ util/scan/dvb-t/fi-Vammala_Jyranvuori                               |    5 
+ util/scan/dvb-t/fi-Vammala_Roismala                                 |    4 
+ util/scan/dvb-t/fi-Vammala_Savi                                     |    4 
+ util/scan/dvb-t/fi-Vantaa_Hakunila                                  |    6 
+ util/scan/dvb-t/fi-Varpaisjarvi_Honkamaki                           |    5 
+ util/scan/dvb-t/fi-Virrat_Lappavuori                                |    5 
+ util/scan/dvb-t/fi-Vuokatti                                         |    6 
+ util/scan/dvb-t/fi-Vuotso                                           |    4 
+ util/scan/dvb-t/fi-Ylitornio_Ainiovaara                             |    5 
+ util/scan/dvb-t/fi-Ylitornio_Raanujarvi                             |    4 
+ util/scan/dvb-t/fi-Yllas                                            |    4 
+ util/scan/dvb-t/fr-Abbeville                                        |   25 
+ util/scan/dvb-t/fr-Agen                                             |   25 
+ util/scan/dvb-t/fr-Ajaccio                                          |   25 
+ util/scan/dvb-t/fr-Albi                                             |   25 
+ util/scan/dvb-t/fr-Alençon                                         |   25 
+ util/scan/dvb-t/fr-Ales                                             |   25 
+ util/scan/dvb-t/fr-Ales-Bouquet                                     |   25 
+ util/scan/dvb-t/fr-Amiens                                           |   25 
+ util/scan/dvb-t/fr-Angers                                           |   25 
+ util/scan/dvb-t/fr-Annecy                                           |   25 
+ util/scan/dvb-t/fr-Arcachon                                         |   25 
+ util/scan/dvb-t/fr-Argenton                                         |   25 
+ util/scan/dvb-t/fr-Aubenas                                          |   25 
+ util/scan/dvb-t/fr-Aurillac                                         |   25 
+ util/scan/dvb-t/fr-Autun                                            |   25 
+ util/scan/dvb-t/fr-Auxerre                                          |   25 
+ util/scan/dvb-t/fr-Avignon                                          |   25 
+ util/scan/dvb-t/fr-BarleDuc                                         |   25 
+ util/scan/dvb-t/fr-Bastia                                           |   25 
+ util/scan/dvb-t/fr-Bayonne                                          |   25 
+ util/scan/dvb-t/fr-Bergerac                                         |   25 
+ util/scan/dvb-t/fr-Besançon                                        |   25 
+ util/scan/dvb-t/fr-Bordeaux                                         |    9 
+ util/scan/dvb-t/fr-Bordeaux-Bouliac                                 |   25 
+ util/scan/dvb-t/fr-Bordeaux-Cauderan                                |   25 
+ util/scan/dvb-t/fr-Boulogne                                         |   25 
+ util/scan/dvb-t/fr-Bourges                                          |   25 
+ util/scan/dvb-t/fr-Brest                                            |    9 
+ util/scan/dvb-t/fr-Brive                                            |   25 
+ util/scan/dvb-t/fr-Caen                                             |   25 
+ util/scan/dvb-t/fr-Caen-Pincon                                      |   25 
+ util/scan/dvb-t/fr-Cannes                                           |   25 
+ util/scan/dvb-t/fr-Carcassonne                                      |   25 
+ util/scan/dvb-t/fr-Chambery                                         |   30 
+ util/scan/dvb-t/fr-Chartres                                         |   25 
+ util/scan/dvb-t/fr-Chennevieres                                     |   25 
+ util/scan/dvb-t/fr-Cherbourg                                        |   25 
+ util/scan/dvb-t/fr-ClermontFerrand                                  |   25 
+ util/scan/dvb-t/fr-Cluses                                           |   23 
+ util/scan/dvb-t/fr-Dieppe                                           |   25 
+ util/scan/dvb-t/fr-Dijon                                            |   28 
+ util/scan/dvb-t/fr-Dunkerque                                        |   30 
+ util/scan/dvb-t/fr-Epinal                                           |   25 
+ util/scan/dvb-t/fr-Evreux                                           |   25 
+ util/scan/dvb-t/fr-Forbach                                          |   30 
+ util/scan/dvb-t/fr-Gex                                              |   30 
+ util/scan/dvb-t/fr-Grenoble                                         |   25 
+ util/scan/dvb-t/fr-Gueret                                           |   25 
+ util/scan/dvb-t/fr-Hirson                                           |   30 
+ util/scan/dvb-t/fr-Hyeres                                           |   25 
+ util/scan/dvb-t/fr-LaRochelle                                       |   25 
+ util/scan/dvb-t/fr-Laval                                            |   25 
+ util/scan/dvb-t/fr-LeCreusot                                        |   25 
+ util/scan/dvb-t/fr-LeHavre                                          |   25 
+ util/scan/dvb-t/fr-LeMans                                           |   21 
+ util/scan/dvb-t/fr-LePuyEnVelay                                     |   25 
+ util/scan/dvb-t/fr-Lille                                            |   30 
+ util/scan/dvb-t/fr-Lille-Lambersart                                 |   25 
+ util/scan/dvb-t/fr-LilleT2                                          |   13 
+ util/scan/dvb-t/fr-Limoges                                          |   25 
+ util/scan/dvb-t/fr-Longwy                                           |   30 
+ util/scan/dvb-t/fr-Lorient                                          |   25 
+ util/scan/dvb-t/fr-Lyon-Fourviere                                   |   18 
+ util/scan/dvb-t/fr-Lyon-Pilat                                       |   17 
+ util/scan/dvb-t/fr-Macon                                            |   30 
+ util/scan/dvb-t/fr-Mantes                                           |   25 
+ util/scan/dvb-t/fr-Marseille                                        |    6 
+ util/scan/dvb-t/fr-Maubeuge                                         |   30 
+ util/scan/dvb-t/fr-Meaux                                            |   25 
+ util/scan/dvb-t/fr-Mende                                            |   25 
+ util/scan/dvb-t/fr-Menton                                           |   25 
+ util/scan/dvb-t/fr-Metz                                             |   30 
+ util/scan/dvb-t/fr-Mezieres                                         |   30 
+ util/scan/dvb-t/fr-Montbeliard                                      |   18 
+ util/scan/dvb-t/fr-Montlucon                                        |   25 
+ util/scan/dvb-t/fr-Montpellier                                      |   25 
+ util/scan/dvb-t/fr-Mulhouse                                         |   26 
+ util/scan/dvb-t/fr-Nancy                                            |   25 
+ util/scan/dvb-t/fr-Nantes                                           |    8 
+ util/scan/dvb-t/fr-NeufchatelEnBray                                 |   25 
+ util/scan/dvb-t/fr-Nice                                             |   25 
+ util/scan/dvb-t/fr-Niort                                            |    7 
+ util/scan/dvb-t/fr-Orleans                                          |   17 
+ util/scan/dvb-t/fr-Paris                                            |   19 
+ util/scan/dvb-t/fr-Parthenay                                        |   25 
+ util/scan/dvb-t/fr-Perpignan                                        |   25 
+ util/scan/dvb-t/fr-Poitiers                                         |   25 
+ util/scan/dvb-t/fr-Privas                                           |   25 
+ util/scan/dvb-t/fr-Reims                                            |   25 
+ util/scan/dvb-t/fr-Rennes                                           |    7 
+ util/scan/dvb-t/fr-Roanne                                           |   25 
+ util/scan/dvb-t/fr-Rouen                                            |    8 
+ util/scan/dvb-t/fr-SaintEtienne                                     |   25 
+ util/scan/dvb-t/fr-SaintRaphael                                     |   25 
+ util/scan/dvb-t/fr-Sannois                                          |   25 
+ util/scan/dvb-t/fr-Sarrebourg                                       |   30 
+ util/scan/dvb-t/fr-Sens                                             |   25 
+ util/scan/dvb-t/fr-Strasbourg                                       |   18 
+ util/scan/dvb-t/fr-Toulon                                           |   25 
+ util/scan/dvb-t/fr-Toulouse                                         |    8 
+ util/scan/dvb-t/fr-Toulouse-Midi                                    |   25 
+ util/scan/dvb-t/fr-Tours                                            |   25 
+ util/scan/dvb-t/fr-Troyes                                           |   25 
+ util/scan/dvb-t/fr-Ussel                                            |   25 
+ util/scan/dvb-t/fr-Valence                                          |   25 
+ util/scan/dvb-t/fr-Valenciennes                                     |   30 
+ util/scan/dvb-t/fr-Vannes                                           |    7 
+ util/scan/dvb-t/fr-Villebon                                         |   22 
+ util/scan/dvb-t/fr-Vittel                                           |   30 
+ util/scan/dvb-t/fr-Voiron                                           |   30 
+ util/scan/dvb-t/gr-Athens                                           |    3 
+ util/scan/dvb-t/hk-HongKong                                         |   18 
+ util/scan/dvb-t/hr-Zagreb                                           |    3 
+ util/scan/dvb-t/is-Reykjavik                                        |   13 
+ util/scan/dvb-t/it-Aosta                                            |   21 
+ util/scan/dvb-t/it-Bari                                             |   18 
+ util/scan/dvb-t/it-Bologna                                          |   28 
+ util/scan/dvb-t/it-Bolzano                                          |    5 
+ util/scan/dvb-t/it-Cagliari                                         |   23 
+ util/scan/dvb-t/it-Caivano                                          |   17 
+ util/scan/dvb-t/it-Catania                                          |   27 
+ util/scan/dvb-t/it-Conero                                           |    8 
+ util/scan/dvb-t/it-Firenze                                          |   20 
+ util/scan/dvb-t/it-Genova                                           |   12 
+ util/scan/dvb-t/it-Livorno                                          |   15 
+ util/scan/dvb-t/it-Milano                                           |   15 
+ util/scan/dvb-t/it-Pagnacco                                         |   27 
+ util/scan/dvb-t/it-Palermo                                          |   23 
+ util/scan/dvb-t/it-Pescara                                          |   15 
+ util/scan/dvb-t/it-Pisa                                             |   18 
+ util/scan/dvb-t/it-Roma                                             |   16 
+ util/scan/dvb-t/it-S-Stefano_al_mare                                |   19 
+ util/scan/dvb-t/it-Sassari                                          |   33 
+ util/scan/dvb-t/it-Torino                                           |   13 
+ util/scan/dvb-t/it-Trieste                                          |   23 
+ util/scan/dvb-t/it-Varese                                           |   16 
+ util/scan/dvb-t/it-Venezia                                          |   19 
+ util/scan/dvb-t/it-Verona                                           |   19 
+ util/scan/dvb-t/lu-All                                              |    5 
+ util/scan/dvb-t/lv-Riga                                             |   25 
+ util/scan/dvb-t/nl-All                                              |   42 
+ util/scan/dvb-t/nl-AlphenaandenRijn                                 |    7 
+ util/scan/dvb-t/nl-Randstad                                         |    7 
+ util/scan/dvb-t/no-Trondelag_Stjordal                               |    7 
+ util/scan/dvb-t/nz-Waiatarua                                        |   13 
+ util/scan/dvb-t/pl-Rzeszow                                          |    3 
+ util/scan/dvb-t/pl-Warszawa                                         |    4 
+ util/scan/dvb-t/pl-Wroclaw                                          |    3 
+ util/scan/dvb-t/se-Alvdalen_Brunnsberg                              |    3 
+ util/scan/dvb-t/se-Alvdalsasen                                      |    3 
+ util/scan/dvb-t/se-Alvsbyn                                          |    7 
+ util/scan/dvb-t/se-Amot                                             |    3 
+ util/scan/dvb-t/se-Ange_Snoberg                                     |    6 
+ util/scan/dvb-t/se-Angebo                                           |    3 
+ util/scan/dvb-t/se-Angelholm_Vegeholm                               |    7 
+ util/scan/dvb-t/se-Arvidsjaur_Jultrask                              |    6 
+ util/scan/dvb-t/se-Aspeboda                                         |    3 
+ util/scan/dvb-t/se-Atvidaberg                                       |    4 
+ util/scan/dvb-t/se-Avesta_Krylbo                                    |    4 
+ util/scan/dvb-t/se-Backefors                                        |    7 
+ util/scan/dvb-t/se-Bankeryd                                         |    4 
+ util/scan/dvb-t/se-Bergsjo_Balleberget                              |    3 
+ util/scan/dvb-t/se-Bergvik                                          |    3 
+ util/scan/dvb-t/se-Bollebygd                                        |    4 
+ util/scan/dvb-t/se-Bollnas                                          |    6 
+ util/scan/dvb-t/se-Boras_Dalsjofors                                 |    7 
+ util/scan/dvb-t/se-Boras_Sjobo                                      |    4 
+ util/scan/dvb-t/se-Borlange_Idkerberget                             |    6 
+ util/scan/dvb-t/se-Borlange_Nygardarna                              |    4 
+ util/scan/dvb-t/se-Bottnaryd_Ryd                                    |    3 
+ util/scan/dvb-t/se-Bromsebro                                        |    4 
+ util/scan/dvb-t/se-Bruzaholm                                        |    3 
+ util/scan/dvb-t/se-Byxelkrok                                        |    4 
+ util/scan/dvb-t/se-Dadran                                           |    3 
+ util/scan/dvb-t/se-Dalfors                                          |    3 
+ util/scan/dvb-t/se-Dalstuga                                         |    3 
+ util/scan/dvb-t/se-Degerfors                                        |    6 
+ util/scan/dvb-t/se-Delary                                           |    3 
+ util/scan/dvb-t/se-Djura                                            |    3 
+ util/scan/dvb-t/se-Drevdagen                                        |    3 
+ util/scan/dvb-t/se-Duvnas                                           |    3 
+ util/scan/dvb-t/se-Duvnas_Basna                                     |    3 
+ util/scan/dvb-t/se-Edsbyn                                           |    3 
+ util/scan/dvb-t/se-Emmaboda_Balshult                                |    6 
+ util/scan/dvb-t/se-Enviken                                          |    4 
+ util/scan/dvb-t/se-Fagersta                                         |    4 
+ util/scan/dvb-t/se-Falerum_Centrum                                  |    3 
+ util/scan/dvb-t/se-Falun_Lovberget                                  |    6 
+ util/scan/dvb-t/se-Farila                                           |    3 
+ util/scan/dvb-t/se-Faro_Ajkerstrask                                 |    4 
+ util/scan/dvb-t/se-Farosund_Bunge                                   |    7 
+ util/scan/dvb-t/se-Filipstad_Klockarhojden                          |    6 
+ util/scan/dvb-t/se-Finnveden                                        |    6 
+ util/scan/dvb-t/se-Fredriksberg                                     |    3 
+ util/scan/dvb-t/se-Fritsla                                          |    3 
+ util/scan/dvb-t/se-Furudal                                          |    3 
+ util/scan/dvb-t/se-Gallivare                                        |    6 
+ util/scan/dvb-t/se-Garpenberg_Kuppgarden                            |    3 
+ util/scan/dvb-t/se-Gavle                                            |    6 
+ util/scan/dvb-t/se-Gavle_Skogmur                                    |    6 
+ util/scan/dvb-t/se-Gnarp                                            |    3 
+ util/scan/dvb-t/se-Gnesta                                           |    4 
+ util/scan/dvb-t/se-Gnosjo_Marieholm                                 |    3 
+ util/scan/dvb-t/se-Goteborg_Brudaremossen                           |    7 
+ util/scan/dvb-t/se-Goteborg_Slattadamm                              |    7 
+ util/scan/dvb-t/se-Gullbrandstorp                                   |    3 
+ util/scan/dvb-t/se-Gunnarsbo                                        |    3 
+ util/scan/dvb-t/se-Gusum                                            |    3 
+ util/scan/dvb-t/se-Hagfors_Varmullsasen                             |    6 
+ util/scan/dvb-t/se-Hallaryd                                         |    3 
+ util/scan/dvb-t/se-Hallbo                                           |    3 
+ util/scan/dvb-t/se-Halmstad_Hamnen                                  |    4 
+ util/scan/dvb-t/se-Halmstad_Oskarstrom                              |    6 
+ util/scan/dvb-t/se-Harnosand_Harnon                                 |    6 
+ util/scan/dvb-t/se-Hassela                                          |    3 
+ util/scan/dvb-t/se-Havdhem                                          |    7 
+ util/scan/dvb-t/se-Hedemora                                         |    3 
+ util/scan/dvb-t/se-Helsingborg_Olympia                              |    7 
+ util/scan/dvb-t/se-Hennan                                           |    3 
+ util/scan/dvb-t/se-Hestra_Aspas                                     |    3 
+ util/scan/dvb-t/se-Hjo_Grevback                                     |    3 
+ util/scan/dvb-t/se-Hofors                                           |    6 
+ util/scan/dvb-t/se-Hogfors                                          |    3 
+ util/scan/dvb-t/se-Hogsby_Virstad                                   |    4 
+ util/scan/dvb-t/se-Holsbybrunn_Holsbyholm                           |    3 
+ util/scan/dvb-t/se-Horby_Sallerup                                   |    7 
+ util/scan/dvb-t/se-Horken                                           |    3 
+ util/scan/dvb-t/se-Hudiksvall_Forsa                                 |    6 
+ util/scan/dvb-t/se-Hudiksvall_Galgberget                            |    4 
+ util/scan/dvb-t/se-Huskvarna                                        |    3 
+ util/scan/dvb-t/se-Idre                                             |    3 
+ util/scan/dvb-t/se-Ingatorp                                         |    3 
+ util/scan/dvb-t/se-Ingvallsbenning                                  |    3 
+ util/scan/dvb-t/se-Irevik                                           |    4 
+ util/scan/dvb-t/se-Jamjo                                            |    4 
+ util/scan/dvb-t/se-Jarnforsen                                       |    3 
+ util/scan/dvb-t/se-Jarvso                                           |    3 
+ util/scan/dvb-t/se-Jokkmokk_Tjalmejaure                             |    6 
+ util/scan/dvb-t/se-Jonkoping_Bondberget                             |    6 
+ util/scan/dvb-t/se-Kalix                                            |    6 
+ util/scan/dvb-t/se-Karbole                                          |    3 
+ util/scan/dvb-t/se-Karlsborg_Vaberget                               |    3 
+ util/scan/dvb-t/se-Karlshamn                                        |    6 
+ util/scan/dvb-t/se-Karlskrona_Vamo                                  |    6 
+ util/scan/dvb-t/se-Karlstad_Sormon                                  |    9 
+ util/scan/dvb-t/se-Kaxholmen_Vistakulle                             |    3 
+ util/scan/dvb-t/se-Kinnastrom                                       |    3 
+ util/scan/dvb-t/se-Kiruna_Kirunavaara                               |    6 
+ util/scan/dvb-t/se-Kisa                                             |    7 
+ util/scan/dvb-t/se-Knared                                           |    3 
+ util/scan/dvb-t/se-Kopmanholmen                                     |    6 
+ util/scan/dvb-t/se-Kopparberg                                       |    4 
+ util/scan/dvb-t/se-Kramfors_Lugnvik                                 |    6 
+ util/scan/dvb-t/se-Kristinehamn_Utsiktsberget                       |    6 
+ util/scan/dvb-t/se-Kungsater                                        |    3 
+ util/scan/dvb-t/se-Kungsberget_GI                                   |    3 
+ util/scan/dvb-t/se-Langshyttan                                      |    3 
+ util/scan/dvb-t/se-Langshyttan_Engelsfors                           |    3 
+ util/scan/dvb-t/se-Leksand_Karingberget                             |    3 
+ util/scan/dvb-t/se-Lerdala                                          |    3 
+ util/scan/dvb-t/se-Lilltjara_Digerberget                            |    3 
+ util/scan/dvb-t/se-Limedsforsen                                     |    3 
+ util/scan/dvb-t/se-Lindshammar_Ramkvilla                            |    3 
+ util/scan/dvb-t/se-Linkoping_Vattentornet                           |    7 
+ util/scan/dvb-t/se-Ljugarn                                          |    4 
+ util/scan/dvb-t/se-Loffstrand                                       |    6 
+ util/scan/dvb-t/se-Lonneberga                                       |    4 
+ util/scan/dvb-t/se-Lorstrand                                        |    3 
+ util/scan/dvb-t/se-Ludvika_Bjorkasen                                |    4 
+ util/scan/dvb-t/se-Lumsheden_Trekanten                              |    3 
+ util/scan/dvb-t/se-Lycksele_Knaften                                 |    6 
+ util/scan/dvb-t/se-Mahult                                           |    3 
+ util/scan/dvb-t/se-Malmo_Jagersro                                   |    7 
+ util/scan/dvb-t/se-Malung                                           |    4 
+ util/scan/dvb-t/se-Mariannelund                                     |    3 
+ util/scan/dvb-t/se-Markaryd_Hualtet                                 |    4 
+ util/scan/dvb-t/se-Matfors                                          |    6 
+ util/scan/dvb-t/se-Molnbo_Tallstugan                                |    2 
+ util/scan/dvb-t/se-Molndal_Vasterberget                             |    7 
+ util/scan/dvb-t/se-Mora_Eldris                                      |    6 
+ util/scan/dvb-t/se-Motala_Ervasteby                                 |    7 
+ util/scan/dvb-t/se-Mullsjo_Torestorp                                |    4 
+ util/scan/dvb-t/se-Nassjo                                           |    6 
+ util/scan/dvb-t/se-Navekvarn                                        |    3 
+ util/scan/dvb-t/se-Norrahammar                                      |    3 
+ util/scan/dvb-t/se-Norrkoping_Krokek                                |    7 
+ util/scan/dvb-t/se-Norrtalje_Sodra_Bergen                           |    7 
+ util/scan/dvb-t/se-Nykoping                                         |    3 
+ util/scan/dvb-t/se-Orebro_Lockhyttan                                |    7 
+ util/scan/dvb-t/se-Ornskoldsvik_As                                  |    6 
+ util/scan/dvb-t/se-Oskarshamn                                       |    6 
+ util/scan/dvb-t/se-Ostersund_Brattasen                              |    7 
+ util/scan/dvb-t/se-Osthammar_Valo                                   |    7 
+ util/scan/dvb-t/se-Overkalix                                        |    6 
+ util/scan/dvb-t/se-Oxberg                                           |    3 
+ util/scan/dvb-t/se-Pajala                                           |    6 
+ util/scan/dvb-t/se-Paulistom                                        |    3 
+ util/scan/dvb-t/se-Rattvik                                          |    3 
+ util/scan/dvb-t/se-Rengsjo                                          |    3 
+ util/scan/dvb-t/se-Rorbacksnas                                      |    3 
+ util/scan/dvb-t/se-Sagmyra                                          |    3 
+ util/scan/dvb-t/se-Salen                                            |    3 
+ util/scan/dvb-t/se-Salfjallet                                       |    3 
+ util/scan/dvb-t/se-Sarna_Mickeltemplet                              |    3 
+ util/scan/dvb-t/se-Satila                                           |    3 
+ util/scan/dvb-t/se-Saxdalen                                         |    3 
+ util/scan/dvb-t/se-Siljansnas_Uvberget                              |    3 
+ util/scan/dvb-t/se-Skarstad                                         |    3 
+ util/scan/dvb-t/se-Skattungbyn                                      |    3 
+ util/scan/dvb-t/se-Skelleftea                                       |    6 
+ util/scan/dvb-t/se-Skene_Nycklarberget                              |    3 
+ util/scan/dvb-t/se-Skovde                                           |    7 
+ util/scan/dvb-t/se-Smedjebacken_Uvberget                            |    6 
+ util/scan/dvb-t/se-Soderhamn                                        |    4 
+ util/scan/dvb-t/se-Soderkoping                                      |    4 
+ util/scan/dvb-t/se-Sodertalje_Ragnhildsborg                         |    8 
+ util/scan/dvb-t/se-Solleftea_Hallsta                                |    6 
+ util/scan/dvb-t/se-Solleftea_Multra                                 |    6 
+ util/scan/dvb-t/se-Sorsjon                                          |    3 
+ util/scan/dvb-t/se-Stockholm_Marieberg                              |    7 
+ util/scan/dvb-t/se-Stockholm_Nacka                                  |    8 
+ util/scan/dvb-t/se-Stora_Skedvi                                     |    3 
+ util/scan/dvb-t/se-Storfjaten                                       |    3 
+ util/scan/dvb-t/se-Storuman                                         |    6 
+ util/scan/dvb-t/se-Stromstad                                        |    7 
+ util/scan/dvb-t/se-Styrsjobo                                        |    3 
+ util/scan/dvb-t/se-Sundborn                                         |    3 
+ util/scan/dvb-t/se-Sundsbruk                                        |    6 
+ util/scan/dvb-t/se-Sundsvall_S_Stadsberget                          |    7 
+ util/scan/dvb-t/se-Sunne_Blabarskullen                              |    6 
+ util/scan/dvb-t/se-Svartnas                                         |    3 
+ util/scan/dvb-t/se-Sveg_Brickan                                     |    6 
+ util/scan/dvb-t/se-Taberg                                           |    3 
+ util/scan/dvb-t/se-Tandadalen                                       |    3 
+ util/scan/dvb-t/se-Tasjo                                            |    6 
+ util/scan/dvb-t/se-Tollsjo                                          |    3 
+ util/scan/dvb-t/se-Torsby_Bada                                      |    6 
+ util/scan/dvb-t/se-Tranas_Bredkarr                                  |    4 
+ util/scan/dvb-t/se-Tranemo                                          |    3 
+ util/scan/dvb-t/se-Transtrand_Bolheden                              |    4 
+ util/scan/dvb-t/se-Traryd_Betas                                     |    4 
+ util/scan/dvb-t/se-Trollhattan                                      |    7 
+ util/scan/dvb-t/se-Trosa                                            |    4 
+ util/scan/dvb-t/se-Tystberga                                        |    3 
+ util/scan/dvb-t/se-Uddevalla_Herrestad                              |    7 
+ util/scan/dvb-t/se-Ullared                                          |    3 
+ util/scan/dvb-t/se-Ulricehamn                                       |    4 
+ util/scan/dvb-t/se-Ulvshyttan_Porjus                                |    3 
+ util/scan/dvb-t/se-Uppsala_Rickomberga                              |    3 
+ util/scan/dvb-t/se-Uppsala_Vedyxa                                   |    7 
+ util/scan/dvb-t/se-Vaddo_Elmsta                                     |    4 
+ util/scan/dvb-t/se-Valdemarsvik                                     |    4 
+ util/scan/dvb-t/se-Vannas_Granlundsberget                           |    6 
+ util/scan/dvb-t/se-Vansbro_Hummelberget                             |    3 
+ util/scan/dvb-t/se-Varberg_Grimeton                                 |    6 
+ util/scan/dvb-t/se-Vasteras_Lillharad                               |    7 
+ util/scan/dvb-t/se-Vastervik_Farhult                                |    6 
+ util/scan/dvb-t/se-Vaxbo                                            |    3 
+ util/scan/dvb-t/se-Vessigebro                                       |    3 
+ util/scan/dvb-t/se-Vetlanda_Nye                                     |    3 
+ util/scan/dvb-t/se-Vikmanshyttan                                    |    3 
+ util/scan/dvb-t/se-Virserum                                         |    6 
+ util/scan/dvb-t/se-Visby_Follingbo                                  |    7 
+ util/scan/dvb-t/se-Visby_Hamnen                                     |    7 
+ util/scan/dvb-t/se-Visingso                                         |    3 
+ util/scan/dvb-t/se-Vislanda_Nydala                                  |    6 
+ util/scan/dvb-t/se-Voxna                                            |    3 
+ util/scan/dvb-t/se-Ystad_Metallgatan                                |    7 
+ util/scan/dvb-t/se-Yttermalung                                      |    3 
+ util/scan/dvb-t/sk-BanskaBystrica                                   |    4 
+ util/scan/dvb-t/sk-Bratislava                                       |    4 
+ util/scan/dvb-t/sk-Kosice                                           |    4 
+ util/scan/dvb-t/tw-Kaohsiung                                        |    6 
+ util/scan/dvb-t/tw-Taipei                                           |    7 
+ util/scan/dvb-t/uk-Aberdare                                         |   10 
+ util/scan/dvb-t/uk-Angus                                            |   10 
+ util/scan/dvb-t/uk-BeaconHill                                       |   10 
+ util/scan/dvb-t/uk-Belmont                                          |   10 
+ util/scan/dvb-t/uk-Bilsdale                                         |   10 
+ util/scan/dvb-t/uk-BlackHill                                        |   11 
+ util/scan/dvb-t/uk-Blaenplwyf                                       |   10 
+ util/scan/dvb-t/uk-BluebellHill                                     |   10 
+ util/scan/dvb-t/uk-Bressay                                          |   10 
+ util/scan/dvb-t/uk-BrierleyHill                                     |   10 
+ util/scan/dvb-t/uk-BristolIlchesterCres                             |   10 
+ util/scan/dvb-t/uk-BristolKingsWeston                               |   10 
+ util/scan/dvb-t/uk-Bromsgrove                                       |   10 
+ util/scan/dvb-t/uk-BrougherMountain                                 |   10 
+ util/scan/dvb-t/uk-Caldbeck                                         |   10 
+ util/scan/dvb-t/uk-CaradonHill                                      |   10 
+ util/scan/dvb-t/uk-Carmel                                           |   10 
+ util/scan/dvb-t/uk-Chatton                                          |   10 
+ util/scan/dvb-t/uk-Chesterfield                                     |   10 
+ util/scan/dvb-t/uk-Craigkelly                                       |   10 
+ util/scan/dvb-t/uk-CrystalPalace                                    |   11 
+ util/scan/dvb-t/uk-Darvel                                           |   10 
+ util/scan/dvb-t/uk-Divis                                            |   10 
+ util/scan/dvb-t/uk-Dover                                            |   14 
+ util/scan/dvb-t/uk-Durris                                           |   10 
+ util/scan/dvb-t/uk-Eitshal                                          |   10 
+ util/scan/dvb-t/uk-EmleyMoor                                        |   10 
+ util/scan/dvb-t/uk-Fenham                                           |   10 
+ util/scan/dvb-t/uk-Fenton                                           |   10 
+ util/scan/dvb-t/uk-Ferryside                                        |    8 
+ util/scan/dvb-t/uk-Guildford                                        |   10 
+ util/scan/dvb-t/uk-Hannington                                       |    9 
+ util/scan/dvb-t/uk-Hastings                                         |   10 
+ util/scan/dvb-t/uk-Heathfield                                       |   10 
+ util/scan/dvb-t/uk-HemelHempstead                                   |   10 
+ util/scan/dvb-t/uk-HuntshawCross                                    |   13 
+ util/scan/dvb-t/uk-Idle                                             |   10 
+ util/scan/dvb-t/uk-KeelylangHill                                    |   10 
+ util/scan/dvb-t/uk-Keighley                                         |   10 
+ util/scan/dvb-t/uk-KilveyHill                                       |   10 
+ util/scan/dvb-t/uk-KnockMore                                        |   10 
+ util/scan/dvb-t/uk-Lancaster                                        |   10 
+ util/scan/dvb-t/uk-LarkStoke                                        |   10 
+ util/scan/dvb-t/uk-Limavady                                         |   10 
+ util/scan/dvb-t/uk-Llanddona                                        |   10 
+ util/scan/dvb-t/uk-Malvern                                          |   10 
+ util/scan/dvb-t/uk-Mendip                                           |   10 
+ util/scan/dvb-t/uk-Midhurst                                         |   10 
+ util/scan/dvb-t/uk-Moel-y-Parc                                      |   10 
+ util/scan/dvb-t/uk-Nottingham                                       |   10 
+ util/scan/dvb-t/uk-OliversMount                                     |   10 
+ util/scan/dvb-t/uk-Oxford                                           |   11 
+ util/scan/dvb-t/uk-PendleForest                                     |   10 
+ util/scan/dvb-t/uk-Plympton                                         |   10 
+ util/scan/dvb-t/uk-PontopPike                                       |   11 
+ util/scan/dvb-t/uk-Pontypool                                        |   10 
+ util/scan/dvb-t/uk-Presely                                          |   10 
+ util/scan/dvb-t/uk-Redruth                                          |    9 
+ util/scan/dvb-t/uk-Reigate                                          |   11 
+ util/scan/dvb-t/uk-RidgeHill                                        |   10 
+ util/scan/dvb-t/uk-Rosemarkie                                       |   10 
+ util/scan/dvb-t/uk-Rosneath                                         |   10 
+ util/scan/dvb-t/uk-Rowridge                                         |   11 
+ util/scan/dvb-t/uk-RumsterForest                                    |   10 
+ util/scan/dvb-t/uk-Saddleworth                                      |   10 
+ util/scan/dvb-t/uk-Salisbury                                        |   10 
+ util/scan/dvb-t/uk-SandyHeath                                       |   11 
+ util/scan/dvb-t/uk-Selkirk                                          |   10 
+ util/scan/dvb-t/uk-Sheffield                                        |   10 
+ util/scan/dvb-t/uk-StocklandHill                                    |   10 
+ util/scan/dvb-t/uk-Storeton                                         |    9 
+ util/scan/dvb-t/uk-Sudbury                                          |   12 
+ util/scan/dvb-t/uk-SuttonColdfield                                  |   10 
+ util/scan/dvb-t/uk-Tacolneston                                      |   10 
+ util/scan/dvb-t/uk-TheWrekin                                        |   15 
+ util/scan/dvb-t/uk-Torosay                                          |   10 
+ util/scan/dvb-t/uk-TunbridgeWells                                   |   10 
+ util/scan/dvb-t/uk-Waltham                                          |   10 
+ util/scan/dvb-t/uk-Wenvoe                                           |   10 
+ util/scan/dvb-t/uk-WhitehawkHill                                    |   10 
+ util/scan/dvb-t/uk-WinterHill                                       |   14 
+ util/scan/dvb-t/vn-Hanoi                                            |    5 
+ util/scan/list.h                                                    |    6 
+ util/scan/lnb.c                                                     |    1 
+ util/scan/lnb.h                                                     |    2 
+ util/scan/scan.c                                                    |   62 
+ util/scan/scan.h                                                    |    1 
+ util/scan/section_generate.pl                                       |   92 
+ util/szap/Makefile                                                  |   39 
+ util/szap/README                                                    |   23 
+ util/szap/azap.c                                                    |    8 
+ util/szap/channels-conf/atsc/make_atsc_chanconf.pl                  |  110 
+ util/szap/channels-conf/atsc/us-Raleigh-Durham                      |    8 
+ util/szap/channels-conf/dvb-c/de-Berlin                             |  171 
+ util/szap/channels-conf/dvb-s/Astra-19.2E                           |  226 
+ util/szap/channels-conf/dvb-s/Astra-28.2E                           |  522 +
+ util/szap/channels-conf/dvb-s/BrasilSat-B3-84.0W                    |   39 
+ util/szap/channels-conf/dvb-t/au-Adelaide                           |   28 
+ util/szap/channels-conf/dvb-t/au-Brisbane                           |   29 
+ util/szap/channels-conf/dvb-t/au-Hobart                             |   18 
+ util/szap/channels-conf/dvb-t/au-Melbourne                          |   17 
+ util/szap/channels-conf/dvb-t/au-Sydney-NorthShore                  |   31 
+ util/szap/channels-conf/dvb-t/cz-Praha                              |   16 
+ util/szap/channels-conf/dvb-t/de-Berlin                             |   47 
+ util/szap/channels-conf/dvb-t/de-Braunschweig                       |   25 
+ util/szap/channels-conf/dvb-t/de-Bremen                             |   25 
+ util/szap/channels-conf/dvb-t/de-Koeln-Bonn                         |   23 
+ util/szap/channels-conf/dvb-t/de-Leipzig                            |    7 
+ util/szap/channels-conf/dvb-t/de-Luebeck                            |   22 
+ util/szap/channels-conf/dvb-t/de-Rhein-Main                         |    6 
+ util/szap/channels-conf/dvb-t/de-Ruhrgebiet                         |   46 
+ util/szap/channels-conf/dvb-t/es-Alpicat                            |   19 
+ util/szap/channels-conf/dvb-t/es-Collserola                         |   19 
+ util/szap/channels-conf/dvb-t/es-Madrid                             |   26 
+ util/szap/channels-conf/dvb-t/es-Mussara                            |   19 
+ util/szap/channels-conf/dvb-t/uk-Crystal-Palace                     |   67 
+ util/szap/channels-conf/dvb-t/uk-Hannington                         |   28 
+ util/szap/channels-conf/dvb-t/uk-Oxford                             |   41 
+ util/szap/channels-conf/dvb-t/uk-Reigate                            |   51 
+ util/szap/channels-conf/dvb-t/uk-Sandy-Heath                        |   12 
+ util/szap/channels.conf-dvbc-berlin                                 |  171 
+ util/szap/channels.conf-dvbs-astra                                  |  226 
+ util/szap/channels.conf-dvbt-australia                              |   31 
+ util/szap/channels.conf-dvbt-berlin                                 |   51 
+ util/szap/channels.conf-dvbt-collserola                             |   25 
+ util/szap/channels.conf-dvbt-crystal-palace                         |   70 
+ util/szap/channels.conf-dvbt-hannington                             |   28 
+ util/szap/channels.conf-dvbt-madrid                                 |   16 
+ util/szap/channels.conf-dvbt-oxford                                 |   41 
+ util/szap/channels.conf-dvbt-reigate                                |   51 
+ util/szap/channels.conf-dvbt-sandy_heath                            |   13 
+ util/szap/czap.c                                                    |  145 
+ util/szap/femon.c                                                   |  149 
+ util/szap/lnb.c                                                     |  101 
+ util/szap/lnb.h                                                     |   22 
+ util/szap/szap.c                                                    |  220 
+ util/szap/tzap.c                                                    |  344 
+ util/ttusb_dec_reset/Makefile                                       |   28 
+ util/ttusb_dec_reset/ttusb_dec_reset.c                              |    4 
+ util/zap/Makefile                                                   |   20 
+ util/zap/zap.c                                                      |  226 
+ util/zap/zap_ca.c                                                   |  198 
+ util/zap/zap_ca.h                                                   |   37 
+ util/zap/zap_dvb.c                                                  |  353 +
+ util/zap/zap_dvb.h                                                  |   41 
+ 1328 files changed, 71527 insertions(+), 3595 deletions(-)
+diff -Nurd linuxtv-dvb-apps-1.1.1/COPYING dvb-apps/COPYING
+--- linuxtv-dvb-apps-1.1.1/COPYING     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/COPYING   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,339 @@
++                  GNU GENERAL PUBLIC LICENSE
++                     Version 2, June 1991
++
++ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
++ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ Everyone is permitted to copy and distribute verbatim copies
++ of this license document, but changing it is not allowed.
++
++                          Preamble
++
++  The licenses for most software are designed to take away your
++freedom to share and change it.  By contrast, the GNU General Public
++License is intended to guarantee your freedom to share and change free
++software--to make sure the software is free for all its users.  This
++General Public License applies to most of the Free Software
++Foundation's software and to any other program whose authors commit to
++using it.  (Some other Free Software Foundation software is covered by
++the GNU Lesser General Public License instead.)  You can apply it to
++your programs, too.
++
++  When we speak of free software, we are referring to freedom, not
++price.  Our General Public Licenses are designed to make sure that you
++have the freedom to distribute copies of free software (and charge for
++this service if you wish), that you receive source code or can get it
++if you want it, that you can change the software or use pieces of it
++in new free programs; and that you know you can do these things.
++
++  To protect your rights, we need to make restrictions that forbid
++anyone to deny you these rights or to ask you to surrender the rights.
++These restrictions translate to certain responsibilities for you if you
++distribute copies of the software, or if you modify it.
++
++  For example, if you distribute copies of such a program, whether
++gratis or for a fee, you must give the recipients all the rights that
++you have.  You must make sure that they, too, receive or can get the
++source code.  And you must show them these terms so they know their
++rights.
++
++  We protect your rights with two steps: (1) copyright the software, and
++(2) offer you this license which gives you legal permission to copy,
++distribute and/or modify the software.
++
++  Also, for each author's protection and ours, we want to make certain
++that everyone understands that there is no warranty for this free
++software.  If the software is modified by someone else and passed on, we
++want its recipients to know that what they have is not the original, so
++that any problems introduced by others will not reflect on the original
++authors' reputations.
++
++  Finally, any free program is threatened constantly by software
++patents.  We wish to avoid the danger that redistributors of a free
++program will individually obtain patent licenses, in effect making the
++program proprietary.  To prevent this, we have made it clear that any
++patent must be licensed for everyone's free use or not licensed at all.
++
++  The precise terms and conditions for copying, distribution and
++modification follow.
++
++                  GNU GENERAL PUBLIC LICENSE
++   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
++
++  0. This License applies to any program or other work which contains
++a notice placed by the copyright holder saying it may be distributed
++under the terms of this General Public License.  The "Program", below,
++refers to any such program or work, and a "work based on the Program"
++means either the Program or any derivative work under copyright law:
++that is to say, a work containing the Program or a portion of it,
++either verbatim or with modifications and/or translated into another
++language.  (Hereinafter, translation is included without limitation in
++the term "modification".)  Each licensee is addressed as "you".
++
++Activities other than copying, distribution and modification are not
++covered by this License; they are outside its scope.  The act of
++running the Program is not restricted, and the output from the Program
++is covered only if its contents constitute a work based on the
++Program (independent of having been made by running the Program).
++Whether that is true depends on what the Program does.
++
++  1. You may copy and distribute verbatim copies of the Program's
++source code as you receive it, in any medium, provided that you
++conspicuously and appropriately publish on each copy an appropriate
++copyright notice and disclaimer of warranty; keep intact all the
++notices that refer to this License and to the absence of any warranty;
++and give any other recipients of the Program a copy of this License
++along with the Program.
++
++You may charge a fee for the physical act of transferring a copy, and
++you may at your option offer warranty protection in exchange for a fee.
++
++  2. You may modify your copy or copies of the Program or any portion
++of it, thus forming a work based on the Program, and copy and
++distribute such modifications or work under the terms of Section 1
++above, provided that you also meet all of these conditions:
++
++    a) You must cause the modified files to carry prominent notices
++    stating that you changed the files and the date of any change.
++
++    b) You must cause any work that you distribute or publish, that in
++    whole or in part contains or is derived from the Program or any
++    part thereof, to be licensed as a whole at no charge to all third
++    parties under the terms of this License.
++
++    c) If the modified program normally reads commands interactively
++    when run, you must cause it, when started running for such
++    interactive use in the most ordinary way, to print or display an
++    announcement including an appropriate copyright notice and a
++    notice that there is no warranty (or else, saying that you provide
++    a warranty) and that users may redistribute the program under
++    these conditions, and telling the user how to view a copy of this
++    License.  (Exception: if the Program itself is interactive but
++    does not normally print such an announcement, your work based on
++    the Program is not required to print an announcement.)
++
++These requirements apply to the modified work as a whole.  If
++identifiable sections of that work are not derived from the Program,
++and can be reasonably considered independent and separate works in
++themselves, then this License, and its terms, do not apply to those
++sections when you distribute them as separate works.  But when you
++distribute the same sections as part of a whole which is a work based
++on the Program, the distribution of the whole must be on the terms of
++this License, whose permissions for other licensees extend to the
++entire whole, and thus to each and every part regardless of who wrote it.
++
++Thus, it is not the intent of this section to claim rights or contest
++your rights to work written entirely by you; rather, the intent is to
++exercise the right to control the distribution of derivative or
++collective works based on the Program.
++
++In addition, mere aggregation of another work not based on the Program
++with the Program (or with a work based on the Program) on a volume of
++a storage or distribution medium does not bring the other work under
++the scope of this License.
++
++  3. You may copy and distribute the Program (or a work based on it,
++under Section 2) in object code or executable form under the terms of
++Sections 1 and 2 above provided that you also do one of the following:
++
++    a) Accompany it with the complete corresponding machine-readable
++    source code, which must be distributed under the terms of Sections
++    1 and 2 above on a medium customarily used for software interchange; or,
++
++    b) Accompany it with a written offer, valid for at least three
++    years, to give any third party, for a charge no more than your
++    cost of physically performing source distribution, a complete
++    machine-readable copy of the corresponding source code, to be
++    distributed under the terms of Sections 1 and 2 above on a medium
++    customarily used for software interchange; or,
++
++    c) Accompany it with the information you received as to the offer
++    to distribute corresponding source code.  (This alternative is
++    allowed only for noncommercial distribution and only if you
++    received the program in object code or executable form with such
++    an offer, in accord with Subsection b above.)
++
++The source code for a work means the preferred form of the work for
++making modifications to it.  For an executable work, complete source
++code means all the source code for all modules it contains, plus any
++associated interface definition files, plus the scripts used to
++control compilation and installation of the executable.  However, as a
++special exception, the source code distributed need not include
++anything that is normally distributed (in either source or binary
++form) with the major components (compiler, kernel, and so on) of the
++operating system on which the executable runs, unless that component
++itself accompanies the executable.
++
++If distribution of executable or object code is made by offering
++access to copy from a designated place, then offering equivalent
++access to copy the source code from the same place counts as
++distribution of the source code, even though third parties are not
++compelled to copy the source along with the object code.
++
++  4. You may not copy, modify, sublicense, or distribute the Program
++except as expressly provided under this License.  Any attempt
++otherwise to copy, modify, sublicense or distribute the Program is
++void, and will automatically terminate your rights under this License.
++However, parties who have received copies, or rights, from you under
++this License will not have their licenses terminated so long as such
++parties remain in full compliance.
++
++  5. You are not required to accept this License, since you have not
++signed it.  However, nothing else grants you permission to modify or
++distribute the Program or its derivative works.  These actions are
++prohibited by law if you do not accept this License.  Therefore, by
++modifying or distributing the Program (or any work based on the
++Program), you indicate your acceptance of this License to do so, and
++all its terms and conditions for copying, distributing or modifying
++the Program or works based on it.
++
++  6. Each time you redistribute the Program (or any work based on the
++Program), the recipient automatically receives a license from the
++original licensor to copy, distribute or modify the Program subject to
++these terms and conditions.  You may not impose any further
++restrictions on the recipients' exercise of the rights granted herein.
++You are not responsible for enforcing compliance by third parties to
++this License.
++
++  7. If, as a consequence of a court judgment or allegation of patent
++infringement or for any other reason (not limited to patent issues),
++conditions are imposed on you (whether by court order, agreement or
++otherwise) that contradict the conditions of this License, they do not
++excuse you from the conditions of this License.  If you cannot
++distribute so as to satisfy simultaneously your obligations under this
++License and any other pertinent obligations, then as a consequence you
++may not distribute the Program at all.  For example, if a patent
++license would not permit royalty-free redistribution of the Program by
++all those who receive copies directly or indirectly through you, then
++the only way you could satisfy both it and this License would be to
++refrain entirely from distribution of the Program.
++
++If any portion of this section is held invalid or unenforceable under
++any particular circumstance, the balance of the section is intended to
++apply and the section as a whole is intended to apply in other
++circumstances.
++
++It is not the purpose of this section to induce you to infringe any
++patents or other property right claims or to contest validity of any
++such claims; this section has the sole purpose of protecting the
++integrity of the free software distribution system, which is
++implemented by public license practices.  Many people have made
++generous contributions to the wide range of software distributed
++through that system in reliance on consistent application of that
++system; it is up to the author/donor to decide if he or she is willing
++to distribute software through any other system and a licensee cannot
++impose that choice.
++
++This section is intended to make thoroughly clear what is believed to
++be a consequence of the rest of this License.
++
++  8. If the distribution and/or use of the Program is restricted in
++certain countries either by patents or by copyrighted interfaces, the
++original copyright holder who places the Program under this License
++may add an explicit geographical distribution limitation excluding
++those countries, so that distribution is permitted only in or among
++countries not thus excluded.  In such case, this License incorporates
++the limitation as if written in the body of this License.
++
++  9. The Free Software Foundation may publish revised and/or new versions
++of the General Public License from time to time.  Such new versions will
++be similar in spirit to the present version, but may differ in detail to
++address new problems or concerns.
++
++Each version is given a distinguishing version number.  If the Program
++specifies a version number of this License which applies to it and "any
++later version", you have the option of following the terms and conditions
++either of that version or of any later version published by the Free
++Software Foundation.  If the Program does not specify a version number of
++this License, you may choose any version ever published by the Free Software
++Foundation.
++
++  10. If you wish to incorporate parts of the Program into other free
++programs whose distribution conditions are different, write to the author
++to ask for permission.  For software which is copyrighted by the Free
++Software Foundation, write to the Free Software Foundation; we sometimes
++make exceptions for this.  Our decision will be guided by the two goals
++of preserving the free status of all derivatives of our free software and
++of promoting the sharing and reuse of software generally.
++
++                          NO WARRANTY
++
++  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
++FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
++OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
++PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
++OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
++MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
++TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
++PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
++REPAIR OR CORRECTION.
++
++  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
++WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
++REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
++INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
++OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
++TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
++YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
++PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
++POSSIBILITY OF SUCH DAMAGES.
++
++                   END OF TERMS AND CONDITIONS
++
++          How to Apply These Terms to Your New Programs
++
++  If you develop a new program, and you want it to be of the greatest
++possible use to the public, the best way to achieve this is to make it
++free software which everyone can redistribute and change under these terms.
++
++  To do so, attach the following notices to the program.  It is safest
++to attach them to the start of each source file to most effectively
++convey the exclusion of warranty; and each file should have at least
++the "copyright" line and a pointer to where the full notice is found.
++
++    <one line to give the program's name and a brief idea of what it does.>
++    Copyright (C) <year>  <name of author>
++
++    This program is free software; you can redistribute it and/or modify
++    it under the terms of the GNU General Public License as published by
++    the Free Software Foundation; either version 2 of the License, or
++    (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU General Public License for more details.
++
++    You should have received a copy of the GNU General Public License along
++    with this program; if not, write to the Free Software Foundation, Inc.,
++    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++
++Also add information on how to contact you by electronic and paper mail.
++
++If the program is interactive, make it output a short notice like this
++when it starts in an interactive mode:
++
++    Gnomovision version 69, Copyright (C) year name of author
++    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
++    This is free software, and you are welcome to redistribute it
++    under certain conditions; type `show c' for details.
++
++The hypothetical commands `show w' and `show c' should show the appropriate
++parts of the General Public License.  Of course, the commands you use may
++be called something other than `show w' and `show c'; they could even be
++mouse-clicks or menu items--whatever suits your program.
++
++You should also get your employer (if you work as a programmer) or your
++school, if any, to sign a "copyright disclaimer" for the program, if
++necessary.  Here is a sample; alter the names:
++
++  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
++  `Gnomovision' (which makes passes at compilers) written by James Hacker.
++
++  <signature of Ty Coon>, 1 April 1989
++  Ty Coon, President of Vice
++
++This General Public License does not permit incorporating your program into
++proprietary programs.  If your program is a subroutine library, you may
++consider it more useful to permit linking proprietary applications with the
++library.  If this is what you want to do, use the GNU Lesser General
++Public License instead of this License.
+diff -Nurd linuxtv-dvb-apps-1.1.1/COPYING.LGPL dvb-apps/COPYING.LGPL
+--- linuxtv-dvb-apps-1.1.1/COPYING.LGPL        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/COPYING.LGPL      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,502 @@
++                GNU LESSER GENERAL PUBLIC LICENSE
++                     Version 2.1, February 1999
++
++ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
++ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
++ Everyone is permitted to copy and distribute verbatim copies
++ of this license document, but changing it is not allowed.
++
++[This is the first released version of the Lesser GPL.  It also counts
++ as the successor of the GNU Library Public License, version 2, hence
++ the version number 2.1.]
++
++                          Preamble
++
++  The licenses for most software are designed to take away your
++freedom to share and change it.  By contrast, the GNU General Public
++Licenses are intended to guarantee your freedom to share and change
++free software--to make sure the software is free for all its users.
++
++  This license, the Lesser General Public License, applies to some
++specially designated software packages--typically libraries--of the
++Free Software Foundation and other authors who decide to use it.  You
++can use it too, but we suggest you first think carefully about whether
++this license or the ordinary General Public License is the better
++strategy to use in any particular case, based on the explanations below.
++
++  When we speak of free software, we are referring to freedom of use,
++not price.  Our General Public Licenses are designed to make sure that
++you have the freedom to distribute copies of free software (and charge
++for this service if you wish); that you receive source code or can get
++it if you want it; that you can change the software and use pieces of
++it in new free programs; and that you are informed that you can do
++these things.
++
++  To protect your rights, we need to make restrictions that forbid
++distributors to deny you these rights or to ask you to surrender these
++rights.  These restrictions translate to certain responsibilities for
++you if you distribute copies of the library or if you modify it.
++
++  For example, if you distribute copies of the library, whether gratis
++or for a fee, you must give the recipients all the rights that we gave
++you.  You must make sure that they, too, receive or can get the source
++code.  If you link other code with the library, you must provide
++complete object files to the recipients, so that they can relink them
++with the library after making changes to the library and recompiling
++it.  And you must show them these terms so they know their rights.
++
++  We protect your rights with a two-step method: (1) we copyright the
++library, and (2) we offer you this license, which gives you legal
++permission to copy, distribute and/or modify the library.
++
++  To protect each distributor, we want to make it very clear that
++there is no warranty for the free library.  Also, if the library is
++modified by someone else and passed on, the recipients should know
++that what they have is not the original version, so that the original
++author's reputation will not be affected by problems that might be
++introduced by others.
++
++  Finally, software patents pose a constant threat to the existence of
++any free program.  We wish to make sure that a company cannot
++effectively restrict the users of a free program by obtaining a
++restrictive license from a patent holder.  Therefore, we insist that
++any patent license obtained for a version of the library must be
++consistent with the full freedom of use specified in this license.
++
++  Most GNU software, including some libraries, is covered by the
++ordinary GNU General Public License.  This license, the GNU Lesser
++General Public License, applies to certain designated libraries, and
++is quite different from the ordinary General Public License.  We use
++this license for certain libraries in order to permit linking those
++libraries into non-free programs.
++
++  When a program is linked with a library, whether statically or using
++a shared library, the combination of the two is legally speaking a
++combined work, a derivative of the original library.  The ordinary
++General Public License therefore permits such linking only if the
++entire combination fits its criteria of freedom.  The Lesser General
++Public License permits more lax criteria for linking other code with
++the library.
++
++  We call this license the "Lesser" General Public License because it
++does Less to protect the user's freedom than the ordinary General
++Public License.  It also provides other free software developers Less
++of an advantage over competing non-free programs.  These disadvantages
++are the reason we use the ordinary General Public License for many
++libraries.  However, the Lesser license provides advantages in certain
++special circumstances.
++
++  For example, on rare occasions, there may be a special need to
++encourage the widest possible use of a certain library, so that it becomes
++a de-facto standard.  To achieve this, non-free programs must be
++allowed to use the library.  A more frequent case is that a free
++library does the same job as widely used non-free libraries.  In this
++case, there is little to gain by limiting the free library to free
++software only, so we use the Lesser General Public License.
++
++  In other cases, permission to use a particular library in non-free
++programs enables a greater number of people to use a large body of
++free software.  For example, permission to use the GNU C Library in
++non-free programs enables many more people to use the whole GNU
++operating system, as well as its variant, the GNU/Linux operating
++system.
++
++  Although the Lesser General Public License is Less protective of the
++users' freedom, it does ensure that the user of a program that is
++linked with the Library has the freedom and the wherewithal to run
++that program using a modified version of the Library.
++
++  The precise terms and conditions for copying, distribution and
++modification follow.  Pay close attention to the difference between a
++"work based on the library" and a "work that uses the library".  The
++former contains code derived from the library, whereas the latter must
++be combined with the library in order to run.
++
++                GNU LESSER GENERAL PUBLIC LICENSE
++   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
++
++  0. This License Agreement applies to any software library or other
++program which contains a notice placed by the copyright holder or
++other authorized party saying it may be distributed under the terms of
++this Lesser General Public License (also called "this License").
++Each licensee is addressed as "you".
++
++  A "library" means a collection of software functions and/or data
++prepared so as to be conveniently linked with application programs
++(which use some of those functions and data) to form executables.
++
++  The "Library", below, refers to any such software library or work
++which has been distributed under these terms.  A "work based on the
++Library" means either the Library or any derivative work under
++copyright law: that is to say, a work containing the Library or a
++portion of it, either verbatim or with modifications and/or translated
++straightforwardly into another language.  (Hereinafter, translation is
++included without limitation in the term "modification".)
++
++  "Source code" for a work means the preferred form of the work for
++making modifications to it.  For a library, complete source code means
++all the source code for all modules it contains, plus any associated
++interface definition files, plus the scripts used to control compilation
++and installation of the library.
++
++  Activities other than copying, distribution and modification are not
++covered by this License; they are outside its scope.  The act of
++running a program using the Library is not restricted, and output from
++such a program is covered only if its contents constitute a work based
++on the Library (independent of the use of the Library in a tool for
++writing it).  Whether that is true depends on what the Library does
++and what the program that uses the Library does.
++
++  1. You may copy and distribute verbatim copies of the Library's
++complete source code as you receive it, in any medium, provided that
++you conspicuously and appropriately publish on each copy an
++appropriate copyright notice and disclaimer of warranty; keep intact
++all the notices that refer to this License and to the absence of any
++warranty; and distribute a copy of this License along with the
++Library.
++
++  You may charge a fee for the physical act of transferring a copy,
++and you may at your option offer warranty protection in exchange for a
++fee.
++
++  2. You may modify your copy or copies of the Library or any portion
++of it, thus forming a work based on the Library, and copy and
++distribute such modifications or work under the terms of Section 1
++above, provided that you also meet all of these conditions:
++
++    a) The modified work must itself be a software library.
++
++    b) You must cause the files modified to carry prominent notices
++    stating that you changed the files and the date of any change.
++
++    c) You must cause the whole of the work to be licensed at no
++    charge to all third parties under the terms of this License.
++
++    d) If a facility in the modified Library refers to a function or a
++    table of data to be supplied by an application program that uses
++    the facility, other than as an argument passed when the facility
++    is invoked, then you must make a good faith effort to ensure that,
++    in the event an application does not supply such function or
++    table, the facility still operates, and performs whatever part of
++    its purpose remains meaningful.
++
++    (For example, a function in a library to compute square roots has
++    a purpose that is entirely well-defined independent of the
++    application.  Therefore, Subsection 2d requires that any
++    application-supplied function or table used by this function must
++    be optional: if the application does not supply it, the square
++    root function must still compute square roots.)
++
++These requirements apply to the modified work as a whole.  If
++identifiable sections of that work are not derived from the Library,
++and can be reasonably considered independent and separate works in
++themselves, then this License, and its terms, do not apply to those
++sections when you distribute them as separate works.  But when you
++distribute the same sections as part of a whole which is a work based
++on the Library, the distribution of the whole must be on the terms of
++this License, whose permissions for other licensees extend to the
++entire whole, and thus to each and every part regardless of who wrote
++it.
++
++Thus, it is not the intent of this section to claim rights or contest
++your rights to work written entirely by you; rather, the intent is to
++exercise the right to control the distribution of derivative or
++collective works based on the Library.
++
++In addition, mere aggregation of another work not based on the Library
++with the Library (or with a work based on the Library) on a volume of
++a storage or distribution medium does not bring the other work under
++the scope of this License.
++
++  3. You may opt to apply the terms of the ordinary GNU General Public
++License instead of this License to a given copy of the Library.  To do
++this, you must alter all the notices that refer to this License, so
++that they refer to the ordinary GNU General Public License, version 2,
++instead of to this License.  (If a newer version than version 2 of the
++ordinary GNU General Public License has appeared, then you can specify
++that version instead if you wish.)  Do not make any other change in
++these notices.
++
++  Once this change is made in a given copy, it is irreversible for
++that copy, so the ordinary GNU General Public License applies to all
++subsequent copies and derivative works made from that copy.
++
++  This option is useful when you wish to copy part of the code of
++the Library into a program that is not a library.
++
++  4. You may copy and distribute the Library (or a portion or
++derivative of it, under Section 2) in object code or executable form
++under the terms of Sections 1 and 2 above provided that you accompany
++it with the complete corresponding machine-readable source code, which
++must be distributed under the terms of Sections 1 and 2 above on a
++medium customarily used for software interchange.
++
++  If distribution of object code is made by offering access to copy
++from a designated place, then offering equivalent access to copy the
++source code from the same place satisfies the requirement to
++distribute the source code, even though third parties are not
++compelled to copy the source along with the object code.
++
++  5. A program that contains no derivative of any portion of the
++Library, but is designed to work with the Library by being compiled or
++linked with it, is called a "work that uses the Library".  Such a
++work, in isolation, is not a derivative work of the Library, and
++therefore falls outside the scope of this License.
++
++  However, linking a "work that uses the Library" with the Library
++creates an executable that is a derivative of the Library (because it
++contains portions of the Library), rather than a "work that uses the
++library".  The executable is therefore covered by this License.
++Section 6 states terms for distribution of such executables.
++
++  When a "work that uses the Library" uses material from a header file
++that is part of the Library, the object code for the work may be a
++derivative work of the Library even though the source code is not.
++Whether this is true is especially significant if the work can be
++linked without the Library, or if the work is itself a library.  The
++threshold for this to be true is not precisely defined by law.
++
++  If such an object file uses only numerical parameters, data
++structure layouts and accessors, and small macros and small inline
++functions (ten lines or less in length), then the use of the object
++file is unrestricted, regardless of whether it is legally a derivative
++work.  (Executables containing this object code plus portions of the
++Library will still fall under Section 6.)
++
++  Otherwise, if the work is a derivative of the Library, you may
++distribute the object code for the work under the terms of Section 6.
++Any executables containing that work also fall under Section 6,
++whether or not they are linked directly with the Library itself.
++
++  6. As an exception to the Sections above, you may also combine or
++link a "work that uses the Library" with the Library to produce a
++work containing portions of the Library, and distribute that work
++under terms of your choice, provided that the terms permit
++modification of the work for the customer's own use and reverse
++engineering for debugging such modifications.
++
++  You must give prominent notice with each copy of the work that the
++Library is used in it and that the Library and its use are covered by
++this License.  You must supply a copy of this License.  If the work
++during execution displays copyright notices, you must include the
++copyright notice for the Library among them, as well as a reference
++directing the user to the copy of this License.  Also, you must do one
++of these things:
++
++    a) Accompany the work with the complete corresponding
++    machine-readable source code for the Library including whatever
++    changes were used in the work (which must be distributed under
++    Sections 1 and 2 above); and, if the work is an executable linked
++    with the Library, with the complete machine-readable "work that
++    uses the Library", as object code and/or source code, so that the
++    user can modify the Library and then relink to produce a modified
++    executable containing the modified Library.  (It is understood
++    that the user who changes the contents of definitions files in the
++    Library will not necessarily be able to recompile the application
++    to use the modified definitions.)
++
++    b) Use a suitable shared library mechanism for linking with the
++    Library.  A suitable mechanism is one that (1) uses at run time a
++    copy of the library already present on the user's computer system,
++    rather than copying library functions into the executable, and (2)
++    will operate properly with a modified version of the library, if
++    the user installs one, as long as the modified version is
++    interface-compatible with the version that the work was made with.
++
++    c) Accompany the work with a written offer, valid for at
++    least three years, to give the same user the materials
++    specified in Subsection 6a, above, for a charge no more
++    than the cost of performing this distribution.
++
++    d) If distribution of the work is made by offering access to copy
++    from a designated place, offer equivalent access to copy the above
++    specified materials from the same place.
++
++    e) Verify that the user has already received a copy of these
++    materials or that you have already sent this user a copy.
++
++  For an executable, the required form of the "work that uses the
++Library" must include any data and utility programs needed for
++reproducing the executable from it.  However, as a special exception,
++the materials to be distributed need not include anything that is
++normally distributed (in either source or binary form) with the major
++components (compiler, kernel, and so on) of the operating system on
++which the executable runs, unless that component itself accompanies
++the executable.
++
++  It may happen that this requirement contradicts the license
++restrictions of other proprietary libraries that do not normally
++accompany the operating system.  Such a contradiction means you cannot
++use both them and the Library together in an executable that you
++distribute.
++
++  7. You may place library facilities that are a work based on the
++Library side-by-side in a single library together with other library
++facilities not covered by this License, and distribute such a combined
++library, provided that the separate distribution of the work based on
++the Library and of the other library facilities is otherwise
++permitted, and provided that you do these two things:
++
++    a) Accompany the combined library with a copy of the same work
++    based on the Library, uncombined with any other library
++    facilities.  This must be distributed under the terms of the
++    Sections above.
++
++    b) Give prominent notice with the combined library of the fact
++    that part of it is a work based on the Library, and explaining
++    where to find the accompanying uncombined form of the same work.
++
++  8. You may not copy, modify, sublicense, link with, or distribute
++the Library except as expressly provided under this License.  Any
++attempt otherwise to copy, modify, sublicense, link with, or
++distribute the Library is void, and will automatically terminate your
++rights under this License.  However, parties who have received copies,
++or rights, from you under this License will not have their licenses
++terminated so long as such parties remain in full compliance.
++
++  9. You are not required to accept this License, since you have not
++signed it.  However, nothing else grants you permission to modify or
++distribute the Library or its derivative works.  These actions are
++prohibited by law if you do not accept this License.  Therefore, by
++modifying or distributing the Library (or any work based on the
++Library), you indicate your acceptance of this License to do so, and
++all its terms and conditions for copying, distributing or modifying
++the Library or works based on it.
++
++  10. Each time you redistribute the Library (or any work based on the
++Library), the recipient automatically receives a license from the
++original licensor to copy, distribute, link with or modify the Library
++subject to these terms and conditions.  You may not impose any further
++restrictions on the recipients' exercise of the rights granted herein.
++You are not responsible for enforcing compliance by third parties with
++this License.
++
++  11. If, as a consequence of a court judgment or allegation of patent
++infringement or for any other reason (not limited to patent issues),
++conditions are imposed on you (whether by court order, agreement or
++otherwise) that contradict the conditions of this License, they do not
++excuse you from the conditions of this License.  If you cannot
++distribute so as to satisfy simultaneously your obligations under this
++License and any other pertinent obligations, then as a consequence you
++may not distribute the Library at all.  For example, if a patent
++license would not permit royalty-free redistribution of the Library by
++all those who receive copies directly or indirectly through you, then
++the only way you could satisfy both it and this License would be to
++refrain entirely from distribution of the Library.
++
++If any portion of this section is held invalid or unenforceable under any
++particular circumstance, the balance of the section is intended to apply,
++and the section as a whole is intended to apply in other circumstances.
++
++It is not the purpose of this section to induce you to infringe any
++patents or other property right claims or to contest validity of any
++such claims; this section has the sole purpose of protecting the
++integrity of the free software distribution system which is
++implemented by public license practices.  Many people have made
++generous contributions to the wide range of software distributed
++through that system in reliance on consistent application of that
++system; it is up to the author/donor to decide if he or she is willing
++to distribute software through any other system and a licensee cannot
++impose that choice.
++
++This section is intended to make thoroughly clear what is believed to
++be a consequence of the rest of this License.
++
++  12. If the distribution and/or use of the Library is restricted in
++certain countries either by patents or by copyrighted interfaces, the
++original copyright holder who places the Library under this License may add
++an explicit geographical distribution limitation excluding those countries,
++so that distribution is permitted only in or among countries not thus
++excluded.  In such case, this License incorporates the limitation as if
++written in the body of this License.
++
++  13. The Free Software Foundation may publish revised and/or new
++versions of the Lesser General Public License from time to time.
++Such new versions will be similar in spirit to the present version,
++but may differ in detail to address new problems or concerns.
++
++Each version is given a distinguishing version number.  If the Library
++specifies a version number of this License which applies to it and
++"any later version", you have the option of following the terms and
++conditions either of that version or of any later version published by
++the Free Software Foundation.  If the Library does not specify a
++license version number, you may choose any version ever published by
++the Free Software Foundation.
++
++  14. If you wish to incorporate parts of the Library into other free
++programs whose distribution conditions are incompatible with these,
++write to the author to ask for permission.  For software which is
++copyrighted by the Free Software Foundation, write to the Free
++Software Foundation; we sometimes make exceptions for this.  Our
++decision will be guided by the two goals of preserving the free status
++of all derivatives of our free software and of promoting the sharing
++and reuse of software generally.
++
++                          NO WARRANTY
++
++  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
++WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
++EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
++OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
++KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
++IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
++PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
++LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
++THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
++
++  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
++WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
++AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
++FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
++CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
++LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
++RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
++FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
++SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
++DAMAGES.
++
++                   END OF TERMS AND CONDITIONS
++
++           How to Apply These Terms to Your New Libraries
++
++  If you develop a new library, and you want it to be of the greatest
++possible use to the public, we recommend making it free software that
++everyone can redistribute and change.  You can do so by permitting
++redistribution under these terms (or, alternatively, under the terms of the
++ordinary General Public License).
++
++  To apply these terms, attach the following notices to the library.  It is
++safest to attach them to the start of each source file to most effectively
++convey the exclusion of warranty; and each file should have at least the
++"copyright" line and a pointer to where the full notice is found.
++
++    <one line to give the library's name and a brief idea of what it does.>
++    Copyright (C) <year>  <name of author>
++
++    This library is free software; you can redistribute it and/or
++    modify it under the terms of the GNU Lesser General Public
++    License as published by the Free Software Foundation; either
++    version 2.1 of the License, or (at your option) any later version.
++
++    This library is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++    Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
++
++Also add information on how to contact you by electronic and paper mail.
++
++You should also get your employer (if you work as a programmer) or your
++school, if any, to sign a "copyright disclaimer" for the library, if
++necessary.  Here is a sample; alter the names:
++
++  Yoyodyne, Inc., hereby disclaims all copyright interest in the
++  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
++
++  <signature of Ty Coon>, 1 April 1990
++  Ty Coon, President of Vice
++
++That's all there is to it!
+diff -Nurd linuxtv-dvb-apps-1.1.1/include/audio.h dvb-apps/include/audio.h
+--- linuxtv-dvb-apps-1.1.1/include/audio.h     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/include/audio.h   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,140 @@
++/*
++ * audio.h
++ *
++ * Copyright (C) 2000 Ralph  Metzler <ralph@convergence.de>
++ *                  & Marcus Metzler <marcus@convergence.de>
++ *                    for convergence integrated media GmbH
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Lesser Public License
++ * as published by the Free Software Foundation; either version 2.1
++ * of the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
++ *
++ */
++
++#ifndef _DVBAUDIO_H_
++#define _DVBAUDIO_H_
++
++#ifdef __KERNEL__
++#include <linux/types.h>
++#else
++#include <stdint.h>
++#endif
++
++
++typedef enum {
++      AUDIO_SOURCE_DEMUX, /* Select the demux as the main source */
++      AUDIO_SOURCE_MEMORY /* Select internal memory as the main source */
++} audio_stream_source_t;
++
++
++typedef enum {
++      AUDIO_STOPPED,      /* Device is stopped */
++      AUDIO_PLAYING,      /* Device is currently playing */
++      AUDIO_PAUSED        /* Device is paused */
++} audio_play_state_t;
++
++
++typedef enum {
++      AUDIO_STEREO,
++      AUDIO_MONO_LEFT,
++      AUDIO_MONO_RIGHT,
++      AUDIO_MONO,
++      AUDIO_STEREO_SWAPPED
++} audio_channel_select_t;
++
++
++typedef struct audio_mixer {
++      unsigned int volume_left;
++      unsigned int volume_right;
++  // what else do we need? bass, pass-through, ...
++} audio_mixer_t;
++
++
++typedef struct audio_status {
++      int                    AV_sync_state;  /* sync audio and video? */
++      int                    mute_state;     /* audio is muted */
++      audio_play_state_t     play_state;     /* current playback state */
++      audio_stream_source_t  stream_source;  /* current stream source */
++      audio_channel_select_t channel_select; /* currently selected channel */
++      int                    bypass_mode;    /* pass on audio data to */
++      audio_mixer_t          mixer_state;    /* current mixer state */
++} audio_status_t;                              /* separate decoder hardware */
++
++
++typedef
++struct audio_karaoke{  /* if Vocal1 or Vocal2 are non-zero, they get mixed  */
++      int vocal1;    /* into left and right t at 70% each */
++      int vocal2;    /* if both, Vocal1 and Vocal2 are non-zero, Vocal1 gets*/
++      int melody;    /* mixed into the left channel and */
++                     /* Vocal2 into the right channel at 100% each. */
++                     /* if Melody is non-zero, the melody channel gets mixed*/
++} audio_karaoke_t;     /* into left and right  */
++
++
++typedef uint16_t audio_attributes_t;
++/*   bits: descr. */
++/*   15-13 audio coding mode (0=ac3, 2=mpeg1, 3=mpeg2ext, 4=LPCM, 6=DTS, */
++/*   12    multichannel extension */
++/*   11-10 audio type (0=not spec, 1=language included) */
++/*    9- 8 audio application mode (0=not spec, 1=karaoke, 2=surround) */
++/*    7- 6 Quantization / DRC (mpeg audio: 1=DRC exists)(lpcm: 0=16bit,  */
++/*    5- 4 Sample frequency fs (0=48kHz, 1=96kHz) */
++/*    2- 0 number of audio channels (n+1 channels) */
++
++
++/* for GET_CAPABILITIES and SET_FORMAT, the latter should only set one bit */
++#define AUDIO_CAP_DTS    1
++#define AUDIO_CAP_LPCM   2
++#define AUDIO_CAP_MP1    4
++#define AUDIO_CAP_MP2    8
++#define AUDIO_CAP_MP3   16
++#define AUDIO_CAP_AAC   32
++#define AUDIO_CAP_OGG   64
++#define AUDIO_CAP_SDDS 128
++#define AUDIO_CAP_AC3  256
++
++#define AUDIO_STOP                 _IO('o', 1)
++#define AUDIO_PLAY                 _IO('o', 2)
++#define AUDIO_PAUSE                _IO('o', 3)
++#define AUDIO_CONTINUE             _IO('o', 4)
++#define AUDIO_SELECT_SOURCE        _IO('o', 5)
++#define AUDIO_SET_MUTE             _IO('o', 6)
++#define AUDIO_SET_AV_SYNC          _IO('o', 7)
++#define AUDIO_SET_BYPASS_MODE      _IO('o', 8)
++#define AUDIO_CHANNEL_SELECT       _IO('o', 9)
++#define AUDIO_GET_STATUS           _IOR('o', 10, audio_status_t)
++
++#define AUDIO_GET_CAPABILITIES     _IOR('o', 11, unsigned int)
++#define AUDIO_CLEAR_BUFFER         _IO('o',  12)
++#define AUDIO_SET_ID               _IO('o', 13)
++#define AUDIO_SET_MIXER            _IOW('o', 14, audio_mixer_t)
++#define AUDIO_SET_STREAMTYPE       _IO('o', 15)
++#define AUDIO_SET_EXT_ID           _IO('o', 16)
++#define AUDIO_SET_ATTRIBUTES       _IOW('o', 17, audio_attributes_t)
++#define AUDIO_SET_KARAOKE          _IOW('o', 18, audio_karaoke_t)
++
++/**
++ * AUDIO_GET_PTS
++ *
++ * Read the 33 bit presentation time stamp as defined
++ * in ITU T-REC-H.222.0 / ISO/IEC 13818-1.
++ *
++ * The PTS should belong to the currently played
++ * frame if possible, but may also be a value close to it
++ * like the PTS of the last decoded frame or the last PTS
++ * extracted by the PES parser.
++ */
++#define AUDIO_GET_PTS              _IOR('o', 19, __u64)
++#define AUDIO_BILINGUAL_CHANNEL_SELECT _IO('o', 20)
++
++#endif /* _DVBAUDIO_H_ */
+diff -Nurd linuxtv-dvb-apps-1.1.1/include/ca.h dvb-apps/include/ca.h
+--- linuxtv-dvb-apps-1.1.1/include/ca.h        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/include/ca.h      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,90 @@
++/*
++ * ca.h
++ *
++ * Copyright (C) 2000 Ralph  Metzler <ralph@convergence.de>
++ *                  & Marcus Metzler <marcus@convergence.de>
++ *                    for convergence integrated media GmbH
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Lesser Public License
++ * as published by the Free Software Foundation; either version 2.1
++ * of the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
++ *
++ */
++
++#ifndef _DVBCA_H_
++#define _DVBCA_H_
++
++/* slot interface types and info */
++
++typedef struct ca_slot_info {
++      int num;               /* slot number */
++
++      int type;              /* CA interface this slot supports */
++#define CA_CI            1     /* CI high level interface */
++#define CA_CI_LINK       2     /* CI link layer level interface */
++#define CA_CI_PHYS       4     /* CI physical layer level interface */
++#define CA_DESCR         8     /* built-in descrambler */
++#define CA_SC          128     /* simple smart card interface */
++
++      unsigned int flags;
++#define CA_CI_MODULE_PRESENT 1 /* module (or card) inserted */
++#define CA_CI_MODULE_READY   2
++} ca_slot_info_t;
++
++
++/* descrambler types and info */
++
++typedef struct ca_descr_info {
++      unsigned int num;          /* number of available descramblers (keys) */
++      unsigned int type;         /* type of supported scrambling system */
++#define CA_ECD           1
++#define CA_NDS           2
++#define CA_DSS           4
++} ca_descr_info_t;
++
++typedef struct ca_caps {
++      unsigned int slot_num;     /* total number of CA card and module slots */
++      unsigned int slot_type;    /* OR of all supported types */
++      unsigned int descr_num;    /* total number of descrambler slots (keys) */
++      unsigned int descr_type;   /* OR of all supported types */
++} ca_caps_t;
++
++/* a message to/from a CI-CAM */
++typedef struct ca_msg {
++      unsigned int index;
++      unsigned int type;
++      unsigned int length;
++      unsigned char msg[256];
++} ca_msg_t;
++
++typedef struct ca_descr {
++      unsigned int index;
++      unsigned int parity;    /* 0 == even, 1 == odd */
++      unsigned char cw[8];
++} ca_descr_t;
++
++typedef struct ca_pid {
++      unsigned int pid;
++      int index;              /* -1 == disable*/
++} ca_pid_t;
++
++#define CA_RESET          _IO('o', 128)
++#define CA_GET_CAP        _IOR('o', 129, ca_caps_t)
++#define CA_GET_SLOT_INFO  _IOR('o', 130, ca_slot_info_t)
++#define CA_GET_DESCR_INFO _IOR('o', 131, ca_descr_info_t)
++#define CA_GET_MSG        _IOR('o', 132, ca_msg_t)
++#define CA_SEND_MSG       _IOW('o', 133, ca_msg_t)
++#define CA_SET_DESCR      _IOW('o', 134, ca_descr_t)
++#define CA_SET_PID        _IOW('o', 135, ca_pid_t)
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/include/dmx.h dvb-apps/include/dmx.h
+--- linuxtv-dvb-apps-1.1.1/include/dmx.h       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/include/dmx.h     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,154 @@
++/*
++ * dmx.h
++ *
++ * Copyright (C) 2000 Marcus Metzler <marcus@convergence.de>
++ *                  & Ralph  Metzler <ralph@convergence.de>
++ *                    for convergence integrated media GmbH
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public License
++ * as published by the Free Software Foundation; either version 2.1
++ * of the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
++ *
++ */
++
++#ifndef _DVBDMX_H_
++#define _DVBDMX_H_
++
++#include <asm/types.h>
++#ifdef __KERNEL__
++#include <linux/time.h>
++#else
++#include <time.h>
++#endif
++
++
++#define DMX_FILTER_SIZE 16
++
++typedef enum
++{
++      DMX_OUT_DECODER, /* Streaming directly to decoder. */
++      DMX_OUT_TAP,     /* Output going to a memory buffer */
++                       /* (to be retrieved via the read command).*/
++      DMX_OUT_TS_TAP   /* Output multiplexed into a new TS  */
++                       /* (to be retrieved by reading from the */
++                       /* logical DVR device).                 */
++} dmx_output_t;
++
++
++typedef enum
++{
++      DMX_IN_FRONTEND, /* Input from a front-end device.  */
++      DMX_IN_DVR       /* Input from the logical DVR device.  */
++} dmx_input_t;
++
++
++typedef enum
++{
++      DMX_PES_AUDIO0,
++      DMX_PES_VIDEO0,
++      DMX_PES_TELETEXT0,
++      DMX_PES_SUBTITLE0,
++      DMX_PES_PCR0,
++
++      DMX_PES_AUDIO1,
++      DMX_PES_VIDEO1,
++      DMX_PES_TELETEXT1,
++      DMX_PES_SUBTITLE1,
++      DMX_PES_PCR1,
++
++      DMX_PES_AUDIO2,
++      DMX_PES_VIDEO2,
++      DMX_PES_TELETEXT2,
++      DMX_PES_SUBTITLE2,
++      DMX_PES_PCR2,
++
++      DMX_PES_AUDIO3,
++      DMX_PES_VIDEO3,
++      DMX_PES_TELETEXT3,
++      DMX_PES_SUBTITLE3,
++      DMX_PES_PCR3,
++
++      DMX_PES_OTHER
++} dmx_pes_type_t;
++
++#define DMX_PES_AUDIO    DMX_PES_AUDIO0
++#define DMX_PES_VIDEO    DMX_PES_VIDEO0
++#define DMX_PES_TELETEXT DMX_PES_TELETEXT0
++#define DMX_PES_SUBTITLE DMX_PES_SUBTITLE0
++#define DMX_PES_PCR      DMX_PES_PCR0
++
++
++typedef struct dmx_filter
++{
++      __u8  filter[DMX_FILTER_SIZE];
++      __u8  mask[DMX_FILTER_SIZE];
++      __u8  mode[DMX_FILTER_SIZE];
++} dmx_filter_t;
++
++
++struct dmx_sct_filter_params
++{
++      __u16          pid;
++      dmx_filter_t   filter;
++      __u32          timeout;
++      __u32          flags;
++#define DMX_CHECK_CRC       1
++#define DMX_ONESHOT         2
++#define DMX_IMMEDIATE_START 4
++#define DMX_KERNEL_CLIENT   0x8000
++};
++
++
++struct dmx_pes_filter_params
++{
++      __u16          pid;
++      dmx_input_t    input;
++      dmx_output_t   output;
++      dmx_pes_type_t pes_type;
++      __u32          flags;
++};
++
++typedef struct dmx_caps {
++      __u32 caps;
++      int num_decoders;
++} dmx_caps_t;
++
++typedef enum {
++      DMX_SOURCE_FRONT0 = 0,
++      DMX_SOURCE_FRONT1,
++      DMX_SOURCE_FRONT2,
++      DMX_SOURCE_FRONT3,
++      DMX_SOURCE_DVR0   = 16,
++      DMX_SOURCE_DVR1,
++      DMX_SOURCE_DVR2,
++      DMX_SOURCE_DVR3
++} dmx_source_t;
++
++struct dmx_stc {
++      unsigned int num;       /* input : which STC? 0..N */
++      unsigned int base;      /* output: divisor for stc to get 90 kHz clock */
++      __u64 stc;              /* output: stc in 'base'*90 kHz units */
++};
++
++
++#define DMX_START                _IO('o', 41)
++#define DMX_STOP                 _IO('o', 42)
++#define DMX_SET_FILTER           _IOW('o', 43, struct dmx_sct_filter_params)
++#define DMX_SET_PES_FILTER       _IOW('o', 44, struct dmx_pes_filter_params)
++#define DMX_SET_BUFFER_SIZE      _IO('o', 45)
++#define DMX_GET_PES_PIDS         _IOR('o', 47, __u16[5])
++#define DMX_GET_CAPS             _IOR('o', 48, dmx_caps_t)
++#define DMX_SET_SOURCE           _IOW('o', 49, dmx_source_t)
++#define DMX_GET_STC              _IOWR('o', 50, struct dmx_stc)
++
++#endif /*_DVBDMX_H_*/
+diff -Nurd linuxtv-dvb-apps-1.1.1/include/frontend.h dvb-apps/include/frontend.h
+--- linuxtv-dvb-apps-1.1.1/include/frontend.h  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/include/frontend.h        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,648 @@
++/*
++ * frontend.h
++ *
++ * Copyright (C) 2000 Marcus Metzler <marcus@convergence.de>
++ *                Ralph  Metzler <ralph@convergence.de>
++ *                Holger Waechtler <holger@convergence.de>
++ *                Andre Draszik <ad@convergence.de>
++ *                for convergence integrated media GmbH
++ *
++ * Copyright (C) Manu Abraham <abraham.manu@gmail.com>
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public License
++ * as published by the Free Software Foundation; either version 2.1
++ * of the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
++ *
++ */
++
++#ifndef _DVBFRONTEND_H_
++#define _DVBFRONTEND_H_
++
++#include <asm/types.h>
++
++
++typedef enum fe_type {
++      FE_QPSK,
++      FE_QAM,
++      FE_OFDM,
++      FE_ATSC
++} fe_type_t;
++
++
++typedef enum fe_caps {
++      FE_IS_STUPID                    = 0,
++      FE_CAN_INVERSION_AUTO           = 0x1,
++      FE_CAN_FEC_1_2                  = 0x2,
++      FE_CAN_FEC_2_3                  = 0x4,
++      FE_CAN_FEC_3_4                  = 0x8,
++      FE_CAN_FEC_4_5                  = 0x10,
++      FE_CAN_FEC_5_6                  = 0x20,
++      FE_CAN_FEC_6_7                  = 0x40,
++      FE_CAN_FEC_7_8                  = 0x80,
++      FE_CAN_FEC_8_9                  = 0x100,
++      FE_CAN_FEC_AUTO                 = 0x200,
++      FE_CAN_QPSK                     = 0x400,
++      FE_CAN_QAM_16                   = 0x800,
++      FE_CAN_QAM_32                   = 0x1000,
++      FE_CAN_QAM_64                   = 0x2000,
++      FE_CAN_QAM_128                  = 0x4000,
++      FE_CAN_QAM_256                  = 0x8000,
++      FE_CAN_QAM_AUTO                 = 0x10000,
++      FE_CAN_TRANSMISSION_MODE_AUTO   = 0x20000,
++      FE_CAN_BANDWIDTH_AUTO           = 0x40000,
++      FE_CAN_GUARD_INTERVAL_AUTO      = 0x80000,
++      FE_CAN_HIERARCHY_AUTO           = 0x100000,
++      FE_CAN_8VSB                     = 0x200000,
++      FE_CAN_16VSB                    = 0x400000,
++      FE_NEEDS_BENDING                = 0x20000000, // not supported anymore, don't use (frontend requires frequency bending)
++      FE_CAN_RECOVER                  = 0x40000000, // frontend can recover from a cable unplug automatically
++      FE_CAN_MUTE_TS                  = 0x80000000  // frontend can stop spurious TS data output
++} fe_caps_t;
++
++
++struct dvb_frontend_info {
++      char       name[128];
++      fe_type_t  type;
++      __u32      frequency_min;
++      __u32      frequency_max;
++      __u32      frequency_stepsize;
++      __u32      frequency_tolerance;
++      __u32      symbol_rate_min;
++      __u32      symbol_rate_max;
++      __u32      symbol_rate_tolerance;       /* ppm */
++      __u32      notifier_delay;              /* DEPRECATED */
++      fe_caps_t  caps;
++};
++
++
++/**
++ *  Check out the DiSEqC bus spec available on http://www.eutelsat.org/ for
++ *  the meaning of this struct...
++ */
++struct dvb_diseqc_master_cmd {
++      __u8 msg [6];   /*  { framing, address, command, data [3] } */
++      __u8 msg_len;   /*  valid values are 3...6  */
++};
++
++
++struct dvb_diseqc_slave_reply {
++      __u8 msg [4];   /*  { framing, data [3] } */
++      __u8 msg_len;   /*  valid values are 0...4, 0 means no msg  */
++      int  timeout;   /*  return from ioctl after timeout ms with */
++};                    /*  errorcode when no message was received  */
++
++
++typedef enum fe_sec_voltage {
++      SEC_VOLTAGE_13,
++      SEC_VOLTAGE_18,
++      SEC_VOLTAGE_OFF
++} fe_sec_voltage_t;
++
++
++typedef enum fe_sec_tone_mode {
++      SEC_TONE_ON,
++      SEC_TONE_OFF
++} fe_sec_tone_mode_t;
++
++
++typedef enum fe_sec_mini_cmd {
++      SEC_MINI_A,
++      SEC_MINI_B
++} fe_sec_mini_cmd_t;
++
++
++typedef enum fe_status {
++      FE_HAS_SIGNAL   = 0x01,   /*  found something above the noise level */
++      FE_HAS_CARRIER  = 0x02,   /*  found a DVB signal  */
++      FE_HAS_VITERBI  = 0x04,   /*  FEC is stable  */
++      FE_HAS_SYNC     = 0x08,   /*  found sync bytes  */
++      FE_HAS_LOCK     = 0x10,   /*  everything's working... */
++      FE_TIMEDOUT     = 0x20,   /*  no lock within the last ~2 seconds */
++      FE_REINIT       = 0x40    /*  frontend was reinitialized,  */
++} fe_status_t;                          /*  application is recommended to reset */
++                                /*  DiSEqC, tone and parameters */
++
++typedef enum fe_spectral_inversion {
++      INVERSION_OFF,
++      INVERSION_ON,
++      INVERSION_AUTO
++} fe_spectral_inversion_t;
++
++
++typedef enum fe_code_rate {
++      FEC_NONE = 0,
++      FEC_1_2,
++      FEC_2_3,
++      FEC_3_4,
++      FEC_4_5,
++      FEC_5_6,
++      FEC_6_7,
++      FEC_7_8,
++      FEC_8_9,
++      FEC_AUTO
++} fe_code_rate_t;
++
++
++typedef enum fe_modulation {
++      QPSK,
++      QAM_16,
++      QAM_32,
++      QAM_64,
++      QAM_128,
++      QAM_256,
++      QAM_AUTO,
++      VSB_8,
++      VSB_16
++} fe_modulation_t;
++
++typedef enum fe_transmit_mode {
++      TRANSMISSION_MODE_2K,
++      TRANSMISSION_MODE_8K,
++      TRANSMISSION_MODE_AUTO
++} fe_transmit_mode_t;
++
++typedef enum fe_bandwidth {
++      BANDWIDTH_8_MHZ,
++      BANDWIDTH_7_MHZ,
++      BANDWIDTH_6_MHZ,
++      BANDWIDTH_AUTO
++} fe_bandwidth_t;
++
++
++typedef enum fe_guard_interval {
++      GUARD_INTERVAL_1_32,
++      GUARD_INTERVAL_1_16,
++      GUARD_INTERVAL_1_8,
++      GUARD_INTERVAL_1_4,
++      GUARD_INTERVAL_AUTO
++} fe_guard_interval_t;
++
++
++typedef enum fe_hierarchy {
++      HIERARCHY_NONE,
++      HIERARCHY_1,
++      HIERARCHY_2,
++      HIERARCHY_4,
++      HIERARCHY_AUTO
++} fe_hierarchy_t;
++
++
++struct dvb_qpsk_parameters {
++      __u32           symbol_rate;  /* symbol rate in Symbols per second */
++      fe_code_rate_t  fec_inner;    /* forward error correction (see above) */
++};
++
++struct dvb_qam_parameters {
++      __u32           symbol_rate; /* symbol rate in Symbols per second */
++      fe_code_rate_t  fec_inner;   /* forward error correction (see above) */
++      fe_modulation_t modulation;  /* modulation type (see above) */
++};
++
++struct dvb_vsb_parameters {
++      fe_modulation_t modulation;  /* modulation type (see above) */
++};
++
++struct dvb_ofdm_parameters {
++      fe_bandwidth_t      bandwidth;
++      fe_code_rate_t      code_rate_HP;  /* high priority stream code rate */
++      fe_code_rate_t      code_rate_LP;  /* low priority stream code rate */
++      fe_modulation_t     constellation; /* modulation type (see above) */
++      fe_transmit_mode_t  transmission_mode;
++      fe_guard_interval_t guard_interval;
++      fe_hierarchy_t      hierarchy_information;
++};
++
++
++struct dvb_frontend_parameters {
++      __u32 frequency;     /* (absolute) frequency in Hz for QAM/OFDM/ATSC */
++                           /* intermediate frequency in kHz for QPSK */
++      fe_spectral_inversion_t inversion;
++      union {
++              struct dvb_qpsk_parameters qpsk;
++              struct dvb_qam_parameters  qam;
++              struct dvb_ofdm_parameters ofdm;
++              struct dvb_vsb_parameters vsb;
++      } u;
++};
++
++
++/**
++ * When set, this flag will disable any zigzagging or other "normal" tuning
++ * behaviour. Additionally, there will be no automatic monitoring of the lock
++ * status, and hence no frontend events will be generated. If a frontend device
++ * is closed, this flag will be automatically turned off when the device is
++ * reopened read-write.
++ */
++#define FE_TUNE_MODE_ONESHOT 0x01
++
++
++#define FE_GET_INFO              _IOR('o', 61, struct dvb_frontend_info)
++
++#define FE_DISEQC_RESET_OVERLOAD   _IO('o', 62)
++#define FE_DISEQC_SEND_MASTER_CMD  _IOW('o', 63, struct dvb_diseqc_master_cmd)
++#define FE_DISEQC_RECV_SLAVE_REPLY _IOR('o', 64, struct dvb_diseqc_slave_reply)
++#define FE_DISEQC_SEND_BURST       _IO('o', 65)  /* fe_sec_mini_cmd_t */
++
++#define FE_SET_TONE              _IO('o', 66)  /* fe_sec_tone_mode_t */
++#define FE_SET_VOLTAGE                   _IO('o', 67)  /* fe_sec_voltage_t */
++#define FE_ENABLE_HIGH_LNB_VOLTAGE _IO('o', 68)  /* int */
++
++#define FE_READ_STATUS                   _IOR('o', 69, fe_status_t)
++#define FE_READ_BER              _IOR('o', 70, __u32)
++#define FE_READ_SIGNAL_STRENGTH    _IOR('o', 71, __u16)
++#define FE_READ_SNR              _IOR('o', 72, __u16)
++#define FE_READ_UNCORRECTED_BLOCKS _IOR('o', 73, __u32)
++
++#define FE_SET_FRONTEND                  _IOW('o', 76, struct dvb_frontend_parameters)
++#define FE_GET_FRONTEND                  _IOR('o', 77, struct dvb_frontend_parameters)
++#define FE_SET_FRONTEND_TUNE_MODE  _IO('o', 81) /* unsigned int */
++
++#define FE_DISHNETWORK_SEND_LEGACY_CMD _IO('o', 80) /* unsigned int */
++
++/*
++ * References:
++ * DVB-S : EN 300 421
++ * DVB-S2: EN 302 307, TR 102 376, EN 301 210
++ * DVB-C : EN 300 429
++ * DVB-T : EN 300 744
++ * DVB-H : EN 300 304
++ * ATSC  : A/53A
++ */
++
++/*
++ * Delivery Systems
++ * needs to set/queried for multistandard frontends
++ */
++enum dvbfe_delsys {
++      DVBFE_DELSYS_DVBS               = (1 <<  0),
++      DVBFE_DELSYS_DSS                = (1 <<  1),
++      DVBFE_DELSYS_DVBS2              = (1 <<  2),
++      DVBFE_DELSYS_DVBC               = (1 <<  3),
++      DVBFE_DELSYS_DVBT               = (1 <<  4),
++      DVBFE_DELSYS_DVBH               = (1 <<  5),
++      DVBFE_DELSYS_ATSC               = (1 <<  6),
++      DVBFE_DELSYS_DUMMY              = (1 << 31)
++};
++#define DVBFE_GET_DELSYS              _IOR('o', 82, enum dvbfe_delsys)
++#define DVBFE_SET_DELSYS              _IOW('o', 87, enum dvbfe_delsys)
++
++/* Modulation types                   */
++enum dvbfe_modulation {
++      DVBFE_MOD_NONE                  = (0 <<  0),
++      DVBFE_MOD_BPSK                  = (1 <<  0),
++      DVBFE_MOD_QPSK                  = (1 <<  1),
++      DVBFE_MOD_OQPSK                 = (1 <<  2),
++      DVBFE_MOD_8PSK                  = (1 <<  3),
++      DVBFE_MOD_16APSK                = (1 <<  4),
++      DVBFE_MOD_32APSK                = (1 <<  5),
++      DVBFE_MOD_QAM4                  = (1 <<  6),
++      DVBFE_MOD_QAM16                 = (1 <<  7),
++      DVBFE_MOD_QAM32                 = (1 <<  8),
++      DVBFE_MOD_QAM64                 = (1 <<  9),
++      DVBFE_MOD_QAM128                = (1 << 10),
++      DVBFE_MOD_QAM256                = (1 << 11),
++      DVBFE_MOD_QAM512                = (1 << 12),
++      DVBFE_MOD_QAM1024               = (1 << 13),
++      DVBFE_MOD_QAMAUTO               = (1 << 14),
++      DVBFE_MOD_OFDM                  = (1 << 15),
++      DVBFE_MOD_COFDM                 = (1 << 16),
++      DVBFE_MOD_VSB8                  = (1 << 17),
++      DVBFE_MOD_VSB16                 = (1 << 18),
++      DVBFE_MOD_AUTO                  = (1 << 31)
++};
++
++/*
++ * Convolution Code Rate (Viterbi Inner Code Rate)
++ * DVB-S2 uses LDPC. Information on LDPC can be found at
++ * http://www.ldpc-codes.com
++ */
++enum dvbfe_fec {
++      DVBFE_FEC_NONE                  = (0 <<  0),
++      DVBFE_FEC_1_4                   = (1 <<  0),
++      DVBFE_FEC_1_3                   = (1 <<  1),
++      DVBFE_FEC_2_5                   = (1 <<  2),
++      DVBFE_FEC_1_2                   = (1 <<  3),
++      DVBFE_FEC_3_5                   = (1 <<  4),
++      DVBFE_FEC_2_3                   = (1 <<  5),
++      DVBFE_FEC_3_4                   = (1 <<  6),
++      DVBFE_FEC_4_5                   = (1 <<  7),
++      DVBFE_FEC_5_6                   = (1 <<  8),
++      DVBFE_FEC_6_7                   = (1 <<  9),
++      DVBFE_FEC_7_8                   = (1 << 10),
++      DVBFE_FEC_8_9                   = (1 << 11),
++      DVBFE_FEC_9_10                  = (1 << 12),
++      DVBFE_FEC_AUTO                  = (1 << 31)
++};
++
++/* Frontend Inversion (I/Q Swap)      */
++enum dvbfe_inversion {
++      DVBFE_INVERSION_OFF             = 0,
++      DVBFE_INVERSION_ON              = 1,
++      DVBFE_INVERSION_AUTO            = 2
++};
++
++/* DVB-S parameters                   */
++struct dvbs_params {
++      __u32                           symbol_rate;
++
++      enum dvbfe_modulation           modulation;
++      enum dvbfe_fec                  fec;
++};
++
++/* DSS parameters                     */
++struct dss_params {
++      __u32                           symbol_rate;
++
++      enum dvbfe_modulation           modulation;
++      enum dvbfe_fec                  fec;
++};
++
++/*
++ * Rolloff Rate (Nyquist Filter Rolloff)
++ * NOTE: DVB-S2 has rates of 0.20, 0.25, 0.35
++ * Values are x100
++ * Applies to DVB-S2
++ */
++enum dvbfe_rolloff {
++      DVBFE_ROLLOFF_35                = 0,
++      DVBFE_ROLLOFF_25                = 1,
++      DVBFE_ROLLOFF_20                = 2,
++      DVBFE_ROLLOFF_UNKNOWN           = 3
++};
++
++/* DVB-S2 parameters                  */
++struct dvbs2_params {
++      __u32                           symbol_rate;
++
++      enum dvbfe_modulation           modulation;
++      enum dvbfe_fec                  fec;
++
++      /* Informational fields only    */
++      enum dvbfe_rolloff              rolloff;
++
++      __u8                            matype_1;
++      __u8                            matype_2;
++      __u8                            upl_1;
++      __u8                            upl_2;
++      __u8                            dfl_1;
++      __u8                            dfl_2;
++      __u8                            sync;
++      __u8                            syncd_1;
++      __u8                            syncd_2;
++
++      __u8                            pad[32];
++};
++
++/* DVB-C parameters                   */
++struct dvbc_params {
++      __u32                           symbol_rate;
++      enum dvbfe_modulation           modulation;
++      enum dvbfe_fec                  fec;
++};
++
++/* DVB-T Channel bandwidth            */
++enum dvbfe_bandwidth {
++      DVBFE_BANDWIDTH_8_MHZ           = (1 <<  0),
++      DVBFE_BANDWIDTH_7_MHZ           = (1 <<  1),
++      DVBFE_BANDWIDTH_6_MHZ           = (1 <<  2),
++      DVBFE_BANDWIDTH_5_MHZ           = (1 <<  3),
++      DVBFE_BANDWIDTH_AUTO            = (1 << 31)
++};
++
++/* DVB-T/DVB-H transmission mode      */
++enum dvbfe_transmission_mode {
++      DVBFE_TRANSMISSION_MODE_2K      = (1 <<  0),
++      DVBFE_TRANSMISSION_MODE_4K      = (1 <<  1),
++      DVBFE_TRANSMISSION_MODE_8K      = (1 <<  2),
++      DVBFE_TRANSMISSION_MODE_AUTO    = (1 << 31)
++};
++
++/* DVB-T/DVB-H Guard interval         */
++enum dvbfe_guard_interval {
++      DVBFE_GUARD_INTERVAL_1_32       = (1 <<  1),
++      DVBFE_GUARD_INTERVAL_1_16       = (1 <<  2),
++      DVBFE_GUARD_INTERVAL_1_8        = (1 <<  3),
++      DVBFE_GUARD_INTERVAL_1_4        = (1 <<  4),
++      DVBFE_GUARD_INTERVAL_AUTO       = (1 << 31)
++};
++
++/* DVB-T/DVB-H Hierarchial modulation */
++enum dvbfe_hierarchy {
++      DVBFE_HIERARCHY_OFF             = (1 <<  0),
++      DVBFE_HIERARCHY_ON              = (1 <<  1),
++      DVBFE_HIERARCHY_AUTO            = (1 <<  2)
++};
++
++/* DVB-T/DVB-H Rolloff's              */
++enum dvbfe_alpha {
++      DVBFE_ALPHA_1                   = (1 <<  0),
++      DVBFE_ALPHA_2                   = (1 <<  1),
++      DVBFE_ALPHA_4                   = (1 <<  2)
++};
++
++/* Stream priority (Hierachial coding)        */
++enum dvbfe_stream_priority {
++      DVBFE_STREAM_PRIORITY_HP        = (0 << 0),
++      DVBFE_STREAM_PRIORITY_LP        = (1 << 0)
++};
++
++/* DVB-T parameters                   */
++struct dvbt_params {
++      enum dvbfe_modulation           constellation;
++      enum dvbfe_bandwidth            bandwidth;
++      enum dvbfe_fec                  code_rate_HP;
++      enum dvbfe_fec                  code_rate_LP;
++      enum dvbfe_transmission_mode    transmission_mode;
++      enum dvbfe_guard_interval       guard_interval;
++      enum dvbfe_hierarchy            hierarchy;
++      enum dvbfe_alpha                alpha;
++      enum dvbfe_stream_priority      priority;
++
++      __u8                            pad[32];
++};
++
++/* DVB-H Interleaver type             */
++enum dvbfe_interleaver {
++      DVBFE_INTERLEAVER_NATIVE        = (1 <<  0),
++      DVBFE_INTERLEAVER_INDEPTH       = (1 <<  1),
++      DVBFE_INTERLEAVER_AUTO          = (1 << 31)
++};
++
++/* DVB-H MPE-FEC Indicator            */
++enum dvbfe_mpefec {
++      DVBFE_MPEFEC_OFF                = (1 <<  0),
++      DVBFE_MPEFEC_ON                 = (1 <<  1)
++};
++
++/* DVB-H Timeslicing Indicator                */
++enum dvbfe_timeslicing {
++      DVBFE_TIMESLICING_OFF           = (1 <<  0),
++      DVBFE_TIMESLICING_ON            = (1 <<  1)
++};
++
++/* DVB-H parameters                   */
++struct dvbh_params {
++      enum dvbfe_modulation           constellation;
++      enum dvbfe_fec                  code_rate_HP;
++      enum dvbfe_fec                  code_rate_LP;
++      enum dvbfe_transmission_mode    transmission_mode;
++      enum dvbfe_guard_interval       guard_interval;
++      enum dvbfe_hierarchy            hierarchy;
++      enum dvbfe_alpha                alpha;
++      enum dvbfe_interleaver          interleaver;
++      enum dvbfe_mpefec               mpefec;
++      enum dvbfe_timeslicing          timeslicing;
++      enum dvbfe_stream_priority      priority;
++
++      __u32                           bandwidth;
++      __u8                            pad[32];
++};
++
++/* ATSC parameters                    */
++struct atsc_params {
++      enum dvbfe_modulation           modulation;
++
++      __u8                            pad[32];
++};
++
++/* DVB Frontend Tuning Parameters     */
++struct dvbfe_params {
++      __u32                           frequency;
++      enum fe_spectral_inversion      inversion;
++      enum dvbfe_delsys               delivery;
++
++      __u8                            pad[32];
++
++      union {
++              struct dvbs_params      dvbs;
++              struct dss_params       dss;
++              struct dvbs2_params     dvbs2;
++              struct dvbc_params      dvbc;
++              struct dvbt_params      dvbt;
++              struct dvbh_params      dvbh;
++              struct atsc_params      atsc;
++
++              __u8                    pad[128];
++      } delsys;
++};
++#define DVBFE_SET_PARAMS              _IOW('o', 83, struct dvbfe_params)
++#define DVBFE_GET_PARAMS              _IOWR('o', 84, struct dvbfe_params)
++
++/* DVB-S capability bitfields         */
++struct dvbfe_dvbs_info {
++      enum dvbfe_modulation           modulation;
++      enum dvbfe_fec                  fec;
++};
++
++/* DSS capability bitfields           */
++struct dvbfe_dss_info {
++      enum dvbfe_modulation           modulation;
++      enum dvbfe_fec                  fec;
++};
++
++/* DVB-S2 capability bitfields                */
++struct dvbfe_dvbs2_info {
++      enum dvbfe_modulation           modulation;
++      enum dvbfe_fec                  fec;
++
++      __u8                            pad[32];
++};
++
++/* DVB-C capability bitfields         */
++struct dvbfe_dvbc_info {
++      enum dvbfe_modulation           modulation;
++};
++
++/* DVB-T capability bitfields         */
++struct dvbfe_dvbt_info {
++      enum dvbfe_modulation           modulation;
++      enum dvbfe_stream_priority      stream_priority;
++
++      __u8                            pad[32];
++};
++
++/* DVB-H capability bitfields         */
++struct dvbfe_dvbh_info {
++      enum dvbfe_modulation           modulation;
++      enum dvbfe_stream_priority      stream_priority;
++
++      __u8                            pad[32];
++};
++
++/* ATSC capability bitfields          */
++struct dvbfe_atsc_info {
++      enum dvbfe_modulation           modulation;
++
++      __u8                            pad[32];
++};
++
++/* DVB Frontend related Information   */
++struct dvbfe_info {
++      char                            name[128];
++
++      union {
++              struct dvbfe_dvbs_info  dvbs;
++              struct dvbfe_dss_info   dss;
++              struct dvbfe_dvbs2_info dvbs2;
++              struct dvbfe_dvbc_info  dvbc;
++              struct dvbfe_dvbt_info  dvbt;
++              struct dvbfe_dvbh_info  dvbh;
++              struct dvbfe_atsc_info  atsc;
++
++              __u8                    pad[128];
++      } delsys;
++
++      __u32                           frequency_min;
++      __u32                           frequency_max;
++      __u32                           frequency_step;
++      __u32                           frequency_tolerance;
++      __u32                           symbol_rate_min;
++      __u32                           symbol_rate_max;
++      __u32                           symbol_rate_tolerance;
++
++      enum fe_spectral_inversion      inversion;
++
++      __u8                            pad[128];
++};
++#define DVBFE_GET_INFO                        _IOR('o', 85, struct dvbfe_info)
++
++enum dvbfe_status {
++      DVBFE_HAS_SIGNAL                = (1 <<  0),    /*  something above noise floor */
++      DVBFE_HAS_CARRIER               = (1 <<  1),    /*  Signal found                */
++      DVBFE_HAS_VITERBI               = (1 <<  2),    /*  FEC is stable               */
++      DVBFE_HAS_SYNC                  = (1 <<  3),    /*  SYNC found                  */
++      DVBFE_HAS_LOCK                  = (1 <<  4),    /*  OK ..                       */
++      DVBFE_TIMEDOUT                  = (1 <<  5),    /*  no lock in last ~2 s        */
++      DVBFE_STATUS_DUMMY              = (1 << 31)
++};
++
++/* DVB Frontend events                        */
++struct dvbfe_events {
++      enum dvbfe_status               status;
++
++      __u8                            pad[32];
++};
++
++struct dvb_frontend_event {
++      fe_status_t status;
++      struct dvb_frontend_parameters parameters;
++};
++#define FE_GET_EVENT             _IOR('o', 78, struct dvb_frontend_event)
++
++struct dvbfe_event {
++      struct dvbfe_events fe_events;
++      struct dvbfe_params fe_params;
++};
++#define DVBFE_GET_EVENT                       _IOR('o', 86, struct dvbfe_event)
++
++#endif /*_DVBFRONTEND_H_*/
+diff -Nurd linuxtv-dvb-apps-1.1.1/include/linux/dvb/audio.h dvb-apps/include/linux/dvb/audio.h
+--- linuxtv-dvb-apps-1.1.1/include/linux/dvb/audio.h   2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/include/linux/dvb/audio.h 1970-01-01 01:00:00.000000000 +0100
+@@ -1,125 +0,0 @@
+-/* 
+- * audio.h
+- *
+- * Copyright (C) 2000 Ralph  Metzler <ralph@convergence.de>
+- *                  & Marcus Metzler <marcus@convergence.de>
+-                      for convergence integrated media GmbH
+- *
+- * This program is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU General Lesser Public License
+- * as published by the Free Software Foundation; either version 2.1
+- * of the License, or (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+- *
+- */
+-
+-#ifndef _DVBAUDIO_H_
+-#define _DVBAUDIO_H_
+-
+-#ifdef __KERNEL__
+-#include <linux/types.h>
+-#else
+-#include <stdint.h>
+-#endif
+-
+-
+-typedef enum {
+-        AUDIO_SOURCE_DEMUX, /* Select the demux as the main source */ 
+-      AUDIO_SOURCE_MEMORY /* Select internal memory as the main source */ 
+-} audio_stream_source_t;
+-
+-
+-typedef enum { 
+-      AUDIO_STOPPED,      /* Device is stopped */ 
+-        AUDIO_PLAYING,      /* Device is currently playing */ 
+-      AUDIO_PAUSED        /* Device is paused */ 
+-} audio_play_state_t;
+-
+-
+-typedef enum {
+-        AUDIO_STEREO,
+-        AUDIO_MONO_LEFT, 
+-      AUDIO_MONO_RIGHT 
+-} audio_channel_select_t;
+-
+-
+-typedef struct audio_mixer { 
+-        unsigned int volume_left;
+-        unsigned int volume_right;
+-  // what else do we need? bass, pass-through, ...
+-} audio_mixer_t;
+-
+-
+-typedef struct audio_status { 
+-        int                    AV_sync_state;  /* sync audio and video? */
+-        int                    mute_state;     /* audio is muted */ 
+-        audio_play_state_t     play_state;     /* current playback state */
+-        audio_stream_source_t  stream_source;  /* current stream source */
+-        audio_channel_select_t channel_select; /* currently selected channel */
+-        int                    bypass_mode;    /* pass on audio data to */
+-      audio_mixer_t          mixer_state;    /* current mixer state */
+-} audio_status_t;                              /* separate decoder hardware */
+-
+-
+-typedef
+-struct audio_karaoke{  /* if Vocal1 or Vocal2 are non-zero, they get mixed  */
+-      int vocal1;    /* into left and right t at 70% each */
+-      int vocal2;    /* if both, Vocal1 and Vocal2 are non-zero, Vocal1 gets*/
+-      int melody;    /* mixed into the left channel and */
+-                       /* Vocal2 into the right channel at 100% each. */
+-                       /* if Melody is non-zero, the melody channel gets mixed*/
+-} audio_karaoke_t;     /* into left and right  */
+-
+-
+-typedef uint16_t audio_attributes_t;
+-/*   bits: descr. */
+-/*   15-13 audio coding mode (0=ac3, 2=mpeg1, 3=mpeg2ext, 4=LPCM, 6=DTS, */
+-/*   12    multichannel extension */
+-/*   11-10 audio type (0=not spec, 1=language included) */
+-/*    9- 8 audio application mode (0=not spec, 1=karaoke, 2=surround) */
+-/*    7- 6 Quantization / DRC (mpeg audio: 1=DRC exists)(lpcm: 0=16bit,  */
+-/*    5- 4 Sample frequency fs (0=48kHz, 1=96kHz) */
+-/*    2- 0 number of audio channels (n+1 channels) */
+- 
+-
+-/* for GET_CAPABILITIES and SET_FORMAT, the latter should only set one bit */
+-#define AUDIO_CAP_DTS    1
+-#define AUDIO_CAP_LPCM   2
+-#define AUDIO_CAP_MP1    4
+-#define AUDIO_CAP_MP2    8
+-#define AUDIO_CAP_MP3   16
+-#define AUDIO_CAP_AAC   32
+-#define AUDIO_CAP_OGG   64
+-#define AUDIO_CAP_SDDS 128
+-#define AUDIO_CAP_AC3  256
+-
+-#define AUDIO_STOP                 _IO('o', 1) 
+-#define AUDIO_PLAY                 _IO('o', 2)
+-#define AUDIO_PAUSE                _IO('o', 3)
+-#define AUDIO_CONTINUE             _IO('o', 4)
+-#define AUDIO_SELECT_SOURCE        _IO('o', 5)
+-#define AUDIO_SET_MUTE             _IO('o', 6)
+-#define AUDIO_SET_AV_SYNC          _IO('o', 7)
+-#define AUDIO_SET_BYPASS_MODE      _IO('o', 8)
+-#define AUDIO_CHANNEL_SELECT       _IO('o', 9)
+-#define AUDIO_GET_STATUS           _IOR('o', 10, audio_status_t)
+-
+-#define AUDIO_GET_CAPABILITIES     _IOR('o', 11, unsigned int)
+-#define AUDIO_CLEAR_BUFFER         _IO('o',  12)
+-#define AUDIO_SET_ID               _IO('o', 13)
+-#define AUDIO_SET_MIXER            _IOW('o', 14, audio_mixer_t)
+-#define AUDIO_SET_STREAMTYPE       _IO('o', 15)
+-#define AUDIO_SET_EXT_ID           _IO('o', 16)
+-#define AUDIO_SET_ATTRIBUTES       _IOW('o', 17, audio_attributes_t)
+-#define AUDIO_SET_KARAOKE          _IOW('o', 18, audio_karaoke_t)
+-
+-#endif /* _DVBAUDIO_H_ */
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/include/linux/dvb/ca.h dvb-apps/include/linux/dvb/ca.h
+--- linuxtv-dvb-apps-1.1.1/include/linux/dvb/ca.h      2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/include/linux/dvb/ca.h    1970-01-01 01:00:00.000000000 +0100
+@@ -1,91 +0,0 @@
+-/* 
+- * ca.h
+- *
+- * Copyright (C) 2000 Ralph  Metzler <ralph@convergence.de>
+- *                  & Marcus Metzler <marcus@convergence.de>
+-                      for convergence integrated media GmbH
+- *
+- * This program is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU General Lesser Public License
+- * as published by the Free Software Foundation; either version 2.1
+- * of the License, or (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+- *
+- */
+-
+-#ifndef _DVBCA_H_
+-#define _DVBCA_H_
+-
+-/* slot interface types and info */
+-
+-typedef struct ca_slot_info {
+-        int num;               /* slot number */
+-
+-        int type;              /* CA interface this slot supports */
+-#define CA_CI            1     /* CI high level interface */
+-#define CA_CI_LINK       2     /* CI link layer level interface */
+-#define CA_CI_PHYS       4     /* CI physical layer level interface */
+-#define CA_DESCR         8     /* built-in descrambler */
+-#define CA_SC          128     /* simple smart card interface */
+-
+-        unsigned int flags;
+-#define CA_CI_MODULE_PRESENT 1 /* module (or card) inserted */
+-#define CA_CI_MODULE_READY   2
+-} ca_slot_info_t;
+-
+-
+-/* descrambler types and info */
+-
+-typedef struct ca_descr_info {
+-        unsigned int num;          /* number of available descramblers (keys) */
+-        unsigned int type;         /* type of supported scrambling system */
+-#define CA_ECD           1
+-#define CA_NDS           2
+-#define CA_DSS           4
+-} ca_descr_info_t;
+-
+-typedef struct ca_caps {
+-        unsigned int slot_num;     /* total number of CA card and module slots */
+-        unsigned int slot_type;    /* OR of all supported types */
+-        unsigned int descr_num;    /* total number of descrambler slots (keys) */
+-        unsigned int descr_type;   /* OR of all supported types */
+-} ca_caps_t;
+-
+-/* a message to/from a CI-CAM */
+-typedef struct ca_msg {
+-        unsigned int index;
+-        unsigned int type;
+-        unsigned int length;
+-        unsigned char msg[256];
+-} ca_msg_t;
+-
+-typedef struct ca_descr {
+-        unsigned int index;
+-        unsigned int parity;  /* 0 == even, 1 == odd */
+-        unsigned char cw[8];
+-} ca_descr_t;
+-
+-typedef struct ca_pid {
+-        unsigned int pid;
+-        int index;            /* -1 == disable*/
+-} ca_pid_t;
+-
+-#define CA_RESET          _IO('o', 128)
+-#define CA_GET_CAP        _IOR('o', 129, ca_caps_t)
+-#define CA_GET_SLOT_INFO  _IOR('o', 130, ca_slot_info_t)
+-#define CA_GET_DESCR_INFO _IOR('o', 131, ca_descr_info_t)
+-#define CA_GET_MSG        _IOR('o', 132, ca_msg_t)
+-#define CA_SEND_MSG       _IOW('o', 133, ca_msg_t)
+-#define CA_SET_DESCR      _IOW('o', 134, ca_descr_t)
+-#define CA_SET_PID        _IOW('o', 135, ca_pid_t)
+-
+-#endif
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/include/linux/dvb/dmx.h dvb-apps/include/linux/dvb/dmx.h
+--- linuxtv-dvb-apps-1.1.1/include/linux/dvb/dmx.h     2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/include/linux/dvb/dmx.h   1970-01-01 01:00:00.000000000 +0100
+@@ -1,181 +0,0 @@
+-/* 
+- * dmx.h
+- *
+- * Copyright (C) 2000 Marcus Metzler <marcus@convergence.de>
+- *                  & Ralph  Metzler <ralph@convergence.de>
+-                      for convergence integrated media GmbH
+- *
+- * This program is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public License
+- * as published by the Free Software Foundation; either version 2.1
+- * of the License, or (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+- *
+- */
+-
+-#ifndef _DVBDMX_H_
+-#define _DVBDMX_H_
+-
+-#include <asm/types.h>
+-#ifdef __KERNEL__
+-#include <linux/time.h>
+-#else
+-#include <time.h>
+-#endif
+-
+-
+-#define DMX_FILTER_SIZE 16
+-
+-typedef enum
+-{
+-      DMX_OUT_DECODER, /* Streaming directly to decoder. */
+-      DMX_OUT_TAP,     /* Output going to a memory buffer */
+-                       /* (to be retrieved via the read command).*/
+-      DMX_OUT_TS_TAP   /* Output multiplexed into a new TS  */
+-                       /* (to be retrieved by reading from the */
+-                       /* logical DVR device).                 */
+-} dmx_output_t;
+-
+-
+-typedef enum
+-{
+-      DMX_IN_FRONTEND, /* Input from a front-end device.  */
+-      DMX_IN_DVR       /* Input from the logical DVR device.  */
+-} dmx_input_t;
+-
+-
+-typedef enum
+-{
+-        DMX_PES_AUDIO0,
+-      DMX_PES_VIDEO0,
+-      DMX_PES_TELETEXT0,
+-      DMX_PES_SUBTITLE0,
+-      DMX_PES_PCR0,
+-
+-        DMX_PES_AUDIO1,
+-      DMX_PES_VIDEO1,
+-      DMX_PES_TELETEXT1,
+-      DMX_PES_SUBTITLE1,
+-      DMX_PES_PCR1,
+-
+-        DMX_PES_AUDIO2,
+-      DMX_PES_VIDEO2,
+-      DMX_PES_TELETEXT2,
+-      DMX_PES_SUBTITLE2,
+-      DMX_PES_PCR2,
+-
+-        DMX_PES_AUDIO3,
+-      DMX_PES_VIDEO3,
+-      DMX_PES_TELETEXT3,
+-      DMX_PES_SUBTITLE3,
+-      DMX_PES_PCR3,
+-
+-      DMX_PES_OTHER
+-} dmx_pes_type_t;
+-
+-#define DMX_PES_AUDIO    DMX_PES_AUDIO0
+-#define DMX_PES_VIDEO    DMX_PES_VIDEO0
+-#define DMX_PES_TELETEXT DMX_PES_TELETEXT0
+-#define DMX_PES_SUBTITLE DMX_PES_SUBTITLE0
+-#define DMX_PES_PCR      DMX_PES_PCR0
+-
+-
+-typedef enum
+-{
+-        DMX_SCRAMBLING_EV,
+-        DMX_FRONTEND_EV
+-} dmx_event_t;
+-
+-
+-typedef enum
+-{
+-      DMX_SCRAMBLING_OFF,
+-      DMX_SCRAMBLING_ON
+-} dmx_scrambling_status_t;
+-
+-
+-typedef struct dmx_filter
+-{
+-      __u8  filter[DMX_FILTER_SIZE];
+-      __u8  mask[DMX_FILTER_SIZE];
+-      __u8  mode[DMX_FILTER_SIZE];
+-} dmx_filter_t;
+-
+-
+-struct dmx_sct_filter_params
+-{
+-      __u16            pid;
+-      dmx_filter_t   filter;
+-      __u32            timeout;
+-      __u32            flags;
+-#define DMX_CHECK_CRC       1
+-#define DMX_ONESHOT         2
+-#define DMX_IMMEDIATE_START 4
+-#define DMX_KERNEL_CLIENT   0x8000
+-};
+-
+-
+-struct dmx_pes_filter_params
+-{
+-      __u16            pid;
+-      dmx_input_t    input;
+-      dmx_output_t   output;
+-      dmx_pes_type_t pes_type;
+-      __u32            flags;
+-};
+-
+-
+-struct dmx_event
+-{
+-      dmx_event_t         event;
+-      time_t              timeStamp;
+-      union
+-      {
+-              dmx_scrambling_status_t scrambling;
+-      } u;
+-};
+-
+-typedef struct dmx_caps {
+-      __u32 caps;
+-      int num_decoders; 
+-} dmx_caps_t;
+-
+-typedef enum {
+-      DMX_SOURCE_FRONT0 = 0,
+-      DMX_SOURCE_FRONT1,
+-      DMX_SOURCE_FRONT2,
+-      DMX_SOURCE_FRONT3,
+-      DMX_SOURCE_DVR0   = 16,
+-      DMX_SOURCE_DVR1,
+-      DMX_SOURCE_DVR2,
+-      DMX_SOURCE_DVR3
+-} dmx_source_t;
+-
+-struct dmx_stc {
+-      unsigned int num;       /* input : which STC? 0..N */
+-      unsigned int base;      /* output: divisor for stc to get 90 kHz clock */
+-      __u64 stc;              /* output: stc in 'base'*90 kHz units */
+-};
+-
+-
+-#define DMX_START                _IO('o', 41) 
+-#define DMX_STOP                 _IO('o', 42)
+-#define DMX_SET_FILTER           _IOW('o', 43, struct dmx_sct_filter_params)
+-#define DMX_SET_PES_FILTER       _IOW('o', 44, struct dmx_pes_filter_params)
+-#define DMX_SET_BUFFER_SIZE      _IO('o', 45)
+-#define DMX_GET_EVENT            _IOR('o', 46, struct dmx_event)
+-#define DMX_GET_PES_PIDS         _IOR('o', 47, __u16[5])
+-#define DMX_GET_CAPS             _IOR('o', 48, dmx_caps_t)
+-#define DMX_SET_SOURCE           _IOW('o', 49, dmx_source_t)
+-#define DMX_GET_STC              _IOWR('o', 50, struct dmx_stc)
+-
+-#endif /*_DVBDMX_H_*/
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/include/linux/dvb/frontend.h dvb-apps/include/linux/dvb/frontend.h
+--- linuxtv-dvb-apps-1.1.1/include/linux/dvb/frontend.h        2006-05-18 01:32:38.000000000 +0200
++++ dvb-apps/include/linux/dvb/frontend.h      1970-01-01 01:00:00.000000000 +0100
+@@ -1,267 +0,0 @@
+-/*
+- * frontend.h
+- *
+- * Copyright (C) 2000 Marcus Metzler <marcus@convergence.de>
+- *                Ralph  Metzler <ralph@convergence.de>
+- *                Holger Waechtler <holger@convergence.de>
+- *                Andre Draszik <ad@convergence.de>
+- *                for convergence integrated media GmbH
+- *
+- * This program is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public License
+- * as published by the Free Software Foundation; either version 2.1
+- * of the License, or (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+- *
+- */
+-
+-#ifndef _DVBFRONTEND_H_
+-#define _DVBFRONTEND_H_
+-
+-#include <asm/types.h>
+-
+-
+-typedef enum fe_type {
+-      FE_QPSK,
+-      FE_QAM,
+-      FE_OFDM,
+-      FE_ATSC
+-} fe_type_t;
+-
+-
+-typedef enum fe_caps {
+-      FE_IS_STUPID                    = 0,
+-      FE_CAN_INVERSION_AUTO           = 0x1,
+-      FE_CAN_FEC_1_2                  = 0x2,
+-      FE_CAN_FEC_2_3                  = 0x4,
+-      FE_CAN_FEC_3_4                  = 0x8,
+-      FE_CAN_FEC_4_5                  = 0x10,
+-      FE_CAN_FEC_5_6                  = 0x20,
+-      FE_CAN_FEC_6_7                  = 0x40,
+-      FE_CAN_FEC_7_8                  = 0x80,
+-      FE_CAN_FEC_8_9                  = 0x100,
+-      FE_CAN_FEC_AUTO                 = 0x200,
+-      FE_CAN_QPSK                     = 0x400,
+-      FE_CAN_QAM_16                   = 0x800,
+-      FE_CAN_QAM_32                   = 0x1000,
+-      FE_CAN_QAM_64                   = 0x2000,
+-      FE_CAN_QAM_128                  = 0x4000,
+-      FE_CAN_QAM_256                  = 0x8000,
+-      FE_CAN_QAM_AUTO                 = 0x10000,
+-      FE_CAN_TRANSMISSION_MODE_AUTO   = 0x20000,
+-      FE_CAN_BANDWIDTH_AUTO           = 0x40000,
+-      FE_CAN_GUARD_INTERVAL_AUTO      = 0x80000,
+-      FE_CAN_HIERARCHY_AUTO           = 0x100000,
+-      FE_CAN_8VSB                     = 0x200000,
+-      FE_CAN_16VSB                    = 0x400000,
+-      FE_NEEDS_BENDING                = 0x20000000, // not supported anymore, don't use (frontend requires frequency bending)
+-      FE_CAN_RECOVER                  = 0x40000000, // frontend can recover from a cable unplug automatically
+-      FE_CAN_MUTE_TS                  = 0x80000000  // frontend can stop spurious TS data output
+-} fe_caps_t;
+-
+-
+-struct dvb_frontend_info {
+-      char       name[128];
+-      fe_type_t  type;
+-      __u32      frequency_min;
+-      __u32      frequency_max;
+-      __u32      frequency_stepsize;
+-      __u32      frequency_tolerance;
+-      __u32      symbol_rate_min;
+-      __u32      symbol_rate_max;
+-      __u32      symbol_rate_tolerance;       /* ppm */
+-      __u32      notifier_delay;              /* DEPRECATED */
+-      fe_caps_t  caps;
+-};
+-
+-
+-/**
+- *  Check out the DiSEqC bus spec available on http://www.eutelsat.org/ for
+- *  the meaning of this struct...
+- */
+-struct dvb_diseqc_master_cmd {
+-      __u8 msg [6];   /*  { framing, address, command, data [3] } */
+-      __u8 msg_len;   /*  valid values are 3...6  */
+-};
+-
+-
+-struct dvb_diseqc_slave_reply {
+-      __u8 msg [4];   /*  { framing, data [3] } */
+-      __u8 msg_len;   /*  valid values are 0...4, 0 means no msg  */
+-      int  timeout;   /*  return from ioctl after timeout ms with */
+-};                    /*  errorcode when no message was received  */
+-
+-
+-typedef enum fe_sec_voltage {
+-      SEC_VOLTAGE_13,
+-      SEC_VOLTAGE_18,
+-      SEC_VOLTAGE_OFF
+-} fe_sec_voltage_t;
+-
+-
+-typedef enum fe_sec_tone_mode {
+-      SEC_TONE_ON,
+-      SEC_TONE_OFF
+-} fe_sec_tone_mode_t;
+-
+-
+-typedef enum fe_sec_mini_cmd {
+-      SEC_MINI_A,
+-      SEC_MINI_B
+-} fe_sec_mini_cmd_t;
+-
+-
+-typedef enum fe_status {
+-      FE_HAS_SIGNAL   = 0x01,   /*  found something above the noise level */
+-      FE_HAS_CARRIER  = 0x02,   /*  found a DVB signal  */
+-      FE_HAS_VITERBI  = 0x04,   /*  FEC is stable  */
+-      FE_HAS_SYNC     = 0x08,   /*  found sync bytes  */
+-      FE_HAS_LOCK     = 0x10,   /*  everything's working... */
+-      FE_TIMEDOUT     = 0x20,   /*  no lock within the last ~2 seconds */
+-      FE_REINIT       = 0x40    /*  frontend was reinitialized,  */
+-} fe_status_t;                          /*  application is recommended to reset */
+-                                /*  DiSEqC, tone and parameters */
+-
+-typedef enum fe_spectral_inversion {
+-      INVERSION_OFF,
+-      INVERSION_ON,
+-      INVERSION_AUTO
+-} fe_spectral_inversion_t;
+-
+-
+-typedef enum fe_code_rate {
+-      FEC_NONE = 0,
+-      FEC_1_2,
+-      FEC_2_3,
+-      FEC_3_4,
+-      FEC_4_5,
+-      FEC_5_6,
+-      FEC_6_7,
+-      FEC_7_8,
+-      FEC_8_9,
+-      FEC_AUTO
+-} fe_code_rate_t;
+-
+-
+-typedef enum fe_modulation {
+-      QPSK,
+-      QAM_16,
+-      QAM_32,
+-      QAM_64,
+-      QAM_128,
+-      QAM_256,
+-      QAM_AUTO,
+-      VSB_8,
+-      VSB_16
+-} fe_modulation_t;
+-
+-typedef enum fe_transmit_mode {
+-      TRANSMISSION_MODE_2K,
+-      TRANSMISSION_MODE_8K,
+-      TRANSMISSION_MODE_AUTO
+-} fe_transmit_mode_t;
+-
+-typedef enum fe_bandwidth {
+-      BANDWIDTH_8_MHZ,
+-      BANDWIDTH_7_MHZ,
+-      BANDWIDTH_6_MHZ,
+-      BANDWIDTH_AUTO
+-} fe_bandwidth_t;
+-
+-
+-typedef enum fe_guard_interval {
+-      GUARD_INTERVAL_1_32,
+-      GUARD_INTERVAL_1_16,
+-      GUARD_INTERVAL_1_8,
+-      GUARD_INTERVAL_1_4,
+-      GUARD_INTERVAL_AUTO
+-} fe_guard_interval_t;
+-
+-
+-typedef enum fe_hierarchy {
+-      HIERARCHY_NONE,
+-      HIERARCHY_1,
+-      HIERARCHY_2,
+-      HIERARCHY_4,
+-      HIERARCHY_AUTO
+-} fe_hierarchy_t;
+-
+-
+-struct dvb_qpsk_parameters {
+-      __u32           symbol_rate;  /* symbol rate in Symbols per second */
+-      fe_code_rate_t  fec_inner;    /* forward error correction (see above) */
+-};
+-
+-struct dvb_qam_parameters {
+-      __u32           symbol_rate; /* symbol rate in Symbols per second */
+-      fe_code_rate_t  fec_inner;   /* forward error correction (see above) */
+-      fe_modulation_t modulation;  /* modulation type (see above) */
+-};
+-
+-struct dvb_vsb_parameters {
+-      fe_modulation_t modulation;  /* modulation type (see above) */
+-};
+-
+-struct dvb_ofdm_parameters {
+-      fe_bandwidth_t      bandwidth;
+-      fe_code_rate_t      code_rate_HP;  /* high priority stream code rate */
+-      fe_code_rate_t      code_rate_LP;  /* low priority stream code rate */
+-      fe_modulation_t     constellation; /* modulation type (see above) */
+-      fe_transmit_mode_t  transmission_mode;
+-      fe_guard_interval_t guard_interval;
+-      fe_hierarchy_t      hierarchy_information;
+-};
+-
+-
+-struct dvb_frontend_parameters {
+-      __u32 frequency;     /* (absolute) frequency in Hz for QAM/OFDM/ATSC */
+-                           /* intermediate frequency in kHz for QPSK */
+-      fe_spectral_inversion_t inversion;
+-      union {
+-              struct dvb_qpsk_parameters qpsk;
+-              struct dvb_qam_parameters  qam;
+-              struct dvb_ofdm_parameters ofdm;
+-              struct dvb_vsb_parameters vsb;
+-      } u;
+-};
+-
+-
+-struct dvb_frontend_event {
+-      fe_status_t status;
+-      struct dvb_frontend_parameters parameters;
+-};
+-
+-
+-
+-#define FE_GET_INFO              _IOR('o', 61, struct dvb_frontend_info)
+-
+-#define FE_DISEQC_RESET_OVERLOAD   _IO('o', 62)
+-#define FE_DISEQC_SEND_MASTER_CMD  _IOW('o', 63, struct dvb_diseqc_master_cmd)
+-#define FE_DISEQC_RECV_SLAVE_REPLY _IOR('o', 64, struct dvb_diseqc_slave_reply)
+-#define FE_DISEQC_SEND_BURST       _IO('o', 65)  /* fe_sec_mini_cmd_t */
+-
+-#define FE_SET_TONE              _IO('o', 66)  /* fe_sec_tone_mode_t */
+-#define FE_SET_VOLTAGE                   _IO('o', 67)  /* fe_sec_voltage_t */
+-#define FE_ENABLE_HIGH_LNB_VOLTAGE _IO('o', 68)  /* int */
+-
+-#define FE_READ_STATUS                   _IOR('o', 69, fe_status_t)
+-#define FE_READ_BER              _IOR('o', 70, __u32)
+-#define FE_READ_SIGNAL_STRENGTH    _IOR('o', 71, __u16)
+-#define FE_READ_SNR              _IOR('o', 72, __u16)
+-#define FE_READ_UNCORRECTED_BLOCKS _IOR('o', 73, __u32)
+-
+-#define FE_SET_FRONTEND                  _IOW('o', 76, struct dvb_frontend_parameters)
+-#define FE_GET_FRONTEND                  _IOR('o', 77, struct dvb_frontend_parameters)
+-#define FE_GET_EVENT             _IOR('o', 78, struct dvb_frontend_event)
+-
+-#define FE_DISHNETWORK_SEND_LEGACY_CMD _IO('o', 80) /* unsigned int */
+-
+-#endif /*_DVBFRONTEND_H_*/
+diff -Nurd linuxtv-dvb-apps-1.1.1/include/linux/dvb/net.h dvb-apps/include/linux/dvb/net.h
+--- linuxtv-dvb-apps-1.1.1/include/linux/dvb/net.h     2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/include/linux/dvb/net.h   1970-01-01 01:00:00.000000000 +0100
+@@ -1,41 +0,0 @@
+-/* 
+- * net.h
+- *
+- * Copyright (C) 2000 Marcus Metzler <marcus@convergence.de>
+- *                  & Ralph  Metzler <ralph@convergence.de>
+-                      for convergence integrated media GmbH
+- *
+- * This program is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public License
+- * as published by the Free Software Foundation; either version 2.1
+- * of the License, or (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+- *
+- */
+-
+-#ifndef _DVBNET_H_
+-#define _DVBNET_H_
+-
+-#include <asm/types.h>
+-
+-
+-struct dvb_net_if {
+-      __u16 pid;
+-      __u16 if_num;
+-};
+-
+-
+-#define NET_ADD_IF                 _IOWR('o', 52, struct dvb_net_if)
+-#define NET_REMOVE_IF              _IO('o', 53)
+-#define NET_GET_IF                 _IOWR('o', 54, struct dvb_net_if)
+-
+-#endif /*_DVBNET_H_*/
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/include/linux/dvb/osd.h dvb-apps/include/linux/dvb/osd.h
+--- linuxtv-dvb-apps-1.1.1/include/linux/dvb/osd.h     2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/include/linux/dvb/osd.h   1970-01-01 01:00:00.000000000 +0100
+@@ -1,111 +0,0 @@
+-/* 
+- * osd.h
+- *
+- * Copyright (C) 2001 Ralph  Metzler <ralph@convergence.de>
+- *                  & Marcus Metzler <marcus@convergence.de>
+-                      for convergence integrated media GmbH
+- *
+- * This program is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU General Lesser Public License
+- * as published by the Free Software Foundation; either version 2.1
+- * of the License, or (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+- *
+- */
+-
+-#ifndef _DVBOSD_H_
+-#define _DVBOSD_H_
+-
+-typedef enum {
+-  // All functions return -2 on "not open"
+-  OSD_Close=1,    // ()
+-  // Disables OSD and releases the buffers
+-  // returns 0 on success
+-  OSD_Open,       // (x0,y0,x1,y1,BitPerPixel[2/4/8](color&0x0F),mix[0..15](color&0xF0))
+-  // Opens OSD with this size and bit depth
+-  // returns 0 on success, -1 on DRAM allocation error, -2 on "already open"
+-  OSD_Show,       // ()
+-  // enables OSD mode
+-  // returns 0 on success
+-  OSD_Hide,       // ()
+-  // disables OSD mode
+-  // returns 0 on success
+-  OSD_Clear,      // ()
+-  // Sets all pixel to color 0
+-  // returns 0 on success
+-  OSD_Fill,       // (color)
+-  // Sets all pixel to color <col>
+-  // returns 0 on success
+-  OSD_SetColor,   // (color,R{x0},G{y0},B{x1},opacity{y1})
+-  // set palette entry <num> to <r,g,b>, <mix> and <trans> apply
+-  // R,G,B: 0..255
+-  // R=Red, G=Green, B=Blue
+-  // opacity=0:      pixel opacity 0% (only video pixel shows)
+-  // opacity=1..254: pixel opacity as specified in header
+-  // opacity=255:    pixel opacity 100% (only OSD pixel shows)
+-  // returns 0 on success, -1 on error
+-  OSD_SetPalette, // (firstcolor{color},lastcolor{x0},data)
+-  // Set a number of entries in the palette
+-  // sets the entries "firstcolor" through "lastcolor" from the array "data"
+-  // data has 4 byte for each color:
+-  // R,G,B, and a opacity value: 0->transparent, 1..254->mix, 255->pixel
+-  OSD_SetTrans,   // (transparency{color})
+-  // Sets transparency of mixed pixel (0..15)
+-  // returns 0 on success
+-  OSD_SetPixel,   // (x0,y0,color)
+-  // sets pixel <x>,<y> to color number <col>
+-  // returns 0 on success, -1 on error
+-  OSD_GetPixel,   // (x0,y0)
+-  // returns color number of pixel <x>,<y>,  or -1
+-  OSD_SetRow,     // (x0,y0,x1,data)
+-  // fills pixels x0,y through  x1,y with the content of data[]
+-  // returns 0 on success, -1 on clipping all pixel (no pixel drawn)
+-  OSD_SetBlock,   // (x0,y0,x1,y1,increment{color},data)
+-  // fills pixels x0,y0 through  x1,y1 with the content of data[]
+-  // inc contains the width of one line in the data block,
+-  // inc<=0 uses blockwidth as linewidth
+-  // returns 0 on success, -1 on clipping all pixel
+-  OSD_FillRow,    // (x0,y0,x1,color)
+-  // fills pixels x0,y through  x1,y with the color <col>
+-  // returns 0 on success, -1 on clipping all pixel
+-  OSD_FillBlock,  // (x0,y0,x1,y1,color)
+-  // fills pixels x0,y0 through  x1,y1 with the color <col>
+-  // returns 0 on success, -1 on clipping all pixel
+-  OSD_Line,       // (x0,y0,x1,y1,color)
+-  // draw a line from x0,y0 to x1,y1 with the color <col>
+-  // returns 0 on success
+-  OSD_Query,      // (x0,y0,x1,y1,xasp{color}}), yasp=11
+-  // fills parameters with the picture dimensions and the pixel aspect ratio
+-  // returns 0 on success
+-  OSD_Test,       // ()
+-  // draws a test picture. for debugging purposes only
+-  // returns 0 on success
+-// TODO: remove "test" in final version
+-  OSD_Text,       // (x0,y0,size,color,text)
+-  OSD_SetWindow, //  (x0) set window with number 0<x0<8 as current
+-  OSD_MoveWindow, //  move current window to (x0, y0)  
+-} OSD_Command;
+-
+-typedef struct osd_cmd_s {
+-        OSD_Command cmd;
+-        int x0;
+-        int y0;
+-        int x1;
+-        int y1;
+-        int color;
+-        void *data;
+-} osd_cmd_t;
+-
+-
+-#define OSD_SEND_CMD       _IOW('o', 160, osd_cmd_t)
+-
+-#endif
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/include/linux/dvb/version.h dvb-apps/include/linux/dvb/version.h
+--- linuxtv-dvb-apps-1.1.1/include/linux/dvb/version.h 2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/include/linux/dvb/version.h       1970-01-01 01:00:00.000000000 +0100
+@@ -1,29 +0,0 @@
+-/*
+- * version.h
+- *
+- * Copyright (C) 2000 Holger Waechtler <holger@convergence.de>
+- *                    for convergence integrated media GmbH
+- *
+- * This program is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public License
+- * as published by the Free Software Foundation; either version 2.1
+- * of the License, or (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+- *
+- */
+-
+-#ifndef _DVBVERSION_H_
+-#define _DVBVERSION_H_
+-
+-#define DVB_API_VERSION 3
+-
+-#endif /*_DVBVERSION_H_*/
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/include/linux/dvb/video.h dvb-apps/include/linux/dvb/video.h
+--- linuxtv-dvb-apps-1.1.1/include/linux/dvb/video.h   2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/include/linux/dvb/video.h 1970-01-01 01:00:00.000000000 +0100
+@@ -1,199 +0,0 @@
+-/* 
+- * video.h
+- *
+- * Copyright (C) 2000 Marcus Metzler <marcus@convergence.de>
+- *                  & Ralph  Metzler <ralph@convergence.de>
+-                      for convergence integrated media GmbH
+- *
+- * This program is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Lesser General Public License
+- * as published by the Free Software Foundation; either version 2.1
+- * of the License, or (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU Lesser General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+- *
+- */
+-
+-#ifndef _DVBVIDEO_H_
+-#define _DVBVIDEO_H_
+-
+-#ifdef __KERNEL__
+-#include <linux/types.h>
+-#else
+-#include <stdint.h>
+-#include <time.h>
+-#endif
+-
+-
+-typedef enum {
+-      VIDEO_FORMAT_4_3,     /* Select 4:3 format */
+-        VIDEO_FORMAT_16_9,    /* Select 16:9 format. */
+-      VIDEO_FORMAT_221_1    /* 2.21:1 */
+-} video_format_t;
+-
+-
+-typedef enum {
+-       VIDEO_SYSTEM_PAL, 
+-       VIDEO_SYSTEM_NTSC, 
+-       VIDEO_SYSTEM_PALN, 
+-       VIDEO_SYSTEM_PALNc, 
+-       VIDEO_SYSTEM_PALM, 
+-       VIDEO_SYSTEM_NTSC60, 
+-       VIDEO_SYSTEM_PAL60,
+-       VIDEO_SYSTEM_PALM60
+-} video_system_t;
+-
+-
+-typedef enum {   
+-        VIDEO_PAN_SCAN,       /* use pan and scan format */
+-      VIDEO_LETTER_BOX,     /* use letterbox format */
+-      VIDEO_CENTER_CUT_OUT  /* use center cut out format */
+-} video_displayformat_t;
+-
+-typedef struct {
+-      int w;
+-      int h;
+-      video_format_t aspect_ratio;
+-} video_size_t;
+-
+-typedef enum {
+-        VIDEO_SOURCE_DEMUX, /* Select the demux as the main source */ 
+-      VIDEO_SOURCE_MEMORY /* If this source is selected, the stream 
+-                             comes from the user through the write 
+-                             system call */ 
+-} video_stream_source_t;
+-
+-
+-typedef enum {
+-      VIDEO_STOPPED, /* Video is stopped */ 
+-        VIDEO_PLAYING, /* Video is currently playing */ 
+-      VIDEO_FREEZED  /* Video is freezed */ 
+-} video_play_state_t; 
+-
+-
+-struct video_event { 
+-        int32_t type; 
+-#define VIDEO_EVENT_SIZE_CHANGED 1
+-        time_t timestamp;
+-      union {
+-              video_size_t size;
+-      } u;
+-};
+-
+-
+-struct video_status { 
+-        int                   video_blank;   /* blank video on freeze? */
+-        video_play_state_t    play_state;    /* current state of playback */  
+-        video_stream_source_t stream_source; /* current source (demux/memory) */
+-        video_format_t        video_format;  /* current aspect ratio of stream*/
+-        video_displayformat_t display_format;/* selected cropping mode */
+-};
+-
+-
+-struct video_still_picture {
+-        char *iFrame;        /* pointer to a single iframe in memory */
+-        int32_t size; 
+-};
+-
+-
+-typedef 
+-struct video_highlight {
+-      int     active;      /*    1=show highlight, 0=hide highlight */
+-      uint8_t contrast1;   /*    7- 4  Pattern pixel contrast */
+-                             /*    3- 0  Background pixel contrast */
+-      uint8_t contrast2;   /*    7- 4  Emphasis pixel-2 contrast */
+-                             /*    3- 0  Emphasis pixel-1 contrast */
+-      uint8_t color1;      /*    7- 4  Pattern pixel color */
+-                             /*    3- 0  Background pixel color */
+-      uint8_t color2;      /*    7- 4  Emphasis pixel-2 color */
+-                             /*    3- 0  Emphasis pixel-1 color */
+-      uint32_t ypos;       /*   23-22  auto action mode */
+-                             /*   21-12  start y */
+-                             /*    9- 0  end y */
+-      uint32_t xpos;       /*   23-22  button color number */
+-                             /*   21-12  start x */
+-                             /*    9- 0  end x */
+-} video_highlight_t;
+-
+-
+-typedef struct video_spu {
+-      int active;
+-      int stream_id;
+-} video_spu_t;
+-
+-
+-typedef struct video_spu_palette {      /* SPU Palette information */
+-      int length;
+-      uint8_t *palette;
+-} video_spu_palette_t;
+-
+-
+-typedef struct video_navi_pack {
+-      int length;          /* 0 ... 1024 */
+-      uint8_t data[1024];
+-} video_navi_pack_t;
+-
+-
+-typedef uint16_t video_attributes_t;
+-/*   bits: descr. */
+-/*   15-14 Video compression mode (0=MPEG-1, 1=MPEG-2) */
+-/*   13-12 TV system (0=525/60, 1=625/50) */
+-/*   11-10 Aspect ratio (0=4:3, 3=16:9) */
+-/*    9- 8 permitted display mode on 4:3 monitor (0=both, 1=only pan-sca */
+-/*    7    line 21-1 data present in GOP (1=yes, 0=no) */
+-/*    6    line 21-2 data present in GOP (1=yes, 0=no) */
+-/*    5- 3 source resolution (0=720x480/576, 1=704x480/576, 2=352x480/57 */
+-/*    2    source letterboxed (1=yes, 0=no) */
+-/*    0    film/camera mode (0=camera, 1=film (625/50 only)) */
+-
+-
+-/* bit definitions for capabilities: */
+-/* can the hardware decode MPEG1 and/or MPEG2? */
+-#define VIDEO_CAP_MPEG1   1 
+-#define VIDEO_CAP_MPEG2   2
+-/* can you send a system and/or program stream to video device?
+-   (you still have to open the video and the audio device but only 
+-    send the stream to the video device) */
+-#define VIDEO_CAP_SYS     4
+-#define VIDEO_CAP_PROG    8
+-/* can the driver also handle SPU, NAVI and CSS encoded data? 
+-   (CSS API is not present yet) */
+-#define VIDEO_CAP_SPU    16
+-#define VIDEO_CAP_NAVI   32
+-#define VIDEO_CAP_CSS    64
+-
+-
+-#define VIDEO_STOP                 _IO('o', 21) 
+-#define VIDEO_PLAY                 _IO('o', 22)
+-#define VIDEO_FREEZE               _IO('o', 23)
+-#define VIDEO_CONTINUE             _IO('o', 24)
+-#define VIDEO_SELECT_SOURCE        _IO('o', 25)
+-#define VIDEO_SET_BLANK            _IO('o', 26)
+-#define VIDEO_GET_STATUS           _IOR('o', 27, struct video_status)
+-#define VIDEO_GET_EVENT            _IOR('o', 28, struct video_event)
+-#define VIDEO_SET_DISPLAY_FORMAT   _IO('o', 29)
+-#define VIDEO_STILLPICTURE         _IOW('o', 30, struct video_still_picture)
+-#define VIDEO_FAST_FORWARD         _IO('o', 31)
+-#define VIDEO_SLOWMOTION           _IO('o', 32)
+-#define VIDEO_GET_CAPABILITIES     _IOR('o', 33, unsigned int)
+-#define VIDEO_CLEAR_BUFFER         _IO('o',  34)
+-#define VIDEO_SET_ID               _IO('o', 35)
+-#define VIDEO_SET_STREAMTYPE       _IO('o', 36)
+-#define VIDEO_SET_FORMAT           _IO('o', 37)
+-#define VIDEO_SET_SYSTEM           _IO('o', 38)
+-#define VIDEO_SET_HIGHLIGHT        _IOW('o', 39, video_highlight_t)
+-#define VIDEO_SET_SPU              _IOW('o', 50, video_spu_t)
+-#define VIDEO_SET_SPU_PALETTE      _IOW('o', 51, video_spu_palette_t)
+-#define VIDEO_GET_NAVI             _IOR('o', 52, video_navi_pack_t)
+-#define VIDEO_SET_ATTRIBUTES       _IO('o', 53)
+-#define VIDEO_GET_SIZE             _IOR('o', 55, video_size_t)
+-
+-#endif /*_DVBVIDEO_H_*/
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/include/net.h dvb-apps/include/net.h
+--- linuxtv-dvb-apps-1.1.1/include/net.h       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/include/net.h     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,53 @@
++/*
++ * net.h
++ *
++ * Copyright (C) 2000 Marcus Metzler <marcus@convergence.de>
++ *                  & Ralph  Metzler <ralph@convergence.de>
++ *                    for convergence integrated media GmbH
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public License
++ * as published by the Free Software Foundation; either version 2.1
++ * of the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
++ *
++ */
++
++#ifndef _DVBNET_H_
++#define _DVBNET_H_
++
++#include <asm/types.h>
++
++
++struct dvb_net_if {
++      __u16 pid;
++      __u16 if_num;
++      __u8  feedtype;
++#define DVB_NET_FEEDTYPE_MPE 0        /* multi protocol encapsulation */
++#define DVB_NET_FEEDTYPE_ULE 1        /* ultra lightweight encapsulation */
++};
++
++
++#define NET_ADD_IF    _IOWR('o', 52, struct dvb_net_if)
++#define NET_REMOVE_IF _IO('o', 53)
++#define NET_GET_IF    _IOWR('o', 54, struct dvb_net_if)
++
++
++/* binary compatibility cruft: */
++struct __dvb_net_if_old {
++      __u16 pid;
++      __u16 if_num;
++};
++#define __NET_ADD_IF_OLD _IOWR('o', 52, struct __dvb_net_if_old)
++#define __NET_GET_IF_OLD _IOWR('o', 54, struct __dvb_net_if_old)
++
++
++#endif /*_DVBNET_H_*/
+diff -Nurd linuxtv-dvb-apps-1.1.1/include/osd.h dvb-apps/include/osd.h
+--- linuxtv-dvb-apps-1.1.1/include/osd.h       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/include/osd.h     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,142 @@
++/*
++ * osd.h
++ *
++ * Copyright (C) 2001 Ralph  Metzler <ralph@convergence.de>
++ *                  & Marcus Metzler <marcus@convergence.de>
++ *                    for convergence integrated media GmbH
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Lesser Public License
++ * as published by the Free Software Foundation; either version 2.1
++ * of the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
++ *
++ */
++
++#ifndef _DVBOSD_H_
++#define _DVBOSD_H_
++
++typedef enum {
++  // All functions return -2 on "not open"
++  OSD_Close=1,    // ()
++  // Disables OSD and releases the buffers
++  // returns 0 on success
++  OSD_Open,       // (x0,y0,x1,y1,BitPerPixel[2/4/8](color&0x0F),mix[0..15](color&0xF0))
++  // Opens OSD with this size and bit depth
++  // returns 0 on success, -1 on DRAM allocation error, -2 on "already open"
++  OSD_Show,       // ()
++  // enables OSD mode
++  // returns 0 on success
++  OSD_Hide,       // ()
++  // disables OSD mode
++  // returns 0 on success
++  OSD_Clear,      // ()
++  // Sets all pixel to color 0
++  // returns 0 on success
++  OSD_Fill,       // (color)
++  // Sets all pixel to color <col>
++  // returns 0 on success
++  OSD_SetColor,   // (color,R{x0},G{y0},B{x1},opacity{y1})
++  // set palette entry <num> to <r,g,b>, <mix> and <trans> apply
++  // R,G,B: 0..255
++  // R=Red, G=Green, B=Blue
++  // opacity=0:      pixel opacity 0% (only video pixel shows)
++  // opacity=1..254: pixel opacity as specified in header
++  // opacity=255:    pixel opacity 100% (only OSD pixel shows)
++  // returns 0 on success, -1 on error
++  OSD_SetPalette, // (firstcolor{color},lastcolor{x0},data)
++  // Set a number of entries in the palette
++  // sets the entries "firstcolor" through "lastcolor" from the array "data"
++  // data has 4 byte for each color:
++  // R,G,B, and a opacity value: 0->transparent, 1..254->mix, 255->pixel
++  OSD_SetTrans,   // (transparency{color})
++  // Sets transparency of mixed pixel (0..15)
++  // returns 0 on success
++  OSD_SetPixel,   // (x0,y0,color)
++  // sets pixel <x>,<y> to color number <col>
++  // returns 0 on success, -1 on error
++  OSD_GetPixel,   // (x0,y0)
++  // returns color number of pixel <x>,<y>,  or -1
++  OSD_SetRow,     // (x0,y0,x1,data)
++  // fills pixels x0,y through  x1,y with the content of data[]
++  // returns 0 on success, -1 on clipping all pixel (no pixel drawn)
++  OSD_SetBlock,   // (x0,y0,x1,y1,increment{color},data)
++  // fills pixels x0,y0 through  x1,y1 with the content of data[]
++  // inc contains the width of one line in the data block,
++  // inc<=0 uses blockwidth as linewidth
++  // returns 0 on success, -1 on clipping all pixel
++  OSD_FillRow,    // (x0,y0,x1,color)
++  // fills pixels x0,y through  x1,y with the color <col>
++  // returns 0 on success, -1 on clipping all pixel
++  OSD_FillBlock,  // (x0,y0,x1,y1,color)
++  // fills pixels x0,y0 through  x1,y1 with the color <col>
++  // returns 0 on success, -1 on clipping all pixel
++  OSD_Line,       // (x0,y0,x1,y1,color)
++  // draw a line from x0,y0 to x1,y1 with the color <col>
++  // returns 0 on success
++  OSD_Query,      // (x0,y0,x1,y1,xasp{color}}), yasp=11
++  // fills parameters with the picture dimensions and the pixel aspect ratio
++  // returns 0 on success
++  OSD_Test,       // ()
++  // draws a test picture. for debugging purposes only
++  // returns 0 on success
++// TODO: remove "test" in final version
++  OSD_Text,       // (x0,y0,size,color,text)
++  OSD_SetWindow, //  (x0) set window with number 0<x0<8 as current
++  OSD_MoveWindow, //  move current window to (x0, y0)
++  OSD_OpenRaw,        // Open other types of OSD windows
++} OSD_Command;
++
++typedef struct osd_cmd_s {
++      OSD_Command cmd;
++      int x0;
++      int y0;
++      int x1;
++      int y1;
++      int color;
++      void *data;
++} osd_cmd_t;
++
++/* OSD_OpenRaw: set 'color' to desired window type */
++typedef enum {
++      OSD_BITMAP1,           /* 1 bit bitmap */
++      OSD_BITMAP2,           /* 2 bit bitmap */
++      OSD_BITMAP4,           /* 4 bit bitmap */
++      OSD_BITMAP8,           /* 8 bit bitmap */
++      OSD_BITMAP1HR,         /* 1 Bit bitmap half resolution */
++      OSD_BITMAP2HR,         /* 2 bit bitmap half resolution */
++      OSD_BITMAP4HR,         /* 4 bit bitmap half resolution */
++      OSD_BITMAP8HR,         /* 8 bit bitmap half resolution */
++      OSD_YCRCB422,          /* 4:2:2 YCRCB Graphic Display */
++      OSD_YCRCB444,          /* 4:4:4 YCRCB Graphic Display */
++      OSD_YCRCB444HR,        /* 4:4:4 YCRCB graphic half resolution */
++      OSD_VIDEOTSIZE,        /* True Size Normal MPEG Video Display */
++      OSD_VIDEOHSIZE,        /* MPEG Video Display Half Resolution */
++      OSD_VIDEOQSIZE,        /* MPEG Video Display Quarter Resolution */
++      OSD_VIDEODSIZE,        /* MPEG Video Display Double Resolution */
++      OSD_VIDEOTHSIZE,       /* True Size MPEG Video Display Half Resolution */
++      OSD_VIDEOTQSIZE,       /* True Size MPEG Video Display Quarter Resolution*/
++      OSD_VIDEOTDSIZE,       /* True Size MPEG Video Display Double Resolution */
++      OSD_VIDEONSIZE,        /* Full Size MPEG Video Display */
++      OSD_CURSOR             /* Cursor */
++} osd_raw_window_t;
++
++typedef struct osd_cap_s {
++      int  cmd;
++#define OSD_CAP_MEMSIZE         1  /* memory size */
++      long val;
++} osd_cap_t;
++
++
++#define OSD_SEND_CMD            _IOW('o', 160, osd_cmd_t)
++#define OSD_GET_CAPABILITY      _IOR('o', 161, osd_cap_t)
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/include/version.h dvb-apps/include/version.h
+--- linuxtv-dvb-apps-1.1.1/include/version.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/include/version.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,29 @@
++/*
++ * version.h
++ *
++ * Copyright (C) 2000 Holger Waechtler <holger@convergence.de>
++ *                    for convergence integrated media GmbH
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public License
++ * as published by the Free Software Foundation; either version 2.1
++ * of the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
++ *
++ */
++
++#ifndef _DVBVERSION_H_
++#define _DVBVERSION_H_
++
++#define DVB_API_VERSION 3
++#define DVB_API_VERSION_MINOR 3
++
++#endif /*_DVBVERSION_H_*/
+diff -Nurd linuxtv-dvb-apps-1.1.1/include/video.h dvb-apps/include/video.h
+--- linuxtv-dvb-apps-1.1.1/include/video.h     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/include/video.h   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,277 @@
++/*
++ * video.h
++ *
++ * Copyright (C) 2000 Marcus Metzler <marcus@convergence.de>
++ *                  & Ralph  Metzler <ralph@convergence.de>
++ *                    for convergence integrated media GmbH
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public License
++ * as published by the Free Software Foundation; either version 2.1
++ * of the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
++ *
++ */
++
++#ifndef _DVBVIDEO_H_
++#define _DVBVIDEO_H_
++
++#ifdef __KERNEL__
++#include <linux/types.h>
++#else
++#include <asm/types.h>
++#include <stdint.h>
++#include <time.h>
++#endif
++
++
++typedef enum {
++      VIDEO_FORMAT_4_3,     /* Select 4:3 format */
++      VIDEO_FORMAT_16_9,    /* Select 16:9 format. */
++      VIDEO_FORMAT_221_1    /* 2.21:1 */
++} video_format_t;
++
++
++typedef enum {
++       VIDEO_SYSTEM_PAL,
++       VIDEO_SYSTEM_NTSC,
++       VIDEO_SYSTEM_PALN,
++       VIDEO_SYSTEM_PALNc,
++       VIDEO_SYSTEM_PALM,
++       VIDEO_SYSTEM_NTSC60,
++       VIDEO_SYSTEM_PAL60,
++       VIDEO_SYSTEM_PALM60
++} video_system_t;
++
++
++typedef enum {
++      VIDEO_PAN_SCAN,       /* use pan and scan format */
++      VIDEO_LETTER_BOX,     /* use letterbox format */
++      VIDEO_CENTER_CUT_OUT  /* use center cut out format */
++} video_displayformat_t;
++
++typedef struct {
++      int w;
++      int h;
++      video_format_t aspect_ratio;
++} video_size_t;
++
++typedef enum {
++      VIDEO_SOURCE_DEMUX, /* Select the demux as the main source */
++      VIDEO_SOURCE_MEMORY /* If this source is selected, the stream
++                             comes from the user through the write
++                             system call */
++} video_stream_source_t;
++
++
++typedef enum {
++      VIDEO_STOPPED, /* Video is stopped */
++      VIDEO_PLAYING, /* Video is currently playing */
++      VIDEO_FREEZED  /* Video is freezed */
++} video_play_state_t;
++
++
++/* Decoder commands */
++#define VIDEO_CMD_PLAY        (0)
++#define VIDEO_CMD_STOP        (1)
++#define VIDEO_CMD_FREEZE      (2)
++#define VIDEO_CMD_CONTINUE    (3)
++
++/* Flags for VIDEO_CMD_FREEZE */
++#define VIDEO_CMD_FREEZE_TO_BLACK             (1 << 0)
++
++/* Flags for VIDEO_CMD_STOP */
++#define VIDEO_CMD_STOP_TO_BLACK       (1 << 0)
++#define VIDEO_CMD_STOP_IMMEDIATELY            (1 << 1)
++
++/* Play input formats: */
++/* The decoder has no special format requirements */
++#define VIDEO_PLAY_FMT_NONE         (0)
++/* The decoder requires full GOPs */
++#define VIDEO_PLAY_FMT_GOP          (1)
++
++/* The structure must be zeroed before use by the application
++   This ensures it can be extended safely in the future. */
++struct video_command {
++      __u32 cmd;
++      __u32 flags;
++      union {
++              struct {
++                      __u64 pts;
++              } stop;
++
++              struct {
++                      /* 0 or 1000 specifies normal speed,
++                         1 specifies forward single stepping,
++                         -1 specifies backward single stepping,
++                         >1: playback at speed/1000 of the normal speed,
++                         <-1: reverse playback at (-speed/1000) of the normal speed. */
++                      __s32 speed;
++                      __u32 format;
++              } play;
++
++              struct {
++                      __u32 data[16];
++              } raw;
++      };
++};
++
++/* FIELD_UNKNOWN can be used if the hardware does not know whether
++   the Vsync is for an odd, even or progressive (i.e. non-interlaced)
++   field. */
++#define VIDEO_VSYNC_FIELD_UNKNOWN     (0)
++#define VIDEO_VSYNC_FIELD_ODD                 (1)
++#define VIDEO_VSYNC_FIELD_EVEN                (2)
++#define VIDEO_VSYNC_FIELD_PROGRESSIVE (3)
++
++struct video_event {
++      int32_t type;
++#define VIDEO_EVENT_SIZE_CHANGED      1
++#define VIDEO_EVENT_FRAME_RATE_CHANGED        2
++#define VIDEO_EVENT_DECODER_STOPPED   3
++#define VIDEO_EVENT_VSYNC             4
++      time_t timestamp;
++      union {
++              video_size_t size;
++              unsigned int frame_rate;        /* in frames per 1000sec */
++              unsigned char vsync_field;      /* unknown/odd/even/progressive */
++      } u;
++};
++
++
++struct video_status {
++      int                   video_blank;   /* blank video on freeze? */
++      video_play_state_t    play_state;    /* current state of playback */
++      video_stream_source_t stream_source; /* current source (demux/memory) */
++      video_format_t        video_format;  /* current aspect ratio of stream*/
++      video_displayformat_t display_format;/* selected cropping mode */
++};
++
++
++struct video_still_picture {
++      char *iFrame;        /* pointer to a single iframe in memory */
++      int32_t size;
++};
++
++
++typedef
++struct video_highlight {
++      int     active;      /*    1=show highlight, 0=hide highlight */
++      uint8_t contrast1;   /*    7- 4  Pattern pixel contrast */
++                           /*    3- 0  Background pixel contrast */
++      uint8_t contrast2;   /*    7- 4  Emphasis pixel-2 contrast */
++                           /*    3- 0  Emphasis pixel-1 contrast */
++      uint8_t color1;      /*    7- 4  Pattern pixel color */
++                           /*    3- 0  Background pixel color */
++      uint8_t color2;      /*    7- 4  Emphasis pixel-2 color */
++                           /*    3- 0  Emphasis pixel-1 color */
++      uint32_t ypos;       /*   23-22  auto action mode */
++                           /*   21-12  start y */
++                           /*    9- 0  end y */
++      uint32_t xpos;       /*   23-22  button color number */
++                           /*   21-12  start x */
++                           /*    9- 0  end x */
++} video_highlight_t;
++
++
++typedef struct video_spu {
++      int active;
++      int stream_id;
++} video_spu_t;
++
++
++typedef struct video_spu_palette {      /* SPU Palette information */
++      int length;
++      uint8_t *palette;
++} video_spu_palette_t;
++
++
++typedef struct video_navi_pack {
++      int length;          /* 0 ... 1024 */
++      uint8_t data[1024];
++} video_navi_pack_t;
++
++
++typedef uint16_t video_attributes_t;
++/*   bits: descr. */
++/*   15-14 Video compression mode (0=MPEG-1, 1=MPEG-2) */
++/*   13-12 TV system (0=525/60, 1=625/50) */
++/*   11-10 Aspect ratio (0=4:3, 3=16:9) */
++/*    9- 8 permitted display mode on 4:3 monitor (0=both, 1=only pan-sca */
++/*    7    line 21-1 data present in GOP (1=yes, 0=no) */
++/*    6    line 21-2 data present in GOP (1=yes, 0=no) */
++/*    5- 3 source resolution (0=720x480/576, 1=704x480/576, 2=352x480/57 */
++/*    2    source letterboxed (1=yes, 0=no) */
++/*    0    film/camera mode (0=camera, 1=film (625/50 only)) */
++
++
++/* bit definitions for capabilities: */
++/* can the hardware decode MPEG1 and/or MPEG2? */
++#define VIDEO_CAP_MPEG1   1
++#define VIDEO_CAP_MPEG2   2
++/* can you send a system and/or program stream to video device?
++   (you still have to open the video and the audio device but only
++    send the stream to the video device) */
++#define VIDEO_CAP_SYS     4
++#define VIDEO_CAP_PROG    8
++/* can the driver also handle SPU, NAVI and CSS encoded data?
++   (CSS API is not present yet) */
++#define VIDEO_CAP_SPU    16
++#define VIDEO_CAP_NAVI   32
++#define VIDEO_CAP_CSS    64
++
++
++#define VIDEO_STOP                 _IO('o', 21)
++#define VIDEO_PLAY                 _IO('o', 22)
++#define VIDEO_FREEZE               _IO('o', 23)
++#define VIDEO_CONTINUE             _IO('o', 24)
++#define VIDEO_SELECT_SOURCE        _IO('o', 25)
++#define VIDEO_SET_BLANK            _IO('o', 26)
++#define VIDEO_GET_STATUS           _IOR('o', 27, struct video_status)
++#define VIDEO_GET_EVENT            _IOR('o', 28, struct video_event)
++#define VIDEO_SET_DISPLAY_FORMAT   _IO('o', 29)
++#define VIDEO_STILLPICTURE         _IOW('o', 30, struct video_still_picture)
++#define VIDEO_FAST_FORWARD         _IO('o', 31)
++#define VIDEO_SLOWMOTION           _IO('o', 32)
++#define VIDEO_GET_CAPABILITIES     _IOR('o', 33, unsigned int)
++#define VIDEO_CLEAR_BUFFER         _IO('o',  34)
++#define VIDEO_SET_ID               _IO('o', 35)
++#define VIDEO_SET_STREAMTYPE       _IO('o', 36)
++#define VIDEO_SET_FORMAT           _IO('o', 37)
++#define VIDEO_SET_SYSTEM           _IO('o', 38)
++#define VIDEO_SET_HIGHLIGHT        _IOW('o', 39, video_highlight_t)
++#define VIDEO_SET_SPU              _IOW('o', 50, video_spu_t)
++#define VIDEO_SET_SPU_PALETTE      _IOW('o', 51, video_spu_palette_t)
++#define VIDEO_GET_NAVI             _IOR('o', 52, video_navi_pack_t)
++#define VIDEO_SET_ATTRIBUTES       _IO('o', 53)
++#define VIDEO_GET_SIZE             _IOR('o', 55, video_size_t)
++#define VIDEO_GET_FRAME_RATE       _IOR('o', 56, unsigned int)
++
++/**
++ * VIDEO_GET_PTS
++ *
++ * Read the 33 bit presentation time stamp as defined
++ * in ITU T-REC-H.222.0 / ISO/IEC 13818-1.
++ *
++ * The PTS should belong to the currently played
++ * frame if possible, but may also be a value close to it
++ * like the PTS of the last decoded frame or the last PTS
++ * extracted by the PES parser.
++ */
++#define VIDEO_GET_PTS              _IOR('o', 57, __u64)
++
++/* Read the number of displayed frames since the decoder was started */
++#define VIDEO_GET_FRAME_COUNT            _IOR('o', 58, __u64)
++
++#define VIDEO_COMMAND            _IOWR('o', 59, struct video_command)
++#define VIDEO_TRY_COMMAND        _IOWR('o', 60, struct video_command)
++
++#endif /*_DVBVIDEO_H_*/
+diff -Nurd linuxtv-dvb-apps-1.1.1/INSTALL dvb-apps/INSTALL
+--- linuxtv-dvb-apps-1.1.1/INSTALL     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/INSTALL   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,26 @@
++Requirements:
++
++For ttusb_dec_reset, you will need libusb.
++
++Building:
++
++Simply type
++$ make
++
++Build options
++  static=1          - Build all applications statically.
++  V=1               - Verbose output during build.
++  ttusb_dec_reset=1 - Build the optional ttusb_dec_reset.
++
++Installing:
++
++Install libraries and utils to /usr/[bin,include,lib,share]
++$ make install
++
++Install options
++  prefix=<...>     - basic installation dir [default: /usr]
++  bindir=<...>     - installation dir for applications [default: $(prefix)/bin]
++  includedir=<...> - installation dir for include files [default: $(prefix)/include]
++  libdir=<...>     - installation dir for applications [default: $(prefix)/lib]
++  sharedir=<...>   - installation dir for shared data [default: $(prefix)/share]
++  DESTDIR=<...>    - prefix for all files, useful for packaging
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvbapi/dvbaudio.c dvb-apps/lib/libdvbapi/dvbaudio.c
+--- linuxtv-dvb-apps-1.1.1/lib/libdvbapi/dvbaudio.c    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvbapi/dvbaudio.c  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,50 @@
++/*
++ * libdvbnet - a DVB network support library
++ *
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <stdlib.h>
++#include <string.h>
++#include <stdio.h>
++#include <sys/param.h>
++#include <fcntl.h>
++#include <unistd.h>
++#include <sys/ioctl.h>
++#include <linux/dvb/audio.h>
++#include <errno.h>
++#include "dvbaudio.h"
++
++int dvbaudio_open(int adapter, int audiodeviceid)
++{
++      char filename[PATH_MAX+1];
++      int fd;
++
++      sprintf(filename, "/dev/dvb/adapter%i/audio%i", adapter, audiodeviceid);
++      if ((fd = open(filename, O_RDWR)) < 0) {
++              // if that failed, try a flat /dev structure
++              sprintf(filename, "/dev/dvb%i.audio%i", adapter, audiodeviceid);
++              fd = open(filename, O_RDWR);
++      }
++
++      return fd;
++}
++
++int dvbaudio_set_bypass(int fd, int bypass)
++{
++      return ioctl(fd, AUDIO_SET_BYPASS_MODE, bypass);
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvbapi/dvbaudio.h dvb-apps/lib/libdvbapi/dvbaudio.h
+--- linuxtv-dvb-apps-1.1.1/lib/libdvbapi/dvbaudio.h    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvbapi/dvbaudio.h  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,55 @@
++/*
++ * libdvbnet - a DVB network support library
++ *
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef LIBDVBAUDIO_H
++#define LIBDVBAUDIO_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <stdint.h>
++
++/**
++ * Open a DVB audio device.
++ *
++ * @param adapter DVB adapter ID.
++ * @param audiodeviceid Id of audio device of that adapter to open.
++ * @return A unix file descriptor on success, or -1 on failure.
++ */
++extern int dvbaudio_open(int adapter, int audiodeviceid);
++
++/**
++ * Control audio bypass - i.e. output decoded audio, or the raw bitstream (e.g. AC3).
++ *
++ * @param fd Audio device opened with dvbaudio_open().
++ * @param bypass 1=> enable bypass, 0=> disable.
++ * @return 0 on success, nonzero on failure.
++ */
++extern int dvbaudio_set_bypass(int fd, int bypass);
++
++// FIXME: this is a stub library
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif // LIBDVBAUDIO_H
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvbapi/dvbca.c dvb-apps/lib/libdvbapi/dvbca.c
+--- linuxtv-dvb-apps-1.1.1/lib/libdvbapi/dvbca.c       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvbapi/dvbca.c     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,159 @@
++/*
++ * libdvbca - interface onto raw CA devices
++ *
++ * Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <stdlib.h>
++#include <string.h>
++#include <stdio.h>
++#include <sys/param.h>
++#include <sys/ioctl.h>
++#include <fcntl.h>
++#include <unistd.h>
++#include <ctype.h>
++#include <errno.h>
++#include <linux/dvb/ca.h>
++#include "dvbca.h"
++
++
++int dvbca_open(int adapter, int cadevice)
++{
++      char filename[PATH_MAX+1];
++      int fd;
++
++      sprintf(filename, "/dev/dvb/adapter%i/ca%i", adapter, cadevice);
++      if ((fd = open(filename, O_RDWR)) < 0) {
++              // if that failed, try a flat /dev structure
++              sprintf(filename, "/dev/dvb%i.ca%i", adapter, cadevice);
++              fd = open(filename, O_RDWR);
++      }
++
++      return fd;
++}
++
++int dvbca_reset(int fd, uint8_t slot)
++{
++      return ioctl(fd, CA_RESET, (1 << slot));
++}
++
++int dvbca_get_interface_type(int fd, uint8_t slot)
++{
++      ca_slot_info_t info;
++
++      info.num = slot;
++      if (ioctl(fd, CA_GET_SLOT_INFO, &info))
++              return -1;
++
++      if (info.type & CA_CI_LINK)
++              return DVBCA_INTERFACE_LINK;
++      if (info.type & CA_CI)
++              return DVBCA_INTERFACE_HLCI;
++
++      return -1;
++}
++
++int dvbca_get_cam_state(int fd, uint8_t slot)
++{
++      ca_slot_info_t info;
++
++      info.num = slot;
++      if (ioctl(fd, CA_GET_SLOT_INFO, &info))
++              return -1;
++
++      if (info.flags == 0)
++              return DVBCA_CAMSTATE_MISSING;
++      if (info.flags & CA_CI_MODULE_READY)
++              return DVBCA_CAMSTATE_READY;
++      if (info.flags & CA_CI_MODULE_PRESENT)
++              return DVBCA_CAMSTATE_INITIALISING;
++
++      return -1;
++}
++
++int dvbca_link_write(int fd, uint8_t slot, uint8_t connection_id,
++                   uint8_t *data, uint16_t data_length)
++{
++      uint8_t *buf = malloc(data_length + 2);
++      if (buf == NULL)
++              return -1;
++
++      buf[0] = slot;
++      buf[1] = connection_id;
++      memcpy(buf+2, data, data_length);
++
++      int result = write(fd, buf, data_length+2);
++      free(buf);
++      return result;
++}
++
++int dvbca_link_read(int fd, uint8_t *slot, uint8_t *connection_id,
++                   uint8_t *data, uint16_t data_length)
++{
++      int size;
++
++      uint8_t *buf = malloc(data_length + 2);
++      if (buf == NULL)
++              return -1;
++
++      if ((size = read(fd, buf, data_length+2)) < 2)
++              return -1;
++
++      *slot = buf[0];
++      *connection_id = buf[1];
++      memcpy(data, buf+2, size-2);
++      free(buf);
++
++      return size - 2;
++}
++
++int dvbca_hlci_write(int fd, uint8_t *data, uint16_t data_length)
++{
++      struct ca_msg msg;
++
++      if (data_length > 256) {
++              return -1;
++      }
++      memset(&msg, 0, sizeof(msg));
++      msg.length = data_length;
++
++      memcpy(msg.msg, data, data_length);
++
++      return ioctl(fd, CA_SEND_MSG, &msg);
++}
++
++int dvbca_hlci_read(int fd, uint32_t app_tag, uint8_t *data,
++                  uint16_t data_length)
++{
++      struct ca_msg msg;
++
++      if (data_length > 256) {
++              data_length = 256;
++      }
++      memset(&msg, 0, sizeof(msg));
++      msg.length = data_length;
++      msg.msg[0] = app_tag >> 16;
++      msg.msg[1] = app_tag >> 8;
++      msg.msg[2] = app_tag;
++
++      int status = ioctl(fd, CA_GET_MSG, &msg);
++      if (status < 0) return status;
++
++      if (msg.length > data_length) msg.length = data_length;
++      memcpy(data, msg.msg, msg.length);
++      return msg.length;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvbapi/dvbca.h dvb-apps/lib/libdvbapi/dvbca.h
+--- linuxtv-dvb-apps-1.1.1/lib/libdvbapi/dvbca.h       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvbapi/dvbca.h     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,135 @@
++/*
++ * libdvbca - interface onto raw CA devices
++ *
++ * Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef LIBDVBCA_H
++#define LIBDVBCA_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <stdint.h>
++
++/**
++ * The types of CA interface we support.
++ */
++#define DVBCA_INTERFACE_LINK 0
++#define DVBCA_INTERFACE_HLCI 1
++
++/**
++ * States a CAM in a slot can be in.
++ */
++#define DVBCA_CAMSTATE_MISSING 0
++#define DVBCA_CAMSTATE_INITIALISING 1
++#define DVBCA_CAMSTATE_READY 2
++
++
++/**
++ * Open a CA device. Multiple CAMs can be accessed through a CA device.
++ *
++ * @param adapter Index of the DVB adapter.
++ * @param cadevice Index of the CA device on that adapter (usually 0).
++ * @return A unix file descriptor on success, or -1 on failure.
++ */
++extern int dvbca_open(int adapter, int cadevice);
++
++/**
++ * Reset a CAM.
++ *
++ * @param fd File handle opened with dvbca_open.
++ * @param slot Slot where the requested CAM is in.
++ * @return 0 on success, -1 on failure.
++ */
++extern int dvbca_reset(int fd, uint8_t slot);
++
++/**
++ * Get the interface type of a CAM.
++ *
++ * @param fd File handle opened with dvbca_open.
++ * @param slot Slot where the requested CAM is in.
++ * @return One of the DVBCA_INTERFACE_* values, or -1 on failure.
++ */
++extern int dvbca_get_interface_type(int fd, uint8_t slot);
++
++/**
++ * Get the state of a CAM.
++ *
++ * @param fd File handle opened with dvbca_open.
++ * @param slot Slot where the requested CAM is in.
++ * @return One of the DVBCA_CAMSTATE_* values, or -1 on failure.
++ */
++extern int dvbca_get_cam_state(int fd, uint8_t slot);
++
++/**
++ * Write a message to a CAM using a link-layer interface.
++ *
++ * @param fd File handle opened with dvbca_open.
++ * @param slot Slot where the requested CAM is in.
++ * @param connection_id Connection ID of the message.
++ * @param data Data to write.
++ * @param data_length Number of bytes to write.
++ * @return 0 on success, or -1 on failure.
++ */
++extern int dvbca_link_write(int fd, uint8_t slot, uint8_t connection_id,
++                          uint8_t *data, uint16_t data_length);
++
++/**
++ * Read a message from a CAM using a link-layer interface.
++ *
++ * @param fd File handle opened with dvbca_open.
++ * @param slot Slot where the responding CAM is in.
++ * @param connection_id Destination for the connection ID the message came from.
++ * @param data Data that was read.
++ * @param data_length Max number of bytes to read.
++ * @return Number of bytes read on success, or -1 on failure.
++ */
++extern int dvbca_link_read(int fd, uint8_t *slot, uint8_t *connection_id,
++                         uint8_t *data, uint16_t data_length);
++
++// FIXME how do we determine which CAM slot of a CA is meant?
++/**
++ * Write a message to a CAM using an HLCI interface.
++ *
++ * @param fd File handle opened with dvbca_open.
++ * @param data Data to write.
++ * @param data_length Number of bytes to write.
++ * @return 0 on success, or -1 on failure.
++ */
++extern int dvbca_hlci_write(int fd, uint8_t *data, uint16_t data_length);
++
++// FIXME how do we determine which CAM slot of a CA is meant?
++/**
++ * Read a message from a CAM using an HLCI interface.
++ *
++ * @param fd File handle opened with dvbca_open.
++ * @param app_tag Application layer tag giving the message type to read.
++ * @param data Data that was read.
++ * @param data_length Max number of bytes to read.
++ * @return Number of bytes read on success, or -1 on failure.
++ */
++extern int dvbca_hlci_read(int fd, uint32_t app_tag, uint8_t *data,
++                         uint16_t data_length);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif // LIBDVBCA_H
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvbapi/dvbdemux.c dvb-apps/lib/libdvbapi/dvbdemux.c
+--- linuxtv-dvb-apps-1.1.1/lib/libdvbapi/dvbdemux.c    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvbapi/dvbdemux.c  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,255 @@
++/*
++ * libdvbdemux - a DVB demux library
++ *
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <stdlib.h>
++#include <string.h>
++#include <stdio.h>
++#include <sys/param.h>
++#include <sys/ioctl.h>
++#include <fcntl.h>
++#include <unistd.h>
++#include <ctype.h>
++#include <errno.h>
++#include <linux/dvb/dmx.h>
++#include "dvbdemux.h"
++
++
++int dvbdemux_open_demux(int adapter, int demuxdevice, int nonblocking)
++{
++      char filename[PATH_MAX+1];
++      int flags = O_RDWR;
++      int fd;
++
++      if (nonblocking)
++              flags |= O_NONBLOCK;
++
++      sprintf(filename, "/dev/dvb/adapter%i/demux%i", adapter, demuxdevice);
++      if ((fd = open(filename, flags)) < 0) {
++              // if that failed, try a flat /dev structure
++              sprintf(filename, "/dev/dvb%i.demux%i", adapter, demuxdevice);
++              fd = open(filename, flags);
++      }
++
++      return fd;
++}
++
++int dvbdemux_open_dvr(int adapter, int dvrdevice, int readonly, int nonblocking)
++{
++      char filename[PATH_MAX+1];
++      int flags = O_RDWR;
++      int fd;
++
++      if (readonly)
++              flags = O_RDONLY;
++      if (nonblocking)
++              flags |= O_NONBLOCK;
++
++      sprintf(filename, "/dev/dvb/adapter%i/dvr%i", adapter, dvrdevice);
++      if ((fd = open(filename, flags)) < 0) {
++              // if that failed, try a flat /dev structure
++              sprintf(filename, "/dev/dvb%i.dvr%i", adapter, dvrdevice);
++              fd = open(filename, flags);
++      }
++
++      return fd;
++}
++
++int dvbdemux_set_section_filter(int fd, int pid,
++                              uint8_t filter[18], uint8_t mask[18],
++                              int start, int checkcrc)
++{
++      struct dmx_sct_filter_params sctfilter;
++
++      memset(&sctfilter, 0, sizeof(sctfilter));
++      sctfilter.pid = pid;
++      memcpy(sctfilter.filter.filter, filter, 1);
++      memcpy(sctfilter.filter.filter+1, filter+3, 15);
++      memcpy(sctfilter.filter.mask, mask, 1);
++      memcpy(sctfilter.filter.mask+1, mask+3, 15);
++      memset(sctfilter.filter.mode, 0, 16);
++      if (start)
++              sctfilter.flags |= DMX_IMMEDIATE_START;
++      if (checkcrc)
++              sctfilter.flags |= DMX_CHECK_CRC;
++
++      return ioctl(fd, DMX_SET_FILTER, &sctfilter);
++}
++
++int dvbdemux_set_pes_filter(int fd, int pid,
++                          int input, int output,
++                          int pestype,
++                          int start)
++{
++      struct dmx_pes_filter_params filter;
++
++      memset(&filter, 0, sizeof(filter));
++      filter.pid = pid;
++
++      switch(input) {
++      case DVBDEMUX_INPUT_FRONTEND:
++              filter.input = DMX_IN_FRONTEND;
++              break;
++
++      case DVBDEMUX_INPUT_DVR:
++              filter.input = DMX_IN_DVR;
++              break;
++
++      default:
++              return -EINVAL;
++      }
++
++      switch(output) {
++      case DVBDEMUX_OUTPUT_DECODER:
++              filter.output = DMX_OUT_DECODER;
++              break;
++
++      case DVBDEMUX_OUTPUT_DEMUX:
++              filter.output = DMX_OUT_TAP;
++              break;
++
++      case DVBDEMUX_OUTPUT_DVR:
++              filter.output = DMX_OUT_TS_TAP;
++              break;
++
++#ifdef DMX_OUT_TSDEMUX_TAP
++      case DVBDEMUX_OUTPUT_TS_DEMUX:
++              filter.output = DMX_OUT_TSDEMUX_TAP;
++              break;
++#endif
++
++      default:
++              return -EINVAL;
++      }
++
++      switch(pestype) {
++      case DVBDEMUX_PESTYPE_AUDIO:
++              filter.pes_type = DMX_PES_AUDIO;
++              break;
++
++      case DVBDEMUX_PESTYPE_VIDEO:
++              filter.pes_type = DMX_PES_VIDEO;
++              break;
++
++      case DVBDEMUX_PESTYPE_TELETEXT:
++              filter.pes_type = DMX_PES_TELETEXT;
++              break;
++
++      case DVBDEMUX_PESTYPE_SUBTITLE:
++              filter.pes_type = DMX_PES_SUBTITLE;
++              break;
++
++      case DVBDEMUX_PESTYPE_PCR:
++              filter.pes_type = DMX_PES_PCR;
++              break;
++
++      default:
++              return -EINVAL;
++      }
++
++      if (start)
++              filter.flags |= DMX_IMMEDIATE_START;
++
++      return ioctl(fd, DMX_SET_PES_FILTER, &filter);
++}
++
++int dvbdemux_set_pid_filter(int fd, int pid,
++                          int input, int output,
++                          int start)
++{
++      struct dmx_pes_filter_params filter;
++
++      memset(&filter, 0, sizeof(filter));
++      if (pid == -1)
++              filter.pid = 0x2000;
++      else
++              filter.pid = pid;
++
++      switch(input) {
++      case DVBDEMUX_INPUT_FRONTEND:
++              filter.input = DMX_IN_FRONTEND;
++              break;
++
++      case DVBDEMUX_INPUT_DVR:
++              filter.input = DMX_IN_DVR;
++              break;
++
++      default:
++              return -EINVAL;
++      }
++
++      switch(output) {
++      case DVBDEMUX_OUTPUT_DECODER:
++              filter.output = DMX_OUT_DECODER;
++              break;
++
++      case DVBDEMUX_OUTPUT_DEMUX:
++              filter.output = DMX_OUT_TAP;
++              break;
++
++      case DVBDEMUX_OUTPUT_DVR:
++              filter.output = DMX_OUT_TS_TAP;
++              break;
++
++#ifdef DMX_OUT_TSDEMUX_TAP
++      case DVBDEMUX_OUTPUT_TS_DEMUX:
++              filter.output = DMX_OUT_TSDEMUX_TAP;
++              break;
++#endif
++
++      default:
++              return -EINVAL;
++      }
++
++      filter.pes_type = DMX_PES_OTHER;
++
++      if (start)
++              filter.flags |= DMX_IMMEDIATE_START;
++
++      return ioctl(fd, DMX_SET_PES_FILTER, &filter);
++}
++
++int dvbdemux_start(int fd)
++{
++      return ioctl(fd, DMX_START);
++}
++
++int dvbdemux_stop(int fd)
++{
++      return ioctl(fd, DMX_STOP);
++}
++
++int dvbdemux_get_stc(int fd, uint64_t *stc)
++{
++      struct dmx_stc _stc;
++      int result;
++
++      memset(stc, 0, sizeof(_stc));
++      if ((result = ioctl(fd, DMX_GET_STC, &_stc)) != 0) {
++              return result;
++      }
++
++      *stc = _stc.stc / _stc.base;
++      return 0;
++}
++
++int dvbdemux_set_buffer(int fd, int bufsize)
++{
++      return ioctl(fd, DMX_SET_BUFFER_SIZE, bufsize);
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvbapi/dvbdemux.h dvb-apps/lib/libdvbapi/dvbdemux.h
+--- linuxtv-dvb-apps-1.1.1/lib/libdvbapi/dvbdemux.h    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvbapi/dvbdemux.h  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,204 @@
++/*
++ * libdvbdemux - a DVB demux library
++ *
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef LIBDVBDEMUX_H
++#define LIBDVBDEMUX_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <stdint.h>
++
++/**
++ * Source of the data to be demuxed.
++ *
++ * FRONTEND. The data will be read from the frontend on the adapter.
++ *
++ * DVR. The data will be read from the DVR device of the adapter (of course,
++ * you need to write data TO the DVR device as well).
++ */
++#define DVBDEMUX_INPUT_FRONTEND 0
++#define DVBDEMUX_INPUT_DVR 1
++
++/**
++ * Destination of the demuxed data.
++ *
++ * DECODER. Sends the data directly to a hardware decoder (if present).
++ *
++ * DEMUX. Sends the PID stream to the current demux file descriptor. HOWEVER, the
++ * data will be the payload *only* - transport stream headers will be stripped.
++ *
++ * DVR sends the data to the DVR device. The data will be the complete transport
++ * stream packets with headers intact. Note: if multiple filters specify
++ * DVBDEMUX_OUTPUT_DVR, the individual PID streams will be re-multiplexed
++ * together.
++ */
++#define DVBDEMUX_OUTPUT_DECODER 0
++#define DVBDEMUX_OUTPUT_DEMUX 1
++#define DVBDEMUX_OUTPUT_DVR 2
++#define DVBDEMUX_OUTPUT_TS_DEMUX 3
++
++/**
++ * PES types.
++ */
++#define DVBDEMUX_PESTYPE_AUDIO 0
++#define DVBDEMUX_PESTYPE_VIDEO 1
++#define DVBDEMUX_PESTYPE_TELETEXT 2
++#define DVBDEMUX_PESTYPE_SUBTITLE 3
++#define DVBDEMUX_PESTYPE_PCR 4
++
++
++/**
++ * Open a demux device. Can be called multiple times. These let you setup a
++ * single filter per FD. It can can also be read() from if you use a section
++ * filter, or create a pes_filter or raw_filter with output DVBDEMUX_OUTPUT_DEMUX.
++ *
++ * @param adapter Index of the DVB adapter.
++ * @param demuxdevice Index of the demux device on that adapter (usually 0).
++ * @param nonblocking If 1, frontend will be opened in nonblocking mode.
++ * @return A unix file descriptor on success, or -1 on failure.
++ */
++extern int dvbdemux_open_demux(int adapter, int demuxdevice, int nonblocking);
++
++/**
++ * Open a DVR device. May be opened for writing or reading once.
++ * It is used to either write() transport stream data to be demuxed
++ * (if input == DVBDEMUX_INPUT_DVR), or to read() a stream of demuxed data
++ * (if output == DVBDEMUX_OUTPUT_DVR).
++ *
++ * Note, all demux filters with output set to DVBDEMUX_OUTPUT_DVR will be
++ * multiplexed together and output their data on this device.
++ *
++ * @param adapter Index of the DVB adapter.
++ * @param dvrdevice Index of the dvr device on that adapter (usually 0)
++ * @param readonly If 1, frontend will be opened in readonly mode only.
++ * @param nonblocking If 1, frontend will be opened in nonblocking mode.
++ * @return A unix file descriptor on success, or -1 on failure.
++ */
++extern int dvbdemux_open_dvr(int adapter, int dvrdevice, int readonly, int nonblocking);
++
++/**
++ * Set filter for the first 18 bytes of decoded SI table sections. Note that
++ * bytes 1 and 2 are _not_ filtered since they contain the length field.
++ *
++ * Conceptually, the driver computes the following for each filtered bit.
++ *
++ * (filter[X].bit[Y] & mask[X].bit[Y]) == (header[X].bit[Y] & mask[X].bit[Y])
++ *
++ * Any sections which do not match this criteria for every bit will be discarded.
++ *
++ * The SI data is always read from the frontend, and is always returned by
++ * read()ing the demux fd. FIXME: check this statement!
++ *
++ * @param fd FD as opened with dvbdemux_open_demux() above.
++ * @param pid PID of the stream.
++ * @param filter The filter values of the first 18 bytes of the desired sections.
++ * @param mask Bitmask indicating which bits in the filter array should be tested
++ * (if a bit is 1, it will be tested).
++ * @param start If 1, the filter will be started immediately. Otherwise you must
++ * call dvbdemux_start() manually.
++ * @param checkcrc If 1, the driver will check the CRC on the table sections.
++ * Any bad sections will be dropped.
++ * @return 0 on success, nonzero on failure.
++ */
++extern int dvbdemux_set_section_filter(int fd, int pid,
++                                       uint8_t filter[18], uint8_t mask[18],
++                                       int start, int checkcrc);
++
++/**
++ * Set filter for a stream of PES data. This call can only used for cards
++ * equipped with a hardware decoder.
++ *
++ * @param fd FD as opened with dvbdemux_open_demux() above.
++ * @param pid PID of the stream.
++ * @param input One of DVBDEMUX_INPUT_*.
++ * @param output One of DVBDEMUX_OUTPUT_*.
++ * @param pestype One of DVBDEMUX_PESTYPE_* - this tells the decoder the type
++ * of data in this stream.
++ * @param start If 1, the filter will be started immediately. Otherwise you must
++ * call dvbdemux_start() manually.
++ * @return 0 on success, nonzero on failure.
++ */
++extern int dvbdemux_set_pes_filter(int fd, int pid,
++                                   int input, int output,
++                                   int pestype,
++                                   int start);
++
++/**
++ * Create a pid filter - this will extract transport stream packets for a
++ * specified PID.
++ *
++ * Note: The wildcard PID can only be used on "budget" cards.
++ *
++ * @param fd FD as opened with dvbdemux_open_demux() above.
++ * @param pid PID to retrieve, or use -1 as a wildcard for ALL PIDs.
++ * @param input One of DVBDEMUX_INPUT_*.
++ * @param output One of DVBDEMUX_OUTPUT_*.
++ * @param start If 1, the filter will be started immediately. Otherwise you must
++ * call dvbdemux_start() manually.
++ * @return 0 on success, nonzero on failure.
++ */
++extern int dvbdemux_set_pid_filter(int fd, int pid,
++                                   int input, int output,
++                                   int start);
++
++/**
++ * Start a demux going.
++ *
++ * @param fd FD as opened with dvbdemux_open_demux() above.
++ * @return 0 on success, nonzero on failure.
++ */
++extern int dvbdemux_start(int fd);
++
++/**
++ * Stop a demux.
++ *
++ * @param fd FD as opened with dvbdemux_open_demux() above.
++ * @return 0 on success, nonzero on failure.
++ */
++extern int dvbdemux_stop(int fd);
++
++/**
++ * Retrieve the current STC from the demux. This call can only used for cards
++ * equipped with a hardware decoder.
++ *
++ * @param fd FD as opened with dvbdemux_open_demux() above.
++ * @param stc Where to put the retrieved STC value (in 90kHz clock).
++ * @return 0 on success, nonzero on failure.
++ */
++extern int dvbdemux_get_stc(int fd, uint64_t *stc);
++
++/**
++ * Change the internal buffer size used by the demuxer. The default buffer size
++ * is 8192 bytes. Can only be used if the demux in question is stopped.
++ *
++ * @param fd FD as opened with dvbdemux_open_demux() above.
++ * @param bufsize New buffer size to use.
++ * @return 0 on success, nonzero on failure.
++ */
++extern int dvbdemux_set_buffer(int fd, int bufsize);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif // LIBDVBDEMUX_H
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvbapi/dvbfe.c dvb-apps/lib/libdvbapi/dvbfe.c
+--- linuxtv-dvb-apps-1.1.1/lib/libdvbapi/dvbfe.c       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvbapi/dvbfe.c     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,574 @@
++/*
++ * libdvbfe - a DVB frontend library
++ *
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ * Copyright (C) 2005 Manu Abraham <abraham.manu@gmail.com>
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#define _GNU_SOURCE
++#include <stdlib.h>
++#include <string.h>
++#include <stdio.h>
++#include <sys/param.h>
++#include <sys/ioctl.h>
++#include <sys/time.h>
++#include <sys/poll.h>
++#include <fcntl.h>
++#include <unistd.h>
++#include <ctype.h>
++#include <errno.h>
++#include <linux/dvb/frontend.h>
++#include <libdvbmisc/dvbmisc.h>
++#include "dvbfe.h"
++
++int verbose = 0;
++
++static int dvbfe_spectral_inversion_to_kapi[][2] =
++{
++      { DVBFE_INVERSION_OFF, INVERSION_OFF },
++      { DVBFE_INVERSION_ON, INVERSION_ON },
++      { DVBFE_INVERSION_AUTO, INVERSION_AUTO },
++      { -1, -1 }
++};
++
++static int dvbfe_code_rate_to_kapi[][2] =
++{
++      { DVBFE_FEC_NONE, FEC_NONE },
++      { DVBFE_FEC_1_2, FEC_1_2 },
++      { DVBFE_FEC_2_3, FEC_2_3 },
++      { DVBFE_FEC_3_4, FEC_3_4 },
++      { DVBFE_FEC_4_5, FEC_4_5 },
++      { DVBFE_FEC_5_6, FEC_5_6 },
++      { DVBFE_FEC_6_7, FEC_6_7 },
++      { DVBFE_FEC_7_8, FEC_7_8 },
++      { DVBFE_FEC_8_9, FEC_8_9 },
++      { DVBFE_FEC_AUTO, FEC_AUTO },
++      { -1, -1 }
++};
++
++static int dvbfe_dvbt_const_to_kapi[][2] =
++{
++      { DVBFE_DVBT_CONST_QPSK, FE_QPSK },
++      { DVBFE_DVBT_CONST_QAM_16, QAM_16 },
++      { DVBFE_DVBT_CONST_QAM_32, QAM_32 },
++      { DVBFE_DVBT_CONST_QAM_64, QAM_64 },
++      { DVBFE_DVBT_CONST_QAM_128, QAM_128 },
++      { DVBFE_DVBT_CONST_QAM_256, QAM_256 },
++      { DVBFE_DVBT_CONST_AUTO, QAM_AUTO },
++      { -1, -1 }
++};
++
++static int dvbfe_dvbc_mod_to_kapi[][2] =
++{
++      { DVBFE_DVBC_MOD_QAM_16, QAM_16 },
++      { DVBFE_DVBC_MOD_QAM_32, QAM_32 },
++      { DVBFE_DVBC_MOD_QAM_64, QAM_64 },
++      { DVBFE_DVBC_MOD_QAM_128, QAM_128 },
++      { DVBFE_DVBC_MOD_QAM_256, QAM_256 },
++      { DVBFE_DVBC_MOD_AUTO, QAM_AUTO },
++      { -1, -1 }
++};
++
++static int dvbfe_atsc_mod_to_kapi[][2] =
++{
++      { DVBFE_ATSC_MOD_QAM_64, QAM_64 },
++      { DVBFE_ATSC_MOD_QAM_256, QAM_256 },
++      { DVBFE_ATSC_MOD_VSB_8, VSB_8 },
++      { DVBFE_ATSC_MOD_VSB_16, VSB_16 },
++      { DVBFE_ATSC_MOD_AUTO, QAM_AUTO },
++      { -1, -1 }
++};
++
++static int dvbfe_dvbt_transmit_mode_to_kapi[][2] =
++{
++      { DVBFE_DVBT_TRANSMISSION_MODE_2K, TRANSMISSION_MODE_2K },
++      { DVBFE_DVBT_TRANSMISSION_MODE_8K, TRANSMISSION_MODE_8K },
++      { DVBFE_DVBT_TRANSMISSION_MODE_AUTO, TRANSMISSION_MODE_AUTO },
++      { -1, -1 }
++};
++
++static int dvbfe_dvbt_bandwidth_to_kapi[][2] =
++{
++      { DVBFE_DVBT_BANDWIDTH_8_MHZ, BANDWIDTH_8_MHZ },
++      { DVBFE_DVBT_BANDWIDTH_7_MHZ, BANDWIDTH_7_MHZ },
++      { DVBFE_DVBT_BANDWIDTH_6_MHZ, BANDWIDTH_6_MHZ },
++      { DVBFE_DVBT_BANDWIDTH_AUTO, BANDWIDTH_AUTO },
++      { -1, -1 }
++};
++
++static int dvbfe_dvbt_guard_interval_to_kapi[][2] =
++{
++      { DVBFE_DVBT_GUARD_INTERVAL_1_32, GUARD_INTERVAL_1_32},
++      { DVBFE_DVBT_GUARD_INTERVAL_1_16, GUARD_INTERVAL_1_16},
++      { DVBFE_DVBT_GUARD_INTERVAL_1_8, GUARD_INTERVAL_1_8},
++      { DVBFE_DVBT_GUARD_INTERVAL_1_4, GUARD_INTERVAL_1_4},
++      { DVBFE_DVBT_GUARD_INTERVAL_AUTO, GUARD_INTERVAL_AUTO},
++      { -1, -1 }
++};
++
++static int dvbfe_dvbt_hierarchy_to_kapi[][2] =
++{
++      { DVBFE_DVBT_HIERARCHY_NONE, HIERARCHY_NONE },
++      { DVBFE_DVBT_HIERARCHY_1, HIERARCHY_1 },
++      { DVBFE_DVBT_HIERARCHY_2, HIERARCHY_2 },
++      { DVBFE_DVBT_HIERARCHY_4, HIERARCHY_4 },
++      { DVBFE_DVBT_HIERARCHY_AUTO, HIERARCHY_AUTO },
++      { -1, -1 }
++};
++
++
++static int lookupval(int val, int reverse, int table[][2])
++{
++      int i =0;
++
++      while(table[i][0] != -1) {
++              if (!reverse) {
++                      if (val == table[i][0]) {
++                              return table[i][1];
++                      }
++              } else {
++                      if (val == table[i][1]) {
++                              return table[i][0];
++                      }
++              }
++              i++;
++      }
++
++      return -1;
++}
++
++
++struct dvbfe_handle {
++      int fd;
++      enum dvbfe_type type;
++      char *name;
++};
++
++struct dvbfe_handle *dvbfe_open(int adapter, int frontend, int readonly)
++{
++      char filename[PATH_MAX+1];
++      struct dvbfe_handle *fehandle;
++      int fd;
++      struct dvb_frontend_info info;
++
++      //  flags
++      int flags = O_RDWR;
++      if (readonly) {
++              flags = O_RDONLY;
++      }
++
++      // open it (try normal /dev structure first)
++      sprintf(filename, "/dev/dvb/adapter%i/frontend%i", adapter, frontend);
++      if ((fd = open(filename, flags)) < 0) {
++              // if that failed, try a flat /dev structure
++              sprintf(filename, "/dev/dvb%i.frontend%i", adapter, frontend);
++              if ((fd = open(filename, flags)) < 0) {
++                      return NULL;
++              }
++      }
++
++      // determine fe type
++      if (ioctl(fd, FE_GET_INFO, &info)) {
++              close(fd);
++              return NULL;
++      }
++
++      // setup structure
++      fehandle = (struct dvbfe_handle*) malloc(sizeof(struct dvbfe_handle));
++      memset(fehandle, 0, sizeof(struct dvbfe_handle));
++      fehandle->fd = fd;
++      switch(info.type) {
++      case FE_QPSK:
++              fehandle->type = DVBFE_TYPE_DVBS;
++              break;
++
++      case FE_QAM:
++              fehandle->type = DVBFE_TYPE_DVBC;
++              break;
++
++      case FE_OFDM:
++              fehandle->type = DVBFE_TYPE_DVBT;
++              break;
++
++      case FE_ATSC:
++              fehandle->type = DVBFE_TYPE_ATSC;
++              break;
++      }
++      fehandle->name = strndup(info.name, sizeof(info.name));
++
++      // done
++      return fehandle;
++}
++
++void dvbfe_close(struct dvbfe_handle *fehandle)
++{
++      close(fehandle->fd);
++      free(fehandle->name);
++      free(fehandle);
++}
++
++extern int dvbfe_get_info(struct dvbfe_handle *fehandle,
++                        enum dvbfe_info_mask querymask,
++                        struct dvbfe_info *result,
++                        enum dvbfe_info_querytype querytype,
++                        int timeout)
++{
++      int returnval = 0;
++      struct dvb_frontend_event kevent;
++      int ok = 0;
++
++      result->name = fehandle->name;
++      result->type = fehandle->type;
++
++      switch(querytype) {
++      case DVBFE_INFO_QUERYTYPE_IMMEDIATE:
++              if (querymask & DVBFE_INFO_LOCKSTATUS) {
++                      if (!ioctl(fehandle->fd, FE_READ_STATUS, &kevent.status)) {
++                              returnval |= DVBFE_INFO_LOCKSTATUS;
++                      }
++              }
++              if (querymask & DVBFE_INFO_FEPARAMS) {
++                      if (!ioctl(fehandle->fd, FE_GET_FRONTEND, &kevent.parameters)) {
++                              returnval |= DVBFE_INFO_FEPARAMS;
++                      }
++              }
++              break;
++
++      case DVBFE_INFO_QUERYTYPE_LOCKCHANGE:
++              {
++                      struct pollfd pollfd;
++                      pollfd.fd = fehandle->fd;
++                      pollfd.events = POLLIN | POLLERR;
++
++                      ok = 1;
++                      if (poll(&pollfd, 1, timeout) < 0)
++                              ok = 0;
++                      if (pollfd.revents & POLLERR)
++                              ok = 0;
++                      if (!(pollfd.revents & POLLIN))
++                              ok = 0;
++              }
++
++              if (ok &&
++                  ((querymask & DVBFE_INFO_LOCKSTATUS) ||
++                   (querymask & DVBFE_INFO_FEPARAMS))) {
++                      if (!ioctl(fehandle->fd, FE_GET_EVENT, &kevent)) {
++                              if (querymask & DVBFE_INFO_LOCKSTATUS)
++                                      returnval |= DVBFE_INFO_LOCKSTATUS;
++                              if (querymask & DVBFE_INFO_FEPARAMS)
++                                      returnval |= DVBFE_INFO_FEPARAMS;
++                      }
++              }
++              break;
++      }
++
++      if (returnval & DVBFE_INFO_LOCKSTATUS) {
++              result->signal = kevent.status & FE_HAS_SIGNAL ? 1 : 0;
++              result->carrier = kevent.status & FE_HAS_CARRIER ? 1 : 0;
++              result->viterbi = kevent.status & FE_HAS_VITERBI ? 1 : 0;
++              result->sync = kevent.status & FE_HAS_SYNC ? 1 : 0;
++              result->lock = kevent.status & FE_HAS_LOCK ? 1 : 0;
++      }
++
++      if (returnval & DVBFE_INFO_FEPARAMS) {
++              result->feparams.frequency = kevent.parameters.frequency;
++              result->feparams.inversion = lookupval(kevent.parameters.inversion, 1, dvbfe_spectral_inversion_to_kapi);
++              switch(fehandle->type) {
++              case FE_QPSK:
++                      result->feparams.u.dvbs.symbol_rate = kevent.parameters.u.qpsk.symbol_rate;
++                      result->feparams.u.dvbs.fec_inner =
++                              lookupval(kevent.parameters.u.qpsk.fec_inner, 1, dvbfe_code_rate_to_kapi);
++                      break;
++
++              case FE_QAM:
++                      result->feparams.u.dvbc.symbol_rate = kevent.parameters.u.qam.symbol_rate;
++                      result->feparams.u.dvbc.fec_inner =
++                              lookupval(kevent.parameters.u.qam.fec_inner, 1, dvbfe_code_rate_to_kapi);
++                      result->feparams.u.dvbc.modulation =
++                              lookupval(kevent.parameters.u.qam.modulation, 1, dvbfe_dvbc_mod_to_kapi);
++                      break;
++
++              case FE_OFDM:
++                      result->feparams.u.dvbt.bandwidth =
++                              lookupval(kevent.parameters.u.ofdm.bandwidth, 1, dvbfe_dvbt_bandwidth_to_kapi);
++                      result->feparams.u.dvbt.code_rate_HP =
++                              lookupval(kevent.parameters.u.ofdm.code_rate_HP, 1, dvbfe_code_rate_to_kapi);
++                      result->feparams.u.dvbt.code_rate_LP =
++                              lookupval(kevent.parameters.u.ofdm.code_rate_LP, 1, dvbfe_code_rate_to_kapi);
++                      result->feparams.u.dvbt.constellation =
++                              lookupval(kevent.parameters.u.ofdm.constellation, 1, dvbfe_dvbt_const_to_kapi);
++                      result->feparams.u.dvbt.transmission_mode =
++                              lookupval(kevent.parameters.u.ofdm.transmission_mode, 1, dvbfe_dvbt_transmit_mode_to_kapi);
++                      result->feparams.u.dvbt.guard_interval =
++                              lookupval(kevent.parameters.u.ofdm.guard_interval, 1, dvbfe_dvbt_guard_interval_to_kapi);
++                      result->feparams.u.dvbt.hierarchy_information =
++                              lookupval(kevent.parameters.u.ofdm.hierarchy_information, 1, dvbfe_dvbt_hierarchy_to_kapi);
++                      break;
++
++              case FE_ATSC:
++                      result->feparams.u.atsc.modulation =
++                              lookupval(kevent.parameters.u.vsb.modulation, 1, dvbfe_atsc_mod_to_kapi);
++                      break;
++              }
++      }
++
++      if (querymask & DVBFE_INFO_BER) {
++              if (!ioctl(fehandle->fd, FE_READ_BER, &result->ber))
++                      returnval |= DVBFE_INFO_BER;
++      }
++      if (querymask & DVBFE_INFO_SIGNAL_STRENGTH) {
++              if (!ioctl(fehandle->fd, FE_READ_SIGNAL_STRENGTH, &result->signal_strength))
++                      returnval |= DVBFE_INFO_SIGNAL_STRENGTH;
++      }
++      if (querymask & DVBFE_INFO_SNR) {
++              if (!ioctl(fehandle->fd, FE_READ_SNR, &result->snr))
++                      returnval |= DVBFE_INFO_SNR;
++      }
++      if (querymask & DVBFE_INFO_UNCORRECTED_BLOCKS) {
++              if (!ioctl(fehandle->fd, FE_READ_UNCORRECTED_BLOCKS, &result->ucblocks))
++                      returnval |= DVBFE_INFO_UNCORRECTED_BLOCKS;
++      }
++
++      // done
++      return returnval;
++}
++
++int dvbfe_set(struct dvbfe_handle *fehandle,
++            struct dvbfe_parameters *params,
++            int timeout)
++{
++      struct dvb_frontend_parameters kparams;
++      int res;
++      struct timeval endtime;
++      fe_status_t status;
++
++      kparams.frequency = params->frequency;
++      kparams.inversion = lookupval(params->inversion, 0, dvbfe_spectral_inversion_to_kapi);
++      switch(fehandle->type) {
++      case FE_QPSK:
++              kparams.u.qpsk.symbol_rate = params->u.dvbs.symbol_rate;
++              kparams.u.qpsk.fec_inner = lookupval(params->u.dvbs.fec_inner, 0, dvbfe_code_rate_to_kapi);
++              break;
++
++      case FE_QAM:
++              kparams.u.qam.symbol_rate = params->u.dvbc.symbol_rate;
++              kparams.u.qam.fec_inner = lookupval(params->u.dvbc.fec_inner, 0, dvbfe_code_rate_to_kapi);
++              kparams.u.qam.modulation = lookupval(params->u.dvbc.modulation, 0, dvbfe_dvbc_mod_to_kapi);
++              break;
++
++      case FE_OFDM:
++              kparams.u.ofdm.bandwidth = lookupval(params->u.dvbt.bandwidth, 0, dvbfe_dvbt_bandwidth_to_kapi);
++              kparams.u.ofdm.code_rate_HP = lookupval(params->u.dvbt.code_rate_HP, 0, dvbfe_code_rate_to_kapi);
++              kparams.u.ofdm.code_rate_LP = lookupval(params->u.dvbt.code_rate_LP, 0, dvbfe_code_rate_to_kapi);
++              kparams.u.ofdm.constellation = lookupval(params->u.dvbt.constellation, 0, dvbfe_dvbt_const_to_kapi);
++              kparams.u.ofdm.transmission_mode =
++                      lookupval(params->u.dvbt.transmission_mode, 0, dvbfe_dvbt_transmit_mode_to_kapi);
++              kparams.u.ofdm.guard_interval =
++                      lookupval(params->u.dvbt.guard_interval, 0, dvbfe_dvbt_guard_interval_to_kapi);
++              kparams.u.ofdm.hierarchy_information =
++                      lookupval(params->u.dvbt.hierarchy_information, 0, dvbfe_dvbt_hierarchy_to_kapi);
++                break;
++
++      case FE_ATSC:
++              kparams.u.vsb.modulation = lookupval(params->u.atsc.modulation, 0, dvbfe_atsc_mod_to_kapi);
++              break;
++
++      default:
++              return -EINVAL;
++      }
++
++      // set it and check for error
++      res = ioctl(fehandle->fd, FE_SET_FRONTEND, &kparams);
++      if (res)
++              return res;
++
++      // 0 => return immediately
++      if (timeout == 0) {
++              return 0;
++      }
++
++      /* calculate timeout */
++      if (timeout > 0) {
++              gettimeofday(&endtime, NULL);
++              timeout *= 1000;
++              endtime.tv_sec += timeout / 1000000;
++              endtime.tv_usec += timeout % 1000000;
++      }
++
++      /* wait for a lock */
++      while(1) {
++              /* has it locked? */
++              if (!ioctl(fehandle->fd, FE_READ_STATUS, &status)) {
++                      if (status & FE_HAS_LOCK) {
++                              break;
++                      }
++              }
++
++              /* check for timeout */
++              if (timeout > 0) {
++                      struct timeval curtime;
++                      gettimeofday(&curtime, NULL);
++                      if ((curtime.tv_sec > endtime.tv_sec) ||
++                          ((curtime.tv_sec == endtime.tv_sec) && (curtime.tv_usec >= endtime.tv_usec))) {
++                              break;
++                      }
++              }
++
++              /* delay for a bit */
++              usleep(100000);
++      }
++
++      /* exit */
++      if (status & FE_HAS_LOCK)
++              return 0;
++      return -ETIMEDOUT;
++}
++
++int dvbfe_get_pollfd(struct dvbfe_handle *handle)
++{
++      return handle->fd;
++}
++
++int dvbfe_set_22k_tone(struct dvbfe_handle *fehandle, enum dvbfe_sec_tone_mode tone)
++{
++      int ret = 0;
++
++      switch (tone) {
++      case DVBFE_SEC_TONE_OFF:
++              ret = ioctl(fehandle->fd, FE_SET_TONE, SEC_TONE_OFF);
++              break;
++      case DVBFE_SEC_TONE_ON:
++              ret = ioctl(fehandle->fd, FE_SET_TONE, SEC_TONE_ON);
++              break;
++      default:
++              print(verbose, ERROR, 1, "Invalid command !");
++              break;
++      }
++      if (ret == -1)
++              print(verbose, ERROR, 1, "IOCTL failed !");
++
++      return ret;
++}
++
++int dvbfe_set_tone_data_burst(struct dvbfe_handle *fehandle, enum dvbfe_sec_mini_cmd minicmd)
++{
++      int ret = 0;
++
++      switch (minicmd) {
++      case DVBFE_SEC_MINI_A:
++              ret = ioctl(fehandle->fd, FE_DISEQC_SEND_BURST, SEC_MINI_A);
++              break;
++      case DVBFE_SEC_MINI_B:
++              ret = ioctl(fehandle->fd, FE_DISEQC_SEND_BURST, SEC_MINI_B);
++              break;
++      default:
++              print(verbose, ERROR, 1, "Invalid command");
++              break;
++      }
++      if (ret == -1)
++              print(verbose, ERROR, 1, "IOCTL failed");
++
++      return ret;
++}
++
++int dvbfe_set_voltage(struct dvbfe_handle *fehandle, enum dvbfe_sec_voltage voltage)
++{
++      int ret = 0;
++
++      switch (voltage) {
++      case DVBFE_SEC_VOLTAGE_OFF:
++              ret = ioctl(fehandle->fd, FE_SET_VOLTAGE, SEC_VOLTAGE_OFF);
++              break;
++      case DVBFE_SEC_VOLTAGE_13:
++              ret = ioctl(fehandle->fd, FE_SET_VOLTAGE, SEC_VOLTAGE_13);
++              break;
++      case DVBFE_SEC_VOLTAGE_18:
++              ret = ioctl(fehandle->fd, FE_SET_VOLTAGE, SEC_VOLTAGE_18);
++              break;
++      default:
++              print(verbose, ERROR, 1, "Invalid command");
++              break;
++      }
++      if (ret == -1)
++              print(verbose, ERROR, 1, "IOCTL failed");
++
++      return ret;
++}
++
++int dvbfe_set_high_lnb_voltage(struct dvbfe_handle *fehandle, int on)
++{
++      switch (on) {
++      case 0:
++              ioctl(fehandle->fd, FE_ENABLE_HIGH_LNB_VOLTAGE, 0);
++              break;
++      default:
++              ioctl(fehandle->fd, FE_ENABLE_HIGH_LNB_VOLTAGE, 1);
++              break;
++      }
++      return 0;
++}
++
++int dvbfe_do_dishnetworks_legacy_command(struct dvbfe_handle *fehandle, unsigned int cmd)
++{
++      int ret = 0;
++
++      ret = ioctl(fehandle->fd, FE_DISHNETWORK_SEND_LEGACY_CMD, cmd);
++      if (ret == -1)
++              print(verbose, ERROR, 1, "IOCTL failed");
++
++      return ret;
++}
++
++int dvbfe_do_diseqc_command(struct dvbfe_handle *fehandle, uint8_t *data, uint8_t len)
++{
++      int ret = 0;
++      struct dvb_diseqc_master_cmd diseqc_message;
++
++      if (len > 6)
++              return -EINVAL;
++
++      diseqc_message.msg_len = len;
++      memcpy(diseqc_message.msg, data, len);
++
++      ret = ioctl(fehandle->fd, FE_DISEQC_SEND_MASTER_CMD, &diseqc_message);
++      if (ret == -1)
++              print(verbose, ERROR, 1, "IOCTL failed");
++
++      return ret;
++}
++
++int dvbfe_diseqc_read(struct dvbfe_handle *fehandle, int timeout, unsigned char *buf, unsigned int len)
++{
++      struct dvb_diseqc_slave_reply reply;
++      int result;
++
++      if (len > 4)
++              len = 4;
++
++      reply.timeout = timeout;
++      reply.msg_len = len;
++
++      if ((result = ioctl(fehandle->fd, FE_DISEQC_RECV_SLAVE_REPLY, reply)) != 0)
++              return result;
++
++      if (reply.msg_len < len)
++              len = reply.msg_len;
++      memcpy(buf, reply.msg, len);
++
++      return len;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvbapi/dvbfe.h dvb-apps/lib/libdvbapi/dvbfe.h
+--- linuxtv-dvb-apps-1.1.1/lib/libdvbapi/dvbfe.h       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvbapi/dvbfe.h     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,333 @@
++/*
++ * libdvbfe - a DVB frontend library
++ *
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ * Copyright (C) 2005 Manu Abraham <abraham.manu@gmail.com>
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef LIBDVBFE_H
++#define LIBDVBFE_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <stdint.h>
++
++/**
++ * The types of frontend we support.
++ */
++enum dvbfe_type {
++      DVBFE_TYPE_DVBS,
++      DVBFE_TYPE_DVBC,
++      DVBFE_TYPE_DVBT,
++      DVBFE_TYPE_ATSC,
++};
++
++enum dvbfe_spectral_inversion {
++      DVBFE_INVERSION_OFF,
++      DVBFE_INVERSION_ON,
++      DVBFE_INVERSION_AUTO
++};
++
++enum dvbfe_code_rate {
++      DVBFE_FEC_NONE,
++      DVBFE_FEC_1_2,
++      DVBFE_FEC_2_3,
++      DVBFE_FEC_3_4,
++      DVBFE_FEC_4_5,
++      DVBFE_FEC_5_6,
++      DVBFE_FEC_6_7,
++      DVBFE_FEC_7_8,
++      DVBFE_FEC_8_9,
++      DVBFE_FEC_AUTO
++};
++
++enum dvbfe_dvbt_const {
++      DVBFE_DVBT_CONST_QPSK,
++      DVBFE_DVBT_CONST_QAM_16,
++      DVBFE_DVBT_CONST_QAM_32,
++      DVBFE_DVBT_CONST_QAM_64,
++      DVBFE_DVBT_CONST_QAM_128,
++      DVBFE_DVBT_CONST_QAM_256,
++      DVBFE_DVBT_CONST_AUTO
++};
++
++enum dvbfe_dvbc_mod {
++      DVBFE_DVBC_MOD_QAM_16,
++      DVBFE_DVBC_MOD_QAM_32,
++      DVBFE_DVBC_MOD_QAM_64,
++      DVBFE_DVBC_MOD_QAM_128,
++      DVBFE_DVBC_MOD_QAM_256,
++      DVBFE_DVBC_MOD_AUTO,
++};
++
++enum dvbfe_atsc_mod {
++      DVBFE_ATSC_MOD_QAM_64,
++      DVBFE_ATSC_MOD_QAM_256,
++      DVBFE_ATSC_MOD_VSB_8,
++      DVBFE_ATSC_MOD_VSB_16,
++      DVBFE_ATSC_MOD_AUTO
++};
++
++enum dvbfe_dvbt_transmit_mode {
++      DVBFE_DVBT_TRANSMISSION_MODE_2K,
++      DVBFE_DVBT_TRANSMISSION_MODE_8K,
++      DVBFE_DVBT_TRANSMISSION_MODE_AUTO
++};
++
++enum dvbfe_dvbt_bandwidth {
++      DVBFE_DVBT_BANDWIDTH_8_MHZ,
++      DVBFE_DVBT_BANDWIDTH_7_MHZ,
++      DVBFE_DVBT_BANDWIDTH_6_MHZ,
++      DVBFE_DVBT_BANDWIDTH_AUTO
++};
++
++enum dvbfe_dvbt_guard_interval {
++      DVBFE_DVBT_GUARD_INTERVAL_1_32,
++      DVBFE_DVBT_GUARD_INTERVAL_1_16,
++      DVBFE_DVBT_GUARD_INTERVAL_1_8,
++      DVBFE_DVBT_GUARD_INTERVAL_1_4,
++      DVBFE_DVBT_GUARD_INTERVAL_AUTO
++};
++
++enum dvbfe_dvbt_hierarchy {
++      DVBFE_DVBT_HIERARCHY_NONE,
++      DVBFE_DVBT_HIERARCHY_1,
++      DVBFE_DVBT_HIERARCHY_2,
++      DVBFE_DVBT_HIERARCHY_4,
++      DVBFE_DVBT_HIERARCHY_AUTO
++};
++
++/**
++ * Structure used to store and communicate frontend parameters.
++ */
++struct dvbfe_parameters {
++      uint32_t frequency;
++      enum dvbfe_spectral_inversion inversion;
++      union {
++              struct {
++                      uint32_t                        symbol_rate;
++                      enum dvbfe_code_rate            fec_inner;
++              } dvbs;
++
++              struct {
++                      uint32_t                        symbol_rate;
++                      enum dvbfe_code_rate            fec_inner;
++                      enum dvbfe_dvbc_mod             modulation;
++              } dvbc;
++
++              struct {
++                      enum dvbfe_dvbt_bandwidth       bandwidth;
++                      enum dvbfe_code_rate            code_rate_HP;
++                      enum dvbfe_code_rate            code_rate_LP;
++                      enum dvbfe_dvbt_const           constellation;
++                      enum dvbfe_dvbt_transmit_mode   transmission_mode;
++                      enum dvbfe_dvbt_guard_interval  guard_interval;
++                      enum dvbfe_dvbt_hierarchy       hierarchy_information;
++              } dvbt;
++
++              struct {
++                      enum dvbfe_atsc_mod             modulation;
++              } atsc;
++      } u;
++};
++
++enum dvbfe_sec_voltage {
++      DVBFE_SEC_VOLTAGE_13,
++      DVBFE_SEC_VOLTAGE_18,
++      DVBFE_SEC_VOLTAGE_OFF
++};
++
++enum dvbfe_sec_tone_mode {
++      DVBFE_SEC_TONE_ON,
++      DVBFE_SEC_TONE_OFF
++};
++
++enum dvbfe_sec_mini_cmd {
++      DVBFE_SEC_MINI_A,
++      DVBFE_SEC_MINI_B
++};
++
++/**
++ * Mask of values used in the dvbfe_get_info() call.
++ */
++enum dvbfe_info_mask {
++      DVBFE_INFO_LOCKSTATUS                   = 0x01,
++      DVBFE_INFO_FEPARAMS                     = 0x02,
++      DVBFE_INFO_BER                          = 0x04,
++      DVBFE_INFO_SIGNAL_STRENGTH              = 0x08,
++      DVBFE_INFO_SNR                          = 0x10,
++      DVBFE_INFO_UNCORRECTED_BLOCKS           = 0x20,
++};
++
++/**
++ * Structure containing values used by the dvbfe_get_info() call.
++ */
++struct dvbfe_info {
++      enum dvbfe_type type;                   /* always retrieved */
++      const char *name;                       /* always retrieved */
++      unsigned int signal     : 1;            /* } DVBFE_INFO_LOCKSTATUS */
++      unsigned int carrier    : 1;            /* } */
++      unsigned int viterbi    : 1;            /* } */
++      unsigned int sync       : 1;            /* } */
++      unsigned int lock       : 1;            /* } */
++      struct dvbfe_parameters feparams;       /* DVBFE_INFO_FEPARAMS */
++      uint32_t ber;                           /* DVBFE_INFO_BER */
++      uint16_t signal_strength;               /* DVBFE_INFO_SIGNAL_STRENGTH */
++      uint16_t snr;                           /* DVBFE_INFO_SNR */
++      uint32_t ucblocks;                      /* DVBFE_INFO_UNCORRECTED_BLOCKS */
++};
++
++/**
++ * Possible types of query used in dvbfe_get_info.
++ *
++ * DVBFE_INFO_QUERYTYPE_IMMEDIATE  - interrogate frontend for most up to date values.
++ * DVBFE_INFO_QUERYTYPE_LOCKCHANGE - return details from queued lock status
++ *                                 change events, or wait for one to occur
++ *                                 if none are queued.
++ */
++enum dvbfe_info_querytype {
++      DVBFE_INFO_QUERYTYPE_IMMEDIATE,
++      DVBFE_INFO_QUERYTYPE_LOCKCHANGE,
++};
++
++
++/**
++ * Frontend handle datatype.
++ */
++struct dvbfe_handle;
++
++/**
++ * Open a DVB frontend.
++ *
++ * @param adapter DVB adapter ID.
++ * @param frontend Frontend ID of that adapter to open.
++ * @param readonly If 1, frontend will be opened in readonly mode only.
++ * @return A handle on success, or NULL on failure.
++ */
++extern struct dvbfe_handle *dvbfe_open(int adapter, int frontend, int readonly);
++
++/**
++ * Close a DVB frontend.
++ *
++ * @param fehandle Handle opened with dvbfe_open().
++ */
++extern void dvbfe_close(struct dvbfe_handle *handle);
++
++/**
++ * Set the frontend tuning parameters.
++ *
++ * Note: this function provides only the basic tuning operation; you might want to
++ * investigate dvbfe_set_sec() in sec.h for a unified device tuning operation.
++ *
++ * @param fehandle Handle opened with dvbfe_open().
++ * @param params Params to set.
++ * @param timeout <0 => wait forever for lock. 0=>return immediately, >0=>
++ * number of milliseconds to wait for a lock.
++ * @return 0 on locked (or if timeout==0 and everything else worked), or
++ * nonzero on failure (including no lock).
++ */
++extern int dvbfe_set(struct dvbfe_handle *fehandle,
++                   struct dvbfe_parameters *params,
++                   int timeout);
++
++/**
++ * Retrieve information about the frontend.
++ *
++ * @param fehandle Handle opened with dvbfe_open().
++ * @param querymask ORed bitmask of desired DVBFE_INFO_* values.
++ * @param result Where to put the retrieved results.
++ * @param querytype Type of query requested.
++ * @param timeout Timeout in ms to use if querytype==lockchange (0=>no timeout, <0=> wait forever).
++ * @return ORed bitmask of DVBFE_INFO_* indicating which values were read successfully.
++ */
++extern int dvbfe_get_info(struct dvbfe_handle *fehandle,
++                        enum dvbfe_info_mask querymask,
++                        struct dvbfe_info *result,
++                        enum dvbfe_info_querytype querytype,
++                        int timeout);
++
++/**
++ * Get a file descriptor for polling for lock status changes.
++ *
++ * @param fehandle Handle opened with dvbfe_open().
++ * @return FD for polling.
++ */
++extern int dvbfe_get_pollfd(struct dvbfe_handle *handle);
++
++/**
++ *    Tone/Data Burst control
++ *    @param fehandle Handle opened with dvbfe_open().
++ *    @param tone, SEC_TONE_ON/SEC_TONE_OFF
++ */
++extern int dvbfe_set_22k_tone(struct dvbfe_handle *handle, enum dvbfe_sec_tone_mode tone);
++
++/**
++ *    22khz Tone control
++ *    @param fehandle Handle opened with dvbfe_open().
++ *    @param adapter, minicmd, SEC_MINI_A/SEC_MINI_B
++ */
++extern int dvbfe_set_tone_data_burst(struct dvbfe_handle *handle, enum dvbfe_sec_mini_cmd minicmd);
++
++/**
++ *    Voltage control
++ *    @param fehandle Handle opened with dvbfe_open().
++ *    @param polarization, SEC_VOLTAGE_13/SEC_VOLTAGE_18/SEC_VOLTAGE_OFF
++ */
++extern int dvbfe_set_voltage(struct dvbfe_handle *handle, enum dvbfe_sec_voltage voltage);
++
++/**
++ *    High LNB voltage control (increases voltage by 1v to compensate for long cables)
++ *    @param fehandle Handle opened with dvbfe_open().
++ *    @param on 1 to enable, 0 to disable.
++ */
++extern int dvbfe_set_high_lnb_voltage(struct dvbfe_handle *fehandle, int on);
++
++/**
++ *    Send a legacy Dish Networks command
++ *    @param fehandle Handle opened with dvbfe_open().
++ *    @param cmd, the command to send
++ */
++extern int dvbfe_do_dishnetworks_legacy_command(struct dvbfe_handle *handle, unsigned int cmd);
++
++/**
++ *    Send a DiSEqC Command
++ *    @param fehandle Handle opened with dvbfe_open().
++ *    @param data, a pointer to am array containing the data to be sent.
++ *      @param len Length of data in  bytes, max 6 bytes.
++ */
++extern int dvbfe_do_diseqc_command(struct dvbfe_handle *handle, uint8_t *data, uint8_t len);
++
++/**
++ * Read a DISEQC response from the frontend.
++ *
++ * @param fehandle Handle opened with dvbfe_open().
++ * @param timeout Timeout for DISEQC response.
++ * @param buf Buffer to store response in.
++ * @param len Number of bytes in buffer.
++ * @return >= 0 on success (number of received bytes), <0 on failure.
++ */
++extern int dvbfe_diseqc_read(struct dvbfe_handle *fehandle, int timeout, unsigned char *buf, unsigned int len);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif // LIBDVBFE_H
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvbapi/dvbnet.c dvb-apps/lib/libdvbapi/dvbnet.c
+--- linuxtv-dvb-apps-1.1.1/lib/libdvbapi/dvbnet.c      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvbapi/dvbnet.c    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,104 @@
++/*
++ * libdvbnet - a DVB network support library
++ *
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <stdlib.h>
++#include <string.h>
++#include <stdio.h>
++#include <sys/param.h>
++#include <fcntl.h>
++#include <unistd.h>
++#include <sys/ioctl.h>
++#include <linux/dvb/net.h>
++#include <errno.h>
++#include "dvbnet.h"
++
++int dvbnet_open(int adapter, int netdeviceid)
++{
++      char filename[PATH_MAX+1];
++      int fd;
++
++      sprintf(filename, "/dev/dvb/adapter%i/net%i", adapter, netdeviceid);
++      if ((fd = open(filename, O_RDWR)) < 0) {
++              // if that failed, try a flat /dev structure
++              sprintf(filename, "/dev/dvb%i.net%i", adapter, netdeviceid);
++              fd = open(filename, O_RDWR);
++      }
++
++      return fd;
++}
++
++int dvbnet_add_interface(int fd, uint16_t pid, enum dvbnet_encap encapsulation)
++{
++      struct dvb_net_if params;
++      int status;
++
++      memset(&params, 0, sizeof(params));
++      params.pid = pid;
++
++      switch(encapsulation) {
++      case DVBNET_ENCAP_MPE:
++              params.feedtype = DVB_NET_FEEDTYPE_MPE;
++              break;
++
++      case DVBNET_ENCAP_ULE:
++              params.feedtype = DVB_NET_FEEDTYPE_ULE;
++              break;
++
++      default:
++              return -EINVAL;
++      }
++
++      status = ioctl(fd, NET_ADD_IF, &params);
++      if (status < 0)
++              return status;
++      return params.if_num;
++}
++
++int dvbnet_get_interface(int fd, int ifnum, uint16_t *pid, enum dvbnet_encap *encapsulation)
++{
++      struct dvb_net_if info;
++      int res;
++
++      memset(&info, 0, sizeof(struct dvb_net_if));
++      info.if_num = ifnum;
++
++      if ((res = ioctl(fd, NET_GET_IF, &info)) < 0)
++              return res;
++
++      *pid = info.pid;
++      switch(info.feedtype) {
++      case DVB_NET_FEEDTYPE_MPE:
++              *encapsulation = DVBNET_ENCAP_MPE;
++              break;
++
++      case DVB_NET_FEEDTYPE_ULE:
++              *encapsulation = DVBNET_ENCAP_ULE;
++              break;
++
++      default:
++              return -EINVAL;
++      }
++      return 0;
++}
++
++int dvbnet_remove_interface(int fd, int ifnum)
++{
++      return ioctl(fd, NET_REMOVE_IF, ifnum);
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvbapi/dvbnet.h dvb-apps/lib/libdvbapi/dvbnet.h
+--- linuxtv-dvb-apps-1.1.1/lib/libdvbapi/dvbnet.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvbapi/dvbnet.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,87 @@
++/*
++ * libdvbnet - a DVB network support library
++ *
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef LIBDVBNET_H
++#define LIBDVBNET_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <stdint.h>
++
++/**
++ * Possible encapsulations of data.
++ */
++enum dvbnet_encap {
++      DVBNET_ENCAP_MPE,
++      DVBNET_ENCAP_ULE,
++};
++
++/**
++ * The maximum allowed number of dvb network devices per adapter netdevice.
++ */
++#define DVBNET_MAX_INTERFACES 10
++
++/**
++ * Open a DVB net interface.
++ *
++ * @param adapter DVB adapter ID.
++ * @param netdeviceid Network control interface of that adapter to open.
++ * @return A unix file descriptor on success, or -1 on failure.
++ */
++extern int dvbnet_open(int adapter, int netdeviceid);
++
++/**
++ * Create a new DVBNET interface.
++ *
++ * @param fd FD opened with libdvbnet_open().
++ * @param pid PID of the stream containing the network data.
++ * @param encapsulation Encapsulation type of the stream (one of DVBNET_ENCAP_*).
++ * @return Index of new interface on success, < 0 on failure.
++ */
++extern int dvbnet_add_interface(int fd, uint16_t pid, enum dvbnet_encap encapsulation);
++
++/**
++ * Get details of a DVBNET interface.
++ *
++ * @param fd FD opened with libdvbnet_open().
++ * @param ifnum Index of interface to retrieve.
++ * @param pid The PID of the interface.
++ * @param encapsulation The encapsulation of the interface (DVBNET_ENCAP_*).
++ * @return 0 on success, nonzero on failure.
++ */
++extern int dvbnet_get_interface(int fd, int ifnum, uint16_t *pid, enum dvbnet_encap *encapsulation);
++
++/**
++ * Remove a DVBNET interface.
++ *
++ * @param fd FD opened with libdvbnet_open().
++ * @param ifnum Index of interface to remove.
++ * @return 0 on success, nonzero on failure.
++ */
++extern int dvbnet_remove_interface(int fd, int ifnum);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif // LIBDVBNET_H
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvbapi/dvbvideo.c dvb-apps/lib/libdvbapi/dvbvideo.c
+--- linuxtv-dvb-apps-1.1.1/lib/libdvbapi/dvbvideo.c    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvbapi/dvbvideo.c  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,46 @@
++/*
++ * libdvbnet - a DVB network support library
++ *
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <stdlib.h>
++#include <string.h>
++#include <stdio.h>
++#include <sys/param.h>
++#include <fcntl.h>
++#include <unistd.h>
++#include <sys/ioctl.h>
++#include <linux/types.h>
++#include <linux/dvb/video.h>
++#include <errno.h>
++#include "dvbvideo.h"
++
++int dvbvideo_open(int adapter, int videodeviceid)
++{
++      char filename[PATH_MAX+1];
++      int fd;
++
++      sprintf(filename, "/dev/dvb/adapter%i/video%i", adapter, videodeviceid);
++      if ((fd = open(filename, O_RDWR)) < 0) {
++              // if that failed, try a flat /dev structure
++              sprintf(filename, "/dev/dvb%i.video%i", adapter, videodeviceid);
++              fd = open(filename, O_RDWR);
++      }
++
++      return fd;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvbapi/dvbvideo.h dvb-apps/lib/libdvbapi/dvbvideo.h
+--- linuxtv-dvb-apps-1.1.1/lib/libdvbapi/dvbvideo.h    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvbapi/dvbvideo.h  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,46 @@
++/*
++ * libdvbnet - a DVB network support library
++ *
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef LIBDVBVIDEO_H
++#define LIBDVBVIDEO_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <stdint.h>
++
++/**
++ * Open a DVB video device.
++ *
++ * @param adapter DVB adapter ID.
++ * @param videodeviceid Id of video device of that adapter to open.
++ * @return A unix file descriptor on success, or -1 on failure.
++ */
++extern int dvbvideo_open(int adapter, int videodeviceid);
++
++// FIXME: this is a stub library
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif // LIBDVBVIDEO_H
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvbapi/Makefile dvb-apps/lib/libdvbapi/Makefile
+--- linuxtv-dvb-apps-1.1.1/lib/libdvbapi/Makefile      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvbapi/Makefile    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Makefile for linuxtv.org dvb-apps/lib/libdvbapi
++
++includes = dvbaudio.h \
++           dvbca.h    \
++           dvbdemux.h \
++           dvbfe.h    \
++           dvbnet.h   \
++           dvbvideo.h
++
++objects  = dvbaudio.o \
++           dvbca.o    \
++           dvbdemux.o \
++           dvbfe.o    \
++           dvbnet.o   \
++           dvbvideo.o
++
++lib_name = libdvbapi
++
++CPPFLAGS += -I../../lib
++
++.PHONY: all
++
++all: library
++
++include ../../Make.rules
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvbcfg/dvbcfg_common.c dvb-apps/lib/libdvbcfg/dvbcfg_common.c
+--- linuxtv-dvb-apps-1.1.1/lib/libdvbcfg/dvbcfg_common.c       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvbcfg/dvbcfg_common.c     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,136 @@
++/*
++ * dvbcfg - support for linuxtv configuration files
++ * common functions
++ *
++ * Copyright (C) 2006 Christoph Pfister <christophpfister@gmail.com>
++ * Copyright (C) 2005 Andrew de Quincey <adq_dvb@lidskialf.net>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
++ */
++
++#include <stdio.h>
++#include <string.h>
++#include <ctype.h>
++#include "dvbcfg_common.h"
++
++int dvbcfg_parse_int(char **text, char *tokens)
++{
++      char *start = *text;
++      char *stop = *text;
++      int value;
++
++      while (*stop != '\0') {
++              if (strchr(tokens, *stop) != NULL) {
++                      *stop = '\0';
++                      stop++;
++                      break;
++              }
++              stop++;
++      }
++
++      if (sscanf(start, "%i", &value) == 1) {
++              *text = stop;
++              return value;
++      }
++
++      *text = NULL;
++      return -1;
++}
++
++int dvbcfg_parse_char(char **text, char *tokens)
++{
++      char *start = *text;
++      char *stop = *text;
++      char value;
++
++      while (*stop != '\0') {
++              if (strchr(tokens, *stop) != NULL) {
++                      *stop = '\0';
++                      stop++;
++                      break;
++              }
++              stop++;
++      }
++
++      if (sscanf(start, "%c", &value) == 1) {
++              *text = stop;
++              return value;
++      }
++
++      *text = NULL;
++      return -1;
++}
++
++int dvbcfg_parse_setting(char **text, char *tokens, const struct dvbcfg_setting *settings)
++{
++      char *start = *text;
++      char *stop = *text;
++
++      while (*stop != '\0') {
++              if (strchr(tokens, *stop) != NULL) {
++                      *stop = '\0';
++                      stop++;
++                      break;
++              }
++              stop++;
++      }
++
++      while (settings->name) {
++              if (strcmp(start, settings->name) == 0) {
++                      *text = stop;
++                      return settings->value;
++              }
++              settings++;
++      }
++
++      *text = NULL;
++      return -1;
++}
++
++void dvbcfg_parse_string(char **text, char *tokens, char *dest, unsigned long size)
++{
++      char *start = *text;
++      char *stop = *text;
++      unsigned long length;
++
++      while ((*stop != '\0') && (strchr(tokens, *stop) == NULL))
++              stop++;
++
++      length = (stop - start) + 1;
++
++      if (length <= size) {
++              if (strchr(tokens, *stop) != NULL) {
++                      *stop = '\0';
++                      *text = stop + 1;
++              } else
++                      *text = stop;
++                      memcpy(dest, start, length);
++                      return;
++      }
++
++      *text = NULL;
++      return;
++}
++
++const char *dvbcfg_lookup_setting(unsigned int setting, const struct dvbcfg_setting *settings)
++{
++      while (settings->name) {
++              if (setting == settings->value)
++                      return settings->name;
++              settings++;
++      }
++
++      return NULL;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvbcfg/dvbcfg_common.h dvb-apps/lib/libdvbcfg/dvbcfg_common.h
+--- linuxtv-dvb-apps-1.1.1/lib/libdvbcfg/dvbcfg_common.h       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvbcfg/dvbcfg_common.h     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,37 @@
++/*
++ * dvbcfg - support for linuxtv configuration files
++ * common functions
++ *
++ * Copyright (C) 2006 Christoph Pfister <christophpfister@gmail.com>
++ * Copyright (C) 2005 Andrew de Quincey <adq_dvb@lidskialf.net>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
++ */
++
++#ifndef DVBCFG_COMMON_H
++#define DVBCFG_COMMON_H 1
++
++struct dvbcfg_setting {
++      const char *name;
++      unsigned int value;
++};
++
++extern int dvbcfg_parse_int(char **text, char *tokens);
++extern int dvbcfg_parse_char(char **text, char *tokens);
++extern int dvbcfg_parse_setting(char **text, char *tokens, const struct dvbcfg_setting *settings);
++extern void dvbcfg_parse_string(char **text, char *tokens, char *dest, unsigned long size);
++extern const char *dvbcfg_lookup_setting(unsigned int setting, const struct dvbcfg_setting *settings);
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvbcfg/dvbcfg_scanfile.c dvb-apps/lib/libdvbcfg/dvbcfg_scanfile.c
+--- linuxtv-dvb-apps-1.1.1/lib/libdvbcfg/dvbcfg_scanfile.c     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvbcfg/dvbcfg_scanfile.c   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,282 @@
++/*
++ * dvbcfg - support for linuxtv configuration files
++ * scan channel file support
++ *
++ * Copyright (C) 2006 Christoph Pfister <christophpfister@gmail.com>
++ * Copyright (C) 2005 Andrew de Quincey <adq_dvb@lidskialf.net>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
++ */
++
++#define _GNU_SOURCE
++
++#include <malloc.h>
++#include <ctype.h>
++
++#include "dvbcfg_scanfile.h"
++#include "dvbcfg_common.h"
++
++static const struct dvbcfg_setting dvbcfg_fec_list[] = {
++      { "1/2",  DVBFE_FEC_1_2  },
++      { "2/3",  DVBFE_FEC_2_3  },
++      { "3/4",  DVBFE_FEC_3_4  },
++      { "4/5",  DVBFE_FEC_4_5  },
++      { "5/6",  DVBFE_FEC_5_6  },
++      { "6/7",  DVBFE_FEC_6_7  },
++      { "7/8",  DVBFE_FEC_7_8  },
++      { "8/9",  DVBFE_FEC_8_9  },
++      { "AUTO", DVBFE_FEC_AUTO },
++      { "NONE", DVBFE_FEC_NONE },
++      { NULL, 0 }
++};
++
++static const struct dvbcfg_setting dvbcfg_dvbc_modulation_list[] = {
++      { "QAM16",   DVBFE_DVBC_MOD_QAM_16  },
++      { "QAM32",   DVBFE_DVBC_MOD_QAM_32  },
++      { "QAM64",   DVBFE_DVBC_MOD_QAM_64  },
++      { "QAM128",  DVBFE_DVBC_MOD_QAM_128 },
++      { "QAM256",  DVBFE_DVBC_MOD_QAM_256 },
++      { "AUTO", DVBFE_DVBC_MOD_AUTO    },
++      { NULL, 0 }
++};
++
++static const struct dvbcfg_setting dvbcfg_bandwidth_list[] = {
++      { "6MHz", DVBFE_DVBT_BANDWIDTH_6_MHZ },
++      { "7MHz", DVBFE_DVBT_BANDWIDTH_7_MHZ },
++      { "8MHz", DVBFE_DVBT_BANDWIDTH_8_MHZ },
++      { "AUTO",  DVBFE_DVBT_BANDWIDTH_AUTO  },
++      { NULL, 0 }
++};
++
++static const struct dvbcfg_setting dvbcfg_constellation_list[] = {
++      { "QAM16",   DVBFE_DVBT_CONST_QAM_16  },
++      { "QAM32",   DVBFE_DVBT_CONST_QAM_32  },
++      { "QAM64",   DVBFE_DVBT_CONST_QAM_64  },
++      { "QAM128",  DVBFE_DVBT_CONST_QAM_128 },
++      { "QAM256",  DVBFE_DVBT_CONST_QAM_256 },
++      { "QPSK",     DVBFE_DVBT_CONST_QPSK    },
++      { "AUTO", DVBFE_DVBT_CONST_AUTO    },
++      { NULL, 0 }
++};
++
++static const struct dvbcfg_setting dvbcfg_transmission_mode_list[] = {
++      { "2k",   DVBFE_DVBT_TRANSMISSION_MODE_2K   },
++      { "8k",   DVBFE_DVBT_TRANSMISSION_MODE_8K   },
++      { "AUTO", DVBFE_DVBT_TRANSMISSION_MODE_AUTO },
++      { NULL, 0 }
++};
++
++static const struct dvbcfg_setting dvbcfg_guard_interval_list[] = {
++      { "1/32", DVBFE_DVBT_GUARD_INTERVAL_1_32 },
++      { "1/16", DVBFE_DVBT_GUARD_INTERVAL_1_16 },
++      { "1/8",  DVBFE_DVBT_GUARD_INTERVAL_1_8  },
++      { "1/4",  DVBFE_DVBT_GUARD_INTERVAL_1_4  },
++      { "AUTO", DVBFE_DVBT_GUARD_INTERVAL_AUTO },
++      { NULL, 0 }
++};
++
++static const struct dvbcfg_setting dvbcfg_hierarchy_list[] = {
++      { "1",    DVBFE_DVBT_HIERARCHY_1    },
++      { "2",    DVBFE_DVBT_HIERARCHY_2    },
++      { "4",    DVBFE_DVBT_HIERARCHY_4    },
++      { "AUTO", DVBFE_DVBT_HIERARCHY_AUTO },
++      { "NONE", DVBFE_DVBT_HIERARCHY_NONE },
++      { NULL, 0 }
++};
++
++static const struct dvbcfg_setting dvbcfg_atsc_modulation_list[] = {
++      { "8VSB",    DVBFE_ATSC_MOD_VSB_8   },
++      { "16VSB",   DVBFE_ATSC_MOD_VSB_16  },
++      { "QAM64",  DVBFE_ATSC_MOD_QAM_64  },
++      { "QAM256", DVBFE_ATSC_MOD_QAM_256 },
++      { NULL, 0 }
++};
++
++int dvbcfg_scanfile_parse(FILE *file, dvbcfg_scancallback callback, void *private_data)
++{
++      char *line_buf = NULL;
++      size_t line_size = 0;
++      int line_len = 0;
++      int ret_val = 0;
++
++      while ((line_len = getline(&line_buf, &line_size, file)) > 0) {
++              char *line_tmp = line_buf;
++              char *line_pos = line_buf;
++              struct dvbcfg_scanfile tmp;
++
++              /* remove newline and comments (started with hashes) */
++              while ((*line_tmp != '\0') && (*line_tmp != '\n') && (*line_tmp != '#'))
++                      line_tmp++;
++              *line_tmp = '\0';
++
++              /* always use inversion auto */
++              tmp.fe_params.inversion = DVBFE_INVERSION_AUTO;
++
++              /* parse frontend type */
++              switch(dvbcfg_parse_char(&line_pos, " ")) {
++              case 'T':
++                      tmp.fe_type = DVBFE_TYPE_DVBT;
++                      break;
++              case 'C':
++                      tmp.fe_type = DVBFE_TYPE_DVBC;
++                      break;
++              case 'S':
++                      tmp.fe_type = DVBFE_TYPE_DVBS;
++                      break;
++              case 'A':
++                      tmp.fe_type = DVBFE_TYPE_ATSC;
++                      break;
++              default:
++                      continue;
++              }
++
++              /* parse frontend specific settings */
++              switch (tmp.fe_type) {
++              case DVBFE_TYPE_ATSC:
++
++                      /* parse frequency */
++                      tmp.fe_params.frequency = dvbcfg_parse_int(&line_pos, " ");
++                      if (!line_pos)
++                              continue;
++
++                      /* modulation */
++                      tmp.fe_params.u.atsc.modulation =
++                              dvbcfg_parse_setting(&line_pos, " ", dvbcfg_atsc_modulation_list);
++                      if (!line_pos)
++                              continue;
++
++                      break;
++
++              case DVBFE_TYPE_DVBC:
++
++                      /* parse frequency */
++                      tmp.fe_params.frequency = dvbcfg_parse_int(&line_pos, " ");
++                      if (!line_pos)
++                              continue;
++
++                      /* symbol rate */
++                      tmp.fe_params.u.dvbc.symbol_rate = dvbcfg_parse_int(&line_pos, " ");
++                      if (!line_pos)
++                              continue;
++
++                      /* fec */
++                      tmp.fe_params.u.dvbc.fec_inner =
++                              dvbcfg_parse_setting(&line_pos, " ", dvbcfg_fec_list);
++                      if (!line_pos)
++                              continue;
++
++                      /* modulation */
++                      tmp.fe_params.u.dvbc.modulation =
++                              dvbcfg_parse_setting(&line_pos, " ", dvbcfg_dvbc_modulation_list);
++                      if (!line_pos)
++                              continue;
++
++                      break;
++
++              case DVBFE_TYPE_DVBS:
++
++                      /* parse frequency */
++                      tmp.fe_params.frequency = dvbcfg_parse_int(&line_pos, " ");
++                      if (!line_pos)
++                              continue;
++
++                      /* polarization */
++                      tmp.polarization = tolower(dvbcfg_parse_char(&line_pos, " "));
++                      if (!line_pos)
++                              continue;
++                      if ((tmp.polarization != 'h') &&
++                          (tmp.polarization != 'v') &&
++                          (tmp.polarization != 'l') &&
++                          (tmp.polarization != 'r'))
++                              continue;
++
++                      /* symbol rate */
++                      tmp.fe_params.u.dvbs.symbol_rate = dvbcfg_parse_int(&line_pos, " ");
++                      if (!line_pos)
++                              continue;
++
++                      /* fec */
++                      tmp.fe_params.u.dvbc.fec_inner =
++                              dvbcfg_parse_setting(&line_pos, " ", dvbcfg_fec_list);
++                      if (!line_pos)
++                              continue;
++
++                      break;
++
++              case DVBFE_TYPE_DVBT:
++
++                      /* parse frequency */
++                      tmp.fe_params.frequency = dvbcfg_parse_int(&line_pos, " ");
++                      if (!line_pos)
++                              continue;
++
++                      /* bandwidth */
++                      tmp.fe_params.u.dvbt.bandwidth =
++                              dvbcfg_parse_setting(&line_pos, " ", dvbcfg_bandwidth_list);
++                      if (!line_pos)
++                              continue;
++
++                      /* fec hp */
++                      tmp.fe_params.u.dvbt.code_rate_HP =
++                              dvbcfg_parse_setting(&line_pos, " ", dvbcfg_fec_list);
++                      if (!line_pos)
++                              continue;
++
++                      /* fec lp */
++                      tmp.fe_params.u.dvbt.code_rate_LP =
++                              dvbcfg_parse_setting(&line_pos, " ", dvbcfg_fec_list);
++                      if (!line_pos)
++                              continue;
++
++                      /* constellation */
++                      tmp.fe_params.u.dvbt.constellation =
++                              dvbcfg_parse_setting(&line_pos, " ", dvbcfg_constellation_list);
++                      if (!line_pos)
++                              continue;
++
++                      /* transmission mode */
++                      tmp.fe_params.u.dvbt.transmission_mode =
++                              dvbcfg_parse_setting(&line_pos, " ", dvbcfg_transmission_mode_list);
++                      if (!line_pos)
++                              continue;
++
++                      /* guard interval */
++                      tmp.fe_params.u.dvbt.guard_interval =
++                              dvbcfg_parse_setting(&line_pos, " ", dvbcfg_guard_interval_list);
++                      if (!line_pos)
++                              continue;
++
++                      /* hierarchy */
++                      tmp.fe_params.u.dvbt.hierarchy_information =
++                              dvbcfg_parse_setting(&line_pos, " ", dvbcfg_hierarchy_list);
++                      if (!line_pos)
++                              continue;
++
++                      break;
++              }
++
++              /* invoke callback */
++              if ((ret_val = callback(&tmp, private_data)) != 0) {
++                      if (ret_val < 0)
++                              ret_val = 0;
++                      break;
++              }
++      }
++
++      if (line_buf)
++              free(line_buf);
++
++      return ret_val;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvbcfg/dvbcfg_scanfile.h dvb-apps/lib/libdvbcfg/dvbcfg_scanfile.h
+--- linuxtv-dvb-apps-1.1.1/lib/libdvbcfg/dvbcfg_scanfile.h     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvbcfg/dvbcfg_scanfile.h   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,61 @@
++/*
++ * dvbcfg - support for linuxtv configuration files
++ * scan channel file support
++ *
++ * Copyright (C) 2006 Andrew de Quincey <adq_dvb@lidskialf.net>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
++ */
++
++#ifndef DVBCFG_SCANFILE_H
++#define DVBCFG_SCANFILE_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include <libdvbapi/dvbfe.h>
++#include <stdio.h>
++
++struct dvbcfg_scanfile {
++      enum dvbfe_type fe_type;
++      struct dvbfe_parameters fe_params;
++      char polarization; /* l,r,v,h - only used for dvb-s */
++};
++
++/**
++ * Callback used in dvbcfg_scanfile_parse()
++ *
++ * @param channel Selected channel
++ * @param private_data Private data for the callback
++ * @return 0 to continue, other values to stop (values > 0 are forwarded; see below)
++ */
++typedef int (*dvbcfg_scancallback)(struct dvbcfg_scanfile *channel, void *private_data);
++
++/**
++ * Parse a linuxtv scan file
++ *
++ * @param file Linuxtv scan file
++ * @param callback Callback called for each scan entry
++ * @param private_data Private data for the callback
++ * @return on success 0 or value from the callback if it's > 0, error code on failure
++ */
++extern int dvbcfg_scanfile_parse(FILE *file, dvbcfg_scancallback callback, void *private_data);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* DVBCFG_SCANFILE_H */
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvbcfg/dvbcfg_zapchannel.c dvb-apps/lib/libdvbcfg/dvbcfg_zapchannel.c
+--- linuxtv-dvb-apps-1.1.1/lib/libdvbcfg/dvbcfg_zapchannel.c   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvbcfg/dvbcfg_zapchannel.c 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,384 @@
++/*
++ * dvbcfg - support for linuxtv configuration files
++ * zap channel file support
++ *
++ * Copyright (C) 2006 Christoph Pfister <christophpfister@gmail.com>
++ * Copyright (C) 2005 Andrew de Quincey <adq_dvb@lidskialf.net>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
++ */
++
++#define _GNU_SOURCE
++
++#include <malloc.h>
++#include <string.h>
++#include <ctype.h>
++
++#include "dvbcfg_zapchannel.h"
++#include "dvbcfg_common.h"
++
++static const struct dvbcfg_setting dvbcfg_inversion_list[] = {
++      { "INVERSION_ON",   DVBFE_INVERSION_ON   },
++      { "INVERSION_OFF",  DVBFE_INVERSION_OFF  },
++      { "INVERSION_AUTO", DVBFE_INVERSION_AUTO },
++      { NULL, 0 }
++};
++
++static const struct dvbcfg_setting dvbcfg_fec_list[] = {
++      { "FEC_1_2",  DVBFE_FEC_1_2  },
++      { "FEC_2_3",  DVBFE_FEC_2_3  },
++      { "FEC_3_4",  DVBFE_FEC_3_4  },
++      { "FEC_4_5",  DVBFE_FEC_4_5  },
++      { "FEC_5_6",  DVBFE_FEC_5_6  },
++      { "FEC_6_7",  DVBFE_FEC_6_7  },
++      { "FEC_7_8",  DVBFE_FEC_7_8  },
++      { "FEC_8_9",  DVBFE_FEC_8_9  },
++      { "FEC_AUTO", DVBFE_FEC_AUTO },
++      { "FEC_NONE", DVBFE_FEC_NONE },
++      { NULL, 0 }
++};
++
++static const struct dvbcfg_setting dvbcfg_dvbc_modulation_list[] = {
++      { "QAM_16",   DVBFE_DVBC_MOD_QAM_16  },
++      { "QAM_32",   DVBFE_DVBC_MOD_QAM_32  },
++      { "QAM_64",   DVBFE_DVBC_MOD_QAM_64  },
++      { "QAM_128",  DVBFE_DVBC_MOD_QAM_128 },
++      { "QAM_256",  DVBFE_DVBC_MOD_QAM_256 },
++      { "QAM_AUTO", DVBFE_DVBC_MOD_AUTO    },
++      { NULL, 0 }
++};
++
++static const struct dvbcfg_setting dvbcfg_bandwidth_list[] = {
++      { "BANDWIDTH_6_MHZ", DVBFE_DVBT_BANDWIDTH_6_MHZ },
++      { "BANDWIDTH_7_MHZ", DVBFE_DVBT_BANDWIDTH_7_MHZ },
++      { "BANDWIDTH_8_MHZ", DVBFE_DVBT_BANDWIDTH_8_MHZ },
++      { "BANDWIDTH_AUTO",  DVBFE_DVBT_BANDWIDTH_AUTO  },
++      { NULL, 0 }
++};
++
++static const struct dvbcfg_setting dvbcfg_constellation_list[] = {
++      { "QAM_16",   DVBFE_DVBT_CONST_QAM_16  },
++      { "QAM_32",   DVBFE_DVBT_CONST_QAM_32  },
++      { "QAM_64",   DVBFE_DVBT_CONST_QAM_64  },
++      { "QAM_128",  DVBFE_DVBT_CONST_QAM_128 },
++      { "QAM_256",  DVBFE_DVBT_CONST_QAM_256 },
++      { "QPSK",     DVBFE_DVBT_CONST_QPSK    },
++      { "QAM_AUTO", DVBFE_DVBT_CONST_AUTO    },
++      { NULL, 0 }
++};
++
++static const struct dvbcfg_setting dvbcfg_transmission_mode_list[] = {
++      { "TRANSMISSION_MODE_2K",   DVBFE_DVBT_TRANSMISSION_MODE_2K   },
++      { "TRANSMISSION_MODE_8K",   DVBFE_DVBT_TRANSMISSION_MODE_8K   },
++      { "TRANSMISSION_MODE_AUTO", DVBFE_DVBT_TRANSMISSION_MODE_AUTO },
++      { NULL, 0 }
++};
++
++static const struct dvbcfg_setting dvbcfg_guard_interval_list[] = {
++      { "GUARD_INTERVAL_1_32", DVBFE_DVBT_GUARD_INTERVAL_1_32 },
++      { "GUARD_INTERVAL_1_16", DVBFE_DVBT_GUARD_INTERVAL_1_16 },
++      { "GUARD_INTERVAL_1_8",  DVBFE_DVBT_GUARD_INTERVAL_1_8  },
++      { "GUARD_INTERVAL_1_4",  DVBFE_DVBT_GUARD_INTERVAL_1_4  },
++      { "GUARD_INTERVAL_AUTO", DVBFE_DVBT_GUARD_INTERVAL_AUTO },
++      { NULL, 0 }
++};
++
++static const struct dvbcfg_setting dvbcfg_hierarchy_list[] = {
++      { "HIERARCHY_1",    DVBFE_DVBT_HIERARCHY_1    },
++      { "HIERARCHY_2",    DVBFE_DVBT_HIERARCHY_2    },
++      { "HIERARCHY_4",    DVBFE_DVBT_HIERARCHY_4    },
++      { "HIERARCHY_AUTO", DVBFE_DVBT_HIERARCHY_AUTO },
++      { "HIERARCHY_NONE", DVBFE_DVBT_HIERARCHY_NONE },
++      { NULL, 0 }
++};
++
++static const struct dvbcfg_setting dvbcfg_atsc_modulation_list[] = {
++      { "8VSB",    DVBFE_ATSC_MOD_VSB_8   },
++      { "16VSB",   DVBFE_ATSC_MOD_VSB_16  },
++      { "QAM_64",  DVBFE_ATSC_MOD_QAM_64  },
++      { "QAM_256", DVBFE_ATSC_MOD_QAM_256 },
++      { NULL, 0 }
++};
++
++int dvbcfg_zapchannel_parse(FILE *file, dvbcfg_zapcallback callback, void *private_data)
++{
++      char *line_buf = NULL;
++      size_t line_size = 0;
++      int line_len = 0;
++      int ret_val = 0;
++
++      while ((line_len = getline(&line_buf, &line_size, file)) > 0) {
++              char *line_tmp = line_buf;
++              char *line_pos = line_buf;
++              struct dvbcfg_zapchannel tmp;
++
++              /* remove newline and comments (started with hashes) */
++              while ((*line_tmp != '\0') && (*line_tmp != '\n') && (*line_tmp != '#'))
++                      line_tmp++;
++              *line_tmp = '\0';
++
++              /* parse name */
++              dvbcfg_parse_string(&line_pos, ":", tmp.name, sizeof(tmp.name));
++              if (!line_pos)
++                      continue;
++
++              /* parse frequency */
++              tmp.fe_params.frequency = dvbcfg_parse_int(&line_pos, ":");
++              if (!line_pos)
++                      continue;
++
++              /* try to determine frontend type */
++              if (strstr(line_pos, ":FEC_")) {
++                      if (strstr(line_pos, ":HIERARCHY_"))
++                              tmp.fe_type = DVBFE_TYPE_DVBT;
++                      else
++                              tmp.fe_type = DVBFE_TYPE_DVBC;
++              } else {
++                      if (strstr(line_pos, "VSB:") || strstr(line_pos, "QAM_"))
++                              tmp.fe_type = DVBFE_TYPE_ATSC;
++                      else
++                              tmp.fe_type = DVBFE_TYPE_DVBS;
++              }
++
++              /* parse frontend specific settings */
++              switch (tmp.fe_type) {
++              case DVBFE_TYPE_ATSC:
++                      /* inversion */
++                      tmp.fe_params.inversion = DVBFE_INVERSION_AUTO;
++
++                      /* modulation */
++                      tmp.fe_params.u.atsc.modulation =
++                              dvbcfg_parse_setting(&line_pos, ":", dvbcfg_atsc_modulation_list);
++                      if (!line_pos)
++                              continue;
++
++                      break;
++
++              case DVBFE_TYPE_DVBC:
++                      /* inversion */
++                      tmp.fe_params.inversion =
++                              dvbcfg_parse_setting(&line_pos, ":", dvbcfg_inversion_list);
++                      if (!line_pos)
++                              continue;
++
++                      /* symbol rate */
++                      tmp.fe_params.u.dvbc.symbol_rate = dvbcfg_parse_int(&line_pos, ":");
++                      if (!line_pos)
++                              continue;
++
++                      /* fec */
++                      tmp.fe_params.u.dvbc.fec_inner =
++                              dvbcfg_parse_setting(&line_pos, ":", dvbcfg_fec_list);
++                      if (!line_pos)
++                              continue;
++
++                      /* modulation */
++                      tmp.fe_params.u.dvbc.modulation =
++                              dvbcfg_parse_setting(&line_pos, ":", dvbcfg_dvbc_modulation_list);
++                      if (!line_pos)
++                              continue;
++
++                      break;
++
++              case DVBFE_TYPE_DVBS:
++                      /* adjust frequency */
++                      tmp.fe_params.frequency *= 1000;
++
++                      /* inversion */
++                      tmp.fe_params.inversion = DVBFE_INVERSION_AUTO;
++
++                      /* fec */
++                      tmp.fe_params.u.dvbs.fec_inner = DVBFE_FEC_AUTO;
++
++                      /* polarization */
++                      tmp.polarization = tolower(dvbcfg_parse_char(&line_pos, ":"));
++                      if (!line_pos)
++                              continue;
++                      if ((tmp.polarization != 'h') &&
++                          (tmp.polarization != 'v') &&
++                          (tmp.polarization != 'l') &&
++                          (tmp.polarization != 'r'))
++                              continue;
++
++                      /* satellite switch position */
++                      tmp.diseqc_switch = dvbcfg_parse_int(&line_pos, ":");
++                      if (!line_pos)
++                              continue;
++
++                      /* symbol rate */
++                      tmp.fe_params.u.dvbs.symbol_rate =
++                              dvbcfg_parse_int(&line_pos, ":") * 1000;
++                      if (!line_pos)
++                              continue;
++
++                      break;
++
++              case DVBFE_TYPE_DVBT:
++                      /* inversion */
++                      tmp.fe_params.inversion =
++                              dvbcfg_parse_setting(&line_pos, ":", dvbcfg_inversion_list);
++                      if (!line_pos)
++                              continue;
++
++                      /* bandwidth */
++                      tmp.fe_params.u.dvbt.bandwidth =
++                              dvbcfg_parse_setting(&line_pos, ":", dvbcfg_bandwidth_list);
++                      if (!line_pos)
++                              continue;
++
++                      /* fec hp */
++                      tmp.fe_params.u.dvbt.code_rate_HP =
++                              dvbcfg_parse_setting(&line_pos, ":", dvbcfg_fec_list);
++                      if (!line_pos)
++                              continue;
++
++                      /* fec lp */
++                      tmp.fe_params.u.dvbt.code_rate_LP =
++                              dvbcfg_parse_setting(&line_pos, ":", dvbcfg_fec_list);
++                      if (!line_pos)
++                              continue;
++
++                      /* constellation */
++                      tmp.fe_params.u.dvbt.constellation =
++                              dvbcfg_parse_setting(&line_pos, ":", dvbcfg_constellation_list);
++                      if (!line_pos)
++                              continue;
++
++                      /* transmission mode */
++                      tmp.fe_params.u.dvbt.transmission_mode =
++                              dvbcfg_parse_setting(&line_pos, ":", dvbcfg_transmission_mode_list);
++                      if (!line_pos)
++                              continue;
++
++                      /* guard interval */
++                      tmp.fe_params.u.dvbt.guard_interval =
++                              dvbcfg_parse_setting(&line_pos, ":", dvbcfg_guard_interval_list);
++                      if (!line_pos)
++                              continue;
++
++                      /* hierarchy */
++                      tmp.fe_params.u.dvbt.hierarchy_information =
++                              dvbcfg_parse_setting(&line_pos, ":", dvbcfg_hierarchy_list);
++                      if (!line_pos)
++                              continue;
++
++                      break;
++              }
++
++              /* parse video and audio pids and service id */
++              tmp.video_pid = dvbcfg_parse_int(&line_pos, ":");
++              if (!line_pos)
++                      continue;
++              tmp.audio_pid = dvbcfg_parse_int(&line_pos, ":");
++              if (!line_pos)
++                      continue;
++              tmp.service_id = dvbcfg_parse_int(&line_pos, ":");
++              if (!line_pos) /* old files don't have a service id */
++                      tmp.service_id = 0;
++
++              /* invoke callback */
++              if ((ret_val = callback(&tmp, private_data)) != 0) {
++                      if (ret_val < 0)
++                              ret_val = 0;
++                      break;
++              }
++      }
++
++      if (line_buf)
++              free(line_buf);
++
++      return ret_val;
++}
++
++int dvbcfg_zapchannel_save(FILE *file, dvbcfg_zapcallback callback, void *private_data)
++{
++      int ret_val = 0;
++      struct dvbcfg_zapchannel tmp;
++
++      while ((ret_val = callback(&tmp, private_data)) == 0) {
++              /* name */
++              if ((ret_val = fprintf(file, "%s:", tmp.name)) < 0)
++                      return ret_val;
++
++              /* frontend specific settings */
++              switch (tmp.fe_type) {
++              case DVBFE_TYPE_ATSC:
++                      if ((ret_val = fprintf(file, "%i:%s:",
++                          tmp.fe_params.frequency,
++                          dvbcfg_lookup_setting(tmp.fe_params.u.atsc.modulation,
++                                                dvbcfg_atsc_modulation_list))) < 0)
++                              return ret_val;
++
++                      break;
++
++              case DVBFE_TYPE_DVBC:
++                      if ((ret_val = fprintf(file, "%i:%s:%i:%s:%s:",
++                          tmp.fe_params.frequency,
++                          dvbcfg_lookup_setting(tmp.fe_params.inversion,
++                                                dvbcfg_inversion_list),
++                          tmp.fe_params.u.dvbc.symbol_rate,
++                          dvbcfg_lookup_setting(tmp.fe_params.u.dvbc.fec_inner,
++                                                dvbcfg_fec_list),
++                          dvbcfg_lookup_setting(tmp.fe_params.u.dvbc.modulation,
++                                                dvbcfg_dvbc_modulation_list))) < 0)
++                              return ret_val;
++
++                      break;
++
++              case DVBFE_TYPE_DVBS:
++                      if ((ret_val = fprintf(file, "%i:%c:%i:%i:",
++                          tmp.fe_params.frequency / 1000,
++                          tolower(tmp.polarization),
++                          tmp.diseqc_switch,
++                          tmp.fe_params.u.dvbs.symbol_rate / 1000)) < 0)
++                              return ret_val;
++
++                      break;
++              case DVBFE_TYPE_DVBT:
++                      if ((ret_val = fprintf(file, "%i:%s:%s:%s:%s:%s:%s:%s:%s:",
++                          tmp.fe_params.frequency,
++                          dvbcfg_lookup_setting(tmp.fe_params.inversion,
++                                                dvbcfg_inversion_list),
++                          dvbcfg_lookup_setting(tmp.fe_params.u.dvbt.bandwidth,
++                                                dvbcfg_bandwidth_list),
++                          dvbcfg_lookup_setting(tmp.fe_params.u.dvbt.code_rate_HP,
++                                                dvbcfg_fec_list),
++                          dvbcfg_lookup_setting(tmp.fe_params.u.dvbt.code_rate_LP,
++                                                dvbcfg_fec_list),
++                          dvbcfg_lookup_setting(tmp.fe_params.u.dvbt.constellation,
++                                                dvbcfg_constellation_list),
++                          dvbcfg_lookup_setting(tmp.fe_params.u.dvbt.transmission_mode,
++                                                dvbcfg_transmission_mode_list),
++                          dvbcfg_lookup_setting(tmp.fe_params.u.dvbt.guard_interval,
++                                                dvbcfg_guard_interval_list),
++                          dvbcfg_lookup_setting(tmp.fe_params.u.dvbt.hierarchy_information,
++                                                dvbcfg_hierarchy_list))) < 0)
++                              return ret_val;
++
++                      break;
++              }
++
++              /* video and audio pids and service id */
++              if ((ret_val = fprintf(file, "%i:%i:%i\n",
++                  tmp.video_pid, tmp.audio_pid, tmp.service_id)) < 0)
++                      return ret_val;
++
++      }
++
++      if (ret_val < 0)
++              ret_val = 0;
++
++      return ret_val;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvbcfg/dvbcfg_zapchannel.h dvb-apps/lib/libdvbcfg/dvbcfg_zapchannel.h
+--- linuxtv-dvb-apps-1.1.1/lib/libdvbcfg/dvbcfg_zapchannel.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvbcfg/dvbcfg_zapchannel.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,77 @@
++/*
++ * dvbcfg - support for linuxtv configuration files
++ * zap channel file support
++ *
++ * Copyright (C) 2006 Christoph Pfister <christophpfister@gmail.com>
++ * Copyright (C) 2005 Andrew de Quincey <adq_dvb@lidskialf.net>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
++ */
++
++#ifndef DVBCFG_ZAPCHANNEL_H
++#define DVBCFG_ZAPCHANNEL_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include <libdvbapi/dvbfe.h>
++#include <stdio.h>
++
++struct dvbcfg_zapchannel {
++      char name[128];
++      int video_pid;
++      int audio_pid;
++      int service_id;
++      enum dvbfe_type fe_type;
++      struct dvbfe_parameters fe_params;
++      char polarization; /* l,r,v,h - only used for dvb-s */
++      int diseqc_switch; /* only used for dvb-s */
++};
++
++/**
++ * Callback used in dvbcfg_zapchannel_parse() and dvbcfg_zapchannel_save()
++ *
++ * @param channel Selected channel
++ * @param private_data Private data for the callback
++ * @return 0 to continue, other values to stop (values > 0 are forwarded; see below)
++ */
++typedef int (*dvbcfg_zapcallback)(struct dvbcfg_zapchannel *channel, void *private_data);
++
++/**
++ * Parse a linuxtv channel file
++ *
++ * @param file Linuxtv channel file
++ * @param callback Callback called for each channel
++ * @param private_data Private data for the callback
++ * @return on success 0 or value from the callback if it's > 0, error code on failure
++ */
++extern int dvbcfg_zapchannel_parse(FILE *file, dvbcfg_zapcallback callback, void *private_data);
++
++/**
++ * Save to a linuxtv channel file
++ *
++ * @param file Linuxtv channel file
++ * @param callback Callback called for each channel
++ * @param private_data Private data for the callback
++ * @return on success 0 or value from the callback if it's > 0, error code on failure
++ */
++extern int dvbcfg_zapchannel_save(FILE *file, dvbcfg_zapcallback callback, void *private_data);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* DVBCFG_ZAPCHANNEL_H */
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvbcfg/Makefile dvb-apps/lib/libdvbcfg/Makefile
+--- linuxtv-dvb-apps-1.1.1/lib/libdvbcfg/Makefile      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvbcfg/Makefile    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,18 @@
++# Makefile for linuxtv.org dvb-apps/lib/libdvbcfg
++
++includes = dvbcfg_zapchannel.h \
++         dvbcfg_scanfile.h
++
++objects  = dvbcfg_zapchannel.o \
++         dvbcfg_scanfile.o \
++         dvbcfg_common.o
++
++lib_name = libdvbcfg
++
++CPPFLAGS += -I../../lib
++
++.PHONY: all
++
++all: library
++
++include ../../Make.rules
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvbcfg/zapchannel.txt dvb-apps/lib/libdvbcfg/zapchannel.txt
+--- linuxtv-dvb-apps-1.1.1/lib/libdvbcfg/zapchannel.txt        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvbcfg/zapchannel.txt      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,72 @@
++/**
++ * The zapchannel file format specifies tuning parameters for channels. Each line describes
++ * a single channel, and consists of multiple options separated by ':'. The exact
++ * format of each line depends on the DVB type of the channel (i.e. DVBS, DVBT, DVBC, or ATSC).
++ *
++ * Note: the lines have been split across multiple lines in the following due to length issues.
++ *
++ * The format for DVBT channels is:
++ *
++ * <name>:<frequency>:<inversion>:<bandwidth>:<fec_hp>:<fec_lp>:
++ * <constellation>:<transmission>:<guard_interval>:<hierarchy>:
++ * <video_pid>:<audio_pid>:<channel_number>
++ *
++ *    name: name of the channel
++ *    frequency: frequency in Hz
++ *    inversion: one of INVERSION_OFF, INVERSION_ON, or INVERSION_AUTO.
++ *    bandwidth: one of BANDWIDTH_6_MHZ, BANDWIDTH_7_MHZ, or BANDWIDTH_8_MHZ.
++ *    fec_hp: FEC of the high priority stream, one of: FEC_1_2, FEC_2_3,
++ *            FEC_3_4, FEC_4_5, FEC_5_6, FEC_6_7, FEC_7_8, FEC_8_9, or FEC_AUTO.
++ *    fec_lp: FEC of the low priority stream, one of: FEC_1_2, FEC_2_3,
++ *            FEC_3_4, FEC_4_5, FEC_5_6, FEC_6_7, FEC_7_8, FEC_8_9, FEC_AUTO, or FEC_NONE.
++ *    constellation: one of QPSK, QAM_128, QAM_16, QAM_256, QAM_32, or QAM_64.
++ *    transmission: one of TRANSMISSION_MODE_2K, or TRANSMISSION_MODE_8K.
++ *    guard_interval: one of GUARD_INTERVAL_1_32, GUARD_INTERVAL_1_16, GUARD_INTERVAL_1_8, or GUARD_INTERVAL_1_4.
++ *    hierarchy: one of HIERARCHY_NONE, HIERARCHY_1, HIERARCHY_2, or HIERARCHY_4.
++ *    video_pid: PID of the video stream.
++ *    audio_pid: PID of the audio stream.
++ *    channel_number: Transport stream channel number of the program.
++ *
++ * DVBC:
++ *
++ * <name>:<frequency>:<inversion>:<symbol_rate>:<fec>:
++ * <modulation>:<video_pid>:<audio_pid>:<channel_number>
++ *
++ *    name: name of the channel
++ *    frequency: frequency in Hz
++ *    inversion: one of INVERSION_OFF, INVERSION_ON, or INVERSION_AUTO.
++ *    symbol_rate: Symbol rate of the channel in ksyms.
++ *    fec: One of: FEC_1_2, FEC_2_3, FEC_3_4, FEC_4_5, FEC_5_6, FEC_6_7,
++ *                    FEC_7_8, FEC_8_9, or FEC_AUTO.
++ *    modulation: one of QAM_16, QAM_32, QAM_64, QAM_128, QAM_256, QAM_AUTO.
++ *    video_pid: PID of the video stream.
++ *    audio_pid: PID of the audio stream.
++ *    channel_number: Transport stream channel number of the program.
++ *
++ * DVBS:
++ *
++ * <name>:<frequency>:<polarization>:<satellite_switches>:<symbol_rate>:<video_pid>:<audio_pid>:<channel_number>
++ *
++ *    name: name of the channel
++ *    frequency: frequency in kHz
++ *    polarization: one of H,V,L, or R.
++ *    satellite_switches: Treated as a 2 bit value controlling switches in SEC equipment:
++ *            bit 0: controls "satellite switch", 0: A, 1: B
++ *            bit 1: controls "switch option", 0: A, 1: B
++ *    symbol_rate: Symbol rate of the channel in ksyms.
++ *    video_pid: PID of the video stream.
++ *    audio_pid: PID of the audio stream.
++ *    channel_number: Transport stream channel number of the program.
++ *
++ * ATSC:
++ *
++ * <name>:<frequency>:<inversion>:<modulation>:<video_pid>:<audio_pid>:<channel_number>
++ *
++ *    name: name of the channel
++ *    frequency: frequency in GHz
++ *    inversion: one of INVERSION_OFF, INVERSION_ON, or INVERSION_AUTO.
++ *    modulation: one of 8VSB, 16VSB, QAM_64, or QAM_256.
++ *    video_pid: PID of the video stream.
++ *    audio_pid: PID of the audio stream.
++ *    channel_number: Transport stream channel number of the program.
++ */
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/asn_1.c dvb-apps/lib/libdvben50221/asn_1.c
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/asn_1.c   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/asn_1.c 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,83 @@
++/*
++      ASN.1 routines, implementation for libdvben50221
++      an implementation for the High Level Common Interface
++
++      Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++      Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++      This library is free software; you can redistribute it and/or modify
++      it under the terms of the GNU Lesser General Public License as
++      published by the Free Software Foundation; either version 2.1 of
++      the License, or (at your option) any later version.
++
++      This program is distributed in the hope that it will be useful,
++      but WITHOUT ANY WARRANTY; without even the implied warranty of
++      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++      GNU Lesser General Public License for more details.
++
++      You should have received a copy of the GNU Lesser General Public
++      License along with this library; if not, write to the Free Software
++      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#include <stdio.h>
++#include "asn_1.h"
++
++int asn_1_decode(uint16_t * length, uint8_t * asn_1_array,
++               uint32_t asn_1_array_len)
++{
++      uint8_t length_field;
++
++      if (asn_1_array_len < 1)
++              return -1;
++      length_field = asn_1_array[0];
++
++      if (length_field < 0x80) {
++              // there is only one word
++              *length = length_field & 0x7f;
++              return 1;
++      } else if (length_field == 0x81) {
++              if (asn_1_array_len < 2)
++                      return -1;
++
++              *length = asn_1_array[1];
++              return 2;
++      } else if (length_field == 0x82) {
++              if (asn_1_array_len < 3)
++                      return -1;
++
++              *length = (asn_1_array[1] << 8) | asn_1_array[2];
++              return 3;
++      }
++
++      return -1;
++}
++
++int asn_1_encode(uint16_t length, uint8_t * asn_1_array,
++               uint32_t asn_1_array_len)
++{
++      if (length < 0x80) {
++              if (asn_1_array_len < 1)
++                      return -1;
++
++              asn_1_array[0] = length & 0x7f;
++              return 1;
++      } else if (length < 0x100) {
++              if (asn_1_array_len < 2)
++                      return -1;
++
++              asn_1_array[0] = 0x81;
++              asn_1_array[1] = length;
++              return 2;
++      } else {
++              if (asn_1_array_len < 3)
++                      return -1;
++
++              asn_1_array[0] = 0x82;
++              asn_1_array[1] = length >> 8;
++              asn_1_array[2] = length;
++              return 3;
++      }
++
++      // never reached
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/asn_1.h dvb-apps/lib/libdvben50221/asn_1.h
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/asn_1.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/asn_1.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,41 @@
++/*
++      ASN.1 routines, implementation for libdvben50221
++      an implementation for the High Level Common Interface
++
++      Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++      Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++      This library is free software; you can redistribute it and/or modify
++      it under the terms of the GNU Lesser General Public License as
++      published by the Free Software Foundation; either version 2.1 of
++      the License, or (at your option) any later version.
++
++      This program is distributed in the hope that it will be useful,
++      but WITHOUT ANY WARRANTY; without even the implied warranty of
++      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++      GNU Lesser General Public License for more details.
++
++      You should have received a copy of the GNU Lesser General Public
++      License along with this library; if not, write to the Free Software
++      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#ifndef __ASN_1_H__
++#define __ASN_1_H__
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include <stdlib.h>
++#include <stdint.h>
++
++int asn_1_decode(uint16_t * length, uint8_t * asn_1_array,
++               uint32_t asn_1_array_len);
++int asn_1_encode(uint16_t length, uint8_t * asn_1_array,
++               uint32_t asn_1_array_len);
++
++#ifdef __cplusplus
++}
++#endif
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_ai.c dvb-apps/lib/libdvben50221/en50221_app_ai.c
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_ai.c  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_app_ai.c        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,191 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 transport layer
++
++    Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++    Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
++    Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#include <string.h>
++#include <libdvbmisc/dvbmisc.h>
++#include <pthread.h>
++#include "en50221_app_ai.h"
++#include "en50221_app_tags.h"
++#include "asn_1.h"
++
++struct en50221_app_ai {
++      struct en50221_app_send_functions *funcs;
++
++      en50221_app_ai_callback callback;
++      void *callback_arg;
++
++      pthread_mutex_t lock;
++};
++
++static int en50221_app_ai_parse_app_info(struct en50221_app_ai *ai,
++                                       uint8_t slot_id,
++                                       uint16_t session_number,
++                                       uint8_t * data,
++                                       uint32_t data_length);
++
++
++struct en50221_app_ai *en50221_app_ai_create(struct en50221_app_send_functions *funcs)
++{
++      struct en50221_app_ai *ai = NULL;
++
++      // create structure and set it up
++      ai = malloc(sizeof(struct en50221_app_ai));
++      if (ai == NULL) {
++              return NULL;
++      }
++      ai->funcs = funcs;
++      ai->callback = NULL;
++
++      pthread_mutex_init(&ai->lock, NULL);
++
++      // done
++      return ai;
++}
++
++void en50221_app_ai_destroy(struct en50221_app_ai *ai)
++{
++      pthread_mutex_destroy(&ai->lock);
++      free(ai);
++}
++
++void en50221_app_ai_register_callback(struct en50221_app_ai *ai,
++                                    en50221_app_ai_callback callback,
++                                    void *arg)
++{
++      pthread_mutex_lock(&ai->lock);
++      ai->callback = callback;
++      ai->callback_arg = arg;
++      pthread_mutex_unlock(&ai->lock);
++}
++
++int en50221_app_ai_enquiry(struct en50221_app_ai *ai,
++                         uint16_t session_number)
++{
++      uint8_t data[4];
++
++      data[0] = (TAG_APP_INFO_ENQUIRY >> 16) & 0xFF;
++      data[1] = (TAG_APP_INFO_ENQUIRY >> 8) & 0xFF;
++      data[2] = TAG_APP_INFO_ENQUIRY & 0xFF;
++      data[3] = 0;
++
++      return ai->funcs->send_data(ai->funcs->arg, session_number, data, 4);
++}
++
++int en50221_app_ai_entermenu(struct en50221_app_ai *ai,
++                           uint16_t session_number)
++{
++      uint8_t data[4];
++
++      data[0] = (TAG_ENTER_MENU >> 16) & 0xFF;
++      data[1] = (TAG_ENTER_MENU >> 8) & 0xFF;
++      data[2] = TAG_ENTER_MENU & 0xFF;
++      data[3] = 0;
++
++      return ai->funcs->send_data(ai->funcs->arg, session_number, data, 4);
++}
++
++int en50221_app_ai_message(struct en50221_app_ai *ai,
++                         uint8_t slot_id,
++                         uint16_t session_number,
++                         uint32_t resource_id,
++                         uint8_t * data, uint32_t data_length)
++{
++      (void) resource_id;
++
++      // get the tag
++      if (data_length < 3) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      uint32_t tag = (data[0] << 16) | (data[1] << 8) | data[2];
++
++      switch (tag) {
++      case TAG_APP_INFO:
++              return en50221_app_ai_parse_app_info(ai, slot_id,
++                                                   session_number,
++                                                   data + 3,
++                                                   data_length - 3);
++      }
++
++      print(LOG_LEVEL, ERROR, 1, "Received unexpected tag %x\n", tag);
++      return -1;
++}
++
++
++
++
++
++
++
++static int en50221_app_ai_parse_app_info(struct en50221_app_ai *ai,
++                                       uint8_t slot_id,
++                                       uint16_t session_number,
++                                       uint8_t * data,
++                                       uint32_t data_length)
++{
++      // parse the length field
++      int length_field_len;
++      uint16_t asn_data_length;
++      if ((length_field_len = asn_1_decode(&asn_data_length, data, data_length)) < 0) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received data with invalid length from module on slot %02x\n",
++                    slot_id);
++              return -1;
++      }
++      // check it
++      if (asn_data_length < 6) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      if (asn_data_length > (data_length - length_field_len)) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      uint8_t *app_info = data + length_field_len;
++
++      // parse the fields
++      uint8_t application_type = app_info[0];
++      uint16_t application_manufacturer = (app_info[1] << 8) | app_info[2];
++      uint16_t manufacturer_code = (app_info[3] << 8) | app_info[4];
++      uint8_t menu_string_length = app_info[5];
++      uint8_t *menu_string = app_info + 6;
++
++      // check the menu_string_length
++      if (menu_string_length > (asn_data_length - 6)) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received bad menu string length - adjusting\n");
++              menu_string_length = asn_data_length - 6;
++      }
++      // tell the app
++      pthread_mutex_lock(&ai->lock);
++      en50221_app_ai_callback cb = ai->callback;
++      void *cb_arg = ai->callback_arg;
++      pthread_mutex_unlock(&ai->lock);
++      if (cb) {
++              return cb(cb_arg, slot_id, session_number,
++                        application_type, application_manufacturer,
++                        manufacturer_code, menu_string_length,
++                        menu_string);
++      }
++      return 0;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_ai.h dvb-apps/lib/libdvben50221/en50221_app_ai.h
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_ai.h  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_app_ai.h        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,136 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 transport layer
++
++    Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++    Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
++    Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#ifndef __EN50221_APPLICATION_AI_H__
++#define __EN50221_APPLICATION_AI_H__
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include <stdlib.h>
++#include <stdint.h>
++#include <libdvben50221/en50221_app_utils.h>
++
++#define EN50221_APP_AI_RESOURCEID MKRID(2,1,1)
++
++#define APPLICATION_TYPE_CA 0x01
++#define APPLICATION_TYPE_EPG 0x02
++
++/**
++ * Type definition for application callback function - called when we receive
++ * an application info object.
++ *
++ * @param arg Private argument.
++ * @param slot_id Slot id concerned.
++ * @param session_number Resource id concerned.
++ * @param application_type Type of application.
++ * @param application_manufacturer Manufacturer of application.
++ * @param manufacturer_code Manufacturer specific code.
++ * @param menu_string_length Length of menu string.
++ * @param menu_string The menu string itself.
++ * @return 0 on success, -1 on failure.
++ */
++typedef int (*en50221_app_ai_callback) (void *arg,
++                                      uint8_t slot_id,
++                                      uint16_t session_number,
++                                      uint8_t application_type,
++                                      uint16_t application_manufacturer,
++                                      uint16_t manufacturer_code,
++                                      uint8_t menu_string_length,
++                                      uint8_t * menu_string);
++
++/**
++ * Opaque type representing an application information resource.
++ */
++struct en50221_app_ai;
++
++/**
++ * Create an instance of an application information resource.
++ *
++ * @param funcs Send functions to use.
++ * @return Instance, or NULL on failure.
++ */
++extern struct en50221_app_ai *en50221_app_ai_create(struct en50221_app_send_functions *funcs);
++
++/**
++ * Destroy an instance of an application information resource.
++ *
++ * @param ai Instance to destroy.
++ */
++extern void en50221_app_ai_destroy(struct en50221_app_ai *ai);
++
++/**
++ * Register a callback for reception of application_info objects.
++ *
++ * @param ai Application information instance.
++ * @param callback Callback function.
++ * @param arg Private argument passed during calls to the callback.
++ */
++extern void en50221_app_ai_register_callback(struct en50221_app_ai *ai,
++                                           en50221_app_ai_callback,
++                                           void *arg);
++
++/**
++ * send a enquiry for the app_info provided by a module
++ *
++ * @param ai Application information instance.
++ * @param session_number Session to send on.
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_ai_enquiry(struct en50221_app_ai *ai,
++                                uint16_t session_number);
++
++/**
++ * send a enter_menu tag, this will make the application
++ * open a new MMI session to provide a Menu, or so.
++ *
++ * @param ai Application information instance.
++ * @param session_number Session to send on.
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_ai_entermenu(struct en50221_app_ai *ai,
++                                  uint16_t session_number);
++
++/**
++ * Pass data received for this resource into it for parsing.
++ *
++ * @param ai Application information instance.
++ * @param slot_id Slot ID concerned.
++ * @param session_number Session number concerned.
++ * @param resource_id Resource ID concerned.
++ * @param data The data.
++ * @param data_length Length of data in bytes.
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_ai_message(struct en50221_app_ai *ai,
++                                uint8_t slot_id,
++                                uint16_t session_number,
++                                uint32_t resource_id,
++                                uint8_t *data,
++                                uint32_t data_length);
++
++#ifdef __cplusplus
++}
++#endif
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_auth.c dvb-apps/lib/libdvben50221/en50221_app_auth.c
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_auth.c        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_app_auth.c      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,180 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 transport layer
++
++    Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++    Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
++    Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#include <string.h>
++#include <libdvbmisc/dvbmisc.h>
++#include <pthread.h>
++#include "en50221_app_auth.h"
++#include "en50221_app_tags.h"
++#include "asn_1.h"
++
++struct en50221_app_auth {
++      struct en50221_app_send_functions *funcs;
++
++      en50221_app_auth_request_callback callback;
++      void *callback_arg;
++
++      pthread_mutex_t lock;
++};
++
++static int en50221_app_auth_parse_request(struct en50221_app_auth *private,
++                                        uint8_t slot_id,
++                                        uint16_t session_number,
++                                        uint8_t * data,
++                                        uint32_t data_length);
++
++
++struct en50221_app_auth *en50221_app_auth_create(struct en50221_app_send_functions *funcs)
++{
++      struct en50221_app_auth *auth = NULL;
++
++      // create structure and set it up
++      auth = malloc(sizeof(struct en50221_app_auth));
++      if (auth == NULL) {
++              return NULL;
++      }
++      auth->funcs = funcs;
++      auth->callback = NULL;
++
++      pthread_mutex_init(&auth->lock, NULL);
++
++      // done
++      return auth;
++}
++
++void en50221_app_auth_destroy(struct en50221_app_auth *auth)
++{
++      pthread_mutex_destroy(&auth->lock);
++      free(auth);
++}
++
++void en50221_app_auth_register_request_callback(struct en50221_app_auth *auth,
++                                              en50221_app_auth_request_callback callback, void *arg)
++{
++      pthread_mutex_lock(&auth->lock);
++      auth->callback = callback;
++      auth->callback_arg = arg;
++      pthread_mutex_unlock(&auth->lock);
++}
++
++int en50221_app_auth_send(struct en50221_app_auth *auth,
++                        uint16_t session_number,
++                        uint16_t auth_protocol_id, uint8_t * auth_data,
++                        uint32_t auth_data_length)
++{
++      uint8_t buf[10];
++
++      // the header
++      buf[0] = (TAG_AUTH_RESP >> 16) & 0xFF;
++      buf[1] = (TAG_AUTH_RESP >> 8) & 0xFF;
++      buf[2] = TAG_AUTH_RESP & 0xFF;
++
++      // encode the length field
++      int length_field_len;
++      if ((length_field_len = asn_1_encode(auth_data_length + 2, buf + 3, 3)) < 0) {
++              return -1;
++      }
++      // the phase_id
++      buf[3 + length_field_len] = auth_protocol_id >> 8;
++      buf[3 + length_field_len + 1] = auth_protocol_id;
++
++      // build the iovecs
++      struct iovec iov[2];
++      iov[0].iov_base = buf;
++      iov[0].iov_len = 3 + length_field_len + 2;
++      iov[1].iov_base = auth_data;
++      iov[1].iov_len = auth_data_length;
++
++      // sendit
++      return auth->funcs->send_datav(auth->funcs->arg, session_number,
++                                     iov, 2);
++}
++
++int en50221_app_auth_message(struct en50221_app_auth *auth,
++                           uint8_t slot_id,
++                           uint16_t session_number,
++                           uint32_t resource_id,
++                           uint8_t * data, uint32_t data_length)
++{
++      (void) resource_id;
++
++      // get the tag
++      if (data_length < 3) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      uint32_t tag = (data[0] << 16) | (data[1] << 8) | data[2];
++
++      switch (tag) {
++      case TAG_AUTH_REQ:
++              return en50221_app_auth_parse_request(auth, slot_id,
++                                                    session_number,
++                                                    data + 3,
++                                                    data_length - 3);
++      }
++
++      print(LOG_LEVEL, ERROR, 1, "Received unexpected tag %x\n", tag);
++      return -1;
++}
++
++
++
++static int en50221_app_auth_parse_request(struct en50221_app_auth *auth,
++                                        uint8_t slot_id,
++                                        uint16_t session_number,
++                                        uint8_t * data,
++                                        uint32_t data_length)
++{
++      // first of all, decode the length field
++      uint16_t asn_data_length;
++      int length_field_len;
++      if ((length_field_len = asn_1_decode(&asn_data_length, data, data_length)) < 0) {
++              print(LOG_LEVEL, ERROR, 1, "ASN.1 decode error\n");
++              return -1;
++      }
++      // check it
++      if (asn_data_length < 2) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      if (asn_data_length > (data_length - length_field_len)) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      uint8_t *auth_data = data + length_field_len;
++
++      // process it
++      uint16_t auth_protocol_id = (auth_data[0] << 8) | auth_data[1];
++
++      // tell the app
++      pthread_mutex_lock(&auth->lock);
++      en50221_app_auth_request_callback cb = auth->callback;
++      void *cb_arg = auth->callback_arg;
++      pthread_mutex_unlock(&auth->lock);
++      if (cb) {
++              return cb(cb_arg, slot_id, session_number,
++                        auth_protocol_id, auth_data + 2,
++                        asn_data_length - 2);
++      }
++      return 0;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_auth.h dvb-apps/lib/libdvben50221/en50221_app_auth.h
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_auth.h        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_app_auth.h      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,123 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 transport layer
++
++    Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++    Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
++    Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#ifndef __EN50221_APPLICATION_auth_H__
++#define __EN50221_APPLICATION_auth_H__
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include <stdlib.h>
++#include <stdint.h>
++#include <libdvben50221/en50221_app_utils.h>
++
++#define EN50221_APP_AUTH_RESOURCEID MKRID(16,1,1)
++
++/**
++ * Type definition for request - called when we receive a auth request from a CAM.
++ *
++ * @param arg Private argument.
++ * @param slot_id Slot id concerned.
++ * @param session_number Session number concerned.
++ * @param auth_protocol_id Auth protocol id.
++ * @param auth_data Data for the request.
++ * @param auth_data_lenghth Number of bytes.
++ * @return 0 on success, -1 on failure.
++ */
++typedef int (*en50221_app_auth_request_callback) (void *arg,
++                                                uint8_t slot_id,
++                                                uint16_t session_number,
++                                                uint16_t auth_protcol_id,
++                                                uint8_t *auth_data,
++                                                uint32_t auth_data_length);
++
++/**
++ * Opaque type representing a auth resource.
++ */
++struct en50221_app_auth;
++
++/**
++ * Create an instance of the auth resource.
++ *
++ * @param funcs Send functions to use.
++ * @return Instance, or NULL on failure.
++ */
++extern struct en50221_app_auth *en50221_app_auth_create(struct en50221_app_send_functions *funcs);
++
++/**
++ * Destroy an instance of the auth resource.
++ *
++ * @param auth Instance to destroy.
++ */
++extern void en50221_app_auth_destroy(struct en50221_app_auth *auth);
++
++/**
++ * Register the callback for when we receive a request.
++ *
++ * @param auth auth resource instance.
++ * @param callback The callback. Set to NULL to remove the callback completely.
++ * @param arg Private data passed as arg0 of the callback.
++ */
++extern void en50221_app_auth_register_request_callback(struct en50221_app_auth *auth,
++                                                     en50221_app_auth_request_callback callback,
++                                                     void *arg);
++
++/**
++ * Send an auth response to the CAM.
++ *
++ * @param auth auth resource instance.
++ * @param session_number Session number to send it on.
++ * @param auth_protocol_id Auth protocol id.
++ * @param auth_data Auth data.
++ * @param auth_data_length Number of bytes.
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_auth_send(struct en50221_app_auth *auth,
++                               uint16_t session_number,
++                               uint16_t auth_protocol_id,
++                               uint8_t *auth_data,
++                               uint32_t auth_data_length);
++
++/**
++ * Pass data received for this resource into it for parsing.
++ *
++ * @param auth Authentication instance.
++ * @param slot_id Slot ID concerned.
++ * @param session_number Session number concerned.
++ * @param resource_id Resource ID concerned.
++ * @param data The data.
++ * @param data_length Length of data in bytes.
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_auth_message(struct en50221_app_auth *auth,
++                                  uint8_t slot_id,
++                                  uint16_t session_number,
++                                  uint32_t resource_id,
++                                  uint8_t *data,
++                                  uint32_t data_length);
++
++#ifdef __cplusplus
++}
++#endif
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_ca.c dvb-apps/lib/libdvben50221/en50221_app_ca.c
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_ca.c  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_app_ca.c        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,631 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 transport layer
++
++    Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++    Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
++    Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#include <string.h>
++#include <libdvbmisc/dvbmisc.h>
++#include <pthread.h>
++#include <libucsi/mpeg/descriptor.h>
++#include "en50221_app_ca.h"
++#include "asn_1.h"
++
++// tags supported by this resource
++#define TAG_CA_INFO_ENQUIRY     0x9f8030
++#define TAG_CA_INFO             0x9f8031
++#define TAG_CA_PMT              0x9f8032
++#define TAG_CA_PMT_REPLY        0x9f8033
++
++struct en50221_app_ca {
++      struct en50221_app_send_functions *funcs;
++
++      en50221_app_ca_info_callback ca_info_callback;
++      void *ca_info_callback_arg;
++
++      en50221_app_ca_pmt_reply_callback ca_pmt_reply_callback;
++      void *ca_pmt_reply_callback_arg;
++
++      pthread_mutex_t lock;
++};
++
++struct ca_pmt_descriptor {
++      uint8_t *descriptor;
++      uint16_t length;
++
++      struct ca_pmt_descriptor *next;
++};
++
++struct ca_pmt_stream {
++      uint8_t stream_type;
++      uint16_t pid;
++      struct ca_pmt_descriptor *descriptors;
++      uint32_t descriptors_length;
++      uint32_t descriptors_count;
++
++      struct ca_pmt_stream *next;
++};
++
++static int en50221_ca_extract_pmt_descriptors(struct mpeg_pmt_section *pmt,
++                                            struct ca_pmt_descriptor **outdescriptors);
++static int en50221_ca_extract_streams(struct mpeg_pmt_section *pmt,
++                                    struct ca_pmt_stream **outstreams);
++static void en50221_ca_try_move_pmt_descriptors(struct ca_pmt_descriptor **pmt_descriptors,
++                                              struct ca_pmt_stream **pmt_streams);
++static uint32_t en50221_ca_calculate_length(struct ca_pmt_descriptor *pmt_descriptors,
++                                          uint32_t *pmt_descriptors_length,
++                                          struct ca_pmt_stream *pmt_streams);
++static int en50221_app_ca_parse_info(struct en50221_app_ca *ca,
++                                   uint8_t slot_id,
++                                   uint16_t session_number,
++                                   uint8_t * data, uint32_t data_length);
++static int en50221_app_ca_parse_reply(struct en50221_app_ca *ca,
++                                    uint8_t slot_id,
++                                    uint16_t session_number,
++                                    uint8_t * data,
++                                    uint32_t data_length);
++
++
++
++struct en50221_app_ca *en50221_app_ca_create(struct en50221_app_send_functions *funcs)
++{
++      struct en50221_app_ca *ca = NULL;
++
++      // create structure and set it up
++      ca = malloc(sizeof(struct en50221_app_ca));
++      if (ca == NULL) {
++              return NULL;
++      }
++      ca->funcs = funcs;
++      ca->ca_info_callback = NULL;
++      ca->ca_pmt_reply_callback = NULL;
++
++      pthread_mutex_init(&ca->lock, NULL);
++
++      // done
++      return ca;
++}
++
++void en50221_app_ca_destroy(struct en50221_app_ca *ca)
++{
++      pthread_mutex_destroy(&ca->lock);
++      free(ca);
++}
++
++void en50221_app_ca_register_info_callback(struct en50221_app_ca *ca,
++                                         en50221_app_ca_info_callback
++                                         callback, void *arg)
++{
++      pthread_mutex_lock(&ca->lock);
++      ca->ca_info_callback = callback;
++      ca->ca_info_callback_arg = arg;
++      pthread_mutex_unlock(&ca->lock);
++}
++
++void en50221_app_ca_register_pmt_reply_callback(struct en50221_app_ca *ca,
++                                              en50221_app_ca_pmt_reply_callback
++                                              callback, void *arg)
++{
++      pthread_mutex_lock(&ca->lock);
++      ca->ca_pmt_reply_callback = callback;
++      ca->ca_pmt_reply_callback_arg = arg;
++      pthread_mutex_unlock(&ca->lock);
++}
++
++int en50221_app_ca_info_enq(struct en50221_app_ca *ca,
++                          uint16_t session_number)
++{
++      uint8_t data[4];
++
++      data[0] = (TAG_CA_INFO_ENQUIRY >> 16) & 0xFF;
++      data[1] = (TAG_CA_INFO_ENQUIRY >> 8) & 0xFF;
++      data[2] = TAG_CA_INFO_ENQUIRY & 0xFF;
++      data[3] = 0;
++      return ca->funcs->send_data(ca->funcs->arg, session_number, data, 4);
++}
++
++int en50221_app_ca_pmt(struct en50221_app_ca *ca,
++                     uint16_t session_number,
++                     uint8_t * ca_pmt, uint32_t ca_pmt_length)
++{
++      uint8_t buf[10];
++
++      // set up the tag
++      buf[0] = (TAG_CA_PMT >> 16) & 0xFF;
++      buf[1] = (TAG_CA_PMT >> 8) & 0xFF;
++      buf[2] = TAG_CA_PMT & 0xFF;
++
++      // encode the length field
++      int length_field_len;
++      if ((length_field_len = asn_1_encode(ca_pmt_length, buf + 3, 3)) < 0) {
++              return -1;
++      }
++      // build the iovecs
++      struct iovec iov[2];
++      iov[0].iov_base = buf;
++      iov[0].iov_len = 3 + length_field_len;
++      iov[1].iov_base = ca_pmt;
++      iov[1].iov_len = ca_pmt_length;
++
++      // create the data and send it
++      return ca->funcs->send_datav(ca->funcs->arg, session_number, iov, 2);
++}
++
++int en50221_app_ca_message(struct en50221_app_ca *ca,
++                         uint8_t slot_id,
++                         uint16_t session_number,
++                         uint32_t resource_id,
++                         uint8_t * data, uint32_t data_length)
++{
++      (void) resource_id;
++
++      // get the tag
++      if (data_length < 3) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      uint32_t tag = (data[0] << 16) | (data[1] << 8) | data[2];
++
++      switch (tag) {
++      case TAG_CA_INFO:
++              return en50221_app_ca_parse_info(ca, slot_id,
++                                               session_number, data + 3,
++                                               data_length - 3);
++      case TAG_CA_PMT_REPLY:
++              return en50221_app_ca_parse_reply(ca, slot_id,
++                                                session_number, data + 3,
++                                                data_length - 3);
++      }
++
++      print(LOG_LEVEL, ERROR, 1, "Received unexpected tag %x\n", tag);
++      return -1;
++}
++
++int en50221_ca_format_pmt(struct mpeg_pmt_section *pmt, uint8_t * data,
++                        uint32_t data_length, int move_ca_descriptors,
++                        uint8_t ca_pmt_list_management,
++                        uint8_t ca_pmt_cmd_id)
++{
++      struct ca_pmt_descriptor *pmt_descriptors = NULL;
++      uint32_t pmt_descriptors_length = 0;
++      struct ca_pmt_stream *pmt_streams = NULL;
++      uint32_t total_required_length = 0;
++      struct ca_pmt_descriptor *cur_d;
++      struct ca_pmt_stream *cur_s;
++      int result = -1;
++
++      // extract the descriptors and streams
++      if (en50221_ca_extract_pmt_descriptors(pmt, &pmt_descriptors))
++              goto cleanup;
++      if (en50221_ca_extract_streams(pmt, &pmt_streams))
++              goto cleanup;
++
++      // try and merge them if we have no PMT descriptors
++      if ((pmt_descriptors == NULL) && move_ca_descriptors) {
++              en50221_ca_try_move_pmt_descriptors(&pmt_descriptors,
++                                                  &pmt_streams);
++      }
++      // calculate the length of all descriptors/streams and the total length required
++      total_required_length =
++          en50221_ca_calculate_length(pmt_descriptors,
++                                      &pmt_descriptors_length,
++                                      pmt_streams);
++
++      // ensure we were supplied with enough data
++      if (total_required_length > data_length) {
++              goto cleanup;
++      }
++      // format the start of the PMT
++      uint32_t data_pos = 0;
++      data[data_pos++] = ca_pmt_list_management;
++      data[data_pos++] = mpeg_pmt_section_program_number(pmt) >> 8;
++      data[data_pos++] = mpeg_pmt_section_program_number(pmt);
++      data[data_pos++] =
++          (pmt->head.version_number << 1) | pmt->head.
++          current_next_indicator;
++      data[data_pos++] = (pmt_descriptors_length >> 8) & 0x0f;
++      data[data_pos++] = pmt_descriptors_length;
++
++      // append the PMT descriptors
++      if (pmt_descriptors_length) {
++              data[data_pos++] = ca_pmt_cmd_id;
++              cur_d = pmt_descriptors;
++              while (cur_d) {
++                      memcpy(data + data_pos, cur_d->descriptor,
++                             cur_d->length);
++                      data_pos += cur_d->length;
++                      cur_d = cur_d->next;
++              }
++      }
++      // now, append the streams
++      cur_s = pmt_streams;
++      while (cur_s) {
++              data[data_pos++] = cur_s->stream_type;
++              data[data_pos++] = (cur_s->pid >> 8) & 0x1f;
++              data[data_pos++] = cur_s->pid;
++              data[data_pos++] = (cur_s->descriptors_length >> 8) & 0x0f;
++              data[data_pos++] = cur_s->descriptors_length;
++
++              // append the stream descriptors
++              if (cur_s->descriptors_length) {
++                      data[data_pos++] = ca_pmt_cmd_id;
++                      cur_d = cur_s->descriptors;
++                      while (cur_d) {
++                              memcpy(data + data_pos, cur_d->descriptor,
++                                     cur_d->length);
++                              data_pos += cur_d->length;
++                              cur_d = cur_d->next;
++                      }
++              }
++              cur_s = cur_s->next;
++      }
++      result = data_pos;
++
++
++      cleanup:
++      // free the PMT descriptors
++      cur_d = pmt_descriptors;
++      while (cur_d) {
++              struct ca_pmt_descriptor *next = cur_d->next;
++              free(cur_d);
++              cur_d = next;
++      }
++
++      // free the streams
++      cur_s = pmt_streams;
++      while (cur_s) {
++              struct ca_pmt_stream *next_s = cur_s->next;
++
++              // free the stream descriptors
++              cur_d = cur_s->descriptors;
++              while (cur_d) {
++                      struct ca_pmt_descriptor *next_d = cur_d->next;
++                      free(cur_d);
++                      cur_d = next_d;
++              }
++
++              free(cur_s);
++              cur_s = next_s;
++      }
++      return result;
++}
++
++
++
++
++
++
++
++static int en50221_ca_extract_pmt_descriptors(struct mpeg_pmt_section *pmt,
++                                            struct ca_pmt_descriptor **outdescriptors)
++{
++      struct ca_pmt_descriptor *descriptors = NULL;
++      struct ca_pmt_descriptor *descriptors_tail = NULL;
++      struct ca_pmt_descriptor *cur_d;
++
++      struct descriptor *cur_descriptor;
++      mpeg_pmt_section_descriptors_for_each(pmt, cur_descriptor) {
++              if (cur_descriptor->tag == dtag_mpeg_ca) {
++                      // create a new structure for this one
++                      struct ca_pmt_descriptor *new_d =
++                          malloc(sizeof(struct ca_pmt_descriptor));
++                      if (new_d == NULL) {
++                              goto error_exit;
++                      }
++                      new_d->descriptor = (uint8_t *) cur_descriptor;
++                      new_d->length = cur_descriptor->len + 2;
++                      new_d->next = NULL;
++
++                      // append it to the list
++                      if (descriptors == NULL) {
++                              descriptors = new_d;
++                      } else {
++                              descriptors_tail->next = new_d;
++                      }
++                      descriptors_tail = new_d;
++              }
++      }
++      *outdescriptors = descriptors;
++      return 0;
++
++error_exit:
++      cur_d = descriptors;
++      while (cur_d) {
++              struct ca_pmt_descriptor *next = cur_d->next;
++              free(cur_d);
++              cur_d = next;
++      }
++      return -1;
++}
++
++static int en50221_ca_extract_streams(struct mpeg_pmt_section *pmt,
++                                    struct ca_pmt_stream **outstreams)
++{
++      struct ca_pmt_stream *streams = NULL;
++      struct ca_pmt_stream *streams_tail = NULL;
++      struct mpeg_pmt_stream *cur_stream;
++      struct descriptor *cur_descriptor;
++      struct ca_pmt_stream *cur_s;
++
++      mpeg_pmt_section_streams_for_each(pmt, cur_stream) {
++              struct ca_pmt_descriptor *descriptors_tail = NULL;
++
++              // create a new structure
++              struct ca_pmt_stream *new_s =
++                  malloc(sizeof(struct ca_pmt_stream));
++              if (new_s == NULL) {
++                      goto exit_cleanup;
++              }
++              new_s->stream_type = cur_stream->stream_type;
++              new_s->pid = cur_stream->pid;
++              new_s->descriptors = NULL;
++              new_s->next = NULL;
++              new_s->descriptors_count = 0;
++
++              // append it to the list
++              if (streams == NULL) {
++                      streams = new_s;
++              } else {
++                      streams_tail->next = new_s;
++              }
++              streams_tail = new_s;
++
++              // now process the descriptors
++              mpeg_pmt_stream_descriptors_for_each(cur_stream,
++                                                   cur_descriptor) {
++                      if (cur_descriptor->tag == dtag_mpeg_ca) {
++                              // create a new structure
++                              struct ca_pmt_descriptor *new_d =
++                                  malloc(sizeof(struct ca_pmt_descriptor));
++                              if (new_d == NULL) {
++                                      goto exit_cleanup;
++                              }
++                              new_d->descriptor =
++                                  (uint8_t *) cur_descriptor;
++                              new_d->length = cur_descriptor->len + 2;
++                              new_d->next = NULL;
++
++                              // append it to the list
++                              if (new_s->descriptors == NULL) {
++                                      new_s->descriptors = new_d;
++                              } else {
++                                      descriptors_tail->next = new_d;
++                              }
++                              descriptors_tail = new_d;
++                              new_s->descriptors_count++;
++                      }
++              }
++      }
++      *outstreams = streams;
++      return 0;
++
++exit_cleanup:
++      // free the streams
++      cur_s = streams;
++      while (cur_s) {
++              struct ca_pmt_stream *next_s = cur_s->next;
++
++              // free the stream descriptors
++              struct ca_pmt_descriptor *cur_d = cur_s->descriptors;
++              while (cur_d) {
++                      struct ca_pmt_descriptor *next_d = cur_d->next;
++                      free(cur_d);
++                      cur_d = next_d;
++              }
++
++              free(cur_s);
++              cur_s = next_s;
++      }
++      return -1;
++}
++
++static void en50221_ca_try_move_pmt_descriptors(struct ca_pmt_descriptor **pmt_descriptors,
++                                              struct ca_pmt_stream **pmt_streams)
++{
++      // get the first stream
++      struct ca_pmt_stream *first_stream = *pmt_streams;
++      if (first_stream == NULL)
++              return;
++
++      // Check that all the other streams with CA descriptors have exactly the same CA descriptors
++      struct ca_pmt_stream *cur_stream = first_stream->next;
++      while (cur_stream) {
++              // if there are differing numbers of descriptors, exit right now
++              if (cur_stream->descriptors_count != first_stream->descriptors_count)
++                      return;
++
++              // now verify the descriptors match
++              struct ca_pmt_descriptor *cur_descriptor = cur_stream->descriptors;
++              struct ca_pmt_descriptor *first_cur_descriptor = first_stream->descriptors;
++              while (cur_descriptor) {
++                      // check the descriptors are the same length
++                      if (cur_descriptor->length != first_cur_descriptor->length)
++                              return;
++
++                      // check their contents match
++                      if (memcmp(cur_descriptor->descriptor,
++                                 first_cur_descriptor->descriptor,
++                                 cur_descriptor->length)) {
++                              return;
++                      }
++                      // move to next
++                      cur_descriptor = cur_descriptor->next;
++                      first_cur_descriptor = first_cur_descriptor->next;
++              }
++
++              // move to next
++              cur_stream = cur_stream->next;
++      }
++
++      // if we end up here, all descriptors in all streams matched
++
++      // hook the first stream's descriptors into the PMT's
++      *pmt_descriptors = first_stream->descriptors;
++      first_stream->descriptors = NULL;
++      first_stream->descriptors_count = 0;
++
++      // now free up all the descriptors in the other streams
++      cur_stream = first_stream->next;
++      while (cur_stream) {
++              struct ca_pmt_descriptor *cur_descriptor = cur_stream->descriptors;
++              while (cur_descriptor) {
++                      struct ca_pmt_descriptor *next = cur_descriptor->next;
++                      free(cur_descriptor);
++                      cur_descriptor = next;
++              }
++              cur_stream->descriptors = NULL;
++              cur_stream->descriptors_count = 0;
++              cur_stream = cur_stream->next;
++      }
++}
++
++static uint32_t en50221_ca_calculate_length(struct ca_pmt_descriptor *pmt_descriptors,
++                                          uint32_t *pmt_descriptors_length,
++                                          struct ca_pmt_stream *pmt_streams)
++{
++      uint32_t total_required_length = 6;     // header
++      struct ca_pmt_stream *cur_s;
++
++      // calcuate the PMT descriptors length
++      (*pmt_descriptors_length) = 0;
++      struct ca_pmt_descriptor *cur_d = pmt_descriptors;
++      while (cur_d) {
++              (*pmt_descriptors_length) += cur_d->length;
++              cur_d = cur_d->next;
++      }
++
++      // add on 1 byte for the ca_pmt_cmd_id if we have some descriptors.
++      if (*pmt_descriptors_length)
++              (*pmt_descriptors_length)++;
++
++      // update the total required length
++      total_required_length += *pmt_descriptors_length;
++
++      // calculate the length of descriptors in the streams
++      cur_s = pmt_streams;
++      while (cur_s) {
++              // calculate the size of descriptors in this stream
++              cur_s->descriptors_length = 0;
++              cur_d = cur_s->descriptors;
++              while (cur_d) {
++                      cur_s->descriptors_length += cur_d->length;
++                      cur_d = cur_d->next;
++              }
++
++              // add on 1 byte for the ca_pmt_cmd_id if we have some descriptors.
++              if (cur_s->descriptors_length)
++                      cur_s->descriptors_length++;
++
++              // update the total required length;
++              total_required_length += 5 + cur_s->descriptors_length;
++
++              cur_s = cur_s->next;
++      }
++
++      // done
++      return total_required_length;
++}
++
++static int en50221_app_ca_parse_info(struct en50221_app_ca *ca,
++                                   uint8_t slot_id,
++                                   uint16_t session_number,
++                                   uint8_t * data, uint32_t data_length)
++{
++      // first of all, decode the length field
++      uint16_t asn_data_length;
++      int length_field_len;
++      if ((length_field_len = asn_1_decode(&asn_data_length, data, data_length)) < 0) {
++              print(LOG_LEVEL, ERROR, 1, "ASN.1 decode error\n");
++              return -1;
++      }
++      // check it
++      if (asn_data_length > (data_length - length_field_len)) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      data += length_field_len;
++
++      // parse
++      uint32_t ca_id_count = asn_data_length / 2;
++
++      // byteswap the IDs
++      uint16_t *ids = (uint16_t *) data;
++      uint32_t i;
++      for (i = 0; i < ca_id_count; i++) {
++              bswap16(data);
++              data += 2;
++      }
++
++      // tell the app
++      pthread_mutex_lock(&ca->lock);
++      en50221_app_ca_info_callback cb = ca->ca_info_callback;
++      void *cb_arg = ca->ca_info_callback_arg;
++      pthread_mutex_unlock(&ca->lock);
++      if (cb) {
++              return cb(cb_arg, slot_id, session_number, ca_id_count,
++                        ids);
++      }
++      return 0;
++}
++
++static int en50221_app_ca_parse_reply(struct en50221_app_ca *ca,
++                                    uint8_t slot_id,
++                                    uint16_t session_number,
++                                    uint8_t * data, uint32_t data_length)
++{
++      // first of all, decode the length field
++      uint16_t asn_data_length;
++      int length_field_len;
++      if ((length_field_len = asn_1_decode(&asn_data_length, data, data_length)) < 0) {
++              print(LOG_LEVEL, ERROR, 1, "ASN.1 decode error\n");
++              return -1;
++      }
++      // check it
++      if (asn_data_length < 4) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      if (asn_data_length > (data_length - length_field_len)) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      data += length_field_len;
++      data_length -= length_field_len;
++
++      // process the reply table to fix endian issues
++      uint32_t pos = 4;
++      bswap16(data);
++      while (pos < asn_data_length) {
++              bswap16(data + pos);
++              pos += 3;
++      }
++
++      // tell the app
++      pthread_mutex_lock(&ca->lock);
++      en50221_app_ca_pmt_reply_callback cb = ca->ca_pmt_reply_callback;
++      void *cb_arg = ca->ca_pmt_reply_callback_arg;
++      pthread_mutex_unlock(&ca->lock);
++      if (cb) {
++              return cb(cb_arg, slot_id, session_number,
++                        (struct en50221_app_pmt_reply *) data,
++                        asn_data_length);
++      }
++      return 0;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_ca.h dvb-apps/lib/libdvben50221/en50221_app_ca.h
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_ca.h  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_app_ca.h        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,264 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 transport layer
++
++    Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++    Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
++    Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#ifndef __EN50221_APPLICATION_ca_H__
++#define __EN50221_APPLICATION_ca_H__
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include <stdlib.h>
++#include <stdint.h>
++#include <libdvben50221/en50221_app_utils.h>
++#include <libucsi/mpeg/pmt_section.h>
++#include <libucsi/dvb/descriptor.h>
++
++#define CA_LIST_MANAGEMENT_MORE     0x00
++#define CA_LIST_MANAGEMENT_FIRST    0x01
++#define CA_LIST_MANAGEMENT_LAST     0x02
++#define CA_LIST_MANAGEMENT_ONLY     0x03
++#define CA_LIST_MANAGEMENT_ADD      0x04
++#define CA_LIST_MANAGEMENT_UPDATE   0x05
++
++#define CA_PMT_CMD_ID_OK_DESCRAMBLING   0x01
++#define CA_PMT_CMD_ID_OK_MMI            0x02
++#define CA_PMT_CMD_ID_QUERY             0x03
++#define CA_PMT_CMD_ID_NOT_SELECTED      0x04
++
++#define CA_ENABLE_DESCRAMBLING_POSSIBLE                     0x01
++#define CA_ENABLE_DESCRAMBLING_POSSIBLE_PURCHASE            0x02
++#define CA_ENABLE_DESCRAMBLING_POSSIBLE_TECHNICAL           0x03
++#define CA_ENABLE_DESCRAMBLING_NOT_POSSIBLE_NO_ENTITLEMENT  0x71
++#define CA_ENABLE_DESCRAMBLING_NOT_POSSIBLE_TECHNICAL       0x73
++
++
++#define EN50221_APP_CA_RESOURCEID MKRID(3,1,1)
++
++/**
++ * PMT reply structure.
++ */
++struct en50221_app_pmt_reply {
++      uint16_t program_number;
++      EBIT3(uint8_t reserved_1                : 2;,
++            uint8_t version_number            : 5;,
++            uint8_t current_next_indicator    : 1;);
++      EBIT2(uint8_t CA_enable_flag            : 1;,
++            uint8_t CA_enable                 : 7;);
++      /* struct en50221_app_pmt_stream streams[] */
++} __attribute__ ((packed));
++
++/**
++ * A stream within a pmt reply structure.
++ */
++struct en50221_app_pmt_stream {
++      EBIT2(uint16_t reserved_1               : 3;,
++            uint16_t es_pid                   :13;);
++      EBIT2(uint8_t CA_enable_flag            : 1;,
++            uint8_t CA_enable                 : 7;);
++} __attribute__ ((packed));
++
++/**
++ * Convenience iterator for the streams field of the en50221_app_pmt_reply structure.
++ *
++ * @param pmt Pointer to the en50221_app_pmt_reply structure.
++ * @param pos Variable holding a pointer to the current en50221_app_pmt_stream.
++ * @param size Total size of the PMT reply.
++ */
++#define en50221_app_pmt_reply_streams_for_each(pmt, pos, size) \
++    for ((pos) = en50221_app_pmt_reply_streams_first(pmt, size); \
++         (pos); \
++         (pos) = en50221_app_pmt_reply_streams_next(pmt, pos, size))
++
++
++/**
++ * Type definition for command - called when we receive a ca info response.
++ *
++ * @param arg Private argument.
++ * @param slot_id Slot id concerned.
++ * @param session_number Session number concerned.
++ * @param ca_id_count Number of ca_system_ids.
++ * @param ca_ids Pointer to list of ca_system_ids.
++ * @return 0 on success, -1 on failure.
++ */
++typedef int (*en50221_app_ca_info_callback) (void *arg,
++                                           uint8_t slot_id,
++                                           uint16_t session_number,
++                                           uint32_t ca_id_count,
++                                           uint16_t * ca_ids);
++
++/**
++ * Type definition for pmt_reply - called when we receive a pmt_reply.
++ *
++ * @param arg Private argument.
++ * @param slot_id Slot id concerned.
++ * @param session_number Session number concerned.
++ * @param reply Pointer to a struct en50221_app_pmt_reply.
++ * @param reply_size Total size of the struct en50221_app_pmt_reply in bytes.
++ * @return 0 on success, -1 on failure.
++ */
++typedef int (*en50221_app_ca_pmt_reply_callback) (void *arg,
++                                                uint8_t slot_id,
++                                                uint16_t session_number,
++                                                struct en50221_app_pmt_reply *reply,
++                                                uint32_t reply_size);
++
++/**
++ * Opaque type representing a ca resource.
++ */
++struct en50221_app_ca;
++
++/**
++ * Create an instance of the ca resource.
++ *
++ * @param funcs Send functions to use.
++ * @return Instance, or NULL on failure.
++ */
++extern struct en50221_app_ca *en50221_app_ca_create(struct en50221_app_send_functions *funcs);
++
++/**
++ * Destroy an instance of the ca resource.
++ *
++ * @param ca Instance to destroy.
++ */
++extern void en50221_app_ca_destroy(struct en50221_app_ca *ca);
++
++/**
++ * Register the callback for when we receive a ca info.
++ *
++ * @param ca ca resource instance.
++ * @param callback The callback. Set to NULL to remove the callback completely.
++ * @param arg Private data passed as arg0 of the callback.
++ */
++extern void en50221_app_ca_register_info_callback(struct en50221_app_ca *ca,
++                                                en50221_app_ca_info_callback callback,
++                                                void *arg);
++
++/**
++ * Register the callback for when we receive a pmt_reply.
++ *
++ * @param ca ca resource instance.
++ * @param callback The callback. Set to NULL to remove the callback completely.
++ * @param arg Private data passed as arg0 of the callback.
++ */
++extern void en50221_app_ca_register_pmt_reply_callback(struct en50221_app_ca *ca,
++                                                     en50221_app_ca_pmt_reply_callback callback,
++                                                     void *arg);
++
++/**
++ * Send a ca_info_req to the CAM.
++ *
++ * @param ca ca resource instance.
++ * @param session_number Session number to send it on.
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_ca_info_enq(struct en50221_app_ca *ca,
++                                 uint16_t session_number);
++
++/**
++ * Send a ca_pmt structure to the CAM.
++ *
++ * @param ca ca resource instance.
++ * @param session_number Session number to send it on.
++ * @param ca_pmt A ca_pmt structure formatted with the en50221_ca_format_pmt() function.
++ * @param ca_pmt_length Length of ca_pmt structure in bytes.
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_ca_pmt(struct en50221_app_ca *ca,
++                            uint16_t session_number,
++                            uint8_t * ca_pmt,
++                            uint32_t ca_pmt_length);
++
++/**
++ * Transform a libucsi PMT into a binary structure for sending to a CAM.
++ *
++ * @param pmt The source PMT structure.
++ * @param data Pointer to data buffer to write it to.
++ * @param data_length Number of bytes available in data buffer.
++ * @param move_ca_descriptors If non-zero, will attempt to move CA descriptors
++ * in order to reduce the size of the formatted CAPMT.
++ * @param ca_pmt_list_management One of the CA_LIST_MANAGEMENT_*.
++ * @param ca_pmt_cmd_id One of the CA_PMT_CMD_ID_*.
++ * @return Number of bytes used, or -1 on error.
++ */
++extern int en50221_ca_format_pmt(struct mpeg_pmt_section *pmt,
++                               uint8_t * data,
++                               uint32_t data_length,
++                               int move_ca_descriptors,
++                               uint8_t ca_pmt_list_management,
++                               uint8_t ca_pmt_cmd_id);
++
++/**
++ * Pass data received for this resource into it for parsing.
++ *
++ * @param ca CA instance.
++ * @param slot_id Slot ID concerned.
++ * @param session_number Session number concerned.
++ * @param resource_id Resource ID concerned.
++ * @param data The data.
++ * @param data_length Length of data in bytes.
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_ca_message(struct en50221_app_ca *ca,
++                                uint8_t slot_id,
++                                uint16_t session_number,
++                                uint32_t resource_id,
++                                uint8_t *data,
++                                uint32_t data_length);
++
++
++
++
++static inline struct en50221_app_pmt_stream *
++      en50221_app_pmt_reply_streams_first(struct en50221_app_pmt_reply *reply,
++                                          uint32_t reply_size)
++{
++      uint32_t pos = sizeof(struct en50221_app_pmt_reply);
++
++      if (pos >= reply_size)
++              return NULL;
++
++      return (struct en50221_app_pmt_stream *) ((uint8_t *) reply + pos);
++}
++
++static inline struct en50221_app_pmt_stream *
++      en50221_app_pmt_reply_streams_next(struct en50221_app_pmt_reply *reply,
++                                         struct en50221_app_pmt_stream *pos,
++                                         uint32_t reply_size)
++{
++      uint8_t *end = (uint8_t *) reply + reply_size;
++      uint8_t *next =
++              (uint8_t *) pos +
++              sizeof(struct en50221_app_pmt_stream);
++
++      if (next >= end)
++              return NULL;
++
++      return (struct en50221_app_pmt_stream *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_datetime.c dvb-apps/lib/libdvben50221/en50221_app_datetime.c
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_datetime.c    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_app_datetime.c  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,173 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 transport layer
++
++    Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++    Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
++    Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#include <string.h>
++#include <libdvbmisc/dvbmisc.h>
++#include <pthread.h>
++#include <libucsi/dvb/types.h>
++#include "en50221_app_datetime.h"
++#include "en50221_app_tags.h"
++#include "asn_1.h"
++
++struct en50221_app_datetime {
++      struct en50221_app_send_functions *funcs;
++
++      en50221_app_datetime_enquiry_callback callback;
++      void *callback_arg;
++
++      pthread_mutex_t lock;
++};
++
++static int en50221_app_datetime_parse_enquiry(struct en50221_app_datetime *datetime,
++                                            uint8_t slot_id,
++                                            uint16_t session_number,
++                                            uint8_t * data,
++                                            uint32_t data_length);
++
++
++
++struct en50221_app_datetime *en50221_app_datetime_create(struct en50221_app_send_functions *funcs)
++{
++      struct en50221_app_datetime *datetime = NULL;
++
++      // create structure and set it up
++      datetime = malloc(sizeof(struct en50221_app_datetime));
++      if (datetime == NULL) {
++              return NULL;
++      }
++      datetime->funcs = funcs;
++      datetime->callback = NULL;
++
++      pthread_mutex_init(&datetime->lock, NULL);
++
++      // done
++      return datetime;
++}
++
++void en50221_app_datetime_destroy(struct en50221_app_datetime *datetime)
++{
++      pthread_mutex_destroy(&datetime->lock);
++      free(datetime);
++}
++
++void en50221_app_datetime_register_enquiry_callback(struct en50221_app_datetime *datetime,
++                                                  en50221_app_datetime_enquiry_callback callback,
++                                                  void *arg)
++{
++      pthread_mutex_lock(&datetime->lock);
++      datetime->callback = callback;
++      datetime->callback_arg = arg;
++      pthread_mutex_unlock(&datetime->lock);
++}
++
++int en50221_app_datetime_send(struct en50221_app_datetime *datetime,
++                            uint16_t session_number,
++                            time_t utc_time, int time_offset)
++{
++      uint8_t data[11];
++      int data_length;
++
++      data[0] = (TAG_DATE_TIME >> 16) & 0xFF;
++      data[1] = (TAG_DATE_TIME >> 8) & 0xFF;
++      data[2] = TAG_DATE_TIME & 0xFF;
++      if (time_offset != -1) {
++              data[3] = 7;
++              unixtime_to_dvbdate(utc_time, data + 4);
++              data[9] = time_offset >> 8;
++              data[10] = time_offset;
++              data_length = 11;
++      } else {
++              data[3] = 5;
++              unixtime_to_dvbdate(utc_time, data + 4);
++              data_length = 9;
++      }
++      return datetime->funcs->send_data(datetime->funcs->arg,
++                                        session_number, data,
++                                        data_length);
++}
++
++int en50221_app_datetime_message(struct en50221_app_datetime *datetime,
++                               uint8_t slot_id,
++                               uint16_t session_number,
++                               uint32_t resource_id,
++                               uint8_t * data, uint32_t data_length)
++{
++      (void) resource_id;
++
++      // get the tag
++      if (data_length < 3) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      uint32_t tag = (data[0] << 16) | (data[1] << 8) | data[2];
++
++      switch (tag) {
++      case TAG_DATE_TIME_ENQUIRY:
++              return en50221_app_datetime_parse_enquiry(datetime,
++                                                        slot_id,
++                                                        session_number,
++                                                        data + 3,
++                                                        data_length - 3);
++      }
++
++      print(LOG_LEVEL, ERROR, 1, "Received unexpected tag %x\n", tag);
++      return -1;
++}
++
++
++
++
++
++
++
++
++
++
++static int en50221_app_datetime_parse_enquiry(struct en50221_app_datetime *datetime,
++                                            uint8_t slot_id,
++                                            uint16_t session_number,
++                                            uint8_t * data,
++                                            uint32_t data_length)
++{
++      // validate data
++      if (data_length != 2) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      if (data[0] != 1) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      uint8_t response_interval = data[1];
++
++      // tell the app
++      pthread_mutex_lock(&datetime->lock);
++      en50221_app_datetime_enquiry_callback cb = datetime->callback;
++      void *cb_arg = datetime->callback_arg;
++      pthread_mutex_unlock(&datetime->lock);
++      if (cb) {
++              return cb(cb_arg, slot_id, session_number,
++                        response_interval);
++      }
++      return 0;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_datetime.h dvb-apps/lib/libdvben50221/en50221_app_datetime.h
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_datetime.h    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_app_datetime.h  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,119 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 transport layer
++
++    Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++    Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
++    Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#ifndef __EN50221_APPLICATION_DATETIME_H__
++#define __EN50221_APPLICATION_DATETIME_H__
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include <stdlib.h>
++#include <stdint.h>
++#include <libdvben50221/en50221_app_utils.h>
++
++#define EN50221_APP_DATETIME_RESOURCEID MKRID(36,1,1)
++
++/**
++ * Type definition for enquiry - called when we receive a date/time enquiry from a CAM.
++ *
++ * @param arg Private argument.
++ * @param slot_id Slot id concerned.
++ * @param session_number Session number concerned.
++ * @param response_interval Response interval requested by CAM.
++ * @return 0 on success, -1 on failure.
++ */
++typedef int (*en50221_app_datetime_enquiry_callback) (void *arg,
++                                                    uint8_t slot_id,
++                                                    uint16_t session_number,
++                                                    uint8_t response_interval);
++
++/**
++ * Opaque type representing a datetime resource.
++ */
++struct en50221_app_datetime;
++
++/**
++ * Create an instance of the datetime resource.
++ *
++ * @param funcs Send functions to use.
++ * @return Instance, or NULL on failure.
++ */
++extern struct en50221_app_datetime
++      *en50221_app_datetime_create(struct en50221_app_send_functions *funcs);
++
++/**
++ * Destroy an instance of the datetime resource.
++ *
++ * @param datetime Instance to destroy.
++ */
++extern void en50221_app_datetime_destroy(struct en50221_app_datetime *datetime);
++
++/**
++ * Register the callback for when we receive a enquiry request.
++ *
++ * @param datetime datetime resource instance.
++ * @param callback The callback. Set to NULL to remove the callback completely.
++ * @param arg Private data passed as arg0 of the callback.
++ */
++extern void en50221_app_datetime_register_enquiry_callback(struct en50221_app_datetime *datetime,
++                                                         en50221_app_datetime_enquiry_callback callback,
++                                                         void *arg);
++
++/**
++ * Send the time to the CAM.
++ *
++ * @param datetime datetime resource instance.
++ * @param session_number Session number to send it on.
++ * @param utc_time UTC time in unix time format.
++ * @param time_offset If -1, the field will not be transmitted, otherwise it is the offset between
++ * UTC and local time in minutes.
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_datetime_send(struct en50221_app_datetime *datetime,
++                                   uint16_t session_number,
++                                   time_t utc_time,
++                                   int time_offset);
++
++/**
++ * Pass data received for this resource into it for parsing.
++ *
++ * @param datetime datetime instance.
++ * @param slot_id Slot ID concerned.
++ * @param session_number Session number concerned.
++ * @param resource_id Resource ID concerned.
++ * @param data The data.
++ * @param data_length Length of data in bytes.
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_datetime_message(struct en50221_app_datetime *datetime,
++                                      uint8_t slot_id,
++                                      uint16_t session_number,
++                                      uint32_t resource_id,
++                                      uint8_t *data,
++                                      uint32_t data_length);
++
++#ifdef __cplusplus
++}
++#endif
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_dvb.c dvb-apps/lib/libdvben50221/en50221_app_dvb.c
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_dvb.c 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_app_dvb.c       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,282 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 transport layer
++
++    Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++    Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
++    Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#include <string.h>
++#include <libdvbmisc/dvbmisc.h>
++#include <pthread.h>
++#include "en50221_app_dvb.h"
++#include "en50221_app_tags.h"
++#include "asn_1.h"
++
++struct en50221_app_dvb {
++      struct en50221_app_send_functions *funcs;
++
++      en50221_app_dvb_tune_callback tune_callback;
++      void *tune_callback_arg;
++
++      en50221_app_dvb_replace_callback replace_callback;
++      void *replace_callback_arg;
++
++      en50221_app_dvb_clear_replace_callback clear_replace_callback;
++      void *clear_replace_callback_arg;
++
++      pthread_mutex_t lock;
++};
++
++static int en50221_app_dvb_parse_tune(struct en50221_app_dvb *dvb,
++                                    uint8_t slot_id,
++                                    uint16_t session_number,
++                                    uint8_t * data,
++                                    uint32_t data_length);
++
++static int en50221_app_dvb_parse_replace(struct en50221_app_dvb *dvb,
++                                       uint8_t slot_id,
++                                       uint16_t session_number,
++                                       uint8_t * data,
++                                       uint32_t data_length);
++
++static int en50221_app_dvb_parse_clear_replace(struct en50221_app_dvb *dvb,
++                                             uint8_t slot_id,
++                                             uint16_t session_number,
++                                             uint8_t * data,
++                                             uint32_t data_length);
++
++
++
++struct en50221_app_dvb *en50221_app_dvb_create(struct en50221_app_send_functions *funcs)
++{
++      struct en50221_app_dvb *dvb = NULL;
++
++      // create structure and set it up
++      dvb = malloc(sizeof(struct en50221_app_dvb));
++      if (dvb == NULL) {
++              return NULL;
++      }
++      dvb->funcs = funcs;
++      dvb->tune_callback = NULL;
++      dvb->replace_callback = NULL;
++      dvb->clear_replace_callback = NULL;
++
++      pthread_mutex_init(&dvb->lock, NULL);
++
++      // done
++      return dvb;
++}
++
++void en50221_app_dvb_destroy(struct en50221_app_dvb *dvb)
++{
++      pthread_mutex_destroy(&dvb->lock);
++      free(dvb);
++}
++
++void en50221_app_dvb_register_tune_callback(struct en50221_app_dvb *dvb,
++                                          en50221_app_dvb_tune_callback callback,
++                                          void *arg)
++{
++      pthread_mutex_lock(&dvb->lock);
++      dvb->tune_callback = callback;
++      dvb->tune_callback_arg = arg;
++      pthread_mutex_unlock(&dvb->lock);
++}
++
++void en50221_app_dvb_register_replace_callback(struct en50221_app_dvb *dvb,
++                                             en50221_app_dvb_replace_callback callback,
++                                             void *arg)
++{
++      pthread_mutex_lock(&dvb->lock);
++      dvb->replace_callback = callback;
++      dvb->replace_callback_arg = arg;
++      pthread_mutex_unlock(&dvb->lock);
++}
++
++void en50221_app_dvb_register_clear_replace_callback(struct en50221_app_dvb *dvb,
++                                                   en50221_app_dvb_clear_replace_callback callback,
++                                                   void *arg)
++{
++      pthread_mutex_lock(&dvb->lock);
++      dvb->clear_replace_callback = callback;
++      dvb->clear_replace_callback_arg = arg;
++      pthread_mutex_unlock(&dvb->lock);
++}
++
++int en50221_app_dvb_ask_release(struct en50221_app_dvb *dvb,
++                              uint16_t session_number)
++{
++      uint8_t data[4];
++
++      data[0] = (TAG_ASK_RELEASE >> 16) & 0xFF;
++      data[1] = (TAG_ASK_RELEASE >> 8) & 0xFF;
++      data[2] = TAG_ASK_RELEASE & 0xFF;
++      data[3] = 0;
++
++      return dvb->funcs->send_data(dvb->funcs->arg, session_number, data, 4);
++}
++
++int en50221_app_dvb_message(struct en50221_app_dvb *dvb,
++                          uint8_t slot_id,
++                          uint16_t session_number,
++                          uint32_t resource_id,
++                          uint8_t * data, uint32_t data_length)
++{
++      (void) resource_id;
++
++      // get the tag
++      if (data_length < 3) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      uint32_t tag = (data[0] << 16) | (data[1] << 8) | data[2];
++
++      switch (tag) {
++      case TAG_TUNE:
++              return en50221_app_dvb_parse_tune(dvb, slot_id,
++                                                session_number, data + 3,
++                                                data_length - 3);
++      case TAG_REPLACE:
++              return en50221_app_dvb_parse_replace(dvb, slot_id,
++                                                   session_number,
++                                                   data + 3,
++                                                   data_length - 3);
++      case TAG_CLEAR_REPLACE:
++              return en50221_app_dvb_parse_clear_replace(dvb, slot_id,
++                                                         session_number,
++                                                         data + 3,
++                                                         data_length - 3);
++      }
++
++      print(LOG_LEVEL, ERROR, 1, "Received unexpected tag %x\n", tag);
++      return -1;
++}
++
++
++
++
++
++
++
++
++
++
++static int en50221_app_dvb_parse_tune(struct en50221_app_dvb *dvb,
++                                    uint8_t slot_id,
++                                    uint16_t session_number,
++                                    uint8_t * data, uint32_t data_length)
++{
++      // validate data
++      if (data_length < 9) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      if (data[0] != 8) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      uint8_t *tune_data = data + 1;
++
++      // parse it
++      uint16_t network_id = (tune_data[0] << 8) | tune_data[1];
++      uint16_t original_network_id = (tune_data[2] << 8) | tune_data[3];
++      uint16_t transport_stream_id = (tune_data[4] << 8) | tune_data[5];
++      uint16_t service_id = (tune_data[6] << 8) | tune_data[7];
++
++      // tell the app
++      pthread_mutex_lock(&dvb->lock);
++      en50221_app_dvb_tune_callback cb = dvb->tune_callback;
++      void *cb_arg = dvb->tune_callback_arg;
++      pthread_mutex_unlock(&dvb->lock);
++      if (cb) {
++              return cb(cb_arg, slot_id, session_number, network_id,
++                        original_network_id, transport_stream_id,
++                        service_id);
++      }
++      return 0;
++}
++
++static int en50221_app_dvb_parse_replace(struct en50221_app_dvb *dvb,
++                                       uint8_t slot_id,
++                                       uint16_t session_number,
++                                       uint8_t * data,
++                                       uint32_t data_length)
++{
++      // validate data
++      if (data_length < 6) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      if (data[0] != 5) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      uint8_t *replace_data = data + 1;
++
++      // parse it
++      uint8_t replacement_ref = replace_data[0];
++      uint16_t replace_pid =
++          ((replace_data[1] & 0x1f) << 8) | replace_data[2];
++      uint16_t replacement_pid =
++          ((replace_data[3] & 0x1f) << 8) | replace_data[4];
++
++      // tell the app
++      pthread_mutex_lock(&dvb->lock);
++      en50221_app_dvb_replace_callback cb = dvb->replace_callback;
++      void *cb_arg = dvb->replace_callback_arg;
++      pthread_mutex_unlock(&dvb->lock);
++      if (cb) {
++              return cb(cb_arg, slot_id, session_number, replacement_ref,
++                        replace_pid, replacement_pid);
++      }
++      return 0;
++}
++
++static int en50221_app_dvb_parse_clear_replace(struct en50221_app_dvb *dvb,
++                                             uint8_t slot_id,
++                                             uint16_t session_number,
++                                             uint8_t * data,
++                                             uint32_t data_length)
++{
++      // validate data
++      if (data_length < 2) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      if (data[0] != 1) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      uint8_t *replace_data = data + 1;
++
++      // parse it
++      uint8_t replacement_ref = replace_data[0];
++
++      // tell the app
++      pthread_mutex_lock(&dvb->lock);
++      en50221_app_dvb_clear_replace_callback cb =
++          dvb->clear_replace_callback;
++      void *cb_arg = dvb->clear_replace_callback_arg;
++      pthread_mutex_unlock(&dvb->lock);
++      if (cb) {
++              return cb(cb_arg, slot_id, session_number,
++                        replacement_ref);
++      }
++      return 0;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_dvb.h dvb-apps/lib/libdvben50221/en50221_app_dvb.h
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_dvb.h 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_app_dvb.h       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,176 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 transport layer
++
++    Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++    Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
++    Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#ifndef __EN50221_APPLICATION_DVB_H__
++#define __EN50221_APPLICATION_DVB_H__
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include <stdlib.h>
++#include <stdint.h>
++#include <libdvben50221/en50221_app_utils.h>
++
++#define EN50221_APP_DVB_RESOURCEID MKRID(32,1,1)
++
++
++/**
++ * Type definition for tune - called when we receive a tune request from a CAM.
++ *
++ * @param arg Private argument.
++ * @param slot_id Slot id concerned.
++ * @param session_number Session number concerned.
++ * @param network_id Network id requested by CAM.
++ * @param original_network_id Original Network id requested by CAM.
++ * @param transport_stream_id Transport stream id requested by CAM.
++ * @param service_id Service id requested by CAM.
++ * @return 0 on success, -1 on failure.
++ */
++typedef int (*en50221_app_dvb_tune_callback) (void *arg,
++                                            uint8_t slot_id,
++                                            uint16_t session_number,
++                                            uint16_t network_id,
++                                            uint32_t original_network_id,
++                                            uint16_t transport_stream_id,
++                                            uint16_t service_id);
++
++/**
++ * Type definition for replace - called when we receive a replace request from a CAM.
++ *
++ * @param arg Private argument.
++ * @param slot_id Slot id concerned.
++ * @param session_number Session number concerned.
++ * @param replacement_ref Replacement ref.
++ * @param replaced_pid PID to replace.
++ * @param replacement_pid PID to replace it with.
++ * @return 0 on success, -1 on failure.
++ */
++typedef int (*en50221_app_dvb_replace_callback) (void *arg,
++                                               uint8_t slot_id,
++                                               uint16_t session_number,
++                                               uint8_t replacement_ref,
++                                               uint16_t replaced_pid,
++                                               uint16_t replacement_pid);
++
++
++/**
++ * Type definition for clear_replace - called when we receive a clear_replace request from a CAM.
++ *
++ * @param arg Private argument.
++ * @param slot_id Slot id concerned.
++ * @param session_number Session number concerned.
++ * @param replacement_ref Replacement ref.
++ * @return 0 on success, -1 on failure.
++ */
++typedef int (*en50221_app_dvb_clear_replace_callback) (void *arg,
++                                                     uint8_t slot_id,
++                                                     uint16_t session_number,
++                                                     uint8_t replacement_ref);
++
++
++/**
++ * Opaque type representing a dvb resource.
++ */
++struct en50221_app_dvb;
++
++/**
++ * Create an instance of the dvb resource.
++ *
++ * @param funcs Send functions to use.
++ * @return Instance, or NULL on failure.
++ */
++extern struct en50221_app_dvb *en50221_app_dvb_create(struct en50221_app_send_functions *funcs);
++
++/**
++ * Destroy an instance of the dvb resource.
++ *
++ * @param dvb Instance to destroy.
++ */
++extern void en50221_app_dvb_destroy(struct en50221_app_dvb *dvb);
++
++/**
++ * Register the callback for when we receive a tune request.
++ *
++ * @param dvb DVB resource instance.
++ * @param callback The callback. Set to NULL to remove the callback completely.
++ * @param arg Private data passed as arg0 of the callback.
++ */
++extern void en50221_app_dvb_register_tune_callback(struct en50221_app_dvb *dvb,
++                                                 en50221_app_dvb_tune_callback callback,
++                                                 void *arg);
++
++/**
++ * Register the callback for when we receive a replace request.
++ *
++ * @param dvb DVB resource instance.
++ * @param callback The callback. Set to NULL to remove the callback completely.
++ * @param arg Private data passed as arg0 of the callback.
++ */
++extern void en50221_app_dvb_register_replace_callback(struct en50221_app_dvb *dvb,
++                                                    en50221_app_dvb_replace_callback callback,
++                                                    void *arg);
++
++/**
++ * Register the callback for when we receive a clear replace request.
++ *
++ * @param dvb DVB resource instance.
++ * @param callback The callback. Set to NULL to remove the callback completely.
++ * @param arg Private data passed as arg0 of the callback.
++ */
++extern void en50221_app_dvb_register_clear_replace_callback(struct en50221_app_dvb *dvb,
++                                                          en50221_app_dvb_clear_replace_callback callback,
++                                                          void *arg);
++
++/**
++ * Send an ask release request to the CAM.
++ *
++ * @param dvb DVB resource instance.
++ * @param session_number Session number to send it on.
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_dvb_ask_release(struct en50221_app_dvb *dvb,
++                                     uint16_t session_number);
++
++/**
++ * Pass data received for this resource into it for parsing.
++ *
++ * @param dvb dvb instance.
++ * @param slot_id Slot ID concerned.
++ * @param session_number Session number concerned.
++ * @param resource_id Resource ID concerned.
++ * @param data The data.
++ * @param data_length Length of data in bytes.
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_dvb_message(struct en50221_app_dvb *dvb,
++                                 uint8_t slot_id,
++                                 uint16_t session_number,
++                                 uint32_t resource_id,
++                                 uint8_t *data,
++                                 uint32_t data_length);
++
++#ifdef __cplusplus
++}
++#endif
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_epg.c dvb-apps/lib/libdvben50221/en50221_app_epg.c
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_epg.c 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_app_epg.c       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,167 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 transport layer
++
++    Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++    Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
++    Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#include <string.h>
++#include <libdvbmisc/dvbmisc.h>
++#include <pthread.h>
++#include <libucsi/dvb/types.h>
++#include "en50221_app_epg.h"
++#include "en50221_app_tags.h"
++#include "asn_1.h"
++
++struct en50221_app_epg {
++      struct en50221_app_send_functions *funcs;
++
++      en50221_app_epg_reply_callback callback;
++      void *callback_arg;
++
++      pthread_mutex_t lock;
++};
++
++static int en50221_app_epg_parse_reply(struct en50221_app_epg *private,
++                                     uint8_t slot_id,
++                                     uint16_t session_number,
++                                     uint8_t * data,
++                                     uint32_t data_length);
++
++
++
++struct en50221_app_epg *en50221_app_epg_create(struct en50221_app_send_functions *funcs)
++{
++      struct en50221_app_epg *epg = NULL;
++
++      // create structure and set it up
++      epg = malloc(sizeof(struct en50221_app_epg));
++      if (epg == NULL) {
++              return NULL;
++      }
++      epg->funcs = funcs;
++      epg->callback = NULL;
++
++      pthread_mutex_init(&epg->lock, NULL);
++
++      // done
++      return epg;
++}
++
++void en50221_app_epg_destroy(struct en50221_app_epg *epg)
++{
++      pthread_mutex_destroy(&epg->lock);
++      free(epg);
++}
++
++void en50221_app_epg_register_enquiry_callback(struct en50221_app_epg *epg,
++                                             en50221_app_epg_reply_callback callback,
++                                             void *arg)
++{
++      pthread_mutex_lock(&epg->lock);
++      epg->callback = callback;
++      epg->callback_arg = arg;
++      pthread_mutex_unlock(&epg->lock);
++}
++
++int en50221_app_epg_enquire(struct en50221_app_epg *epg,
++                          uint16_t session_number,
++                          uint8_t command_id,
++                          uint16_t network_id,
++                          uint16_t original_network_id,
++                          uint16_t transport_stream_id,
++                          uint16_t service_id, uint16_t event_id)
++{
++      uint8_t data[15];
++
++      data[0] = (TAG_EPG_ENQUIRY >> 16) & 0xFF;
++      data[1] = (TAG_EPG_ENQUIRY >> 8) & 0xFF;
++      data[2] = TAG_EPG_ENQUIRY & 0xFF;
++      data[3] = 11;
++      data[4] = command_id;
++      data[5] = network_id >> 8;
++      data[6] = network_id;
++      data[7] = original_network_id >> 8;
++      data[8] = original_network_id;
++      data[9] = transport_stream_id >> 8;
++      data[10] = transport_stream_id;
++      data[11] = service_id >> 8;
++      data[12] = service_id;
++      data[13] = event_id >> 8;
++      data[14] = event_id;
++      return epg->funcs->send_data(epg->funcs->arg, session_number, data, 15);
++}
++
++int en50221_app_epg_message(struct en50221_app_epg *epg,
++                          uint8_t slot_id,
++                          uint16_t session_number,
++                          uint32_t resource_id,
++                          uint8_t * data, uint32_t data_length)
++{
++      struct en50221_app_epg *private = (struct en50221_app_epg *) epg;
++      (void) resource_id;
++
++      // get the tag
++      if (data_length < 3) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      uint32_t tag = (data[0] << 16) | (data[1] << 8) | data[2];
++
++      switch (tag) {
++      case TAG_EPG_REPLY:
++              return en50221_app_epg_parse_reply(private, slot_id,
++                                                 session_number,
++                                                 data + 3,
++                                                 data_length - 3);
++      }
++
++      print(LOG_LEVEL, ERROR, 1, "Received unexpected tag %x\n", tag);
++      return -1;
++}
++
++
++
++static int en50221_app_epg_parse_reply(struct en50221_app_epg *epg,
++                                     uint8_t slot_id,
++                                     uint16_t session_number,
++                                     uint8_t * data,
++                                     uint32_t data_length)
++{
++      // validate data
++      if (data_length != 2) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      if (data[0] != 1) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      uint8_t event_status = data[1];
++
++      // tell the app
++      pthread_mutex_lock(&epg->lock);
++      en50221_app_epg_reply_callback cb = epg->callback;
++      void *cb_arg = epg->callback_arg;
++      pthread_mutex_unlock(&epg->lock);
++      if (cb) {
++              return cb(cb_arg, slot_id, session_number, event_status);
++      }
++      return 0;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_epg.h dvb-apps/lib/libdvben50221/en50221_app_epg.h
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_epg.h 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_app_epg.h       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,138 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 transport layer
++
++    Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++    Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
++    Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#ifndef __EN50221_APPLICATION_epg_H__
++#define __EN50221_APPLICATION_epg_H__
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include <stdlib.h>
++#include <stdint.h>
++#include <libdvben50221/en50221_app_utils.h>
++
++#define EPG_COMMAND_ID_MMI                          0x02
++#define EPG_COMMAND_ID_QUERY                        0x03
++
++#define EPG_EVENTSTATUS_ENTITLEMENT_UNKNOWN         0x00
++#define EPG_EVENTSTATUS_ENTITLEMENT_AVAILABLE       0x01
++#define EPG_EVENTSTATUS_ENTITLEMENT_NOT_AVAILABLE   0x02
++#define EPG_EVENTSTATUS_MMI_DIALOGUE_REQUIRED       0x03
++#define EPG_EVENTSTATUS_MMI_COMPLETE_UNKNOWN        0x04
++#define EPG_EVENTSTATUS_MMI_COMPLETE_AVAILABLE      0x05
++#define EPG_EVENTSTATUS_MMI_COMPLETE_NOT_AVAILABLE  0x06
++
++#define EN50221_APP_EPG_RESOURCEID(INSTANCE_NUM) MKRID(120,(INSTANCE_NUM),1)
++
++
++
++/**
++ * Type definition for reply - called when we receive an EPG reply from a CAM.
++ *
++ * @param arg Private argument.
++ * @param slot_id Slot id concerned.
++ * @param session_number Session number concerned.
++ * @param event_status One of the EPG_EVENTSTATUS_* values.
++ * @return 0 on success, -1 on failure.
++ */
++typedef int (*en50221_app_epg_reply_callback) (void *arg,
++                                             uint8_t slot_id,
++                                             uint16_t session_number,
++                                             uint8_t event_status);
++
++/**
++ * Opaque type representing a epg resource.
++ */
++struct en50221_app_epg;
++
++/**
++ * Create an instance of the epg resource.
++ *
++ * @param funcs Send functions to use.
++ * @return Instance, or NULL on failure.
++ */
++extern struct en50221_app_epg *en50221_app_epg_create(struct en50221_app_send_functions *funcs);
++
++/**
++ * Destroy an instance of the epg resource.
++ *
++ * @param epg Instance to destroy.
++ */
++extern void en50221_app_epg_destroy(struct en50221_app_epg *epg);
++
++/**
++ * Register the callback for when we receive a enquiry response.
++ *
++ * @param epg epg resource instance.
++ * @param callback The callback. Set to NULL to remove the callback completely.
++ * @param arg Private data passed as arg0 of the callback.
++ */
++extern void en50221_app_epg_register_reply_callback(struct en50221_app_epg *epg,
++                                                  en50221_app_epg_reply_callback callback,
++                                                  void *arg);
++
++/**
++ * Enquire about the entitlement status for an EPG entry.
++ *
++ * @param epg epg resource instance.
++ * @param session_number Session number to send it on.
++ * @param command_id One of the EPG_COMMAND_ID_* fields.
++ * @param network_id Network ID concerned.
++ * @param original_network_id Original network ID concerned.
++ * @param transport_stream_id Transport stream ID concerned.
++ * @param service_id Service ID concerned.
++ * @param event_id Event ID concerned.
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_epg_enquire(struct en50221_app_epg *epg,
++                                 uint16_t session_number,
++                                 uint8_t command_id,
++                                 uint16_t network_id,
++                                 uint16_t original_network_id,
++                                 uint16_t transport_stream_id,
++                                 uint16_t service_id,
++                                 uint16_t event_id);
++
++/**
++ * Pass data received for this resource into it for parsing.
++ *
++ * @param epg epg instance.
++ * @param slot_id Slot ID concerned.
++ * @param session_number Session number concerned.
++ * @param resource_id Resource ID concerned.
++ * @param data The data.
++ * @param data_length Length of data in bytes.
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_epg_message(struct en50221_app_epg *epg,
++                                 uint8_t slot_id,
++                                 uint16_t session_number,
++                                 uint32_t resource_id,
++                                 uint8_t *data,
++                                 uint32_t data_length);
++
++#ifdef __cplusplus
++}
++#endif
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_lowspeed.c dvb-apps/lib/libdvben50221/en50221_app_lowspeed.c
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_lowspeed.c    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_app_lowspeed.c  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,533 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 transport layer
++
++    Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++    Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
++    Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#include <string.h>
++#include <libdvbmisc/dvbmisc.h>
++#include <pthread.h>
++#include "en50221_app_lowspeed.h"
++#include "en50221_app_tags.h"
++#include "asn_1.h"
++
++struct en50221_app_lowspeed_session {
++      uint16_t session_number;
++      uint8_t *block_chain;
++      uint32_t block_length;
++
++      struct en50221_app_lowspeed_session *next;
++};
++
++struct en50221_app_lowspeed {
++      struct en50221_app_send_functions *funcs;
++
++      en50221_app_lowspeed_command_callback command_callback;
++      void *command_callback_arg;
++
++      en50221_app_lowspeed_send_callback send_callback;
++      void *send_callback_arg;
++
++      struct en50221_app_lowspeed_session *sessions;
++
++      pthread_mutex_t lock;
++};
++
++static int en50221_app_lowspeed_parse_connect_on_channel(struct en50221_app_lowspeed_command *command,
++                                                       uint8_t *data,
++                                                       int data_length);
++static int en50221_app_lowspeed_parse_command(struct en50221_app_lowspeed *lowspeed,
++                                            uint8_t slot_id,
++                                            uint16_t session_number,
++                                            uint8_t *data,
++                                            uint32_t data_length);
++static int en50221_app_lowspeed_parse_send(struct en50221_app_lowspeed *lowspeed,
++                                         uint8_t slot_id,
++                                         uint16_t session_number,
++                                         int more_last,
++                                         uint8_t *data,
++                                         uint32_t data_length);
++
++
++
++struct en50221_app_lowspeed *en50221_app_lowspeed_create(struct en50221_app_send_functions *funcs)
++{
++      struct en50221_app_lowspeed *lowspeed = NULL;
++
++      // create structure and set it up
++      lowspeed = malloc(sizeof(struct en50221_app_lowspeed));
++      if (lowspeed == NULL) {
++              return NULL;
++      }
++      lowspeed->funcs = funcs;
++      lowspeed->command_callback = NULL;
++      lowspeed->send_callback = NULL;
++      lowspeed->sessions = NULL;
++
++      pthread_mutex_init(&lowspeed->lock, NULL);
++
++      // done
++      return lowspeed;
++}
++
++void en50221_app_lowspeed_destroy(struct en50221_app_lowspeed *lowspeed)
++{
++      struct en50221_app_lowspeed_session *cur_s = lowspeed->sessions;
++      while (cur_s) {
++              struct en50221_app_lowspeed_session *next = cur_s->next;
++              if (cur_s->block_chain)
++                      free(cur_s->block_chain);
++              free(cur_s);
++              cur_s = next;
++      }
++
++      pthread_mutex_destroy(&lowspeed->lock);
++      free(lowspeed);
++}
++
++void en50221_app_lowspeed_clear_session(struct en50221_app_lowspeed *lowspeed,
++                                      uint16_t session_number)
++{
++      pthread_mutex_lock(&lowspeed->lock);
++      struct en50221_app_lowspeed_session *cur_s = lowspeed->sessions;
++      struct en50221_app_lowspeed_session *prev_s = NULL;
++      while (cur_s) {
++              if (cur_s->session_number == session_number) {
++                      if (cur_s->block_chain)
++                              free(cur_s->block_chain);
++                      if (prev_s) {
++                              prev_s->next = cur_s->next;
++                      } else {
++                              lowspeed->sessions = cur_s->next;
++                      }
++                      free(cur_s);
++                      return;
++              }
++
++              prev_s = cur_s;
++              cur_s = cur_s->next;
++      }
++      pthread_mutex_unlock(&lowspeed->lock);
++}
++
++void en50221_app_lowspeed_register_command_callback(struct en50221_app_lowspeed *lowspeed,
++                                                  en50221_app_lowspeed_command_callback callback,
++                                                  void *arg)
++{
++      pthread_mutex_lock(&lowspeed->lock);
++      lowspeed->command_callback = callback;
++      lowspeed->command_callback_arg = arg;
++      pthread_mutex_unlock(&lowspeed->lock);
++}
++
++void en50221_app_lowspeed_register_send_callback(struct en50221_app_lowspeed *lowspeed,
++                                               en50221_app_lowspeed_send_callback callback,
++                                               void *arg)
++{
++      pthread_mutex_lock(&lowspeed->lock);
++      lowspeed->send_callback = callback;
++      lowspeed->send_callback_arg = arg;
++      pthread_mutex_unlock(&lowspeed->lock);
++}
++
++int en50221_app_lowspeed_send_comms_reply(struct en50221_app_lowspeed *lowspeed,
++                                        uint16_t session_number,
++                                        uint8_t comms_reply_id,
++                                        uint8_t return_value)
++{
++      uint8_t data[6];
++
++      data[0] = (TAG_COMMS_REPLY >> 16) & 0xFF;
++      data[1] = (TAG_COMMS_REPLY >> 8) & 0xFF;
++      data[2] = TAG_COMMS_REPLY & 0xFF;
++      data[3] = 2;
++      data[4] = comms_reply_id;
++      data[5] = return_value;
++      return lowspeed->funcs->send_data(lowspeed->funcs->arg,
++                                        session_number, data, 6);
++}
++
++int en50221_app_lowspeed_send_comms_data(struct en50221_app_lowspeed *lowspeed,
++                                       uint16_t session_number,
++                                       uint8_t phase_id,
++                                       uint32_t tx_data_length,
++                                       uint8_t * tx_data)
++{
++      uint8_t buf[10];
++
++      // the spec defines this limit
++      if (tx_data_length > 254) {
++              return -1;
++      }
++      // set up the tag
++      buf[0] = (TAG_COMMS_RECV_LAST >> 16) & 0xFF;
++      buf[1] = (TAG_COMMS_RECV_LAST >> 8) & 0xFF;
++      buf[2] = TAG_COMMS_RECV_LAST & 0xFF;
++
++      // encode the length field
++      int length_field_len;
++      if ((length_field_len = asn_1_encode(tx_data_length + 1, buf + 3, 3)) < 0) {
++              return -1;
++      }
++      // the phase_id
++      buf[3 + length_field_len] = phase_id;
++
++      // build the iovecs
++      struct iovec iov[2];
++      iov[0].iov_base = buf;
++      iov[0].iov_len = 3 + length_field_len + 1;
++      iov[1].iov_base = tx_data;
++      iov[1].iov_len = tx_data_length;
++
++      // create the data and send it
++      return lowspeed->funcs->send_datav(lowspeed->funcs->arg,
++                                         session_number, iov, 2);
++}
++
++int en50221_app_lowspeed_message(struct en50221_app_lowspeed *lowspeed,
++                               uint8_t slot_id,
++                               uint16_t session_number,
++                               uint32_t resource_id,
++                               uint8_t * data, uint32_t data_length)
++{
++      (void) resource_id;
++
++      // get the tag
++      if (data_length < 3) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      uint32_t tag = (data[0] << 16) | (data[1] << 8) | data[2];
++
++      switch (tag) {
++      case TAG_COMMS_COMMAND:
++              return en50221_app_lowspeed_parse_command(lowspeed,
++                                                        slot_id,
++                                                        session_number,
++                                                        data + 3,
++                                                        data_length - 3);
++      case TAG_COMMS_SEND_LAST:
++              return en50221_app_lowspeed_parse_send(lowspeed, slot_id,
++                                                     session_number, 1,
++                                                     data + 3,
++                                                     data_length - 3);
++      case TAG_COMMS_SEND_MORE:
++              return en50221_app_lowspeed_parse_send(lowspeed, slot_id,
++                                                     session_number, 0,
++                                                     data + 3,
++                                                     data_length - 3);
++      }
++
++      print(LOG_LEVEL, ERROR, 1, "Received unexpected tag %x\n", tag);
++      return -1;
++}
++
++
++
++static int en50221_app_lowspeed_parse_connect_on_channel(struct en50221_app_lowspeed_command *command,
++                                                       uint8_t *data,
++                                                       int data_length)
++{
++      if (data_length < 3) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      // check the tag
++      uint32_t tag = (data[0] << 16) | (data[1] << 8) | data[2];
++      if (tag != TAG_CONNECTION_DESCRIPTOR) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received bad CONNECT_ON_CHANNEL\n");
++              return -1;
++      }
++      data += 3;
++      data_length -= 3;
++
++      // parse the descriptor-length-field
++      uint16_t asn_data_length;
++      int length_field_len;
++      if ((length_field_len = asn_1_decode(&asn_data_length, data, data_length)) < 0) {
++              print(LOG_LEVEL, ERROR, 1, "ASN.1 decode error\n");
++              return -1;
++      }
++      data += length_field_len;
++      data_length -= length_field_len;
++
++      // check length field
++      if (asn_data_length > data_length) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      if (asn_data_length < 1) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      // get the descriptor type
++      command->u.connect_on_channel.descriptor_type = data[0];
++      data++;
++      data_length--;
++      asn_data_length--;
++
++      // deal with the descriptor itself
++      switch (command->u.connect_on_channel.descriptor_type) {
++      case CONNECTION_DESCRIPTOR_TYPE_TELEPHONE:
++      {
++              // get the raw descriptor and validate length
++              struct descriptor *d = (struct descriptor *) data;
++              if (asn_data_length < 2) {
++                      print(LOG_LEVEL, ERROR, 1,
++                              "Received short data\n");
++                      return -1;
++              }
++              if (asn_data_length != (2 + d->len)) {
++                      print(LOG_LEVEL, ERROR, 1,
++                              "Received short data\n");
++                      return -1;
++              }
++              if (d->tag != dtag_dvb_telephone) {
++                      print(LOG_LEVEL, ERROR, 1,
++                              "Received invalid telephone descriptor\n");
++                      return -1;
++              }
++              // parse the telephone descriptor
++              command->u.connect_on_channel.descriptor.telephone = dvb_telephone_descriptor_codec(d);
++              if (command->u.connect_on_channel.descriptor.telephone == NULL) {
++                      print(LOG_LEVEL, ERROR, 1,
++                              "Received invalid telephone descriptor\n");
++                      return -1;
++              }
++              data += 2 + d->len;
++              data_length -= 2 + d->len;
++              break;
++      }
++
++      case CONNECTION_DESCRIPTOR_TYPE_CABLE:
++              if (asn_data_length != 1) {
++                      print(LOG_LEVEL, ERROR, 1,
++                            "Received short data\n");
++                      return -1;
++              }
++              command->u.connect_on_channel.descriptor.cable_channel_id = data[0];
++              data++;
++              data_length--;
++              break;
++      default:
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received unknown connection descriptor %02x\n",
++                    command->u.connect_on_channel.descriptor_type);
++              return -1;
++      }
++
++      // parse the last bit
++      if (data_length != 2) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      command->u.connect_on_channel.retry_count = data[0];
++      command->u.connect_on_channel.timeout = data[1];
++
++      // ok
++      return 0;
++}
++
++static int en50221_app_lowspeed_parse_command(struct en50221_app_lowspeed *lowspeed,
++                                            uint8_t slot_id,
++                                            uint16_t session_number,
++                                            uint8_t * data,
++                                            uint32_t data_length)
++{
++      // first of all, decode the length field
++      uint16_t asn_data_length;
++      int length_field_len;
++      if ((length_field_len = asn_1_decode(&asn_data_length, data, data_length)) < 0) {
++              print(LOG_LEVEL, ERROR, 1, "ASN.1 decode error\n");
++              return -1;
++      }
++      // check it
++      if (asn_data_length < 1) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      if (asn_data_length > (data_length - length_field_len)) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      data += length_field_len;
++
++      // get command id
++      uint8_t command_id = data[0];
++      data++;
++      asn_data_length--;
++
++      // parse the command
++      struct en50221_app_lowspeed_command command;
++      switch (command_id) {
++      case COMMS_COMMAND_ID_CONNECT_ON_CHANNEL:
++              if (en50221_app_lowspeed_parse_connect_on_channel
++                  (&command, data, asn_data_length)) {
++                      return -1;
++              }
++              break;
++      case COMMS_COMMAND_ID_SET_PARAMS:
++              if (asn_data_length != 2) {
++                      print(LOG_LEVEL, ERROR, 1,
++                            "Received short data\n");
++                      return -1;
++              }
++              command.u.set_params.buffer_size = data[0];
++              command.u.set_params.timeout = data[1];
++              break;
++      case COMMS_COMMAND_ID_GET_NEXT_BUFFER:
++              if (asn_data_length != 1) {
++                      print(LOG_LEVEL, ERROR, 1,
++                            "Received short data\n");
++                      return -1;
++              }
++              command.u.get_next_buffer.phase_id = data[0];
++              break;
++
++      case COMMS_COMMAND_ID_DISCONNECT_ON_CHANNEL:
++      case COMMS_COMMAND_ID_ENQUIRE_STATUS:
++              break;
++
++      default:
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received unexpected command_id %02x\n", command_id);
++              return -1;
++      }
++
++      // tell the app
++      pthread_mutex_lock(&lowspeed->lock);
++      en50221_app_lowspeed_command_callback cb = lowspeed->command_callback;
++      void *cb_arg = lowspeed->command_callback_arg;
++      pthread_mutex_unlock(&lowspeed->lock);
++      if (cb) {
++              return cb(cb_arg, slot_id, session_number, command_id,
++                        &command);
++      }
++      return 0;
++}
++
++static int en50221_app_lowspeed_parse_send(struct en50221_app_lowspeed *lowspeed,
++                                         uint8_t slot_id,
++                                         uint16_t session_number,
++                                         int more_last,
++                                         uint8_t *data,
++                                         uint32_t data_length)
++{
++      // first of all, decode the length field
++      uint16_t asn_data_length;
++      int length_field_len;
++      if ((length_field_len = asn_1_decode(&asn_data_length, data, data_length)) < 0) {
++              print(LOG_LEVEL, ERROR, 1, "ASN.1 decode error\n");
++              return -1;
++      }
++      // check it
++      if (asn_data_length > (data_length - length_field_len)) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      // skip over the length field
++      data += length_field_len;
++
++      // find previous session
++      pthread_mutex_lock(&lowspeed->lock);
++      struct en50221_app_lowspeed_session *cur_s = lowspeed->sessions;
++      while (cur_s) {
++              if (cur_s->session_number == session_number)
++                      break;
++              cur_s = cur_s->next;
++      }
++
++      // more data is still to come
++      if (!more_last) {
++              // if there was no previous session, create one
++              if (cur_s == NULL) {
++                      cur_s = malloc(sizeof(struct en50221_app_lowspeed_session));
++                      if (cur_s == NULL) {
++                              print(LOG_LEVEL, ERROR, 1,
++                                    "Ran out of memory\n");
++                              pthread_mutex_unlock(&lowspeed->lock);
++                              return -1;
++                      }
++                      cur_s->session_number = session_number;
++                      cur_s->block_chain = NULL;
++                      cur_s->block_length = 0;
++                      cur_s->next = lowspeed->sessions;
++                      lowspeed->sessions = cur_s;
++              }
++              // append the data
++              uint8_t *new_data = realloc(cur_s->block_chain,
++                                          cur_s->block_length + asn_data_length);
++              if (new_data == NULL) {
++                      print(LOG_LEVEL, ERROR, 1, "Ran out of memory\n");
++                      pthread_mutex_unlock(&lowspeed->lock);
++                      return -1;
++              }
++              memcpy(new_data + cur_s->block_length, data, asn_data_length);
++              cur_s->block_chain = new_data;
++              cur_s->block_length += asn_data_length;
++
++              // done
++              pthread_mutex_unlock(&lowspeed->lock);
++              return 0;
++      }
++      // we hit the last of a possible chain of fragments
++      int do_free = 0;
++      if (cur_s != NULL) {
++              // we have a preceding fragment - need to append
++              uint8_t *new_data = realloc(cur_s->block_chain,
++                                          cur_s->block_length + asn_data_length);
++              if (new_data == NULL) {
++                      print(LOG_LEVEL, ERROR, 1, "Ran out of memory\n");
++                      pthread_mutex_unlock(&lowspeed->lock);
++                      return -1;
++              }
++              memcpy(new_data + cur_s->block_length, data, asn_data_length);
++              asn_data_length = cur_s->block_length + asn_data_length;
++              data = new_data;
++              cur_s->block_chain = NULL;
++              cur_s->block_length = 0;
++              do_free = 1;
++      }
++      // check the reassembled data length
++      if (asn_data_length < 1) {
++              pthread_mutex_unlock(&lowspeed->lock);
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              if (do_free)
++                      free(data);
++              return -1;
++      }
++      // now, parse the data
++      uint8_t phase_id = data[0];
++
++      // tell the app
++      en50221_app_lowspeed_send_callback cb = lowspeed->send_callback;
++      void *cb_arg = lowspeed->send_callback_arg;
++      pthread_mutex_unlock(&lowspeed->lock);
++      int cbstatus = 0;
++      if (cb) {
++              cbstatus =
++                  cb(cb_arg, slot_id, session_number, phase_id, data + 1, asn_data_length - 1);
++      }
++      // done
++      if (do_free)
++              free(data);
++      return cbstatus;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_lowspeed.h dvb-apps/lib/libdvben50221/en50221_app_lowspeed.h
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_lowspeed.h    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_app_lowspeed.h  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,219 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 transport layer
++
++    Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++    Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
++    Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#ifndef __EN50221_APPLICATION_LOWSPEED_H__
++#define __EN50221_APPLICATION_LOWSPEED_H__
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include <stdlib.h>
++#include <stdint.h>
++#include <libdvben50221/en50221_app_utils.h>
++#include <libucsi/dvb/descriptor.h>
++
++#define COMMS_COMMAND_ID_CONNECT_ON_CHANNEL     0x01
++#define COMMS_COMMAND_ID_DISCONNECT_ON_CHANNEL  0x02
++#define COMMS_COMMAND_ID_SET_PARAMS             0x03
++#define COMMS_COMMAND_ID_ENQUIRE_STATUS         0x04
++#define COMMS_COMMAND_ID_GET_NEXT_BUFFER        0x05
++
++#define CONNECTION_DESCRIPTOR_TYPE_TELEPHONE    0x01
++#define CONNECTION_DESCRIPTOR_TYPE_CABLE        0x02
++
++#define COMMS_REPLY_ID_CONNECT_ACK              0x01
++#define COMMS_REPLY_ID_DISCONNECT_ACK           0x02
++#define COMMS_REPLY_ID_SET_PARAMS_ACK           0x03
++#define COMMS_REPLY_ID_STATUS_REPLY             0x04
++#define COMMS_REPLY_ID_GET_NEXT_BUFFER_ACK      0x05
++#define COMMS_REPLY_ID_SEND_ACK                 0x06
++
++#define EN50221_APP_LOWSPEED_RESOURCEID(DEVICE_TYPE, DEVICE_NUMBER) MKRID(96,((DEVICE_TYPE)<<2)|((DEVICE_NUMBER) & 0x03),1)
++
++
++/**
++ * Structure holding information on a received comms command.
++ */
++struct en50221_app_lowspeed_command {
++      union {
++              struct {
++                      uint8_t descriptor_type;        // CONNECTION_DESCRIPTOR_TYPE_*
++                      uint8_t retry_count;
++                      uint8_t timeout;
++                      union {
++                              struct dvb_telephone_descriptor *telephone;
++                              uint8_t cable_channel_id;
++                      } descriptor;
++              } connect_on_channel;
++
++              struct {
++                      uint8_t buffer_size;
++                      uint8_t timeout;
++              } set_params;
++
++              struct {
++                      uint8_t phase_id;
++              } get_next_buffer;
++      } u;
++};
++
++/**
++ * Type definition for command - called when we receive a comms command.
++ *
++ * @param arg Private argument.
++ * @param slot_id Slot id concerned.
++ * @param session_number Session number concerned.
++ * @param command_id One of the COMMS_COMMAND_ID_* values
++ * @param command Pointer to a lowspeed command structure containing the command data.
++ * @return 0 on success, -1 on failure.
++ */
++typedef int (*en50221_app_lowspeed_command_callback) (void *arg,
++                                                    uint8_t slot_id,
++                                                    uint16_t session_number,
++                                                    uint8_t command_id,
++                                                    struct en50221_app_lowspeed_command *command);
++
++/**
++ * Type definition for send - called when we receive data to send. The block can be segmented into
++ * multiple pieces - last_more indicates the details of this.
++ *
++ * @param arg Private argument.
++ * @param slot_id Slot id concerned.
++ * @param session_number Session number concerned.
++ * @param phase_id Comms phase id.
++ * @param data The data.
++ * @param length Number of bytes.
++ * @return 0 on success, -1 on failure.
++ */
++typedef int (*en50221_app_lowspeed_send_callback) (void *arg,
++                                                 uint8_t slot_id,
++                                                 uint16_t session_number,
++                                                 uint8_t phase_id,
++                                                 uint8_t *data,
++                                                 uint32_t length);
++
++/**
++ * Opaque type representing a lowspeed resource.
++ */
++struct en50221_app_lowspeed;
++
++/**
++ * Create an instance of the lowspeed resource.
++ *
++ * @param funcs Send functions to use.
++ * @return Instance, or NULL on failure.
++ */
++extern struct en50221_app_lowspeed *
++      en50221_app_lowspeed_create(struct en50221_app_send_functions *funcs);
++
++/**
++ * Destroy an instance of the lowspeed resource.
++ *
++ * @param lowspeed Instance to destroy.
++ */
++extern void en50221_app_lowspeed_destroy(struct en50221_app_lowspeed *lowspeed);
++
++/**
++ * Informs the lowspeed object that a session to it has been closed - cleans up internal state.
++ *
++ * @param lowspeed lowspeed resource instance.
++ * @param session_number The session concerned.
++ */
++extern void en50221_app_lowspeed_clear_session(struct en50221_app_lowspeed *lowspeed,
++                                             uint16_t session_number);
++
++/**
++ * Register the callback for when we receive a comms command.
++ *
++ * @param lowspeed lowspeed resource instance.
++ * @param callback The callback. Set to NULL to remove the callback completely.
++ * @param arg Private data passed as arg0 of the callback.
++ */
++extern void en50221_app_lowspeed_register_command_callback(struct en50221_app_lowspeed *lowspeed,
++                                                         en50221_app_lowspeed_command_callback callback,
++                                                         void *arg);
++
++/**
++ * Register the callback for when we receive data to send.
++ *
++ * @param lowspeed lowspeed resource instance.
++ * @param callback The callback. Set to NULL to remove the callback completely.
++ * @param arg Private data passed as arg0 of the callback.
++ */
++extern void en50221_app_lowspeed_register_send_callback(struct en50221_app_lowspeed *lowspeed,
++                                                      en50221_app_lowspeed_send_callback callback,
++                                                      void *arg);
++
++/**
++ * Send a comms reply to the CAM.
++ *
++ * @param lowspeed lowspeed resource instance.
++ * @param session_number Session number to send it on.
++ * @param comms_reply_id One of the COMMS_REPLY_ID_* values.
++ * @param return_value Comms reply specific value.
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_lowspeed_send_comms_reply(struct en50221_app_lowspeed *lowspeed,
++                                               uint16_t session_number,
++                                               uint8_t comms_reply_id,
++                                               uint8_t return_value);
++
++/**
++ * Send received data to the CAM.
++ *
++ * @param lowspeed lowspeed resource instance.
++ * @param session_number Session number to send it on.
++ * @param phase_id Comms phase id.
++ * @param tx_data_length Length of data in bytes (max 254 bytes as per spec).
++ * @param tx_data Data.
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_lowspeed_send_comms_data(struct en50221_app_lowspeed *lowspeed,
++                                              uint16_t session_number,
++                                              uint8_t phase_id,
++                                              uint32_t tx_data_length,
++                                              uint8_t * tx_data);
++
++/**
++ * Pass data received for this resource into it for parsing.
++ *
++ * @param lowspeed lowspeed instance.
++ * @param slot_id Slot ID concerned.
++ * @param session_number Session number concerned.
++ * @param resource_id Resource ID concerned.
++ * @param data The data.
++ * @param data_length Length of data in bytes.
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_lowspeed_message(struct en50221_app_lowspeed *lowspeed,
++                                      uint8_t slot_id,
++                                      uint16_t session_number,
++                                      uint32_t resource_id,
++                                      uint8_t * data,
++                                      uint32_t data_length);
++
++#ifdef __cplusplus
++}
++#endif
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_mmi.c dvb-apps/lib/libdvben50221/en50221_app_mmi.c
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_mmi.c 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_app_mmi.c       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,1397 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 transport layer
++
++    Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++    Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
++    Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#include <string.h>
++#include <libdvbmisc/dvbmisc.h>
++#include <pthread.h>
++#include <libucsi/dvb/types.h>
++#include "en50221_app_mmi.h"
++#include "en50221_app_tags.h"
++#include "asn_1.h"
++
++struct en50221_app_mmi_session {
++      uint16_t session_number;
++
++      uint8_t *menu_block_chain;
++      uint32_t menu_block_length;
++
++      uint8_t *list_block_chain;
++      uint32_t list_block_length;
++
++      uint8_t *subtitlesegment_block_chain;
++      uint32_t subtitlesegment_block_length;
++
++      uint8_t *subtitledownload_block_chain;
++      uint32_t subtitledownload_block_length;
++
++      struct en50221_app_mmi_session *next;
++};
++
++struct en50221_app_mmi {
++      struct en50221_app_send_functions *funcs;
++      struct en50221_app_mmi_session *sessions;
++
++      en50221_app_mmi_close_callback closecallback;
++      void *closecallback_arg;
++
++      en50221_app_mmi_display_control_callback displaycontrolcallback;
++      void *displaycontrolcallback_arg;
++
++      en50221_app_mmi_keypad_control_callback keypadcontrolcallback;
++      void *keypadcontrolcallback_arg;
++
++      en50221_app_mmi_subtitle_segment_callback subtitlesegmentcallback;
++      void *subtitlesegmentcallback_arg;
++
++      en50221_app_mmi_scene_end_mark_callback sceneendmarkcallback;
++      void *sceneendmarkcallback_arg;
++
++      en50221_app_mmi_scene_control_callback scenecontrolcallback;
++      void *scenecontrolcallback_arg;
++
++      en50221_app_mmi_subtitle_download_callback subtitledownloadcallback;
++      void *subtitledownloadcallback_arg;
++
++      en50221_app_mmi_flush_download_callback flushdownloadcallback;
++      void *flushdownloadcallback_arg;
++
++      en50221_app_mmi_enq_callback enqcallback;
++      void *enqcallback_arg;
++
++      en50221_app_mmi_menu_callback menucallback;
++      void *menucallback_arg;
++
++      en50221_app_mmi_list_callback listcallback;
++      void *listcallback_arg;
++
++      pthread_mutex_t lock;
++};
++
++static int en50221_app_mmi_parse_close(struct en50221_app_mmi *mmi,
++                                     uint8_t slot_id,
++                                     uint16_t session_number,
++                                     uint8_t * data,
++                                     uint32_t data_length);
++static int en50221_app_mmi_parse_display_control(struct en50221_app_mmi
++                                               *mmi, uint8_t slot_id,
++                                               uint16_t session_number,
++                                               uint8_t * data,
++                                               uint32_t data_length);
++static int en50221_app_mmi_parse_keypad_control(struct en50221_app_mmi
++                                              *mmi, uint8_t slot_id,
++                                              uint16_t session_number,
++                                              uint8_t * data,
++                                              uint32_t data_length);
++static int en50221_app_mmi_parse_enq(struct en50221_app_mmi *mmi,
++                                   uint8_t slot_id,
++                                   uint16_t session_number,
++                                   uint8_t * data, uint32_t data_length);
++static int en50221_app_mmi_parse_list_menu(struct en50221_app_mmi *mmi,
++                                         uint8_t slot_id,
++                                         uint16_t session_number,
++                                         uint32_t tag_id, int more_last,
++                                         uint8_t * data,
++                                         uint32_t data_length);
++static int en50221_app_mmi_parse_subtitle(struct en50221_app_mmi *mmi,
++                                        uint8_t slot_id,
++                                        uint16_t session_number,
++                                        uint32_t tag_id, int more_last,
++                                        uint8_t * data,
++                                        uint32_t data_length);
++static int en50221_app_mmi_parse_scene_end_mark(struct en50221_app_mmi *mmi,
++                                              uint8_t slot_id,
++                                              uint16_t session_number,
++                                              uint8_t * data,
++                                              uint32_t data_length);
++static int en50221_app_mmi_parse_scene_control(struct en50221_app_mmi *mmi,
++                                             uint8_t slot_id,
++                                             uint16_t session_number,
++                                             uint8_t * data,
++                                             uint32_t data_length);
++static int en50221_app_mmi_parse_subtitle(struct en50221_app_mmi *mmi,
++                                        uint8_t slot_id,
++                                        uint16_t session_number,
++                                        uint32_t tag_id, int more_last,
++                                        uint8_t * data,
++                                        uint32_t data_length);
++static int en50221_app_mmi_parse_flush_download(struct en50221_app_mmi *mmi,
++                                              uint8_t slot_id,
++                                              uint16_t session_number,
++                                              uint8_t * data,
++                                              uint32_t data_length);
++static int en50221_app_mmi_defragment(struct en50221_app_mmi *mmi,
++                                    uint16_t session_number,
++                                    uint32_t tag_id, int more_last,
++                                    uint8_t * indata,
++                                    uint32_t indata_length,
++                                    uint8_t ** outdata,
++                                    uint32_t * outdata_length);
++static int en50221_app_mmi_defragment_text(uint8_t * data,
++                                         uint32_t data_length,
++                                         uint8_t ** outdata,
++                                         uint32_t * outdata_length,
++                                         uint32_t * outconsumed);
++
++
++
++struct en50221_app_mmi *en50221_app_mmi_create(struct en50221_app_send_functions *funcs)
++{
++      struct en50221_app_mmi *mmi = NULL;
++
++      // create structure and set it up
++      mmi = malloc(sizeof(struct en50221_app_mmi));
++      if (mmi == NULL) {
++              return NULL;
++      }
++      mmi->funcs = funcs;
++      mmi->closecallback = NULL;
++      mmi->displaycontrolcallback = NULL;
++      mmi->keypadcontrolcallback = NULL;
++      mmi->subtitlesegmentcallback = NULL;
++      mmi->sceneendmarkcallback = NULL;
++      mmi->scenecontrolcallback = NULL;
++      mmi->subtitledownloadcallback = NULL;
++      mmi->flushdownloadcallback = NULL;
++      mmi->enqcallback = NULL;
++      mmi->menucallback = NULL;
++      mmi->listcallback = NULL;
++      mmi->sessions = NULL;
++
++      pthread_mutex_init(&mmi->lock, NULL);
++
++      // done
++      return mmi;
++}
++
++void en50221_app_mmi_destroy(struct en50221_app_mmi *mmi)
++{
++      struct en50221_app_mmi_session *cur_s = mmi->sessions;
++      while (cur_s) {
++              struct en50221_app_mmi_session *next = cur_s->next;
++              if (cur_s->menu_block_chain)
++                      free(cur_s->menu_block_chain);
++              if (cur_s->list_block_chain)
++                      free(cur_s->list_block_chain);
++              if (cur_s->subtitlesegment_block_chain)
++                      free(cur_s->subtitlesegment_block_chain);
++              if (cur_s->subtitledownload_block_chain)
++                      free(cur_s->subtitledownload_block_chain);
++              free(cur_s);
++              cur_s = next;
++      }
++
++      pthread_mutex_destroy(&mmi->lock);
++      free(mmi);
++}
++
++void en50221_app_mmi_clear_session(struct en50221_app_mmi *mmi,
++                                 uint16_t session_number)
++{
++      pthread_mutex_lock(&mmi->lock);
++      struct en50221_app_mmi_session *cur_s = mmi->sessions;
++      struct en50221_app_mmi_session *prev_s = NULL;
++      while (cur_s) {
++              if (cur_s->session_number == session_number) {
++                      if (cur_s->menu_block_chain)
++                              free(cur_s->menu_block_chain);
++                      if (cur_s->list_block_chain)
++                              free(cur_s->list_block_chain);
++                      if (cur_s->subtitlesegment_block_chain)
++                              free(cur_s->subtitlesegment_block_chain);
++                      if (cur_s->subtitledownload_block_chain)
++                              free(cur_s->subtitledownload_block_chain);
++                      if (prev_s) {
++                              prev_s->next = cur_s->next;
++                      } else {
++                              mmi->sessions = cur_s->next;
++                      }
++                      free(cur_s);
++                      return;
++              }
++
++              prev_s = cur_s;
++              cur_s = cur_s->next;
++      }
++      pthread_mutex_unlock(&mmi->lock);
++}
++
++void en50221_app_mmi_register_close_callback(struct en50221_app_mmi *mmi,
++                                           en50221_app_mmi_close_callback callback,
++                                           void *arg)
++{
++      pthread_mutex_lock(&mmi->lock);
++      mmi->closecallback = callback;
++      mmi->closecallback_arg = arg;
++      pthread_mutex_unlock(&mmi->lock);
++}
++
++void en50221_app_mmi_register_display_control_callback(struct en50221_app_mmi *mmi,
++                                                     en50221_app_mmi_display_control_callback callback,
++                                                     void *arg)
++{
++      pthread_mutex_lock(&mmi->lock);
++      mmi->displaycontrolcallback = callback;
++      mmi->displaycontrolcallback_arg = arg;
++      pthread_mutex_unlock(&mmi->lock);
++}
++
++void en50221_app_mmi_register_keypad_control_callback(struct en50221_app_mmi *mmi,
++                                                    en50221_app_mmi_keypad_control_callback callback,
++                                                    void *arg)
++{
++      pthread_mutex_lock(&mmi->lock);
++      mmi->keypadcontrolcallback = callback;
++      mmi->keypadcontrolcallback_arg = arg;
++      pthread_mutex_unlock(&mmi->lock);
++}
++
++void en50221_app_mmi_register_subtitle_segment_callback(struct en50221_app_mmi *mmi,
++                                                      en50221_app_mmi_subtitle_segment_callback callback,
++                                                      void *arg)
++{
++      pthread_mutex_lock(&mmi->lock);
++      mmi->subtitlesegmentcallback = callback;
++      mmi->subtitlesegmentcallback_arg = arg;
++      pthread_mutex_unlock(&mmi->lock);
++}
++
++void en50221_app_mmi_register_scene_end_mark_callback(struct en50221_app_mmi *mmi,
++                                                    en50221_app_mmi_scene_end_mark_callback callback, void *arg)
++{
++      pthread_mutex_lock(&mmi->lock);
++      mmi->sceneendmarkcallback = callback;
++      mmi->sceneendmarkcallback_arg = arg;
++      pthread_mutex_unlock(&mmi->lock);
++}
++
++void en50221_app_mmi_register_scene_control_callback(struct en50221_app_mmi *mmi,
++                                                   en50221_app_mmi_scene_control_callback callback, void *arg)
++{
++      pthread_mutex_lock(&mmi->lock);
++      mmi->scenecontrolcallback = callback;
++      mmi->scenecontrolcallback_arg = arg;
++      pthread_mutex_unlock(&mmi->lock);
++}
++
++void en50221_app_mmi_register_subtitle_download_callback(struct en50221_app_mmi *mmi,
++                                                       en50221_app_mmi_subtitle_download_callback callback,
++                                                       void *arg)
++{
++      pthread_mutex_lock(&mmi->lock);
++      mmi->subtitledownloadcallback = callback;
++      mmi->subtitledownloadcallback_arg = arg;
++      pthread_mutex_unlock(&mmi->lock);
++}
++
++void en50221_app_mmi_register_flush_download_callback(struct en50221_app_mmi *mmi,
++                                                    en50221_app_mmi_flush_download_callback callback,
++                                                    void *arg)
++{
++      pthread_mutex_lock(&mmi->lock);
++      mmi->flushdownloadcallback = callback;
++      mmi->flushdownloadcallback_arg = arg;
++      pthread_mutex_unlock(&mmi->lock);
++}
++
++void en50221_app_mmi_register_enq_callback(struct en50221_app_mmi *mmi,
++                                         en50221_app_mmi_enq_callback callback,
++                                         void *arg)
++{
++      pthread_mutex_lock(&mmi->lock);
++      mmi->enqcallback = callback;
++      mmi->enqcallback_arg = arg;
++      pthread_mutex_unlock(&mmi->lock);
++}
++
++void en50221_app_mmi_register_menu_callback(struct en50221_app_mmi *mmi,
++                                          en50221_app_mmi_menu_callback callback,
++                                          void *arg)
++{
++      pthread_mutex_lock(&mmi->lock);
++      mmi->menucallback = callback;
++      mmi->menucallback_arg = arg;
++      pthread_mutex_unlock(&mmi->lock);
++}
++
++void en50221_app_mmi_register_list_callback(struct en50221_app_mmi *mmi,
++                                          en50221_app_mmi_list_callback callback,
++                                          void *arg)
++{
++      pthread_mutex_lock(&mmi->lock);
++      mmi->listcallback = callback;
++      mmi->listcallback_arg = arg;
++      pthread_mutex_unlock(&mmi->lock);
++}
++
++int en50221_app_mmi_close(struct en50221_app_mmi *mmi,
++                        uint16_t session_number,
++                        uint8_t cmd_id, uint8_t delay)
++{
++      uint8_t data[6];
++      int data_length = 5;
++
++      data[0] = (TAG_CLOSE_MMI >> 16) & 0xFF;
++      data[1] = (TAG_CLOSE_MMI >> 8) & 0xFF;
++      data[2] = TAG_CLOSE_MMI & 0xFF;
++      data[3] = 1;
++      data[4] = cmd_id;
++      if (cmd_id == MMI_CLOSE_MMI_CMD_ID_DELAY) {
++              data[3] = 2;
++              data[5] = delay;
++              data_length = 6;
++      }
++      return mmi->funcs->send_data(mmi->funcs->arg, session_number, data,
++                                   data_length);
++}
++
++int en50221_app_mmi_display_reply(struct en50221_app_mmi *mmi,
++                                uint16_t session_number,
++                                uint8_t reply_id,
++                                struct en50221_app_mmi_display_reply_details *details)
++{
++      uint8_t data[32];
++      struct iovec iov[2];
++      uint32_t iov_count;
++      int length_field_len;
++
++      // fill out the start of the header
++      data[0] = (TAG_DISPLAY_REPLY >> 16) & 0xFF;
++      data[1] = (TAG_DISPLAY_REPLY >> 8) & 0xFF;
++      data[2] = TAG_DISPLAY_REPLY & 0xFF;
++
++      switch (reply_id) {
++      case MMI_DISPLAY_REPLY_ID_MMI_MODE_ACK:
++              data[3] = 2;
++              data[4] = reply_id;
++              data[5] = details->u.mode_ack.mmi_mode;
++              iov[0].iov_base = data;
++              iov[0].iov_len = 6;
++              iov_count = 1;
++              break;
++
++      case MMI_DISPLAY_REPLY_ID_LIST_DISPLAY_CHAR_TABLES:
++      case MMI_DISPLAY_REPLY_ID_LIST_INPUT_CHAR_TABLES:
++              if ((length_field_len =
++                      asn_1_encode(details->u.char_table.table_length + 1, data + 3, 3)) < 0) {
++                      return -1;
++              }
++              data[3 + length_field_len] = reply_id;
++              iov[0].iov_base = data;
++              iov[0].iov_len = 3 + length_field_len + 1;
++              iov[1].iov_base = details->u.char_table.table;
++              iov[1].iov_len = details->u.char_table.table_length;
++              iov_count = 2;
++              break;
++
++      case MMI_DISPLAY_REPLY_ID_LIST_OVERLAY_GFX_CHARACTERISTICS:
++      case MMI_DISPLAY_REPLY_ID_LIST_FULLSCREEN_GFX_CHARACTERISTICS:
++              {
++                      if ((length_field_len =
++                              asn_1_encode(1 + 9 + (details->u.gfx.num_pixel_depths * 2), data + 3, 3)) < 0) {
++                              return -1;
++                      }
++                      data[3 + length_field_len] = reply_id;
++                      data[3 + length_field_len + 1] = details->u.gfx.width >> 8;
++                      data[3 + length_field_len + 2] = details->u.gfx.width;
++                      data[3 + length_field_len + 3] = details->u.gfx.height >> 8;
++                      data[3 + length_field_len + 4] = details->u.gfx.height;
++                      data[3 + length_field_len + 5] =
++                              ((details->u.gfx.aspect_ratio & 0x0f) << 4) |
++                              ((details->u.gfx.gfx_relation_to_video & 0x07) << 1) |
++                              (details->u.gfx.multiple_depths & 1);
++                      data[3 + length_field_len + 6] = details->u.gfx.display_bytes >> 4;
++                      data[3 + length_field_len + 7] =
++                              ((details->u.gfx.display_bytes & 0x0f) << 4) |
++                              ((details->u.gfx.composition_buffer_bytes & 0xf0) >> 4);
++                      data[3 + length_field_len + 8] =
++                              ((details->u.gfx.composition_buffer_bytes & 0x0f) << 4) |
++                              ((details->u.gfx.object_cache_bytes & 0xf0) >> 4);
++                      data[3 + length_field_len + 9] =
++                              ((details->u.gfx.object_cache_bytes & 0x0f) << 4) |
++                               (details->u.gfx.num_pixel_depths & 0x0f);
++
++                      // render the pixel depths themselves
++                      uint8_t *pixdepths =
++                          alloca(details->u.gfx.num_pixel_depths * 2);
++                      if (pixdepths == NULL) {
++                              return -1;
++                      }
++                      uint32_t i;
++                      for (i = 0; i < details->u.gfx.num_pixel_depths; i++) {
++                              pixdepths[0] =
++                                  ((details->u.gfx.pixel_depths[i].display_depth & 0x07) << 5) |
++                                  ((details->u.gfx.pixel_depths[i].pixels_per_byte & 0x07) << 2);
++                              pixdepths[1] =
++                                  details->u.gfx.pixel_depths[i].region_overhead;
++                              pixdepths += 2;
++                      }
++
++                      // make up the iovs
++                      iov[0].iov_base = data;
++                      iov[0].iov_len = 3 + length_field_len + 10;
++                      iov[1].iov_base = pixdepths;
++                      iov[1].iov_len =
++                          details->u.gfx.num_pixel_depths * 2;
++                      iov_count = 2;
++                      break;
++              }
++
++      default:
++              data[3] = 1;
++              data[4] = reply_id;
++              iov[0].iov_base = data;
++              iov[0].iov_len = 5;
++              iov_count = 1;
++              break;
++      }
++
++      // sendit
++      return mmi->funcs->send_datav(mmi->funcs->arg, session_number, iov, iov_count);
++}
++
++int en50221_app_mmi_keypress(struct en50221_app_mmi *mmi,
++                           uint16_t session_number, uint8_t keycode)
++{
++      uint8_t data[5];
++
++      data[0] = (TAG_KEYPRESS >> 16) & 0xFF;
++      data[1] = (TAG_KEYPRESS >> 8) & 0xFF;
++      data[2] = TAG_KEYPRESS & 0xFF;
++      data[3] = 1;
++      data[4] = keycode;
++      return mmi->funcs->send_data(mmi->funcs->arg, session_number, data, 5);
++}
++
++int en50221_app_mmi_display_message(struct en50221_app_mmi *mmi,
++                                  uint16_t session_number,
++                                  uint8_t display_message_id)
++{
++      uint8_t data[5];
++
++      data[0] = (TAG_DISPLAY_MESSAGE >> 16) & 0xFF;
++      data[1] = (TAG_DISPLAY_MESSAGE >> 8) & 0xFF;
++      data[2] = TAG_DISPLAY_MESSAGE & 0xFF;
++      data[3] = 1;
++      data[4] = display_message_id;
++      return mmi->funcs->send_data(mmi->funcs->arg, session_number, data, 5);
++}
++
++int en50221_app_mmi_scene_done(struct en50221_app_mmi *mmi,
++                             uint16_t session_number,
++                             uint8_t decoder_continue,
++                             uint8_t scene_reveal, uint8_t scene_tag)
++{
++      uint8_t data[5];
++
++      data[0] = (TAG_SCENE_DONE >> 16) & 0xFF;
++      data[1] = (TAG_SCENE_DONE >> 8) & 0xFF;
++      data[2] = TAG_SCENE_DONE & 0xFF;
++      data[3] = 1;
++      data[4] =
++              (decoder_continue ? 0x80 : 0x00) |
++              (scene_reveal ? 0x40 : 0x00) |
++              (scene_tag & 0x0f);
++      return mmi->funcs->send_data(mmi->funcs->arg, session_number, data, 5);
++}
++
++int en50221_app_mmi_download_reply(struct en50221_app_mmi *mmi,
++                                 uint16_t session_number,
++                                 uint16_t object_id,
++                                 uint8_t download_reply_id)
++{
++      uint8_t data[7];
++
++      data[0] = (TAG_DOWNLOAD_REPLY >> 16) & 0xFF;
++      data[1] = (TAG_DOWNLOAD_REPLY >> 8) & 0xFF;
++      data[2] = TAG_DOWNLOAD_REPLY & 0xFF;
++      data[3] = 3;
++      data[4] = object_id >> 8;
++      data[5] = object_id;
++      data[6] = download_reply_id;
++      return mmi->funcs->send_data(mmi->funcs->arg, session_number, data, 7);
++}
++
++int en50221_app_mmi_answ(struct en50221_app_mmi *mmi,
++                       uint16_t session_number,
++                       uint8_t answ_id,
++                       uint8_t * text, uint32_t text_count)
++{
++      uint8_t buf[10];
++
++      // set up the tag
++      buf[0] = (TAG_ANSWER >> 16) & 0xFF;
++      buf[1] = (TAG_ANSWER >> 8) & 0xFF;
++      buf[2] = TAG_ANSWER & 0xFF;
++
++      // encode the length field
++      struct iovec iov[2];
++      int length_field_len = 0;
++      int iov_count = 1;
++      if (answ_id == MMI_ANSW_ID_ANSWER) {
++              if ((length_field_len = asn_1_encode(text_count + 1, buf + 3, 3)) < 0) {
++                      return -1;
++              }
++              buf[3 + length_field_len] = answ_id;
++
++              iov[0].iov_base = buf;
++              iov[0].iov_len = 3 + length_field_len + 1;
++              iov[1].iov_base = text;
++              iov[1].iov_len = text_count;
++              iov_count = 2;
++      } else {
++              buf[3] = 1;
++              buf[4] = answ_id;
++              iov[0].iov_base = buf;
++              iov[0].iov_len = 5;
++              iov_count = 1;
++      }
++
++      // create the data and send it
++      return mmi->funcs->send_datav(mmi->funcs->arg, session_number, iov,
++                                    iov_count);
++}
++
++int en50221_app_mmi_menu_answ(struct en50221_app_mmi *mmi,
++                            uint16_t session_number, uint8_t choice_ref)
++{
++      uint8_t data[5];
++
++      data[0] = (TAG_MENU_ANSWER >> 16) & 0xFF;
++      data[1] = (TAG_MENU_ANSWER >> 8) & 0xFF;
++      data[2] = TAG_MENU_ANSWER & 0xFF;
++      data[3] = 1;
++      data[4] = choice_ref;
++      return mmi->funcs->send_data(mmi->funcs->arg, session_number, data, 5);
++}
++
++int en50221_app_mmi_message(struct en50221_app_mmi *mmi,
++                          uint8_t slot_id,
++                          uint16_t session_number,
++                          uint32_t resource_id,
++                          uint8_t * data, uint32_t data_length)
++{
++      (void) resource_id;
++
++      // get the tag
++      if (data_length < 3) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      uint32_t tag = (data[0] << 16) | (data[1] << 8) | data[2];
++
++      switch (tag) {
++      case TAG_CLOSE_MMI:
++              return en50221_app_mmi_parse_close(mmi, slot_id,
++                                                 session_number,
++                                                 data + 3,
++                                                 data_length - 3);
++      case TAG_DISPLAY_CONTROL:
++              return en50221_app_mmi_parse_display_control(mmi, slot_id,
++                                                           session_number,
++                                                           data + 3,
++                                                           data_length - 3);
++      case TAG_KEYPAD_CONTROL:
++              return en50221_app_mmi_parse_keypad_control(mmi, slot_id,
++                                                          session_number,
++                                                          data + 3,
++                                                          data_length - 3);
++      case TAG_ENQUIRY:
++              return en50221_app_mmi_parse_enq(mmi, slot_id,
++                                               session_number, data + 3,
++                                               data_length - 3);
++      case TAG_MENU_LAST:
++              return en50221_app_mmi_parse_list_menu(mmi, slot_id,
++                                                     session_number, tag,
++                                                     1, data + 3,
++                                                     data_length - 3);
++      case TAG_MENU_MORE:
++              return en50221_app_mmi_parse_list_menu(mmi, slot_id,
++                                                     session_number, tag,
++                                                     0, data + 3,
++                                                     data_length - 3);
++      case TAG_LIST_LAST:
++              return en50221_app_mmi_parse_list_menu(mmi, slot_id,
++                                                     session_number, tag,
++                                                     1, data + 3,
++                                                     data_length - 3);
++      case TAG_LIST_MORE:
++              return en50221_app_mmi_parse_list_menu(mmi, slot_id,
++                                                     session_number, tag,
++                                                     0, data + 3,
++                                                     data_length - 3);
++      case TAG_SUBTITLE_SEGMENT_LAST:
++              return en50221_app_mmi_parse_subtitle(mmi, slot_id,
++                                                    session_number, tag,
++                                                    1, data + 3,
++                                                    data_length - 3);
++      case TAG_SUBTITLE_SEGMENT_MORE:
++              return en50221_app_mmi_parse_subtitle(mmi, slot_id,
++                                                    session_number, tag,
++                                                    0, data + 3,
++                                                    data_length - 3);
++      case TAG_SCENE_END_MARK:
++              return en50221_app_mmi_parse_scene_end_mark(mmi, slot_id,
++                                                          session_number,
++                                                          data + 3,
++                                                          data_length - 3);
++      case TAG_SCENE_CONTROL:
++              return en50221_app_mmi_parse_scene_control(mmi, slot_id,
++                                                         session_number,
++                                                         data + 3,
++                                                         data_length - 3);
++      case TAG_SUBTITLE_DOWNLOAD_LAST:
++              return en50221_app_mmi_parse_subtitle(mmi, slot_id,
++                                                    session_number, tag,
++                                                    1, data + 3,
++                                                    data_length - 3);
++      case TAG_SUBTITLE_DOWNLOAD_MORE:
++              return en50221_app_mmi_parse_subtitle(mmi, slot_id,
++                                                    session_number, tag,
++                                                    0, data + 3,
++                                                    data_length - 3);
++      case TAG_FLUSH_DOWNLOAD:
++              return en50221_app_mmi_parse_flush_download(mmi, slot_id,
++                                                          session_number,
++                                                          data + 3,
++                                                          data_length - 3);
++      }
++
++      print(LOG_LEVEL, ERROR, 1, "Received unexpected tag %x\n", tag);
++      return -1;
++}
++
++
++
++
++
++static int en50221_app_mmi_parse_close(struct en50221_app_mmi *mmi,
++                                     uint8_t slot_id,
++                                     uint16_t session_number,
++                                     uint8_t * data,
++                                     uint32_t data_length)
++{
++      // validate data
++      if (data_length < 2) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      if (data[0] > (data_length - 1)) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      uint8_t cmd_id = data[1];
++      uint8_t delay = 0;
++      if (cmd_id == MMI_CLOSE_MMI_CMD_ID_DELAY) {
++              if (data[0] != 2) {
++                      print(LOG_LEVEL, ERROR, 1,
++                            "Received short data\n");
++                      return -1;
++              }
++              delay = data[2];
++      }
++      // tell the app
++      pthread_mutex_lock(&mmi->lock);
++      en50221_app_mmi_close_callback cb = mmi->closecallback;
++      void *cb_arg = mmi->closecallback_arg;
++      pthread_mutex_unlock(&mmi->lock);
++      if (cb) {
++              return cb(cb_arg, slot_id, session_number, cmd_id, delay);
++      }
++      return 0;
++}
++
++static int en50221_app_mmi_parse_display_control(struct en50221_app_mmi *mmi,
++                                               uint8_t slot_id,
++                                               uint16_t session_number,
++                                               uint8_t *data,
++                                               uint32_t data_length)
++{
++      // validate data
++      if (data_length < 2) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      if (data[0] > (data_length - 1)) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      uint8_t cmd_id = data[1];
++      uint8_t mmi_mode = 0;
++      if (cmd_id == MMI_DISPLAY_CONTROL_CMD_ID_SET_MMI_MODE) {
++              if (data[0] != 2) {
++                      print(LOG_LEVEL, ERROR, 1,
++                            "Received short data\n");
++                      return -1;
++              }
++              mmi_mode = data[2];
++      }
++      // tell the app
++      pthread_mutex_lock(&mmi->lock);
++      en50221_app_mmi_display_control_callback cb = mmi->displaycontrolcallback;
++      void *cb_arg = mmi->displaycontrolcallback_arg;
++      pthread_mutex_unlock(&mmi->lock);
++      if (cb) {
++              return cb(cb_arg, slot_id, session_number, cmd_id, mmi_mode);
++      }
++      return 0;
++}
++
++static int en50221_app_mmi_parse_keypad_control(struct en50221_app_mmi *mmi,
++                                              uint8_t slot_id,
++                                              uint16_t session_number,
++                                              uint8_t *data,
++                                              uint32_t data_length)
++{
++      // first of all, decode the length field
++      uint16_t asn_data_length;
++      int length_field_len;
++      if ((length_field_len = asn_1_decode(&asn_data_length, data, data_length)) < 0) {
++              print(LOG_LEVEL, ERROR, 1, "ASN.1 decode error\n");
++              return -1;
++      }
++      // check it
++      if (asn_data_length > (data_length - length_field_len)) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      if (asn_data_length < 1) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      // skip over the length field
++      data += length_field_len;
++
++      // extract the information
++      uint8_t cmd_id = data[0];
++      uint8_t *keycodes = data + 1;
++
++      // tell the app
++      pthread_mutex_lock(&mmi->lock);
++      en50221_app_mmi_keypad_control_callback cb = mmi->keypadcontrolcallback;
++      void *cb_arg = mmi->keypadcontrolcallback_arg;
++      pthread_mutex_unlock(&mmi->lock);
++      if (cb) {
++              return cb(cb_arg, slot_id, session_number, cmd_id,
++                        keycodes, asn_data_length - 1);
++      }
++      return 0;
++}
++
++static int en50221_app_mmi_parse_enq(struct en50221_app_mmi *mmi,
++                                   uint8_t slot_id,
++                                   uint16_t session_number,
++                                   uint8_t * data, uint32_t data_length)
++{
++      // first of all, decode the length field
++      uint16_t asn_data_length;
++      int length_field_len;
++      if ((length_field_len = asn_1_decode(&asn_data_length, data, data_length)) < 0) {
++              print(LOG_LEVEL, ERROR, 1, "ASN.1 decode error\n");
++              return -1;
++      }
++      // check it
++      if (asn_data_length > (data_length - length_field_len)) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      if (asn_data_length < 2) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      // skip over the length field
++      data += length_field_len;
++
++      // extract the information
++      uint8_t blind_answer = (data[0] & 0x01) ? 1 : 0;
++      uint8_t answer_length = data[1];
++      uint8_t *text = data + 2;
++
++      // tell the app
++      pthread_mutex_lock(&mmi->lock);
++      en50221_app_mmi_enq_callback cb = mmi->enqcallback;
++      void *cb_arg = mmi->enqcallback_arg;
++      pthread_mutex_unlock(&mmi->lock);
++      if (cb) {
++              return cb(cb_arg, slot_id, session_number, blind_answer,
++                        answer_length, text, asn_data_length - 2);
++      }
++      return 0;
++}
++
++static int en50221_app_mmi_parse_list_menu(struct en50221_app_mmi *mmi,
++                                         uint8_t slot_id,
++                                         uint16_t session_number,
++                                         uint32_t tag_id, int more_last,
++                                         uint8_t * data,
++                                         uint32_t data_length)
++{
++      int result = 0;
++      uint8_t *text_flags = NULL;
++      struct en50221_app_mmi_text *text_data = NULL;
++      uint32_t i;
++      uint8_t text_count = 0;
++
++      // first of all, decode the length field
++      uint16_t asn_data_length;
++      int length_field_len;
++      if ((length_field_len = asn_1_decode(&asn_data_length, data, data_length)) < 0) {
++              print(LOG_LEVEL, ERROR, 1, "ASN.1 decode error\n");
++              return -1;
++      }
++      // check it
++      if (asn_data_length > (data_length - length_field_len)) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      // skip over the length field
++      data += length_field_len;
++
++      // defragment
++      pthread_mutex_lock(&mmi->lock);
++      uint8_t *outdata;
++      uint32_t outdata_length;
++      int dfstatus =
++          en50221_app_mmi_defragment(mmi, session_number, tag_id,
++                                     more_last,
++                                     data, asn_data_length,
++                                     &outdata, &outdata_length);
++      if (dfstatus <= 0) {
++              pthread_mutex_unlock(&mmi->lock);
++              return dfstatus;
++      }
++      data = outdata;
++      data_length = outdata_length;
++
++      // check the reassembled data length
++      if (data_length < 1) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              pthread_mutex_unlock(&mmi->lock);
++              result = -1;
++              goto exit_cleanup;
++      }
++      // now, parse the data
++      uint8_t choice_nb = data[0];
++      text_count = choice_nb + 3;
++      if (choice_nb == 0xff)
++              text_count = 3;
++      data++;
++      data_length--;
++
++      // variables for extracted text state
++      text_flags = alloca(text_count);
++      if (text_flags == NULL) {
++              pthread_mutex_unlock(&mmi->lock);
++              result = -1;
++              goto exit_cleanup;
++      }
++      memset(text_flags, 0, text_count);
++      text_data = (struct en50221_app_mmi_text *)
++          alloca(sizeof(struct en50221_app_mmi_text) * text_count);
++      if (text_data == NULL) {
++              pthread_mutex_unlock(&mmi->lock);
++              result = -1;
++              goto exit_cleanup;
++      }
++      memset(text_data, 0,
++             sizeof(struct en50221_app_mmi_text) * text_count);
++
++      // extract the text!
++      for (i = 0; i < text_count; i++) {
++              uint32_t consumed = 0;
++              int cur_status =
++                  en50221_app_mmi_defragment_text(data, data_length,
++                                                  &text_data[i].text,
++                                                  &text_data[i].text_length,
++                                                  &consumed);
++              if (cur_status < 0) {
++                      pthread_mutex_unlock(&mmi->lock);
++                      result = -1;
++                      goto exit_cleanup;
++              }
++
++              text_flags[i] = cur_status;
++              data += consumed;
++              data_length -= consumed;
++      }
++
++      // work out what to pass to the user
++      struct en50221_app_mmi_text *text_data_for_user = (struct en50221_app_mmi_text *)
++          alloca(sizeof(struct en50221_app_mmi_text) * text_count);
++      if (text_data_for_user == NULL) {
++              result = -1;
++              goto exit_cleanup;
++      }
++      memcpy(text_data_for_user, text_data,
++             sizeof(struct en50221_app_mmi_text) * text_count);
++      struct en50221_app_mmi_text *text_ptr = NULL;
++      if (text_count > 3) {
++              text_ptr = &text_data_for_user[3];
++      }
++      uint8_t *items_raw = NULL;
++      uint32_t items_raw_length = 0;
++      if (choice_nb == 0xff) {
++              items_raw = data;
++              items_raw_length = data_length;
++      }
++      // do callback
++      result = 0;
++      switch (tag_id) {
++      case TAG_MENU_LAST:
++      {
++              en50221_app_mmi_menu_callback cb = mmi->menucallback;
++              void *cb_arg = mmi->menucallback_arg;
++              pthread_mutex_unlock(&mmi->lock);
++              if (cb) {
++                      result =
++                              cb(cb_arg, slot_id, session_number,
++                              &text_data_for_user[0],
++                              &text_data_for_user[1],
++                              &text_data_for_user[2],
++                              text_count - 3, text_ptr,
++                              items_raw_length, items_raw);
++              }
++              break;
++      }
++
++      case TAG_LIST_LAST:
++      {
++              en50221_app_mmi_list_callback cb = mmi->listcallback;
++              void *cb_arg = mmi->listcallback_arg;
++              pthread_mutex_unlock(&mmi->lock);
++              if (cb) {
++                      result =
++                              cb(cb_arg, slot_id, session_number,
++                              &text_data_for_user[0],
++                              &text_data_for_user[1],
++                              &text_data_for_user[2],
++                              text_count - 3, text_ptr,
++                              items_raw_length, items_raw);
++              }
++              break;
++      }
++
++      default:
++              pthread_mutex_unlock(&mmi->lock);
++              break;
++      }
++
++exit_cleanup:
++      if ((dfstatus == 2) && outdata)
++              free(outdata);
++      if (text_flags && text_data) {
++              for (i = 0; i < text_count; i++) {
++                      if ((text_flags[i] == 2) && text_data[i].text) {
++                              free(text_data[i].text);
++                      }
++              }
++      }
++      return result;
++}
++
++static int en50221_app_mmi_parse_subtitle(struct en50221_app_mmi *mmi,
++                                        uint8_t slot_id,
++                                        uint16_t session_number,
++                                        uint32_t tag_id, int more_last,
++                                        uint8_t * data,
++                                        uint32_t data_length)
++{
++      // first of all, decode the length field
++      uint16_t asn_data_length;
++      int length_field_len;
++      if ((length_field_len = asn_1_decode(&asn_data_length, data, data_length)) < 0) {
++              print(LOG_LEVEL, ERROR, 1, "ASN.1 decode error\n");
++              return -1;
++      }
++      // check it
++      if (asn_data_length > (data_length - length_field_len)) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      // skip over the length field
++      data += length_field_len;
++
++      // defragment
++      pthread_mutex_lock(&mmi->lock);
++      uint8_t *outdata;
++      uint32_t outdata_length;
++      int dfstatus =
++          en50221_app_mmi_defragment(mmi, session_number, tag_id,
++                                     more_last,
++                                     data, asn_data_length,
++                                     &outdata, &outdata_length);
++      if (dfstatus <= 0) {
++              pthread_mutex_unlock(&mmi->lock);
++              return dfstatus;
++      }
++      // do callback
++      int cbstatus = 0;
++      switch (tag_id) {
++      case TAG_SUBTITLE_SEGMENT_LAST:
++              {
++                      en50221_app_mmi_subtitle_segment_callback cb =
++                          mmi->subtitlesegmentcallback;
++                      void *cb_arg = mmi->subtitlesegmentcallback_arg;
++                      pthread_mutex_unlock(&mmi->lock);
++                      if (cb) {
++                              cbstatus =
++                                  cb(cb_arg, slot_id, session_number, outdata, outdata_length);
++                      }
++                      break;
++              }
++
++      case TAG_SUBTITLE_DOWNLOAD_LAST:
++              {
++                      en50221_app_mmi_subtitle_download_callback cb =
++                          mmi->subtitledownloadcallback;
++                      void *cb_arg = mmi->subtitledownloadcallback_arg;
++                      pthread_mutex_unlock(&mmi->lock);
++                      if (cb) {
++                              cbstatus =
++                                  cb(cb_arg, slot_id, session_number, outdata, outdata_length);
++                      }
++                      break;
++              }
++      }
++
++      // free the data returned by the defragment call if asked to
++      if (dfstatus == 2) {
++              free(outdata);
++      }
++      // done
++      return cbstatus;
++}
++
++static int en50221_app_mmi_parse_scene_end_mark(struct en50221_app_mmi *mmi,
++                                              uint8_t slot_id,
++                                              uint16_t session_number,
++                                              uint8_t * data,
++                                              uint32_t data_length)
++{
++      // validate data
++      if (data_length != 2) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      if (data[0] != 1) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      uint8_t flags = data[1];
++
++      // tell the app
++      pthread_mutex_lock(&mmi->lock);
++      en50221_app_mmi_scene_end_mark_callback cb =
++          mmi->sceneendmarkcallback;
++      void *cb_arg = mmi->sceneendmarkcallback_arg;
++      pthread_mutex_unlock(&mmi->lock);
++      if (cb) {
++              return cb(cb_arg, slot_id, session_number,
++                        (flags & 0x80) ? 1 : 0,
++                        (flags & 0x40) ? 1 : 0,
++                        (flags & 0x20) ? 1 : 0, flags & 0x0f);
++      }
++      return 0;
++}
++
++static int en50221_app_mmi_parse_scene_control(struct en50221_app_mmi *mmi,
++                                             uint8_t slot_id,
++                                             uint16_t session_number,
++                                             uint8_t * data,
++                                             uint32_t data_length)
++{
++      // validate data
++      if (data_length != 2) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      if (data[0] != 1) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      uint8_t flags = data[1];
++
++      // tell the app
++      pthread_mutex_lock(&mmi->lock);
++      en50221_app_mmi_scene_control_callback cb = mmi->scenecontrolcallback;
++      void *cb_arg = mmi->scenecontrolcallback_arg;
++      pthread_mutex_unlock(&mmi->lock);
++      if (cb) {
++              return cb(cb_arg, slot_id, session_number,
++                        (flags & 0x80) ? 1 : 0,
++                        (flags & 0x40) ? 1 : 0, flags & 0x0f);
++      }
++      return 0;
++}
++
++static int en50221_app_mmi_parse_flush_download(struct en50221_app_mmi *mmi,
++                                              uint8_t slot_id,
++                                              uint16_t session_number,
++                                              uint8_t *data,
++                                              uint32_t data_length)
++{
++      // validate data
++      if (data_length != 1) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      if (data[0] != 0) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      // tell the app
++      pthread_mutex_lock(&mmi->lock);
++      en50221_app_mmi_flush_download_callback cb = mmi->flushdownloadcallback;
++      void *cb_arg = mmi->flushdownloadcallback_arg;
++      pthread_mutex_unlock(&mmi->lock);
++      if (cb) {
++              return cb(cb_arg, slot_id, session_number);
++      }
++      return 0;
++}
++
++static int en50221_app_mmi_defragment(struct en50221_app_mmi *mmi,
++                                    uint16_t session_number,
++                                    uint32_t tag_id,
++                                    int more_last,
++                                    uint8_t * indata,
++                                    uint32_t indata_length,
++                                    uint8_t ** outdata,
++                                    uint32_t * outdata_length)
++{
++      struct en50221_app_mmi_session *cur_s = mmi->sessions;
++      while (cur_s) {
++              if (cur_s->session_number == session_number)
++                      break;
++              cur_s = cur_s->next;
++      }
++
++      // more data is still to come
++      if (!more_last) {
++              // if there was no previous session, create one
++              if (cur_s == NULL) {
++                      cur_s = malloc(sizeof(struct en50221_app_mmi_session));
++                      if (cur_s == NULL) {
++                              print(LOG_LEVEL, ERROR, 1, "Ran out of memory\n");
++                              return -1;
++                      }
++                      cur_s->session_number = session_number;
++                      cur_s->menu_block_chain = NULL;
++                      cur_s->menu_block_length = 0;
++                      cur_s->list_block_chain = NULL;
++                      cur_s->list_block_length = 0;
++                      cur_s->subtitlesegment_block_chain = NULL;
++                      cur_s->subtitlesegment_block_length = 0;
++                      cur_s->subtitledownload_block_chain = NULL;
++                      cur_s->subtitledownload_block_length = 0;
++                      cur_s->next = mmi->sessions;
++                      mmi->sessions = cur_s;
++              }
++              // find the block/block_length to use
++              uint8_t **block_chain;
++              uint32_t *block_length;
++              switch (tag_id) {
++              case TAG_MENU_LAST:
++              case TAG_MENU_MORE:
++                      block_chain = &cur_s->menu_block_chain;
++                      block_length = &cur_s->menu_block_length;
++                      break;
++              case TAG_LIST_LAST:
++              case TAG_LIST_MORE:
++                      block_chain = &cur_s->list_block_chain;
++                      block_length = &cur_s->list_block_length;
++                      break;
++              case TAG_SUBTITLE_SEGMENT_LAST:
++              case TAG_SUBTITLE_SEGMENT_MORE:
++                      block_chain = &cur_s->subtitlesegment_block_chain;
++                      block_length = &cur_s->subtitlesegment_block_length;
++                      break;
++              case TAG_SUBTITLE_DOWNLOAD_LAST:
++              case TAG_SUBTITLE_DOWNLOAD_MORE:
++                      block_chain = &cur_s->subtitledownload_block_chain;
++                      block_length = &cur_s->subtitledownload_block_length;
++                      break;
++              default:
++                      return -1;
++              }
++
++              // append the data
++              uint8_t *new_data =
++                  realloc(*block_chain, *block_length + indata_length);
++              if (new_data == NULL) {
++                      print(LOG_LEVEL, ERROR, 1, "Ran out of memory\n");
++                      return -1;
++              }
++              memcpy(new_data + *block_length, indata, indata_length);
++              *block_chain = new_data;
++              *block_length += indata_length;
++
++              // success, but block not complete yet
++              return 0;
++      }
++      // we hit the last of a possible chain of fragments
++      if (cur_s != NULL) {
++              // find the block/block_length to use
++              uint8_t **block_chain;
++              uint32_t *block_length;
++              switch (tag_id) {
++              case TAG_MENU_LAST:
++              case TAG_MENU_MORE:
++                      block_chain = &cur_s->menu_block_chain;
++                      block_length = &cur_s->menu_block_length;
++                      break;
++              case TAG_LIST_LAST:
++              case TAG_LIST_MORE:
++                      block_chain = &cur_s->list_block_chain;
++                      block_length = &cur_s->list_block_length;
++                      break;
++              case TAG_SUBTITLE_SEGMENT_LAST:
++              case TAG_SUBTITLE_SEGMENT_MORE:
++                      block_chain = &cur_s->subtitlesegment_block_chain;
++                      block_length = &cur_s->subtitlesegment_block_length;
++                      break;
++              case TAG_SUBTITLE_DOWNLOAD_LAST:
++              case TAG_SUBTITLE_DOWNLOAD_MORE:
++                      block_chain = &cur_s->subtitledownload_block_chain;
++                      block_length = &cur_s->subtitledownload_block_length;
++                      break;
++              default:
++                      return -1;
++              }
++
++              // we have a preceding fragment - need to append
++              uint8_t *new_data =
++                  realloc(*block_chain, *block_length + indata_length);
++              if (new_data == NULL) {
++                      print(LOG_LEVEL, ERROR, 1, "Ran out of memory\n");
++                      return -1;
++              }
++              memcpy(new_data + *block_length, indata, indata_length);
++              *outdata_length = *block_length + indata_length;
++              *outdata = new_data;
++              *block_chain = NULL;
++              *block_length = 0;
++
++              // success, and indicate to free the block when done
++              return 2;
++      }
++      // success, but indicate it is not to be freed
++      *outdata_length = indata_length;
++      *outdata = indata;
++      return 1;
++}
++
++static int en50221_app_mmi_defragment_text(uint8_t * data,
++                                         uint32_t data_length,
++                                         uint8_t ** outdata,
++                                         uint32_t * outdata_length,
++                                         uint32_t * outconsumed)
++{
++      uint8_t *text = NULL;
++      uint32_t text_length = 0;
++      uint32_t consumed = 0;
++
++      while (1) {
++              // get the tag
++              if (data_length < 3) {
++                      print(LOG_LEVEL, ERROR, 1, "Short data\n");
++                      if (text)
++                              free(text);
++                      return -1;
++              }
++              uint32_t tag = (data[0] << 16) | (data[1] << 8) | data[2];
++              data += 3;
++              data_length -= 3;
++              consumed += 3;
++
++              // get the length of the data and adjust
++              uint16_t asn_data_length;
++              int length_field_len;
++              if ((length_field_len =
++                   asn_1_decode(&asn_data_length, data,
++                                data_length)) < 0) {
++                      print(LOG_LEVEL, ERROR, 1, "ASN.1 decode error\n");
++                      if (text)
++                              free(text);
++                      return -1;
++              }
++              data += length_field_len;
++              data_length -= length_field_len;
++              consumed += length_field_len;
++
++              // deal with the tags
++              if (tag == TAG_TEXT_LAST) {
++                      if (text == NULL) {
++                              *outdata = data;
++                              *outdata_length = asn_data_length;
++                              *outconsumed = consumed + asn_data_length;
++                              return 1;
++                      } else {
++                              // append the data
++                              uint8_t *new_text = realloc(text,
++                                                          text_length + asn_data_length);
++                              if (new_text == NULL) {
++                                      print(LOG_LEVEL, ERROR, 1,
++                                            "Ran out of memory\n");
++                                      if (text)
++                                              free(text);
++                                      return -1;
++                              }
++                              memcpy(new_text + text_length, data,
++                                     asn_data_length);
++                              *outdata = new_text;
++                              *outdata_length =
++                                  text_length + asn_data_length;
++                              *outconsumed = consumed + asn_data_length;
++                              return 2;
++                      }
++
++              } else if (tag == TAG_TEXT_MORE) {
++                      // append the data
++                      uint8_t *new_text =
++                          realloc(text, text_length + asn_data_length);
++                      if (new_text == NULL) {
++                              print(LOG_LEVEL, ERROR, 1,
++                                    "Ran out of memory\n");
++                              if (text)
++                                      free(text);
++                              return -1;
++                      }
++                      memcpy(new_text + text_length, data,
++                             asn_data_length);
++                      text = new_text;
++                      text_length += asn_data_length;
++
++                      // consume the data
++                      data += asn_data_length;
++                      data_length -= asn_data_length;
++                      consumed += asn_data_length;
++              } else {
++                      // unknown tag
++                      print(LOG_LEVEL, ERROR, 1,
++                            "Unknown MMI text tag\n");
++                      if (text)
++                              free(text);
++                      return -1;
++              }
++      }
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_mmi.h dvb-apps/lib/libdvben50221/en50221_app_mmi.h
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_mmi.h 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_app_mmi.h       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,618 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 transport layer
++
++    Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++    Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
++    Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#ifndef __EN50221_APPLICATION_mmi_H__
++#define __EN50221_APPLICATION_mmi_H__
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include <stdlib.h>
++#include <stdint.h>
++#include <libdvben50221/en50221_app_utils.h>
++
++#define EN50221_APP_MMI_RESOURCEID MKRID(64,1,1)
++
++#define MMI_CLOSE_MMI_CMD_ID_IMMEDIATE                                  0x00
++#define MMI_CLOSE_MMI_CMD_ID_DELAY                                      0x01
++
++#define MMI_DISPLAY_CONTROL_CMD_ID_SET_MMI_MODE                         0x01
++#define MMI_DISPLAY_CONTROL_CMD_ID_GET_DISPLAY_CHAR_TABLES              0x02
++#define MMI_DISPLAY_CONTROL_CMD_ID_GET_INPUT_CHAR_TABLES                0x03
++#define MMI_DISPLAY_CONTROL_CMD_ID_GET_OVERLAY_GFX_CHARACTERISTICS      0x04
++#define MMI_DISPLAY_CONTROL_CMD_ID_GET_FULLSCREEN_GFX_CHARACTERISTICS   0x05
++
++#define MMI_DISPLAY_REPLY_ID_MMI_MODE_ACK                               0x01
++#define MMI_DISPLAY_REPLY_ID_LIST_DISPLAY_CHAR_TABLES                   0x02
++#define MMI_DISPLAY_REPLY_ID_LIST_INPUT_CHAR_TABLES                     0x03
++#define MMI_DISPLAY_REPLY_ID_LIST_OVERLAY_GFX_CHARACTERISTICS           0x04
++#define MMI_DISPLAY_REPLY_ID_LIST_FULLSCREEN_GFX_CHARACTERISTICS        0x05
++#define MMI_DISPLAY_REPLY_ID_UNKNOWN_CMD_ID                             0xF0
++#define MMI_DISPLAY_REPLY_ID_UNKNOWN_MMI_MODE                           0xF1
++#define MMI_DISPLAY_REPLY_ID_UNKNOWN_CHAR_TABLE                         0xF2
++
++#define MMI_MODE_HIGH_LEVEL                                             0x01
++#define MMI_MODE_LOW_LEVEL_OVERLAY_GFX                                  0x02
++#define MMI_MODE_LOW_LEVEL_FULLSCREEN_GFX                               0x03
++
++#define MMI_KEYPAD_CONTROL_CMD_ID_INTERCEPT_ALL                         0x01
++#define MMI_KEYPAD_CONTROL_CMD_ID_IGNORE_ALL                            0x02
++#define MMI_KEYPAD_CONTROL_CMD_ID_INTERCEPT_SELECTED                    0x03
++#define MMI_KEYPAD_CONTROL_CMD_ID_IGNORE_SELECTED                       0x04
++#define MMI_KEYPAD_CONTROL_CMD_ID_REJECT_KEYPRESS                       0x05
++
++#define MMI_GFX_VIDEO_RELATION_NONE                                     0x00
++#define MMI_GFX_VIDEO_RELATION_MATCHES_EXACTLY                          0x07
++
++#define MMI_DISPLAY_MESSAGE_ID_OK                                       0x00
++#define MMI_DISPLAY_MESSAGE_ID_ERROR                                    0x01
++#define MMI_DISPLAY_MESSAGE_ID_OUT_OF_MEMORY                            0x02
++#define MMI_DISPLAY_MESSAGE_ID_SUBTITLE_SYNTAX_ERROR                    0x03
++#define MMI_DISPLAY_MESSAGE_ID_UNDEFINED_REGION                         0x04
++#define MMI_DISPLAY_MESSAGE_ID_UNDEFINED_CLUT                           0x05
++#define MMI_DISPLAY_MESSAGE_ID_UNDEFINED_OBJECT                         0x06
++#define MMI_DISPLAY_MESSAGE_ID_INCOMPATABLE_OBJECT                      0x07
++#define MMI_DISPLAY_MESSAGE_ID_UNKNOWN_CHARACTER                        0x08
++#define MMI_DISPLAY_MESSAGE_ID_DISPLAY_CHANGED                          0x09
++
++#define MMI_DOWNLOAD_REPLY_ID_OK                                        0x00
++#define MMI_DOWNLOAD_REPLY_ID_NOT_OBJECT_SEGMENT                        0x01
++#define MMI_DOWNLOAD_REPLY_ID_OUT_OF_MEMORY                             0x02
++
++#define MMI_ANSW_ID_CANCEL                                              0x00
++#define MMI_ANSW_ID_ANSWER                                              0x01
++
++/**
++ * A pixel depth as supplied with display_reply details
++ */
++struct en50221_app_mmi_pixel_depth {
++      uint8_t display_depth;
++      uint8_t pixels_per_byte;
++      uint8_t region_overhead;
++};
++
++/**
++ * Details returned with a display_reply
++ */
++struct en50221_app_mmi_display_reply_details {
++      union {
++              struct {
++                      uint16_t width;
++                      uint16_t height;
++                      uint8_t aspect_ratio;
++                      uint8_t gfx_relation_to_video;  /* one of MMI_GFX_VIDEO_RELATION_* */
++                      uint8_t multiple_depths;
++                      uint16_t display_bytes;
++                      uint8_t composition_buffer_bytes;
++                      uint8_t object_cache_bytes;
++                      uint8_t num_pixel_depths;
++                      struct en50221_app_mmi_pixel_depth *pixel_depths;
++              } gfx;  /* MMI_DISPLAY_REPLY_ID_LIST_OVERLAY_GFX_CHARACTERISTICS or
++                              MMI_DISPLAY_REPLY_ID_LIST_FULLSCREEN_GFX_CHARACTERISTICS */
++
++              struct {
++                      uint32_t table_length;
++                      uint8_t *table;
++              } char_table;   /* MMI_DISPLAY_REPLY_ID_LIST_DISPLAY_CHAR_TABLES or
++                                      MMI_DISPLAY_REPLY_ID_LIST_INPUT_CHAR_TABLES */
++
++              struct {
++                      uint8_t mmi_mode;       /* one of the MMI_MODE_* values */
++              } mode_ack;     /* for MMI_DISPLAY_REPLY_ID_MMI_MODE_ACK */
++      } u;
++};
++
++/**
++ * Pointer to a text string.
++ */
++struct en50221_app_mmi_text {
++      uint8_t *text;
++      uint32_t text_length;
++};
++
++/**
++ * Type definition for close - called when we receive an mmi_close from a CAM.
++ *
++ * @param arg Private argument.
++ * @param slot_id Slot id concerned.
++ * @param session_number Session number concerned.
++ * @param cmd_id One of the MMI_CLOSE_MMI_CMD_ID_* values.
++ * @param delay Delay supplied with MMI_CLOSE_MMI_CMD_ID_DELAY.
++ * @return 0 on success, -1 on failure.
++ */
++typedef int (*en50221_app_mmi_close_callback) (void *arg,
++                                             uint8_t slot_id,
++                                             uint16_t session_number,
++                                             uint8_t cmd_id,
++                                             uint8_t delay);
++
++/**
++ * Type definition for display_control callback.
++ *
++ * @param arg Private argument.
++ * @param slot_id Slot id concerned.
++ * @param session_number Session number concerned.
++ * @param cmd_id One of the MMI_DISPLAY_CONTROL_CMD_ID_* values.
++ * @param delay One of the MMI_MODE_* values.
++ * @return 0 on success, -1 on failure.
++ */
++typedef int (*en50221_app_mmi_display_control_callback) (void *arg,
++                                                       uint8_t slot_id,
++                                                       uint16_t session_number,
++                                                       uint8_t cmd_id,
++                                                       uint8_t mmi_mode);
++
++/**
++ * Type definition for keypad_control callback.
++ *
++ * @param arg Private argument.
++ * @param slot_id Slot id concerned.
++ * @param session_number Session number concerned.
++ * @param cmd_id One of the MMI_KEYPAD_CONTROL_CMD_ID_* values.
++ * @param key_codes Pointer to the key codes.
++ * @param key_codes_count Number of key codes.
++ * @return 0 on success, -1 on failure.
++ */
++typedef int (*en50221_app_mmi_keypad_control_callback) (void *arg,
++                                                      uint8_t slot_id,
++                                                      uint16_t session_number,
++                                                      uint8_t cmd_id,
++                                                      uint8_t *key_codes,
++                                                      uint32_t key_codes_count);
++
++/**
++ * Type definition for subtitle_segment callback.
++ *
++ * @param arg Private argument.
++ * @param slot_id Slot id concerned.
++ * @param session_number Session number concerned.
++ * @param segment Pointer to the segment data.
++ * @param segment_size Size of segment data.
++ * @return 0 on success, -1 on failure.
++ */
++typedef int (*en50221_app_mmi_subtitle_segment_callback) (void *arg,
++                                                        uint8_t slot_id,
++                                                        uint16_t session_number,
++                                                        uint8_t *segment,
++                                                        uint32_t segment_size);
++
++/**
++ * Type definition for scene_end_mark callback.
++ *
++ * @param arg Private argument.
++ * @param slot_id Slot id concerned.
++ * @param session_number Session number concerned.
++ * @param decoder_continue_flag
++ * @param scene_reveal_flag
++ * @param send_scene_done
++ * @param scene_tag
++ * @return 0 on success, -1 on failure.
++ */
++typedef int (*en50221_app_mmi_scene_end_mark_callback) (void *arg,
++                                                      uint8_t slot_id,
++                                                      uint16_t session_number,
++                                                      uint8_t decoder_continue_flag,
++                                                      uint8_t scene_reveal_flag,
++                                                      uint8_t send_scene_done,
++                                                      uint8_t scene_tag);
++
++/**
++ * Type definition for scene_control callback.
++ *
++ * @param arg Private argument.
++ * @param slot_id Slot id concerned.
++ * @param session_number Session number concerned.
++ * @param decoder_continue_flag
++ * @param scene_reveal_flag
++ * @param scene_tag
++ * @return 0 on success, -1 on failure.
++ */
++typedef int (*en50221_app_mmi_scene_control_callback) (void *arg,
++                                                     uint8_t slot_id,
++                                                     uint16_t session_number,
++                                                     uint8_t decoder_continue_flag,
++                                                     uint8_t scene_reveal_flag,
++                                                     uint8_t scene_tag);
++
++/**
++ * Type definition for subtitle_download callback.
++ *
++ * @param arg Private argument.
++ * @param slot_id Slot id concerned.
++ * @param session_number Session number concerned.
++ * @param segment Pointer to the segment data.
++ * @param segment_size Size of segment data.
++ * @return 0 on success, -1 on failure.
++ */
++typedef int (*en50221_app_mmi_subtitle_download_callback) (void *arg,
++                                                         uint8_t slot_id,
++                                                         uint16_t session_number,
++                                                         uint8_t *segment,
++                                                         uint32_t segment_size);
++
++/**
++ * Type definition for flush_download callback.
++ *
++ * @param arg Private argument.
++ * @param slot_id Slot id concerned.
++ * @param session_number Session number concerned.
++ * @return 0 on success, -1 on failure.
++ */
++typedef int (*en50221_app_mmi_flush_download_callback) (void *arg,
++                                                      uint8_t slot_id,
++                                                      uint16_t session_number);
++
++/**
++ * Type definition for enq callback.
++ *
++ * @param arg Private argument.
++ * @param slot_id Slot id concerned.
++ * @param session_number Session number concerned.
++ * @param blind_answer 1=>Obscure text input in some manner,
++ * @param expected_answer_length Expected max number of characters to be returned.
++ * @param text Pointer to the text data.
++ * @param text_size Size of text data.
++ * @return 0 on success, -1 on failure.
++ */
++typedef int (*en50221_app_mmi_enq_callback) (void *arg,
++                                           uint8_t slot_id,
++                                           uint16_t session_number,
++                                           uint8_t blind_answer,
++                                           uint8_t expected_answer_length,
++                                           uint8_t * text,
++                                           uint32_t text_size);
++
++/**
++ * Type definition for menu callback.
++ *
++ * @param arg Private argument.
++ * @param slot_id Slot id concerned.
++ * @param session_number Session number concerned.
++ * @param title Title text.
++ * @param sub_title Sub-Title text.
++ * @param bottom Bottom text.
++ * @param item_count Number of text elements in items.
++ * @param items Pointer to array of en50221_app_mmi_text structures which are standard menu choices,
++ * @param item_raw_length Length of item raw data.
++ * @param items_raw If nonstandard items were supplied, pointer to their data.
++ * @return 0 on success, -1 on failure.
++ */
++typedef int (*en50221_app_mmi_menu_callback) (void *arg,
++                                            uint8_t slot_id,
++                                            uint16_t session_number,
++                                            struct en50221_app_mmi_text *title,
++                                            struct en50221_app_mmi_text *sub_title,
++                                            struct en50221_app_mmi_text *bottom,
++                                            uint32_t item_count,
++                                            struct en50221_app_mmi_text *items,
++                                            uint32_t item_raw_length,
++                                            uint8_t *items_raw);
++
++/**
++ * Type definition for list callback.
++ *
++ * @param arg Private argument.
++ * @param slot_id Slot id concerned.
++ * @param session_number Session number concerned.
++ * @param title Title text.
++ * @param sub_title Sub-Title text.
++ * @param bottom Bottom text.
++ * @param item_count Number of text elements in items.
++ * @param items Pointer to array of en50221_app_mmi_text structures which are standard menu choices,
++ * @param item_raw_length Length of item raw data.
++ * @param items_raw If nonstandard items were supplied, pointer to their data.
++ * @return 0 on success, -1 on failure.
++ */
++typedef int (*en50221_app_mmi_list_callback) (void *arg,
++                                            uint8_t slot_id,
++                                            uint16_t session_number,
++                                            struct en50221_app_mmi_text *title,
++                                            struct en50221_app_mmi_text *sub_title,
++                                            struct en50221_app_mmi_text *bottom,
++                                            uint32_t item_count,
++                                            struct en50221_app_mmi_text *items,
++                                            uint32_t item_raw_length,
++                                            uint8_t *items_raw);
++
++/**
++ * Opaque type representing a mmi resource.
++ */
++struct en50221_app_mmi;
++
++/**
++ * Create an instance of the mmi resource.
++ *
++ * @param funcs Send functions to use.
++ * @return Instance, or NULL on failure.
++ */
++extern struct en50221_app_mmi *en50221_app_mmi_create(struct en50221_app_send_functions *funcs);
++
++/**
++ * Destroy an instance of the mmi resource.
++ *
++ * @param mmi Instance to destroy.
++ */
++extern void en50221_app_mmi_destroy(struct en50221_app_mmi *mmi);
++
++/**
++ * Informs the mmi object that a session to it has been closed - cleans up internal state.
++ *
++ * @param mmi mmi resource instance.
++ * @param session_number The session concerned.
++ */
++extern void en50221_app_mmi_clear_session(struct en50221_app_mmi *mmi,
++                                        uint16_t session_number);
++
++/**
++ * Register the callback for when we receive an mmi_close request.
++ *
++ * @param mmi mmi resource instance.
++ * @param callback The callback. Set to NULL to remove the callback completely.
++ * @param arg Private data passed as arg0 of the callback.
++ */
++extern void en50221_app_mmi_register_close_callback(struct en50221_app_mmi *mmi,
++                                                  en50221_app_mmi_close_callback callback,
++                                                  void *arg);
++
++/**
++ * Register the callback for when we receive a display control request.
++ *
++ * @param mmi mmi resource instance.
++ * @param callback The callback. Set to NULL to remove the callback completely.
++ * @param arg Private data passed as arg0 of the callback.
++ */
++extern void en50221_app_mmi_register_display_control_callback(struct en50221_app_mmi *mmi,
++                                                            en50221_app_mmi_display_control_callback callback,
++                                                            void *arg);
++
++/**
++ * Register the callback for when we receive a keypad control request.
++ *
++ * @param mmi mmi resource instance.
++ * @param callback The callback. Set to NULL to remove the callback completely.
++ * @param arg Private data passed as arg0 of the callback.
++ */
++extern void en50221_app_mmi_register_keypad_control_callback(struct en50221_app_mmi *mmi,
++                                                           en50221_app_mmi_keypad_control_callback callback,
++                                                           void *arg);
++
++/**
++ * Register the callback for when we receive a subtitle segment request.
++ *
++ * @param mmi mmi resource instance.
++ * @param callback The callback. Set to NULL to remove the callback completely.
++ * @param arg Private data passed as arg0 of the callback.
++ */
++extern void en50221_app_mmi_register_subtitle_segment_callback(struct en50221_app_mmi *mmi,
++                                                             en50221_app_mmi_subtitle_segment_callback callback,
++                                                             void *arg);
++
++/**
++ * Register the callback for when we receive a scene end mark request.
++ *
++ * @param mmi mmi resource instance.
++ * @param callback The callback. Set to NULL to remove the callback completely.
++ * @param arg Private data passed as arg0 of the callback.
++ */
++extern void en50221_app_mmi_register_scene_end_mark_callback(struct en50221_app_mmi *mmi,
++                                                           en50221_app_mmi_scene_end_mark_callback callback,
++                                                           void *arg);
++
++/**
++ * Register the callback for when we receive a scene control request.
++ *
++ * @param mmi mmi resource instance.
++ * @param callback The callback. Set to NULL to remove the callback completely.
++ * @param arg Private data passed as arg0 of the callback.
++ */
++extern void en50221_app_mmi_register_scene_control_callback(struct en50221_app_mmi *mmi,
++                                                          en50221_app_mmi_scene_control_callback callback,
++                                                          void *arg);
++
++/**
++ * Register the callback for when we receive a subtitle download request.
++ *
++ * @param mmi mmi resource instance.
++ * @param callback The callback. Set to NULL to remove the callback completely.
++ * @param arg Private data passed as arg0 of the callback.
++ */
++extern void en50221_app_mmi_register_subtitle_download_callback(struct en50221_app_mmi *mmi,
++                                                              en50221_app_mmi_subtitle_download_callback callback,
++                                                              void *arg);
++
++/**
++ * Register the callback for when we receive a flush download request.
++ *
++ * @param mmi mmi resource instance.
++ * @param callback The callback. Set to NULL to remove the callback completely.
++ * @param arg Private data passed as arg0 of the callback.
++ */
++extern void en50221_app_mmi_register_flush_download_callback(struct en50221_app_mmi *mmi,
++                                                           en50221_app_mmi_flush_download_callback callback,
++                                                           void *arg);
++
++/**
++ * Register the callback for when we receive an enq request.
++ *
++ * @param mmi mmi resource instance.
++ * @param callback The callback. Set to NULL to remove the callback completely.
++ * @param arg Private data passed as arg0 of the callback.
++ */
++extern void en50221_app_mmi_register_enq_callback(struct en50221_app_mmi *mmi,
++                                                en50221_app_mmi_enq_callback callback,
++                                                void *arg);
++
++/**
++ * Register the callback for when we receive a menu request.
++ *
++ * @param mmi mmi resource instance.
++ * @param callback The callback. Set to NULL to remove the callback completely.
++ * @param arg Private data passed as arg0 of the callback.
++ */
++extern void en50221_app_mmi_register_menu_callback(struct en50221_app_mmi *mmi,
++                                                 en50221_app_mmi_menu_callback callback,
++                                                 void *arg);
++
++/**
++ * Register the callback for when we receive a list request.
++ *
++ * @param mmi mmi resource instance.
++ * @param callback The callback. Set to NULL to remove the callback completely.
++ * @param arg Private data passed as arg0 of the callback.
++ */
++extern void en50221_app_mmi_register_list_callback(struct en50221_app_mmi *mmi,
++                                                 en50221_app_mmi_list_callback callback,
++                                                 void *arg);
++
++/**
++ * Send an mmi_close to the cam.
++ *
++ * @param mmi mmi resource instance.
++ * @param session_number Session number to send it on.
++ * @param cmd_id One of the MMI_CLOSE_MMI_CMD_ID_* values.
++ * @param delay Delay to use if MMI_CLOSE_MMI_CMD_ID_DELAY specified.
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_mmi_close(struct en50221_app_mmi *mmi,
++                               uint16_t session_number,
++                               uint8_t cmd_id, uint8_t delay);
++
++/**
++ * Send a display_reply to the cam.
++ *
++ * @param mmi mmi resource instance.
++ * @param session_number Session number to send it on.
++ * @param reply_id One of the MMI_DISPLAY_REPLY_ID_* values.
++ * @param details The details of the reply - can be NULL if the chosen reply_id does not need it.
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_mmi_display_reply(struct en50221_app_mmi *mmi,
++                                       uint16_t session_number,
++                                       uint8_t reply_id,
++                                       struct en50221_app_mmi_display_reply_details *details);
++
++/**
++ * Send a keypress to the cam.
++ *
++ * @param mmi mmi resource instance.
++ * @param session_number Session number to send it on.
++ * @param keycode The keycode.
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_mmi_keypress(struct en50221_app_mmi *mmi,
++                                  uint16_t session_number,
++                                  uint8_t keycode);
++
++/**
++ * Send a display message to the cam.
++ *
++ * @param mmi mmi resource instance.
++ * @param session_number Session number to send it on.
++ * @param display_message_id One of the MMI_DISPLAY_MESSAGE_ID_* values.
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_mmi_display_message(struct en50221_app_mmi *mmi,
++                                         uint16_t session_number,
++                                         uint8_t display_message_id);
++
++/**
++ * Send a scene done message to the cam.
++ *
++ * @param mmi mmi resource instance.
++ * @param session_number Session number to send it on.
++ * @param decoder_continue Copy of flag in scene_end_mark.
++ * @param scene_reveal Copy of flag in scene_end_mark.
++ * @param scene_tag Scene tag this responds to.
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_mmi_scene_done(struct en50221_app_mmi *mmi,
++                                    uint16_t session_number,
++                                    uint8_t decoder_continue,
++                                    uint8_t scene_reveal,
++                                    uint8_t scene_tag);
++
++/**
++ * Send a download reply to the cam.
++ *
++ * @param mmi mmi resource instance.
++ * @param session_number Session number to send it on.
++ * @param object_id Object id.
++ * @param download_reply_id One of the MMI_DOWNLOAD_REPLY_ID_* values.
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_mmi_download_reply(struct en50221_app_mmi *mmi,
++                                        uint16_t session_number,
++                                        uint16_t object_id,
++                                        uint8_t download_reply_id);
++
++/**
++ * Send an answ to the cam.
++ *
++ * @param mmi mmi resource instance.
++ * @param session_number Session number to send it on.
++ * @param answ_id One of the MMI_ANSW_ID_* values.
++ * @param text The text if MMI_ANSW_ID_ANSWER.
++ * @param text_count Length of text.
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_mmi_answ(struct en50221_app_mmi *mmi,
++                              uint16_t session_number,
++                              uint8_t answ_id,
++                              uint8_t * text,
++                              uint32_t text_count);
++
++/**
++ * Send a menu answ to the cam.
++ *
++ * @param mmi mmi resource instance.
++ * @param session_number Session number to send it on.
++ * @param choice_ref Option chosen by user (0=>canceled).
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_mmi_menu_answ(struct en50221_app_mmi *mmi,
++                                   uint16_t session_number,
++                                   uint8_t choice_ref);
++
++/**
++ * Pass data received for this resource into it for parsing.
++ *
++ * @param mmi mmi instance.
++ * @param slot_id Slot ID concerned.
++ * @param session_number Session number concerned.
++ * @param resource_id Resource ID concerned.
++ * @param data The data.
++ * @param data_length Length of data in bytes.
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_mmi_message(struct en50221_app_mmi *mmi,
++                                 uint8_t slot_id,
++                                 uint16_t session_number,
++                                 uint32_t resource_id,
++                                 uint8_t *data,
++                                 uint32_t data_length);
++
++#ifdef __cplusplus
++}
++#endif
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_rm.c dvb-apps/lib/libdvben50221/en50221_app_rm.c
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_rm.c  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_app_rm.c        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,307 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 transport layer
++
++    Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++    Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
++    Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#include <string.h>
++#include <libdvbmisc/dvbmisc.h>
++#include <pthread.h>
++#include <libucsi/endianops.h>
++#include "en50221_app_rm.h"
++#include "en50221_app_tags.h"
++#include "asn_1.h"
++
++struct en50221_app_rm {
++      struct en50221_app_send_functions *funcs;
++
++      en50221_app_rm_enq_callback enqcallback;
++      void *enqcallback_arg;
++
++      en50221_app_rm_reply_callback replycallback;
++      void *replycallback_arg;
++
++      en50221_app_rm_changed_callback changedcallback;
++      void *changedcallback_arg;
++
++      pthread_mutex_t lock;
++};
++
++static int en50221_app_rm_parse_profile_enq(struct en50221_app_rm *rm,
++                                          uint8_t slot_id,
++                                          uint16_t session_number,
++                                          uint8_t * data,
++                                          uint32_t data_length);
++static int en50221_app_rm_parse_profile_reply(struct en50221_app_rm *rm,
++                                            uint8_t slot_id,
++                                            uint16_t session_number,
++                                            uint8_t * data,
++                                            uint32_t data_length);
++static int en50221_app_rm_parse_profile_change(struct en50221_app_rm *rm,
++                                             uint8_t slot_id,
++                                             uint16_t session_number,
++                                             uint8_t * data,
++                                             uint32_t data_length);
++
++
++struct en50221_app_rm *en50221_app_rm_create(struct
++                                           en50221_app_send_functions
++                                           *funcs)
++{
++      struct en50221_app_rm *rm = NULL;
++
++      // create structure and set it up
++      rm = malloc(sizeof(struct en50221_app_rm));
++      if (rm == NULL) {
++              return NULL;
++      }
++      rm->funcs = funcs;
++      rm->enqcallback = NULL;
++      rm->replycallback = NULL;
++      rm->changedcallback = NULL;
++
++      pthread_mutex_init(&rm->lock, NULL);
++
++      // done
++      return rm;
++}
++
++void en50221_app_rm_destroy(struct en50221_app_rm *rm)
++{
++      pthread_mutex_destroy(&rm->lock);
++      free(rm);
++}
++
++void en50221_app_rm_register_enq_callback(struct en50221_app_rm *rm,
++                                        en50221_app_rm_enq_callback
++                                        callback, void *arg)
++{
++      pthread_mutex_lock(&rm->lock);
++      rm->enqcallback = callback;
++      rm->enqcallback_arg = arg;
++      pthread_mutex_unlock(&rm->lock);
++}
++
++void en50221_app_rm_register_reply_callback(struct en50221_app_rm *rm,
++                                          en50221_app_rm_reply_callback
++                                          callback, void *arg)
++{
++      pthread_mutex_lock(&rm->lock);
++      rm->replycallback = callback;
++      rm->replycallback_arg = arg;
++      pthread_mutex_unlock(&rm->lock);
++}
++
++void en50221_app_rm_register_changed_callback(struct en50221_app_rm *rm,
++                                            en50221_app_rm_changed_callback
++                                            callback, void *arg)
++{
++      pthread_mutex_lock(&rm->lock);
++      rm->changedcallback = callback;
++      rm->changedcallback_arg = arg;
++      pthread_mutex_unlock(&rm->lock);
++}
++
++int en50221_app_rm_enq(struct en50221_app_rm *rm, uint16_t session_number)
++{
++      uint8_t buf[4];
++
++      // set up the tag
++      buf[0] = (TAG_PROFILE_ENQUIRY >> 16) & 0xFF;
++      buf[1] = (TAG_PROFILE_ENQUIRY >> 8) & 0xFF;
++      buf[2] = TAG_PROFILE_ENQUIRY & 0xFF;
++      buf[3] = 0;
++
++      // create the data and send it
++      return rm->funcs->send_data(rm->funcs->arg, session_number, buf, 4);
++}
++
++int en50221_app_rm_reply(struct en50221_app_rm *rm,
++                       uint16_t session_number,
++                       uint32_t resource_id_count,
++                       uint32_t * resource_ids)
++{
++      uint8_t buf[10];
++
++      // set up the tag
++      buf[0] = (TAG_PROFILE >> 16) & 0xFF;
++      buf[1] = (TAG_PROFILE >> 8) & 0xFF;
++      buf[2] = TAG_PROFILE & 0xFF;
++
++      // encode the length field
++      int length_field_len;
++      if ((length_field_len = asn_1_encode(resource_id_count * 4, buf + 3, 3)) < 0) {
++              return -1;
++      }
++      // copy the data and byteswap it
++      uint32_t *copy_resource_ids = alloca(4 * resource_id_count);
++      if (copy_resource_ids == NULL) {
++              return -1;
++      }
++      uint8_t *data = (uint8_t *) copy_resource_ids;
++      memcpy(data, resource_ids, resource_id_count * 4);
++      uint32_t i;
++      for (i = 0; i < resource_id_count; i++) {
++              bswap32(data);
++              data += 4;
++      }
++
++      // build the iovecs
++      struct iovec iov[2];
++      iov[0].iov_base = buf;
++      iov[0].iov_len = 3 + length_field_len;
++      iov[1].iov_base = (uint8_t *) copy_resource_ids;
++      iov[1].iov_len = resource_id_count * 4;
++
++      // create the data and send it
++      return rm->funcs->send_datav(rm->funcs->arg, session_number, iov, 2);
++}
++
++int en50221_app_rm_changed(struct en50221_app_rm *rm,
++                         uint16_t session_number)
++{
++      uint8_t buf[4];
++
++      // set up the tag
++      buf[0] = (TAG_PROFILE_CHANGE >> 16) & 0xFF;
++      buf[1] = (TAG_PROFILE_CHANGE >> 8) & 0xFF;
++      buf[2] = TAG_PROFILE_CHANGE & 0xFF;
++      buf[3] = 0;
++
++      // create the data and send it
++      return rm->funcs->send_data(rm->funcs->arg, session_number, buf, 4);
++}
++
++int en50221_app_rm_message(struct en50221_app_rm *rm,
++                         uint8_t slot_id,
++                         uint16_t session_number,
++                         uint32_t resource_id,
++                         uint8_t * data, uint32_t data_length)
++{
++      (void) resource_id;
++
++      // get the tag
++      if (data_length < 3) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      uint32_t tag = (data[0] << 16) | (data[1] << 8) | data[2];
++
++      // dispatch it
++      switch (tag) {
++      case TAG_PROFILE_ENQUIRY:
++              return en50221_app_rm_parse_profile_enq(rm, slot_id,
++                                                      session_number,
++                                                      data + 3,
++                                                      data_length - 3);
++      case TAG_PROFILE:
++              return en50221_app_rm_parse_profile_reply(rm, slot_id,
++                                                        session_number,
++                                                        data + 3,
++                                                        data_length - 3);
++      case TAG_PROFILE_CHANGE:
++              return en50221_app_rm_parse_profile_change(rm, slot_id,
++                                                         session_number,
++                                                         data + 3,
++                                                         data_length - 3);
++      }
++
++      print(LOG_LEVEL, ERROR, 1, "Received unexpected tag %x\n", tag);
++      return -1;
++}
++
++
++static int en50221_app_rm_parse_profile_enq(struct en50221_app_rm *rm,
++                                          uint8_t slot_id,
++                                          uint16_t session_number,
++                                          uint8_t * data,
++                                          uint32_t data_length)
++{
++      (void) data;
++      (void) data_length;
++
++      pthread_mutex_lock(&rm->lock);
++      en50221_app_rm_enq_callback cb = rm->enqcallback;
++      void *cb_arg = rm->enqcallback_arg;
++      pthread_mutex_unlock(&rm->lock);
++      if (cb) {
++              return cb(cb_arg, slot_id, session_number);
++      }
++      return 0;
++}
++
++static int en50221_app_rm_parse_profile_reply(struct en50221_app_rm *rm,
++                                            uint8_t slot_id,
++                                            uint16_t session_number,
++                                            uint8_t * data,
++                                            uint32_t data_length)
++{
++      // first of all, decode the length field
++      uint16_t asn_data_length;
++      int length_field_len;
++      if ((length_field_len = asn_1_decode(&asn_data_length, data, data_length)) < 0) {
++              print(LOG_LEVEL, ERROR, 1, "ASN.1 decode error\n");
++              return -1;
++      }
++      // check it
++      if (asn_data_length > (data_length - length_field_len)) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      uint32_t resources_count = asn_data_length / 4;
++      uint32_t *resource_ids = (uint32_t *) (data + length_field_len);
++      data += length_field_len;
++
++      // byteswap it
++      uint32_t i;
++      for (i = 0; i < resources_count; i++) {
++              bswap32(data);
++              data += 4;
++      }
++
++      // inform observer
++      pthread_mutex_lock(&rm->lock);
++      en50221_app_rm_reply_callback cb = rm->replycallback;
++      void *cb_arg = rm->replycallback_arg;
++      pthread_mutex_unlock(&rm->lock);
++      if (cb) {
++              return cb(cb_arg, slot_id, session_number, resources_count, resource_ids);
++      }
++      return 0;
++}
++
++static int en50221_app_rm_parse_profile_change(struct en50221_app_rm *rm,
++                                             uint8_t slot_id,
++                                             uint16_t session_number,
++                                             uint8_t * data,
++                                             uint32_t data_length)
++{
++      (void) data;
++      (void) data_length;
++
++      pthread_mutex_lock(&rm->lock);
++      en50221_app_rm_changed_callback cb = rm->changedcallback;
++      void *cb_arg = rm->changedcallback_arg;
++      pthread_mutex_unlock(&rm->lock);
++      if (cb) {
++              return cb(cb_arg, slot_id, session_number);
++      }
++      return 0;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_rm.h dvb-apps/lib/libdvben50221/en50221_app_rm.h
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_rm.h  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_app_rm.h        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,187 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 transport layer
++
++    Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++    Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
++    Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#ifndef __EN50221_APPLICATION_RM_H__
++#define __EN50221_APPLICATION_RM_H__
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include <stdlib.h>
++#include <stdint.h>
++#include <libdvben50221/en50221_app_utils.h>
++
++#define EN50221_APP_RM_RESOURCEID MKRID(1,1,1)
++
++/**
++ * Type definition for profile_enq callback function - called when we receive
++ * a profile_enq from a CAM.
++ *
++ * @param arg Private argument.
++ * @param slot_id Slot id concerned.
++ * @param session_number Session number concerned.
++ * @return 0 on success, -1 on failure.
++ */
++typedef int (*en50221_app_rm_enq_callback) (void *arg,
++                                          uint8_t slot_id,
++                                          uint16_t session_number);
++
++/**
++ * Type definition for profile_reply callback function - called when we receive
++ * a profile_reply from a CAM.
++ *
++ * @param arg Private argument.
++ * @param slot_id Slot id concerned.
++ * @param session_number Session number concerned.
++ * @param resource_id_count Number of resource_ids.
++ * @param resource_ids The resource ids themselves.
++ * @return 0 on success, -1 on failure.
++ */
++typedef int (*en50221_app_rm_reply_callback) (void *arg,
++                                            uint8_t slot_id,
++                                            uint16_t session_number,
++                                            uint32_t resource_id_count,
++                                            uint32_t *resource_ids);
++/**
++ * Type definition for profile_changed callback function - called when we receive
++ * a profile_changed from a CAM.
++ *
++ * @param arg Private argument.
++ * @param slot_id Slot id concerned.
++ * @param session_number Session number concerned.
++ * @return 0 on success, -1 on failure.
++ */
++typedef int (*en50221_app_rm_changed_callback) (void *arg,
++                                              uint8_t slot_id,
++                                              uint16_t session_number);
++
++
++
++/**
++ * Opaque type representing a resource manager.
++ */
++struct en50221_app_rm;
++
++/**
++ * Create an instance of the resource manager.
++ *
++ * @param funcs Send functions to use.
++ * @return Instance, or NULL on failure.
++ */
++extern struct en50221_app_rm *en50221_app_rm_create(struct en50221_app_send_functions *funcs);
++
++/**
++ * Destroy an instance of the resource manager.
++ *
++ * @param rm Instance to destroy.
++ */
++extern void en50221_app_rm_destroy(struct en50221_app_rm *rm);
++
++/**
++ * Register the callback for when we receive a profile_enq from a CAM.
++ *
++ * @param rm Resource manager instance.
++ * @param callback The callback. Set to NULL to remove the callback completely.
++ * @param arg Private data passed as arg0 of the callback.
++ */
++extern void en50221_app_rm_register_enq_callback(struct en50221_app_rm *rm,
++                                               en50221_app_rm_enq_callback callback,
++                                               void *arg);
++
++/**
++ * Register the callback for when we receive a profile_reply from a CAM.
++ *
++ * @param rm Resource manager instance.
++ * @param callback The callback. Set to NULL to remove the callback completely.
++ * @param arg Private data passed as arg0 of the callback.
++ */
++extern void en50221_app_rm_register_reply_callback(struct en50221_app_rm *rm,
++                                                 en50221_app_rm_reply_callback callback,
++                                                 void *arg);
++
++/**
++ * Register the callback for when we receive a profile_changed from a CAM.
++ *
++ * @param rm Resource manager instance.
++ * @param callback The callback. Set to NULL to remove the callback completely.
++ * @param arg Private data passed as arg0 of the callback.
++ */
++extern void en50221_app_rm_register_changed_callback(struct en50221_app_rm *rm,
++                                                   en50221_app_rm_changed_callback callback,
++                                                   void *arg);
++
++/**
++ * Send a profile_enq to a CAM.
++ *
++ * @param rm Resource manager resource instance.
++ * @param session_number Session number to send it on.
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_rm_enq(struct en50221_app_rm *rm, uint16_t session_number);
++
++/**
++ * Send a profile_reply to a CAM.
++ *
++ * @param rm Resource manager resource instance.
++ * @param session_number Session number to send it on.
++ * @param resource_id_count Number of resource ids.
++ * @param resource_ids The resource IDs themselves
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_rm_reply(struct en50221_app_rm *rm,
++                              uint16_t session_number,
++                              uint32_t resource_id_count,
++                              uint32_t * resource_ids);
++
++/**
++ * Send a profile_changed to a CAM.
++ *
++ * @param rm Resource manager resource instance.
++ * @param session_number Session number to send it on.
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_rm_changed(struct en50221_app_rm *rm, uint16_t session_number);
++
++/**
++ * Pass data received for this resource into it for parsing.
++ *
++ * @param rm rm instance.
++ * @param slot_id Slot ID concerned.
++ * @param session_number Session number concerned.
++ * @param resource_id Resource ID concerned.
++ * @param data The data.
++ * @param data_length Length of data in bytes.
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_rm_message(struct en50221_app_rm *rm,
++                                uint8_t slot_id,
++                                uint16_t session_number,
++                                uint32_t resource_id,
++                                uint8_t *data,
++                                uint32_t data_length);
++
++#ifdef __cplusplus
++}
++#endif
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_smartcard.c dvb-apps/lib/libdvben50221/en50221_app_smartcard.c
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_smartcard.c   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_app_smartcard.c 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,296 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 transport layer
++
++    Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++    Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
++    Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#include <string.h>
++#include <libdvbmisc/dvbmisc.h>
++#include <pthread.h>
++#include "en50221_app_smartcard.h"
++#include "en50221_app_tags.h"
++#include "asn_1.h"
++
++struct en50221_app_smartcard {
++      struct en50221_app_send_functions *funcs;
++
++      en50221_app_smartcard_command_callback command_callback;
++      void *command_callback_arg;
++
++      en50221_app_smartcard_send_callback send_callback;
++      void *send_callback_arg;
++
++      pthread_mutex_t lock;
++};
++
++static int en50221_app_smartcard_parse_command(struct en50221_app_smartcard *smartcard,
++                                             uint8_t slot_id,
++                                             uint16_t session_number,
++                                             uint8_t * data,
++                                             uint32_t data_length);
++
++static int en50221_app_smartcard_parse_send(struct en50221_app_smartcard *smartcard,
++                                          uint8_t slot_id,
++                                          uint16_t session_number,
++                                          uint8_t * data,
++                                          uint32_t data_length);
++
++
++struct en50221_app_smartcard *en50221_app_smartcard_create(struct en50221_app_send_functions *funcs)
++{
++      struct en50221_app_smartcard *smartcard = NULL;
++
++      // create structure and set it up
++      smartcard = malloc(sizeof(struct en50221_app_smartcard));
++      if (smartcard == NULL) {
++              return NULL;
++      }
++      smartcard->funcs = funcs;
++      smartcard->command_callback = NULL;
++      smartcard->send_callback = NULL;
++
++      pthread_mutex_init(&smartcard->lock, NULL);
++
++      // done
++      return smartcard;
++}
++
++void en50221_app_smartcard_destroy(struct en50221_app_smartcard *smartcard)
++{
++      pthread_mutex_destroy(&smartcard->lock);
++      free(smartcard);
++}
++
++void en50221_app_smartcard_register_command_callback(struct en50221_app_smartcard *smartcard,
++                                                   en50221_app_smartcard_command_callback callback, void *arg)
++{
++      pthread_mutex_lock(&smartcard->lock);
++      smartcard->command_callback = callback;
++      smartcard->command_callback_arg = arg;
++      pthread_mutex_unlock(&smartcard->lock);
++}
++
++void en50221_app_smartcard_register_send_callback(struct en50221_app_smartcard *smartcard,
++                                                en50221_app_smartcard_send_callback callback, void *arg)
++{
++      pthread_mutex_lock(&smartcard->lock);
++      smartcard->send_callback = callback;
++      smartcard->send_callback_arg = arg;
++      pthread_mutex_unlock(&smartcard->lock);
++}
++
++int en50221_app_smartcard_command_reply(struct en50221_app_smartcard *smartcard,
++                                      uint16_t session_number,
++                                      uint8_t reply_id, uint8_t status,
++                                      uint8_t *data,
++                                      uint32_t data_length)
++{
++      uint8_t hdr[10];
++      struct iovec iovec[2];
++      int iov_count = 0;
++
++      // the tag
++      hdr[0] = (TAG_SMARTCARD_REPLY >> 16) & 0xFF;
++      hdr[1] = (TAG_SMARTCARD_REPLY >> 8) & 0xFF;
++      hdr[2] = TAG_SMARTCARD_REPLY & 0xFF;
++
++      // the rest of the data
++      if (reply_id == SMARTCARD_REPLY_ID_ANSW_TO_RESET) {
++              // encode the length field
++              int length_field_len;
++              if ((length_field_len = asn_1_encode(data_length + 2, data + 3, 3)) < 0) {
++                      return -1;
++              }
++              // the rest of the header
++              hdr[3 + length_field_len] = reply_id;
++              hdr[3 + length_field_len + 1] = status;
++              iovec[0].iov_base = hdr;
++              iovec[0].iov_len = 3 + length_field_len + 2;
++
++              // the data
++              iovec[1].iov_base = data;
++              iovec[1].iov_len = data_length;
++              iov_count = 2;
++      } else {
++              hdr[3] = 2;
++              hdr[4] = reply_id;
++              hdr[5] = status;
++              iovec[0].iov_base = data;
++              iovec[0].iov_len = 6;
++              iov_count = 1;
++      }
++
++      return smartcard->funcs->send_datav(smartcard->funcs->arg, session_number, iovec, iov_count);
++}
++
++int en50221_app_smartcard_receive(struct en50221_app_smartcard *smartcard,
++                                uint16_t session_number,
++                                uint8_t *data,
++                                uint32_t data_length,
++                                uint8_t SW1, uint8_t SW2)
++{
++      uint8_t buf[10];
++      uint8_t trailer[10];
++
++      // set up the tag
++      buf[0] = (TAG_SMARTCARD_RCV >> 16) & 0xFF;
++      buf[1] = (TAG_SMARTCARD_RCV >> 8) & 0xFF;
++      buf[2] = TAG_SMARTCARD_RCV & 0xFF;
++
++      // encode the length field
++      int length_field_len;
++      if ((length_field_len = asn_1_encode(data_length + 2, buf + 3, 3)) < 0) {
++              return -1;
++      }
++      // set up the trailer
++      trailer[0] = SW1;
++      trailer[1] = SW2;
++
++      // build the iovecs
++      struct iovec iov[3];
++      iov[0].iov_base = buf;
++      iov[0].iov_len = 3 + length_field_len;
++      iov[1].iov_base = data;
++      iov[1].iov_len = data_length;
++      iov[2].iov_base = trailer;
++      iov[2].iov_len = 2;
++
++      // create the data and send it
++      return smartcard->funcs->send_datav(smartcard->funcs->arg,
++                                          session_number, iov, 3);
++}
++
++int en50221_app_smartcard_message(struct en50221_app_smartcard *smartcard,
++                                uint8_t slot_id,
++                                uint16_t session_number,
++                                uint32_t resource_id,
++                                uint8_t *data, uint32_t data_length)
++{
++      (void) resource_id;
++
++      // get the tag
++      if (data_length < 3) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      uint32_t tag = (data[0] << 16) | (data[1] << 8) | data[2];
++
++      switch (tag) {
++      case TAG_SMARTCARD_COMMAND:
++              return en50221_app_smartcard_parse_command(smartcard,
++                                                         slot_id,
++                                                         session_number,
++                                                         data + 3,
++                                                         data_length - 3);
++      case TAG_SMARTCARD_SEND:
++              return en50221_app_smartcard_parse_send(smartcard, slot_id,
++                                                      session_number,
++                                                      data + 3,
++                                                      data_length - 3);
++      }
++
++      print(LOG_LEVEL, ERROR, 1, "Received unexpected tag %x\n", tag);
++      return -1;
++}
++
++
++
++
++
++
++
++static int en50221_app_smartcard_parse_command(struct en50221_app_smartcard *smartcard,
++                                             uint8_t slot_id,
++                                             uint16_t session_number,
++                                             uint8_t * data,
++                                             uint32_t data_length)
++{
++      if (data_length != 2) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      if (data[0] != 1) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      uint8_t command_id = data[1];
++
++      // tell the app
++      pthread_mutex_lock(&smartcard->lock);
++      en50221_app_smartcard_command_callback cb = smartcard->command_callback;
++      void *cb_arg = smartcard->command_callback_arg;
++      pthread_mutex_unlock(&smartcard->lock);
++      if (cb) {
++              return cb(cb_arg, slot_id, session_number, command_id);
++      }
++      return 0;
++}
++
++static int en50221_app_smartcard_parse_send(struct en50221_app_smartcard *smartcard,
++                                          uint8_t slot_id,
++                                          uint16_t session_number,
++                                          uint8_t * data,
++                                          uint32_t data_length)
++{
++      // first of all, decode the length field
++      uint16_t asn_data_length;
++      int length_field_len;
++      if ((length_field_len = asn_1_decode(&asn_data_length, data, data_length)) < 0) {
++              print(LOG_LEVEL, ERROR, 1, "ASN.1 decode error\n");
++              return -1;
++      }
++      // check it
++      if (asn_data_length < 8) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      if (asn_data_length > (data_length - length_field_len)) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      data += length_field_len;
++
++      // parse
++      uint8_t CLA = data[0];
++      uint8_t INS = data[1];
++      uint8_t P1 = data[2];
++      uint8_t P2 = data[3];
++      uint16_t length_in = (data[4] << 8) | data[5];
++      uint8_t *data_in = data + 6;
++
++      // validate the length
++      if ((length_in + 8) != asn_data_length) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      uint16_t length_out =
++          (data[6 + length_in] << 8) | data[6 + length_in + 1];
++
++      // tell the app
++      pthread_mutex_lock(&smartcard->lock);
++      en50221_app_smartcard_send_callback cb = smartcard->send_callback;
++      void *cb_arg = smartcard->send_callback_arg;
++      pthread_mutex_unlock(&smartcard->lock);
++      if (cb) {
++              return cb(cb_arg, slot_id, session_number, CLA, INS, P1,
++                        P2, data_in, length_in, length_out);
++      }
++      return 0;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_smartcard.h dvb-apps/lib/libdvben50221/en50221_app_smartcard.h
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_smartcard.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_app_smartcard.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,200 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 transport layer
++
++    Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++    Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
++    Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#ifndef __EN50221_APPLICATION_smartcard_H__
++#define __EN50221_APPLICATION_smartcard_H__
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include <stdlib.h>
++#include <stdint.h>
++#include <libdvben50221/en50221_app_utils.h>
++
++#define SMARTCARD_COMMAND_ID_CONNECT            0x01
++#define SMARTCARD_COMMAND_ID_DISCONNECT         0x02
++#define SMARTCARD_COMMAND_ID_POWERON_CARD       0x03
++#define SMARTCARD_COMMAND_ID_POWEROFF_CARD      0x04
++#define SMARTCARD_COMMAND_ID_RESET_CARD         0x05
++#define SMARTCARD_COMMAND_ID_RESET_STATUS       0x06
++#define SMARTCARD_COMMAND_ID_READ_ANSW_TO_RESET 0x07
++
++#define SMARTCARD_REPLY_ID_CONNECTED            0x01
++#define SMARTCARD_REPLY_ID_FREE                 0x02
++#define SMARTCARD_REPLY_ID_BUSY                 0x03
++#define SMARTCARD_REPLY_ID_ANSW_TO_RESET        0x04
++#define SMARTCARD_REPLY_ID_NO_ANSW_TO_RESET     0x05
++
++#define SMARTCARD_STATUS_CARD_INSERTED          0x01
++#define SMARTCARD_STATUS_CARD_REMOVED           0x02
++#define SMARTCARD_STATUS_CARD_IN_PLACE_POWEROFF 0x03
++#define SMARTCARD_STATUS_CARD_IN_PLACE_POWERON  0x04
++#define SMARTCARD_STATUS_CARD_NO_CARD           0x05
++#define SMARTCARD_STATUS_CARD_UNRESPONSIVE_CARD 0x06
++#define SMARTCARD_STATUS_CARD_REFUSED_CARD      0x07
++
++#define EN50221_APP_SMARTCARD_RESOURCEID(DEVICE_NUMBER) MKRID(112, ((DEVICE_NUMBER)& 0x0f), 1)
++
++
++
++/**
++ * Type definition for command - called when we receive a command.
++ *
++ * @param arg Private argument.
++ * @param slot_id Slot id concerned.
++ * @param session_number Session number concerned.
++ * @param command_id One of the SMARTCARD_COMMAND_ID_* values
++ * @return 0 on success, -1 on failure.
++ */
++typedef int (*en50221_app_smartcard_command_callback) (void *arg,
++                                                     uint8_t slot_id,
++                                                     uint16_t session_number,
++                                                     uint8_t command_id);
++
++/**
++ * Type definition for command - called when we receive a send command.
++ *
++ * @param arg Private argument.
++ * @param slot_id Slot id concerned.
++ * @param session_number Session number concerned.
++ * @param CLA CLA value.
++ * @param INS INS value.
++ * @param P1 P1 value.
++ * @param P2 P2 value.
++ * @param in Data to send to the card
++ * @param in_length Number of bytes to send.
++ * @param out_length Number of bytes expected.
++ * @return 0 on success, -1 on failure.
++ */
++typedef int (*en50221_app_smartcard_send_callback) (void *arg,
++                                                  uint8_t slot_id,
++                                                  uint16_t session_number,
++                                                  uint8_t CLA,
++                                                  uint8_t INS,
++                                                  uint8_t P1,
++                                                  uint8_t P2,
++                                                  uint8_t *in,
++                                                  uint32_t in_length,
++                                                  uint32_t out_length);
++
++/**
++ * Opaque type representing a smartcard resource.
++ */
++struct en50221_app_smartcard;
++
++/**
++ * Create an instance of the smartcard resource.
++ *
++ * @param funcs Send functions to use.
++ * @return Instance, or NULL on failure.
++ */
++extern struct en50221_app_smartcard *
++      en50221_app_smartcard_create(struct en50221_app_send_functions *funcs);
++
++/**
++ * Destroy an instance of the smartcard resource.
++ *
++ * @param smartcard Instance to destroy.
++ */
++extern void en50221_app_smartcard_destroy(struct en50221_app_smartcard *smartcard);
++
++/**
++ * Register the callback for when we receive a comms command.
++ *
++ * @param smartcard smartcard resource instance.
++ * @param callback The callback. Set to NULL to remove the callback completely.
++ * @param arg Private data passed as arg0 of the callback.
++ */
++extern void en50221_app_smartcard_register_command_callback(struct en50221_app_smartcard *smartcard,
++                                                          en50221_app_smartcard_command_callback callback,
++                                                          void *arg);
++
++/**
++ * Register the callback for when we receive data to send.
++ *
++ * @param smartcard smartcard resource instance.
++ * @param callback The callback. Set to NULL to remove the callback completely.
++ * @param arg Private data passed as arg0 of the callback.
++ */
++extern void en50221_app_smartcard_register_send_callback(struct en50221_app_smartcard *smartcard,
++                                                       en50221_app_smartcard_send_callback callback,
++                                                       void *arg);
++
++/**
++ * Send a command response to the CAM.
++ *
++ * @param smartcard smartcard resource instance.
++ * @param session_number Session number to send it on.
++ * @param reply_id One of the SMARTCARD_REPLY_ID_* values.
++ * @param status One of the SMARTCARD_STATUS_* values.
++ * @param data Data to send when it is a SMARTCARD_REPLY_ID_ANSW_TO_RESET.
++ * @param data_length Length of data to send.
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_smartcard_command_reply(struct en50221_app_smartcard *smartcard,
++                                             uint16_t session_number,
++                                             uint8_t reply_id,
++                                             uint8_t status,
++                                             uint8_t * data,
++                                             uint32_t data_length);
++
++/**
++ * Send data received from a smartcart to the CAM.
++ *
++ * @param smartcard smartcard resource instance.
++ * @param session_number Session number to send it on.
++ * @param data Data to send when it is a SMARTCARD_REPLY_ID_ANSW_TO_RESET.
++ * @param data_length Length of data to send.
++ * @param SW1 SW1 value.
++ * @param SW2 SW2 value.
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_smartcard_receive(struct en50221_app_smartcard *smartcard,
++                                       uint16_t session_number,
++                                       uint8_t * data,
++                                       uint32_t data_length,
++                                       uint8_t SW1, uint8_t SW2);
++
++/**
++ * Pass data received for this resource into it for parsing.
++ *
++ * @param smartcard smartcard instance.
++ * @param slot_id Slot ID concerned.
++ * @param session_number Session number concerned.
++ * @param resource_id Resource ID concerned.
++ * @param data The data.
++ * @param data_length Length of data in bytes.
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_smartcard_message(struct en50221_app_smartcard *smartcard,
++                                       uint8_t slot_id,
++                                       uint16_t session_number,
++                                       uint32_t resource_id,
++                                       uint8_t * data,
++                                       uint32_t data_length);
++
++#ifdef __cplusplus
++}
++#endif
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_tags.h dvb-apps/lib/libdvben50221/en50221_app_tags.h
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_tags.h        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_app_tags.h      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,104 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 transport layer
++
++    Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++    Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#ifndef __EN50221_APP_TAGS_H__
++#define __EN50221_APP_TAGS_H__
++
++/*    Resource Manager                */
++#define TAG_PROFILE_ENQUIRY           0x9f8010
++#define TAG_PROFILE                   0x9f8011
++#define TAG_PROFILE_CHANGE            0x9f8012
++
++/*    Application Info                */
++#define TAG_APP_INFO_ENQUIRY          0x9f8020
++#define TAG_APP_INFO                  0x9f8021
++#define TAG_ENTER_MENU                        0x9f8022
++
++/*    CA Support                      */
++#define TAG_CA_INFO_ENQUIRY           0x9f8030
++#define TAG_CA_INFO                   0x9f8031
++#define TAG_CA_PMT                    0x9f8032
++#define TAG_CA_PMT_REPLY              0x9f8033
++
++/*    Host Control                    */
++#define TAG_TUNE                      0x9f8400
++#define TAG_REPLACE                   0x9f8401
++#define TAG_CLEAR_REPLACE             0x9f8402
++#define TAG_ASK_RELEASE                       0x9f8403
++
++/*    Date and Time                   */
++#define TAG_DATE_TIME_ENQUIRY         0x9f8440
++#define TAG_DATE_TIME                 0x9f8441
++
++/*    Man Machine Interface (MMI)     */
++#define TAG_CLOSE_MMI                 0x9f8800
++#define TAG_DISPLAY_CONTROL           0x9f8801
++#define TAG_DISPLAY_REPLY             0x9f8802
++#define TAG_TEXT_LAST                 0x9f8803
++#define TAG_TEXT_MORE                 0x9f8804
++#define TAG_KEYPAD_CONTROL            0x9f8805
++#define TAG_KEYPRESS                  0x9f8806
++#define TAG_ENQUIRY                   0x9f8807
++#define TAG_ANSWER                    0x9f8808
++#define TAG_MENU_LAST                 0x9f8809
++#define TAG_MENU_MORE                 0x9f880a
++#define TAG_MENU_ANSWER                       0x9f880b
++#define TAG_LIST_LAST                 0x9f880c
++#define TAG_LIST_MORE                 0x9f880d
++#define TAG_SUBTITLE_SEGMENT_LAST     0x9f880e
++#define TAG_SUBTITLE_SEGMENT_MORE     0x9f880f
++#define TAG_DISPLAY_MESSAGE           0x9f8810
++#define TAG_SCENE_END_MARK            0x9f8811
++#define TAG_SCENE_DONE                        0x9f8812
++#define TAG_SCENE_CONTROL             0x9f8813
++#define TAG_SUBTITLE_DOWNLOAD_LAST    0x9f8814
++#define TAG_SUBTITLE_DOWNLOAD_MORE    0x9f8815
++#define TAG_FLUSH_DOWNLOAD            0x9f8816
++#define TAG_DOWNLOAD_REPLY            0x9f8817
++
++/*    Low Speed Communications        */
++#define TAG_COMMS_COMMAND             0x9f8c00
++#define TAG_CONNECTION_DESCRIPTOR     0x9f8c01
++#define TAG_COMMS_REPLY                       0x9f8c02
++#define TAG_COMMS_SEND_LAST           0x9f8c03
++#define TAG_COMMS_SEND_MORE           0x9f8c04
++#define TAG_COMMS_RECV_LAST           0x9f8c05
++#define TAG_COMMS_RECV_MORE           0x9f8c06
++
++/* Authentication */
++#define TAG_AUTH_REQ                  0x9f8200
++#define TAG_AUTH_RESP                 0x9f8201
++
++/* Teletext */
++#define TAG_TELETEXT_EBU              0x9f9000
++
++/* Smartcard */
++#define TAG_SMARTCARD_COMMAND         0x9f8e00
++#define TAG_SMARTCARD_REPLY           0x9f8e01
++#define TAG_SMARTCARD_SEND            0x9f8e02
++#define TAG_SMARTCARD_RCV             0x9f8e03
++
++/* EPG */
++#define TAG_EPG_ENQUIRY               0x9f8f00
++#define TAG_EPG_REPLY                 0x9f8f01
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_teletext.c dvb-apps/lib/libdvben50221/en50221_app_teletext.c
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_teletext.c    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_app_teletext.c  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,141 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 transport layer
++
++    Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++    Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
++    Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#include <string.h>
++#include <libdvbmisc/dvbmisc.h>
++#include <pthread.h>
++#include "en50221_app_teletext.h"
++#include "en50221_app_tags.h"
++#include "asn_1.h"
++
++struct en50221_app_teletext {
++      struct en50221_app_send_functions *funcs;
++
++      en50221_app_teletext_callback callback;
++      void *callback_arg;
++
++      pthread_mutex_t lock;
++};
++
++static int en50221_app_teletext_parse_ebu(struct en50221_app_teletext *teletext,
++                                        uint8_t slot_id,
++                                        uint16_t session_number,
++                                        uint8_t * data,
++                                        uint32_t data_length);
++
++
++
++struct en50221_app_teletext *
++      en50221_app_teletext_create(struct en50221_app_send_functions *funcs)
++{
++      struct en50221_app_teletext *teletext = NULL;
++
++      // create structure and set it up
++      teletext = malloc(sizeof(struct en50221_app_teletext));
++      if (teletext == NULL) {
++              return NULL;
++      }
++      teletext->funcs = funcs;
++      teletext->callback = NULL;
++
++      pthread_mutex_init(&teletext->lock, NULL);
++
++      // done
++      return teletext;
++}
++
++void en50221_app_teletext_destroy(struct en50221_app_teletext *teletext)
++{
++      pthread_mutex_destroy(&teletext->lock);
++      free(teletext);
++}
++
++void en50221_app_teletext_register_callback(struct en50221_app_teletext *teletext,
++                                          en50221_app_teletext_callback callback, void *arg)
++{
++      pthread_mutex_lock(&teletext->lock);
++      teletext->callback = callback;
++      teletext->callback_arg = arg;
++      pthread_mutex_unlock(&teletext->lock);
++}
++
++int en50221_app_teletext_message(struct en50221_app_teletext *teletext,
++                               uint8_t slot_id,
++                               uint16_t session_number,
++                               uint32_t resource_id,
++                               uint8_t * data, uint32_t data_length)
++{
++      (void) resource_id;
++
++      // get the tag
++      if (data_length < 3) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      uint32_t tag = (data[0] << 16) | (data[1] << 8) | data[2];
++
++      switch (tag) {
++      case TAG_TELETEXT_EBU:
++              return en50221_app_teletext_parse_ebu(teletext, slot_id,
++                                                    session_number,
++                                                    data + 3,
++                                                    data_length - 3);
++      }
++
++      print(LOG_LEVEL, ERROR, 1, "Received unexpected tag %x\n", tag);
++      return -1;
++}
++
++
++static int en50221_app_teletext_parse_ebu(struct en50221_app_teletext *teletext,
++                                        uint8_t slot_id,
++                                        uint16_t session_number,
++                                        uint8_t *data,
++                                        uint32_t data_length)
++{
++      // first of all, decode the length field
++      uint16_t asn_data_length;
++      int length_field_len;
++      if ((length_field_len = asn_1_decode(&asn_data_length, data, data_length)) < 0) {
++              print(LOG_LEVEL, ERROR, 1, "ASN.1 decode error\n");
++              return -1;
++      }
++
++      // check it
++      if (asn_data_length > (data_length - length_field_len)) {
++              print(LOG_LEVEL, ERROR, 1, "Received short data\n");
++              return -1;
++      }
++      uint8_t *teletext_data = data + length_field_len;
++
++      // tell the app
++      pthread_mutex_lock(&teletext->lock);
++      en50221_app_teletext_callback cb = teletext->callback;
++      void *cb_arg = teletext->callback_arg;
++      pthread_mutex_unlock(&teletext->lock);
++      if (cb) {
++              return cb(cb_arg, slot_id, session_number, teletext_data,
++                        asn_data_length);
++      }
++      return 0;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_teletext.h dvb-apps/lib/libdvben50221/en50221_app_teletext.h
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_teletext.h    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_app_teletext.h  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,107 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 transport layer
++
++    Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++    Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
++    Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#ifndef __EN50221_APPLICATION_teletext_H__
++#define __EN50221_APPLICATION_teletext_H__
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include <stdlib.h>
++#include <stdint.h>
++#include <libdvben50221/en50221_app_utils.h>
++
++#define EN50221_APP_TELETEXT_RESOURCEID MKRID(128, 1, 1)
++
++
++/**
++ * Type definition for request - called when we receive teletext from a CAM.
++ *
++ * @param arg Private argument.
++ * @param slot_id Slot id concerned.
++ * @param session_number Session number concerned.
++ * @param teletext_data Data for the request.
++ * @param teletext_data_lenghth Number of bytes.
++ * @return 0 on success, -1 on failure.
++ */
++typedef int (*en50221_app_teletext_callback) (void *arg,
++                                            uint8_t slot_id,
++                                            uint16_t session_number,
++                                            uint8_t *teletext_data,
++                                            uint32_t teletext_data_length);
++
++/**
++ * Opaque type representing a teletext resource.
++ */
++struct en50221_app_teletext;
++
++/**
++ * Create an instance of the teletext resource.
++ *
++ * @param funcs Send functions to use.
++ * @return Instance, or NULL on failure.
++ */
++extern struct en50221_app_teletext *
++      en50221_app_teletext_create(struct en50221_app_send_functions *funcs);
++
++/**
++ * Destroy an instance of the teletext resource.
++ *
++ * @param teletext Instance to destroy.
++ */
++extern void en50221_app_teletext_destroy(struct en50221_app_teletext *teletext);
++
++/**
++ * Register the callback for when we receive a request.
++ *
++ * @param teletext teletext resource instance.
++ * @param callback The callback. Set to NULL to remove the callback completely.
++ * @param arg Private data passed as arg0 of the callback.
++ */
++extern void en50221_app_teletext_register_callback(struct en50221_app_teletext *teletext,
++                                                 en50221_app_teletext_callback callback,
++                                                 void *arg);
++
++/**
++ * Pass data received for this resource into it for parsing.
++ *
++ * @param teletext teletext instance.
++ * @param slot_id Slot ID concerned.
++ * @param session_number Session number concerned.
++ * @param resource_id Resource ID concerned.
++ * @param data The data.
++ * @param data_length Length of data in bytes.
++ * @return 0 on success, -1 on failure.
++ */
++extern int en50221_app_teletext_message(struct en50221_app_teletext *teletext,
++                                      uint8_t slot_id,
++                                      uint16_t session_number,
++                                      uint32_t resource_id,
++                                      uint8_t * data,
++                                      uint32_t data_length);
++
++#ifdef __cplusplus
++}
++#endif
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_utils.c dvb-apps/lib/libdvben50221/en50221_app_utils.c
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_utils.c       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_app_utils.c     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,38 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 transport layer
++
++    Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++    Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
++    Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#include "en50221_app_utils.h"
++
++struct en50221_app_public_resource_id
++      *en50221_app_decode_public_resource_id(struct en50221_app_public_resource_id *idf,
++                                             uint32_t resource_id)
++{
++      // reject private resources
++      if ((resource_id & 0xc0000000) == 0xc0000000)
++              return NULL;
++
++      idf->resource_class = (resource_id >> 16) & 0xffff;     // use the resource_id as the MSBs of class
++      idf->resource_type = (resource_id >> 6) & 0x3ff;
++      idf->resource_version = resource_id & 0x3f;
++      return idf;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_utils.h dvb-apps/lib/libdvben50221/en50221_app_utils.h
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_app_utils.h       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_app_utils.h     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,112 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 transport layer
++
++    Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++    Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
++    Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#ifndef __EN50221_APP_UTILS_H__
++#define __EN50221_APP_UTILS_H__
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include <stdlib.h>
++#include <stdint.h>
++#include <sys/uio.h>
++
++/**
++ * A decomposed public resource structure.
++ *
++ * we will ignore private resource (resource_id_type==3),
++ * because they are not used by any modules at all and
++ * would need special code for any private resource anyway.
++ */
++struct en50221_app_public_resource_id {
++      uint16_t resource_class;
++      uint16_t resource_type;
++      uint8_t resource_version;
++};
++
++typedef int (*en50221_send_data) (void *arg,
++                                uint16_t session_number,
++                                uint8_t * data,
++                                uint16_t data_length);
++typedef int (*en50221_send_datav) (void *arg,
++                                 uint16_t session_number,
++                                 struct iovec * vector,
++                                 int iov_count);
++
++/**
++ * An abstraction away from hardcoded send functions so different layers may be
++ * slotted in under the application layer.
++ */
++struct en50221_app_send_functions {
++      /**
++       * Argument to pass to these functions.
++       */
++      void *arg;
++
++      /**
++       * Send data.
++       */
++      en50221_send_data send_data;
++
++      /**
++       * Send vector data.
++       */
++      en50221_send_datav send_datav;
++};
++
++/**
++ * Make a host-endian uint32_t formatted resource id.
++ *
++ * @param CLASS Class of resource.
++ * @param TYPE Type of resource.
++ * @param VERSION Version of resource.
++ * @return Formatted resource id.
++ */
++#define MKRID(CLASS, TYPE, VERSION) ((((CLASS)&0xffff)<<16) | (((TYPE)&0x3ff)<<6) | ((VERSION)&0x3f))
++
++/**
++ * Decode a host-endian public resource_id into an en50221_app_public_resource_id structure.
++ *
++ * @param idf Structure to write decoded resource_id into.
++ * @param resource_id ID to decode.
++ * @return Pointer to idf on success, or NULL if this is not a public resource.
++ */
++struct en50221_app_public_resource_id *
++      en50221_app_decode_public_resource_id(struct en50221_app_public_resource_id *idf,
++                                            uint32_t resource_id);
++
++/**
++ * Encode an en50221_app_public_resource_id structure into a host-endian uint32_t.
++ *
++ * @param idf Structure to encode.
++ * @return The encoded value
++ */
++static inline uint32_t en50221_app_encode_public_resource_id(struct en50221_app_public_resource_id *idf) {
++      return MKRID(idf->resource_class, idf->resource_type, idf->resource_version);
++}
++
++#ifdef __cplusplus
++}
++#endif
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_errno.h dvb-apps/lib/libdvben50221/en50221_errno.h
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_errno.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_errno.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,49 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 session layer
++
++    Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++    Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
++    Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#ifndef EN50221_ERRNO
++#define EN50221_ERRNO 1
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#define EN50221ERR_CAREAD -1  /* error during read from CA device. */
++#define EN50221ERR_CAWRITE -2 /* error during write to CA device. */
++#define EN50221ERR_TIMEOUT -3 /* timeout occured waiting for a response from a device. */
++#define EN50221ERR_BADSLOTID -4       /* bad slot ID supplied by user - the offending slot_id will not be set. */
++#define EN50221ERR_BADCONNECTIONID -5 /* bad connection ID supplied by user. */
++#define EN50221ERR_BADSTATE -6        /* slot/connection in the wrong state. */
++#define EN50221ERR_BADCAMDATA -7      /* CAM supplied an invalid request. */
++#define EN50221ERR_OUTOFMEMORY -8     /* memory allocation failed. */
++#define EN50221ERR_ASNENCODE -9       /* ASN.1 encode failure - indicates library bug. */
++#define EN50221ERR_OUTOFCONNECTIONS -10       /* no more connections available. */
++#define EN50221ERR_OUTOFSLOTS -11     /* no more slots available - the offending slot_id will not be set. */
++#define EN50221ERR_IOVLIMIT -12       /* Too many struct iovecs were used. */
++#define EN50221ERR_BADSESSIONNUMBER -13       /* Bad session number suppplied by user. */
++#define EN50221ERR_OUTOFSESSIONS -14  /* no more sessions available. */
++
++#ifdef __cplusplus
++}
++#endif
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_session.c dvb-apps/lib/libdvben50221/en50221_session.c
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_session.c 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_session.c       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,1055 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 transport layer
++
++    Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++    Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
++    Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#include <stdio.h>
++#include <unistd.h>
++#include <string.h>
++#include <fcntl.h>
++#include <sys/ioctl.h>
++#include <time.h>
++#include <libdvbmisc/dvbmisc.h>
++#include <sys/uio.h>
++#include <pthread.h>
++#include "en50221_transport.h"
++#include "en50221_session.h"
++#include "en50221_errno.h"
++#include "asn_1.h"
++
++
++// these are the possible session statuses
++#define S_STATUS_OPEN                    0x00 // session is opened
++#define S_STATUS_CLOSE_NO_RES            0xF0 // could not open session, no proper resource available
++#define S_STATUS_CLOSE_RES_UNAVAILABLE   0xF1 // could not open session, resource unavailable
++#define S_STATUS_CLOSE_RES_LOW_VERSION   0xF2 // could not open session, resource version too low
++#define S_STATUS_CLOSE_RES_BUSY          0xF3 // could not open session, resource is busy
++
++#define ST_OPEN_SESSION_REQ     0x91  // h<--m
++#define ST_OPEN_SESSION_RES     0x92  // h-->m
++#define ST_CREATE_SESSION       0x93  // h-->m
++#define ST_CREATE_SESSION_RES   0x94  // h<--m
++#define ST_CLOSE_SESSION_REQ    0x95  // h<->m
++#define ST_CLOSE_SESSION_RES    0x96  // h<->m
++#define ST_SESSION_NUMBER       0x90  // h<->m
++
++#define S_STATE_IDLE            0x01  // this session is not in use
++#define S_STATE_ACTIVE          0x02  // this session is in use
++#define S_STATE_IN_CREATION     0x04  // this session waits for a ST_CREATE_SESSION_RES to become active
++#define S_STATE_IN_DELETION     0x08  // this session waits for ST_CLOSE_SESSION_RES to become idle again
++
++
++// for each session we store its identifier, the resource-id
++// it is linked to and the callback of the specific resource
++struct en50221_session {
++      uint8_t state;
++      uint32_t resource_id;
++      uint8_t slot_id;
++      uint8_t connection_id;
++
++      en50221_sl_resource_callback callback;
++      void *callback_arg;
++
++      pthread_mutex_t session_lock;
++};
++
++struct en50221_session_layer {
++      uint32_t max_sessions;
++      struct en50221_transport_layer *tl;
++
++      en50221_sl_lookup_callback lookup;
++      void *lookup_arg;
++
++      en50221_sl_session_callback session;
++      void *session_arg;
++
++      pthread_mutex_t global_lock;
++      pthread_mutex_t setcallback_lock;
++
++      int error;
++
++      struct en50221_session *sessions;
++};
++
++static void en50221_sl_transport_callback(void *arg, int reason,
++                                        uint8_t * data,
++                                        uint32_t data_length,
++                                        uint8_t slot_id,
++                                        uint8_t connection_id);
++static int en50221_sl_alloc_new_session(struct en50221_session_layer *sl,
++                                      uint32_t resource_id,
++                                      uint8_t slot_id,
++                                      uint8_t connection_id,
++                                      en50221_sl_resource_callback
++                                      callback, void *arg);
++
++
++
++
++struct en50221_session_layer *en50221_sl_create(struct en50221_transport_layer *tl,
++                                              uint32_t max_sessions)
++{
++      struct en50221_session_layer *sl = NULL;
++      uint32_t i;
++
++      // setup structure
++      sl = (struct en50221_session_layer *)
++          malloc(sizeof(struct en50221_session_layer));
++      if (sl == NULL)
++              goto error_exit;
++      sl->max_sessions = max_sessions;
++      sl->lookup = NULL;
++      sl->session = NULL;
++      sl->tl = tl;
++      sl->error = 0;
++
++      // init the mutex
++      pthread_mutex_init(&sl->global_lock, NULL);
++      pthread_mutex_init(&sl->setcallback_lock, NULL);
++
++      // create the slots
++      sl->sessions = malloc(sizeof(struct en50221_session) * max_sessions);
++      if (sl->sessions == NULL)
++              goto error_exit;
++
++      // set them up
++      for (i = 0; i < max_sessions; i++) {
++              sl->sessions[i].state = S_STATE_IDLE;
++              sl->sessions[i].callback = NULL;
++
++              pthread_mutex_init(&sl->sessions[i].session_lock, NULL);
++      }
++
++      // register ourselves with the transport layer
++      en50221_tl_register_callback(tl, en50221_sl_transport_callback, sl);
++
++      return sl;
++
++error_exit:
++      en50221_sl_destroy(sl);
++      return NULL;
++}
++
++void en50221_sl_destroy(struct en50221_session_layer *sl)
++{
++      uint32_t i;
++
++      if (sl) {
++              if (sl->sessions) {
++                      for (i = 0; i < sl->max_sessions; i++) {
++                              pthread_mutex_destroy(&sl->sessions[i].session_lock);
++                      }
++                      free(sl->sessions);
++              }
++
++              pthread_mutex_destroy(&sl->setcallback_lock);
++              pthread_mutex_destroy(&sl->global_lock);
++
++              free(sl);
++      }
++}
++
++int en50221_sl_get_error(struct en50221_session_layer *sl)
++{
++      return sl->error;
++}
++
++void en50221_sl_register_lookup_callback(struct en50221_session_layer *sl,
++                                       en50221_sl_lookup_callback
++                                       callback, void *arg)
++{
++      pthread_mutex_lock(&sl->setcallback_lock);
++      sl->lookup = callback;
++      sl->lookup_arg = arg;
++      pthread_mutex_unlock(&sl->setcallback_lock);
++}
++
++void en50221_sl_register_session_callback(struct en50221_session_layer *sl,
++                                        en50221_sl_session_callback
++                                        callback, void *arg)
++{
++      pthread_mutex_lock(&sl->setcallback_lock);
++      sl->session = callback;
++      sl->session_arg = arg;
++      pthread_mutex_unlock(&sl->setcallback_lock);
++}
++
++int en50221_sl_create_session(struct en50221_session_layer *sl,
++                            int slot_id, uint8_t connection_id,
++                            uint32_t resource_id,
++                            en50221_sl_resource_callback callback,
++                            void *arg)
++{
++      // lookup next free session_id:
++      pthread_mutex_lock(&sl->global_lock);
++      int session_number =
++          en50221_sl_alloc_new_session(sl, resource_id, slot_id,
++                                       connection_id, callback, arg);
++      if (session_number == -1) {
++              pthread_mutex_unlock(&sl->global_lock);
++              return -1;
++      }
++      pthread_mutex_unlock(&sl->global_lock);
++
++      // make up the header
++      uint8_t hdr[8];
++      hdr[0] = ST_CREATE_SESSION;
++      hdr[1] = 6;
++      hdr[2] = resource_id >> 24;
++      hdr[3] = resource_id >> 16;
++      hdr[4] = resource_id >> 8;
++      hdr[5] = resource_id;
++      hdr[6] = session_number >> 8;
++      hdr[7] = session_number;
++
++      // send this command
++      if (en50221_tl_send_data(sl->tl, slot_id, connection_id, hdr, 8)) {
++              pthread_mutex_lock(&sl->sessions[session_number].session_lock);
++              if (sl->sessions[session_number].state == S_STATE_IN_CREATION) {
++                      sl->sessions[session_number].state = S_STATE_IDLE;
++              }
++              pthread_mutex_unlock(&sl->sessions[session_number].session_lock);
++
++              sl->error = en50221_tl_get_error(sl->tl);
++              return -1;
++      }
++      // ok.
++      return session_number;
++}
++
++int en50221_sl_destroy_session(struct en50221_session_layer *sl,
++                             uint16_t session_number)
++{
++      if (session_number >= sl->max_sessions) {
++              sl->error = EN50221ERR_BADSESSIONNUMBER;
++              return -1;
++      }
++
++      pthread_mutex_lock(&sl->sessions[session_number].session_lock);
++      if (!(sl->sessions[session_number].state & (S_STATE_ACTIVE | S_STATE_IN_DELETION))) {
++              sl->error = EN50221ERR_BADSESSIONNUMBER;
++              pthread_mutex_unlock(&sl->sessions[session_number].session_lock);
++              return -1;
++      }
++      // set the state
++      sl->sessions[session_number].state = S_STATE_IN_DELETION;
++
++      // get essential details
++      uint8_t slot_id = sl->sessions[session_number].slot_id;
++      uint8_t connection_id = sl->sessions[session_number].connection_id;
++      pthread_mutex_unlock(&sl->sessions[session_number].session_lock);
++
++      //  sendit
++      uint8_t hdr[4];
++      hdr[0] = ST_CLOSE_SESSION_REQ;
++      hdr[1] = 2;
++      hdr[2] = session_number >> 8;
++      hdr[3] = session_number;
++      if (en50221_tl_send_data(sl->tl, slot_id, connection_id, hdr, 4)) {
++              pthread_mutex_lock(&sl->sessions[session_number].session_lock);
++              if (sl->sessions[session_number].state == S_STATE_IN_DELETION) {
++                      sl->sessions[session_number].state = S_STATE_IDLE;
++              }
++              pthread_mutex_unlock(&sl->sessions[session_number].session_lock);
++
++              sl->error = en50221_tl_get_error(sl->tl);
++              return -1;
++      }
++
++      return 0;
++}
++
++int en50221_sl_send_data(struct en50221_session_layer *sl,
++                       uint16_t session_number,
++                       uint8_t *data,
++                       uint16_t data_length)
++{
++      if (session_number >= sl->max_sessions) {
++              sl->error = EN50221ERR_BADSESSIONNUMBER;
++              return -1;
++      }
++
++      pthread_mutex_lock(&sl->sessions[session_number].session_lock);
++      if (sl->sessions[session_number].state != S_STATE_ACTIVE) {
++              sl->error = EN50221ERR_BADSESSIONNUMBER;
++              pthread_mutex_unlock(&sl->sessions[session_number].session_lock);
++              return -1;
++      }
++      // get essential details
++      uint8_t slot_id = sl->sessions[session_number].slot_id;
++      uint8_t connection_id = sl->sessions[session_number].connection_id;
++      pthread_mutex_unlock(&sl->sessions[session_number].session_lock);
++
++      // sendit
++      struct iovec iov[2];
++      uint8_t hdr[4];
++      hdr[0] = ST_SESSION_NUMBER;
++      hdr[1] = 2;
++      hdr[2] = session_number >> 8;
++      hdr[3] = session_number;
++      iov[0].iov_base = hdr;
++      iov[0].iov_len = 4;
++      iov[1].iov_base = data;
++      iov[1].iov_len = data_length;
++      if (en50221_tl_send_datav(sl->tl, slot_id, connection_id, iov, 2)) {
++              sl->error = en50221_tl_get_error(sl->tl);
++              return -1;
++      }
++
++      return 0;
++}
++
++int en50221_sl_send_datav(struct en50221_session_layer *sl,
++                        uint16_t session_number,
++                        struct iovec *vector,
++                        int iov_count)
++{
++      if (session_number >= sl->max_sessions) {
++              sl->error = EN50221ERR_BADSESSIONNUMBER;
++              return -1;
++      }
++
++      pthread_mutex_lock(&sl->sessions[session_number].session_lock);
++      if (sl->sessions[session_number].state != S_STATE_ACTIVE) {
++              sl->error = EN50221ERR_BADSESSIONNUMBER;
++              pthread_mutex_unlock(&sl->sessions[session_number].session_lock);
++              return -1;
++      }
++      if (iov_count > 9) {
++              sl->error = EN50221ERR_IOVLIMIT;
++              pthread_mutex_unlock(&sl->sessions[session_number].session_lock);
++              return -1;
++      }
++      uint8_t slot_id = sl->sessions[session_number].slot_id;
++      uint8_t connection_id = sl->sessions[session_number].connection_id;
++      pthread_mutex_unlock(&sl->sessions[session_number].session_lock);
++
++      // make up the header
++      struct iovec out_iov[10];
++      uint8_t hdr[4];
++      hdr[0] = ST_SESSION_NUMBER;
++      hdr[1] = 2;
++      hdr[2] = session_number >> 8;
++      hdr[3] = session_number;
++      out_iov[0].iov_base = hdr;
++      out_iov[0].iov_len = 4;
++
++      // make up the data
++      memcpy(&out_iov[1], vector, iov_count * sizeof(struct iovec));
++
++      // send this command
++      if (en50221_tl_send_datav(sl->tl, slot_id, connection_id, out_iov, iov_count + 1)) {
++              sl->error = en50221_tl_get_error(sl->tl);
++              return -1;
++      }
++      return 0;
++}
++
++int en50221_sl_broadcast_data(struct en50221_session_layer *sl,
++                            int slot_id, uint32_t resource_id,
++                            uint8_t *data, uint16_t data_length)
++{
++      uint32_t i;
++
++      for (i = 0; i < sl->max_sessions; i++) {
++              pthread_mutex_lock(&sl->sessions[i].session_lock);
++
++              if (sl->sessions[i].state != S_STATE_ACTIVE) {
++                      pthread_mutex_unlock(&sl->sessions[i].session_lock);
++                      continue;
++              }
++              if ((slot_id != -1)
++                  && (slot_id != sl->sessions[i].slot_id)) {
++                      pthread_mutex_unlock(&sl->sessions[i].session_lock);
++                      continue;
++              }
++
++              if (sl->sessions[i].resource_id == resource_id) {
++                      pthread_mutex_unlock(&sl->sessions[i].session_lock);
++                      en50221_sl_send_data(sl, i, data, data_length);
++              } else {
++                      pthread_mutex_unlock(&sl->sessions[i].session_lock);
++              }
++      }
++
++      return 0;
++}
++
++
++
++static void en50221_sl_handle_open_session_request(struct en50221_session_layer *sl,
++                                                 uint8_t *data,
++                                                 uint32_t data_length,
++                                                 uint8_t slot_id,
++                                                 uint8_t connection_id)
++{
++      // check
++      if (data_length < 5) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received data with invalid length from module on slot %02x\n",
++                    slot_id);
++              return;
++      }
++      if (data[0] != 4) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received data with invalid length from module on slot %02x\n",
++                    slot_id);
++              return;
++      }
++      // get the resource id
++      uint32_t requested_resource_id =
++          (data[1] << 24) | (data[2] << 16) | (data[3] << 8) | data[4];
++
++      // get lookup callback details
++      pthread_mutex_lock(&sl->setcallback_lock);
++      en50221_sl_lookup_callback lcb = sl->lookup;
++      void *lcb_arg = sl->lookup_arg;
++      pthread_mutex_unlock(&sl->setcallback_lock);
++
++      // first of all, lookup this resource id
++      int status = S_STATUS_CLOSE_NO_RES;
++      en50221_sl_resource_callback resource_callback = NULL;
++      void *resource_arg = NULL;
++      uint32_t connected_resource_id;
++      if (lcb) {
++              status =
++                  lcb(lcb_arg, slot_id, requested_resource_id,
++                      &resource_callback, &resource_arg,
++                      &connected_resource_id);
++              switch (status) {
++              case 0:
++                      status = S_STATUS_OPEN;
++                      break;
++
++              case -1:
++                      status = S_STATUS_CLOSE_NO_RES;
++                      break;
++
++              case -2:
++                      status = S_STATUS_CLOSE_RES_LOW_VERSION;
++                      break;
++
++              case -3:
++                      status = S_STATUS_CLOSE_RES_UNAVAILABLE;
++                      break;
++              }
++      }
++      // if we found it, get a new session for it
++      int session_number = -1;
++      if (status == S_STATUS_OPEN) {
++              // lookup next free session_id:
++              pthread_mutex_lock(&sl->global_lock);
++              session_number =
++                  en50221_sl_alloc_new_session(sl, connected_resource_id,
++                                               slot_id, connection_id,
++                                               resource_callback,
++                                               resource_arg);
++              pthread_mutex_unlock(&sl->global_lock);
++
++              if (session_number == -1) {
++                      status = S_STATUS_CLOSE_NO_RES;
++              } else {
++                      // inform upper layers/ check availability
++                      pthread_mutex_lock(&sl->setcallback_lock);
++                      en50221_sl_session_callback cb = sl->session;
++                      void *cb_arg = sl->session_arg;
++                      pthread_mutex_unlock(&sl->setcallback_lock);
++                      if (cb) {
++                              if (cb(cb_arg, S_SCALLBACK_REASON_CAMCONNECTING,
++                                     slot_id, session_number,
++                                     connected_resource_id)) {
++                                      status = S_STATUS_CLOSE_RES_BUSY;
++                              }
++                      } else {
++                              status = S_STATUS_CLOSE_RES_UNAVAILABLE;
++                      }
++              }
++      }
++      // send response
++      uint8_t hdr[9];
++      hdr[0] = ST_OPEN_SESSION_RES;
++      hdr[1] = 7;
++      hdr[2] = status;
++      hdr[3] = connected_resource_id >> 24;
++      hdr[4] = connected_resource_id >> 16;
++      hdr[5] = connected_resource_id >> 8;
++      hdr[6] = connected_resource_id;
++      hdr[7] = session_number >> 8;
++      hdr[8] = session_number;
++      if (en50221_tl_send_data(sl->tl, slot_id, connection_id, hdr, 9)) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Transport layer error %i occurred\n",
++                    en50221_tl_get_error(sl->tl));
++              status = S_STATUS_CLOSE_NO_RES;
++              // fallthrough
++      }
++      // inform upper layers what happened
++      if (session_number != -1) {
++              // setup session state apppropriately from upper layer response
++              pthread_mutex_lock(&sl->sessions[session_number].session_lock);
++              if (status != S_STATUS_OPEN) {
++                      sl->sessions[session_number].state = S_STATE_IDLE;
++              } else {
++                      sl->sessions[session_number].state = S_STATE_ACTIVE;
++              }
++              pthread_mutex_unlock(&sl->sessions[session_number].session_lock);
++
++              // tell upper layers
++              if (sl->sessions[session_number].state == S_STATE_ACTIVE) {
++                      pthread_mutex_lock(&sl->setcallback_lock);
++                      en50221_sl_session_callback cb = sl->session;
++                      void *cb_arg = sl->session_arg;
++                      pthread_mutex_unlock(&sl->setcallback_lock);
++
++                      if (status == S_STATUS_OPEN) {
++                              if (cb)
++                                      cb(cb_arg,
++                                         S_SCALLBACK_REASON_CAMCONNECTED,
++                                         slot_id, session_number,
++                                         connected_resource_id);
++                      } else {
++                              sl->sessions[session_number].state =
++                                  S_STATE_IDLE;
++                              if (cb)
++                                      cb(cb_arg,
++                                         S_SCALLBACK_REASON_CAMCONNECTFAIL,
++                                         slot_id, session_number,
++                                         connected_resource_id);
++                      }
++              }
++      }
++}
++
++static void en50221_sl_handle_close_session_request(struct en50221_session_layer *sl,
++                                                  uint8_t * data,
++                                                  uint32_t data_length,
++                                                  uint8_t slot_id,
++                                                  uint8_t connection_id)
++{
++      // check
++      if (data_length < 3) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received data with invalid length from module on slot %02x\n",
++                    slot_id);
++              return;
++      }
++      if (data[0] != 2) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received data with invalid length from module on slot %02x\n",
++                    slot_id);
++              return;
++      }
++      // extract session number
++      uint16_t session_number = (data[1] << 8) | data[2];
++
++      // check session number is ok
++      uint8_t code = 0x00;
++      uint32_t resource_id = 0;
++      if (session_number >= sl->max_sessions) {
++              code = 0xF0;    // session close error
++              print(LOG_LEVEL, ERROR, 1, "Received bad session id %i\n",
++                    slot_id);
++      } else {
++              pthread_mutex_lock(&sl->sessions[session_number].
++                                 session_lock);
++              if (slot_id != sl->sessions[session_number].slot_id) {
++                      print(LOG_LEVEL, ERROR, 1,
++                            "Received unexpected session on invalid slot %i\n",
++                            slot_id);
++                      code = 0xF0;    // session close error
++              }
++              if (connection_id != sl->sessions[session_number].connection_id) {
++                      print(LOG_LEVEL, ERROR, 1,
++                            "Received unexpected session on invalid slot %i\n",
++                            slot_id);
++                      code = 0xF0;    // session close error
++              }
++              if (!(sl->sessions[session_number].state & (S_STATE_ACTIVE | S_STATE_IN_DELETION))) {
++                      print(LOG_LEVEL, ERROR, 1,
++                            "Received unexpected session on invalid slot %i\n",
++                            slot_id);
++                      code = 0xF0;    // session close error
++              }
++
++              if (code == 0x00) {
++                      sl->sessions[session_number].state = S_STATE_IDLE;
++                      code = 0x00;    // close ok
++              }
++              resource_id = sl->sessions[session_number].resource_id;
++              pthread_mutex_unlock(&sl->sessions[session_number].session_lock);
++      }
++
++      // make up the response
++      uint8_t hdr[5];
++      hdr[0] = ST_CLOSE_SESSION_RES;
++      hdr[1] = 3;
++      hdr[2] = code;
++      hdr[3] = session_number >> 8;
++      hdr[4] = session_number;
++
++      // sendit
++      if (en50221_tl_send_data(sl->tl, slot_id, connection_id, hdr, 5)) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Transport layer reports error %i on slot %i\n",
++                    en50221_tl_get_error(sl->tl), slot_id);
++      }
++      // callback to announce destruction to resource if it was ok
++      if (code == 0x00) {
++              pthread_mutex_lock(&sl->setcallback_lock);
++              en50221_sl_session_callback cb = sl->session;
++              void *cb_arg = sl->session_arg;
++              pthread_mutex_unlock(&sl->setcallback_lock);
++
++              if (cb)
++                      cb(cb_arg, S_SCALLBACK_REASON_CLOSE, slot_id,
++                         session_number, resource_id);
++      }
++}
++
++static void en50221_sl_handle_create_session_response(struct en50221_session_layer *sl,
++                                                    uint8_t * data,
++                                                    uint32_t data_length,
++                                                    uint8_t slot_id,
++                                                    uint8_t connection_id)
++{
++      // check
++      if (data_length < 8) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received data with invalid length from module on slot %02x\n",
++                    slot_id);
++              return;
++      }
++      if (data[0] != 7) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received data with invalid length from module on slot %02x\n",
++                    slot_id);
++              return;
++      }
++      // extract session number
++      uint16_t session_number = (data[5] << 8) | data[6];
++
++      // check session number is ok
++      if (session_number >= sl->max_sessions) {
++              print(LOG_LEVEL, ERROR, 1, "Received bad session id %i\n",
++                    slot_id);
++              return;
++      }
++
++      pthread_mutex_lock(&sl->sessions[session_number].session_lock);
++      if (slot_id != sl->sessions[session_number].slot_id) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received unexpected session on invalid slot %i\n",
++                    slot_id);
++              pthread_mutex_unlock(&sl->sessions[session_number].session_lock);
++              return;
++      }
++      if (connection_id != sl->sessions[session_number].connection_id) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received unexpected session on invalid slot %i\n",
++                    slot_id);
++              pthread_mutex_unlock(&sl->sessions[session_number].session_lock);
++              return;
++      }
++      if (sl->sessions[session_number].state != S_STATE_IN_CREATION) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received unexpected session on invalid slot %i\n",
++                    slot_id);
++              pthread_mutex_unlock(&sl->sessions[session_number].session_lock);
++              return;
++      }
++      // extract status
++      if (data[1] != S_STATUS_OPEN) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Session creation failed 0x%02x\n", data[1]);
++              sl->sessions[session_number].state = S_STATE_IDLE;
++              pthread_mutex_unlock(&sl->sessions[session_number].session_lock);
++
++              // inform upper layers
++              pthread_mutex_lock(&sl->setcallback_lock);
++              en50221_sl_session_callback cb = sl->session;
++              void *cb_arg = sl->session_arg;
++              pthread_mutex_unlock(&sl->setcallback_lock);
++              if (cb)
++                      cb(cb_arg, S_SCALLBACK_REASON_CONNECTFAIL, slot_id,
++                         session_number,
++                         sl->sessions[session_number].resource_id);
++              return;
++      }
++      // set it active
++      sl->sessions[session_number].state = S_STATE_ACTIVE;
++      pthread_mutex_unlock(&sl->sessions[session_number].session_lock);
++
++      // inform upper layers
++      pthread_mutex_lock(&sl->setcallback_lock);
++      en50221_sl_session_callback cb = sl->session;
++      void *cb_arg = sl->session_arg;
++      pthread_mutex_unlock(&sl->setcallback_lock);
++      if (cb)
++              cb(cb_arg, S_SCALLBACK_REASON_CONNECTED, slot_id,
++                 session_number,
++                 sl->sessions[session_number].resource_id);
++}
++
++static void en50221_sl_handle_close_session_response(struct en50221_session_layer *sl,
++                                                   uint8_t *data,
++                                                   uint32_t data_length,
++                                                   uint8_t slot_id,
++                                                   uint8_t connection_id)
++{
++      // check
++      if (data_length < 5) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received data with invalid length from module on slot %02x\n",
++                    slot_id);
++              return;
++      }
++      if (data[0] != 4) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received data with invalid length from module on slot %02x\n",
++                    slot_id);
++              return;
++      }
++      // extract session number
++      uint16_t session_number = (data[2] << 8) | data[3];
++
++      // check session number is ok
++      if (session_number >= sl->max_sessions) {
++              print(LOG_LEVEL, ERROR, 1, "Received bad session id %i\n", slot_id);
++              return;
++      }
++
++      pthread_mutex_lock(&sl->sessions[session_number].session_lock);
++      if (slot_id != sl->sessions[session_number].slot_id) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received unexpected session on invalid slot %i\n",
++                    slot_id);
++              pthread_mutex_unlock(&sl->sessions[session_number].session_lock);
++              return;
++      }
++      if (connection_id != sl->sessions[session_number].connection_id) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received unexpected session on invalid slot %i\n",
++                    slot_id);
++              pthread_mutex_unlock(&sl->sessions[session_number].session_lock);
++              return;
++      }
++      if (sl->sessions[session_number].state != S_STATE_IN_DELETION) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received unexpected session on invalid slot %i\n",
++                    slot_id);
++              pthread_mutex_unlock(&sl->sessions[session_number].session_lock);
++              return;
++      }
++      // extract status
++      if (data[1] != 0x00) {
++              print(LOG_LEVEL, ERROR, 1, "Session close failed 0x%02x\n", data[1]);
++              // just fallthrough anyway
++      }
++      // completed
++      sl->sessions[session_number].state = S_STATE_IDLE;
++      pthread_mutex_unlock(&sl->sessions[session_number].session_lock);
++}
++
++static void en50221_sl_handle_session_package(struct en50221_session_layer *sl,
++                                            uint8_t *data,
++                                            uint32_t data_length,
++                                            uint8_t slot_id,
++                                            uint8_t connection_id)
++{
++      // check
++      if (data_length < 3) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received data with invalid length from module on slot %i\n",
++                    slot_id);
++              return;
++      }
++      if (data[0] != 2) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received data with invalid length from module on slot %i\n",
++                    slot_id);
++              return;
++      }
++      // get session number
++      uint16_t session_number = (data[1] << 8) | data[2];
++
++      // check it
++      if (session_number >= sl->max_sessions) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received data with bad session_number from module on slot %i\n",
++                    slot_id);
++              return;
++      }
++
++      pthread_mutex_lock(&sl->sessions[session_number].session_lock);
++      if (slot_id != sl->sessions[session_number].slot_id) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received unexpected session on invalid slot %i\n",
++                    slot_id);
++              pthread_mutex_unlock(&sl->sessions[session_number].session_lock);
++              return;
++      }
++      if (connection_id != sl->sessions[session_number].connection_id) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received unexpected session on invalid slot %i\n",
++                    slot_id);
++              pthread_mutex_unlock(&sl->sessions[session_number].session_lock);
++              return;
++      }
++      if (sl->sessions[session_number].state != S_STATE_ACTIVE) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received data with bad session_number from module on slot %i\n",
++                    slot_id);
++              pthread_mutex_unlock(&sl->sessions[session_number].session_lock);
++              return;
++      }
++
++      en50221_sl_resource_callback cb = sl->sessions[session_number].callback;
++      void *cb_arg = sl->sessions[session_number].callback_arg;
++      uint32_t resource_id = sl->sessions[session_number].resource_id;
++      pthread_mutex_unlock(&sl->sessions[session_number].session_lock);
++
++      // there can be > 1 APDU following the package - all for the same session/resource_id tho.
++      data += 3;
++      data_length -= 3;
++      while (data_length) {
++              // check length field
++              if (data_length < 3) {
++                      print(LOG_LEVEL, ERROR, 1,
++                            "Received invalid sized session package from slot %i\n",
++                            slot_id);
++                      return;
++              }
++              // parse the APDU's length field
++              int length_field_len;
++              uint16_t asn_data_length;
++              if ((length_field_len = asn_1_decode(&asn_data_length, data + 3, data_length - 3)) < 0) {
++                      print(LOG_LEVEL, ERROR, 1,
++                            "Received invalid sized session package from slot %i\n",
++                            slot_id);
++                      return;
++              }
++              uint32_t apdu_length = 3 + length_field_len + asn_data_length;
++
++              // check there is enough data
++              if (apdu_length > data_length) {
++                      print(LOG_LEVEL, ERROR, 1,
++                            "Received invalid sized session package from slot %i\n",
++                            slot_id);
++                      return;
++              }
++              // pass the APDU up to the higher layers
++              if (cb)
++                      cb(cb_arg, slot_id, session_number, resource_id, data, apdu_length);
++
++              // next!
++              data += apdu_length;
++              data_length -= apdu_length;
++      }
++
++}
++
++static void en50221_sl_transport_callback(void *arg, int reason,
++                                        uint8_t *data,
++                                        uint32_t data_length,
++                                        uint8_t slot_id,
++                                        uint8_t connection_id)
++{
++      struct en50221_session_layer *sl =
++          (struct en50221_session_layer *) arg;
++      uint32_t i;
++
++      // deal with the reason for this callback
++      switch (reason) {
++      case T_CALLBACK_REASON_DATA:
++              // fallthrough into rest of this function
++              break;
++
++      case T_CALLBACK_REASON_CONNECTIONOPEN:
++      {
++              pthread_mutex_lock(&sl->setcallback_lock);
++              en50221_sl_session_callback cb = sl->session;
++              void *cb_arg = sl->session_arg;
++              pthread_mutex_unlock(&sl->setcallback_lock);
++
++              if (cb)
++                      cb(cb_arg, S_SCALLBACK_REASON_TC_CONNECT,
++                              slot_id, connection_id, 0);
++              return;
++      }
++
++      case T_CALLBACK_REASON_CAMCONNECTIONOPEN:
++      {
++              pthread_mutex_lock(&sl->setcallback_lock);
++              en50221_sl_session_callback cb = sl->session;
++              void *cb_arg = sl->session_arg;
++              pthread_mutex_unlock(&sl->setcallback_lock);
++
++              if (cb)
++                      cb(cb_arg,
++                              S_SCALLBACK_REASON_TC_CAMCONNECT,
++                              slot_id, connection_id, 0);
++              return;
++      }
++
++      case T_CALLBACK_REASON_CONNECTIONCLOSE:
++      {
++              pthread_mutex_lock(&sl->setcallback_lock);
++              en50221_sl_session_callback cb = sl->session;
++              void *cb_arg = sl->session_arg;
++              pthread_mutex_unlock(&sl->setcallback_lock);
++
++              for (i = 0; i < sl->max_sessions; i++) {
++                      pthread_mutex_lock(&sl->sessions[i].session_lock);
++
++                      if (sl->sessions[i].state == S_STATE_IDLE) {
++                              pthread_mutex_unlock(&sl->sessions[i].session_lock);
++                              continue;
++                      }
++                      if (sl->sessions[i].connection_id != connection_id) {
++                              pthread_mutex_unlock(&sl->sessions[i].session_lock);
++                              continue;
++                      }
++
++                      sl->sessions[i].state = S_STATE_IDLE;
++
++                      uint8_t _slot_id = sl->sessions[i].slot_id;
++                      uint32_t resource_id = sl->sessions[i].resource_id;
++                      pthread_mutex_unlock(&sl->sessions[i].session_lock);
++
++                      if (cb)
++                              cb(cb_arg, S_SCALLBACK_REASON_CLOSE, _slot_id, i, resource_id);
++              }
++              return;
++      }
++
++      case T_CALLBACK_REASON_SLOTCLOSE:
++      {
++              pthread_mutex_lock(&sl->setcallback_lock);
++              en50221_sl_session_callback cb = sl->session;
++              void *cb_arg = sl->session_arg;
++              pthread_mutex_unlock(&sl->setcallback_lock);
++
++              for (i = 0; i < sl->max_sessions; i++) {
++                      pthread_mutex_lock(&sl->sessions[i].session_lock);
++
++                      if (sl->sessions[i].state == S_STATE_IDLE) {
++                              pthread_mutex_unlock(&sl->sessions[i].session_lock);
++                              continue;
++                      }
++                      if (sl->sessions[i].slot_id != slot_id) {
++                              pthread_mutex_unlock(&sl->sessions[i].session_lock);
++                              continue;
++                      }
++                      sl->sessions[i].state = S_STATE_IDLE;
++
++                      uint32_t resource_id = sl->sessions[i].resource_id;
++                      pthread_mutex_unlock(&sl->sessions[i].session_lock);
++
++                      if (cb)
++                              cb(cb_arg, S_SCALLBACK_REASON_CLOSE, slot_id, i, resource_id);
++
++              }
++              return;
++      }
++      }
++
++      // sanity check data length
++      if (data_length < 1) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received data with invalid length from module on slot %i\n",
++                    slot_id);
++              return;
++      }
++      // deal with the data
++      uint8_t spdu_tag = data[0];
++      switch (spdu_tag) {
++      case ST_OPEN_SESSION_REQ:
++              en50221_sl_handle_open_session_request(sl, data + 1,
++                                                     data_length - 1,
++                                                     slot_id,
++                                                     connection_id);
++              break;
++
++      case ST_CLOSE_SESSION_REQ:
++              en50221_sl_handle_close_session_request(sl, data + 1,
++                                                      data_length - 1,
++                                                      slot_id,
++                                                      connection_id);
++              break;
++
++      case ST_SESSION_NUMBER:
++              en50221_sl_handle_session_package(sl, data + 1,
++                                                data_length - 1, slot_id,
++                                                connection_id);
++              break;
++
++      case ST_CREATE_SESSION_RES:
++              en50221_sl_handle_create_session_response(sl, data + 1,
++                                                        data_length - 1,
++                                                        slot_id,
++                                                        connection_id);
++              break;
++
++      case ST_CLOSE_SESSION_RES:
++              en50221_sl_handle_close_session_response(sl, data + 1,
++                                                       data_length - 1,
++                                                       slot_id,
++                                                       connection_id);
++              break;
++
++      default:
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received unknown session tag %02x from module on slot %i",
++                    spdu_tag, slot_id);
++              break;
++      }
++}
++
++static int en50221_sl_alloc_new_session(struct en50221_session_layer *sl,
++                                      uint32_t resource_id,
++                                      uint8_t slot_id,
++                                      uint8_t connection_id,
++                                      en50221_sl_resource_callback
++                                      callback, void *arg)
++{
++      int session_number = -1;
++      uint32_t i;
++      for (i = 1; i < sl->max_sessions; i++) {
++              if (sl->sessions[i].state == S_STATE_IDLE) {
++                      session_number = i;
++                      break;
++              }
++      }
++      if (session_number == -1) {
++              sl->error = EN50221ERR_OUTOFSESSIONS;
++              return -1;
++      }
++      // setup the session
++      sl->sessions[session_number].state = S_STATE_IN_CREATION;
++      sl->sessions[session_number].resource_id = resource_id;
++      sl->sessions[session_number].slot_id = slot_id;
++      sl->sessions[session_number].connection_id = connection_id;
++      sl->sessions[session_number].callback = callback;
++      sl->sessions[session_number].callback_arg = arg;
++
++      // ok
++      return session_number;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_session.h dvb-apps/lib/libdvben50221/en50221_session.h
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_session.h 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_session.h       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,232 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 session layer
++
++    Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++    Copyright (C) 2005 Julian Scheel (julian@jusst.de)
++    Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++
++#ifndef __EN50221_SESSION_H__
++#define __EN50221_SESSION_H__
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include <stdlib.h>
++#include <stdint.h>
++#include <libdvben50221/en50221_transport.h>
++
++#define S_SCALLBACK_REASON_CAMCONNECTING  0x00        // CAM originated session connecting to resource (check for availability)
++#define S_SCALLBACK_REASON_CAMCONNECTED   0x01        // CAM originated session connection established succesfully
++#define S_SCALLBACK_REASON_CAMCONNECTFAIL 0x02        // CAM originated session connection failed
++#define S_SCALLBACK_REASON_CONNECTED      0x03        // Host originated session ACKed by CAM.
++#define S_SCALLBACK_REASON_CONNECTFAIL    0x04        // Host originated session NACKed by CAM.
++#define S_SCALLBACK_REASON_CLOSE          0x05        // Session closed
++#define S_SCALLBACK_REASON_TC_CONNECT     0x06        // A host originated transport connection has been established.
++#define S_SCALLBACK_REASON_TC_CAMCONNECT  0x07        // A CAM originated transport connection has been established.
++
++
++/**
++ * Opaque type representing a session layer.
++ */
++struct en50221_session_layer;
++
++/**
++ * Type definition for resource callback function - called by session layer when data
++ * arrives for a particular resource.
++ *
++ * @param arg Private argument.
++ * @param slot_id Slot id concerned.
++ * @param session_number Session number.
++ * @param resource_id Resource id.
++ * @param data The data.
++ * @param data_length Length of data in bytes.
++ * @return 0 on success, or -1 on failure.
++ */
++typedef int (*en50221_sl_resource_callback) (void *arg,
++                                           uint8_t slot_id,
++                                           uint16_t session_number,
++                                           uint32_t resource_id,
++                                           uint8_t * data,
++                                           uint32_t data_length);
++
++/**
++ * Type definition for resource lookup callback function - used by the session layer to
++ * look up requested resources.
++ *
++ * @param arg Private argument.
++ * @param slot_id Slot id the request came from.
++ * @param requested_resource_id Resource id requested.
++ * @param callback_out Output parameter for pointer to resource callback function.
++ * @param arg_out Output parameter for arg to pass to resource callback.
++ * @param resource_id_out Set this to the resource_id connected to (e.g. may differ from resource_id due to versions).
++ * @return 0 on success,
++ * -1 if the resource was not found,
++ * -2 if it exists, but had a lower version, or
++ * -3 if it exists, but was unavailable.
++ */
++typedef int (*en50221_sl_lookup_callback) (void *arg,
++                                         uint8_t slot_id,
++                                         uint32_t requested_resource_id,
++                                         en50221_sl_resource_callback * callback_out,
++                                         void **arg_out,
++                                         uint32_t *resource_id_out);
++
++
++/**
++ * Type definition for session callback function - used to inform top level code when a CAM
++ * modifies a session to a resource.
++ *
++ * @param arg Private argument.
++ * @param reason One of the S_CCALLBACK_REASON_* values above.
++ * @param slot_id Slot id concerned.
++ * @param session_number Session number.
++ * @param resource_id Resource id.
++ * @return 0 on sucess, or -1 on error.
++ */
++typedef int (*en50221_sl_session_callback) (void *arg, int reason,
++                                          uint8_t slot_id,
++                                          uint16_t session_number,
++                                          uint32_t resource_id);
++
++/**
++ * Construct a new instance of the session layer.
++ *
++ * @param tl The en50221_transport_layer instance to use.
++ * @param max_sessions Maximum number of sessions supported.
++ * @return The en50221_session_layer instance, or NULL on error.
++ */
++extern struct en50221_session_layer *en50221_sl_create(struct en50221_transport_layer *tl,
++                                                     uint32_t max_sessions);
++
++/**
++ * Destroy an instance of the session layer.
++ *
++ * @param tl The en50221_session_layer instance.
++ */
++extern void en50221_sl_destroy(struct en50221_session_layer *sl);
++
++/**
++ * Gets the last error.
++ *
++ * @param tl The en50221_session_layer instance.
++ * @return One of the EN50221ERR_* values.
++ */
++extern int en50221_sl_get_error(struct en50221_session_layer *tl);
++
++/**
++ * Register the callback for resource lookup.
++ *
++ * @param sl The en50221_session_layer instance.
++ * @param callback The callback. Set to NULL to remove the callback completely.
++ * @param arg Private data passed as arg0 of the callback.
++ */
++extern void en50221_sl_register_lookup_callback(struct en50221_session_layer *sl,
++                                              en50221_sl_lookup_callback callback,
++                                              void *arg);
++
++/**
++ * Register the callback for informing about session from a cam.
++ *
++ * @param sl The en50221_session_layer instance.
++ * @param callback The callback. Set to NULL to remove the callback completely.
++ * @param arg Private data passed as arg0 of the callback.
++ */
++extern void en50221_sl_register_session_callback(struct en50221_session_layer *sl,
++                                               en50221_sl_session_callback callback,
++                                               void *arg);
++
++/**
++ * Create a new session to a module in a slot.
++ *
++ * @param sl The en50221_session_layer instance.
++ * @param slot The slot to connect to.
++ * @param resource_id The resource_id to connect to.
++ * @param callback The callback for received data.
++ * @param arg Argument to pass to the callback.
++ * @return The new session_number, or -1 on error.
++ */
++extern int en50221_sl_create_session(struct en50221_session_layer *sl, int slot_id,
++                                   uint8_t connection_id,
++                                   uint32_t resource_id,
++                                   en50221_sl_resource_callback callback,
++                                   void *arg);
++
++/**
++ * Destroy a session.
++ *
++ * @param sl The en50221_session_layer instance.
++ * @param session_number The session to destroy.
++ * @return 0 on success, or -1 on error.
++ */
++extern int en50221_sl_destroy_session(struct en50221_session_layer *sl,
++                                    uint16_t session_number);
++
++/**
++ * this function is used to take a data-block, pack into
++ * into a SPDU (SESSION_NUMBER) and send it to the transport layer
++ *
++ * @param sl The en50221_session_layer instance to use.
++ * @param session_number Session number concerned.
++ * @param data Data to send.
++ * @param data_length Length of data in bytes.
++ * @return 0 on success, or -1 on error.
++ */
++extern int en50221_sl_send_data(struct en50221_session_layer *sl,
++                              uint16_t session_number,
++                              uint8_t * data,
++                              uint16_t data_length);
++
++/**
++ * this function is used to take a data-block, pack into
++ * into a SPDU (SESSION_NUMBER) and send it to the transport layer
++ *
++ * @param sl The en50221_session_layer instance to use.
++ * @param session_number Session number concerned.
++ * @param vector IOVEC to send.
++ * @param iov_count Number of elements in io vector.
++ * @return 0 on success, or -1 on error.
++ */
++extern int en50221_sl_send_datav(struct en50221_session_layer *sl,
++                               uint16_t session_number,
++                               struct iovec *vector,
++                               int iov_count);
++
++/**
++ * this is used to send a message to all sessions, linked
++ * to resource res
++ *
++ * @param tl The en50221_session_layer instance to use.
++ * @param slot_id Set to -1 to send to any slot. Other values will send to only that slot.
++ * @param resource_id Resource id concerned.
++ * @param data Data to send.
++ * @param data_length Length of data in bytes.
++ * @return 0 on success, or -1 on error.
++ */
++extern int en50221_sl_broadcast_data(struct en50221_session_layer *sl,
++                                   int slot_id,
++                                   uint32_t resource_id,
++                                   uint8_t * data,
++                                   uint16_t data_length);
++
++#ifdef __cplusplus
++}
++#endif
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_stdcam.c dvb-apps/lib/libdvben50221/en50221_stdcam.c
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_stdcam.c  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_stdcam.c        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,54 @@
++/*
++      en50221 encoder An implementation for libdvb
++      an implementation for the en50221 transport layer
++
++      Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++      This program is free software; you can redistribute it and/or modify
++      it under the terms of the GNU Lesser General Public License as
++      published by the Free Software Foundation; either version 2.1 of
++      the License, or (at your option) any later version.
++
++      This program is distributed in the hope that it will be useful,
++      but WITHOUT ANY WARRANTY; without even the implied warranty of
++      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++      GNU Lesser General Public License for more details.
++
++      You should have received a copy of the GNU Lesser General Public
++      License along with this library; if not, write to the Free Software
++      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#include <stdio.h>
++#include <unistd.h>
++#include <limits.h>
++#include <string.h>
++#include <errno.h>
++#include <libdvbapi/dvbca.h>
++#include "en50221_stdcam.h"
++
++struct en50221_stdcam *en50221_stdcam_create(int adapter, int slotnum,
++                                           struct en50221_transport_layer *tl,
++                                           struct en50221_session_layer *sl)
++{
++      struct en50221_stdcam *result = NULL;
++
++      int cafd = dvbca_open(adapter, 0);
++      if (cafd == -1)
++              return NULL;
++
++      int ca_type = dvbca_get_interface_type(cafd, slotnum);
++      switch(ca_type) {
++      case DVBCA_INTERFACE_LINK:
++              result = en50221_stdcam_llci_create(cafd, slotnum, tl, sl);
++              break;
++
++      case DVBCA_INTERFACE_HLCI:
++              result = en50221_stdcam_hlci_create(cafd, slotnum);
++              break;
++      }
++
++      if (result == NULL)
++              close(cafd);
++      return result;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_stdcam.h dvb-apps/lib/libdvben50221/en50221_stdcam.h
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_stdcam.h  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_stdcam.h        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,102 @@
++/*
++      en50221 encoder An implementation for libdvb
++      an implementation for the en50221 transport layer
++
++      Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++      This program is free software; you can redistribute it and/or modify
++      it under the terms of the GNU Lesser General Public License as
++      published by the Free Software Foundation; either version 2.1 of
++      the License, or (at your option) any later version.
++
++      This program is distributed in the hope that it will be useful,
++      but WITHOUT ANY WARRANTY; without even the implied warranty of
++      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++      GNU Lesser General Public License for more details.
++
++      You should have received a copy of the GNU Lesser General Public
++      License along with this library; if not, write to the Free Software
++      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#ifndef EN50221_STDCAM_H
++#define EN50221_STDCAM_H 1
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include <libdvben50221/en50221_app_ai.h>
++#include <libdvben50221/en50221_app_ca.h>
++#include <libdvben50221/en50221_app_mmi.h>
++#include <libdvben50221/en50221_session.h>
++#include <libdvben50221/en50221_transport.h>
++
++enum en50221_stdcam_status {
++      EN50221_STDCAM_CAM_NONE,
++      EN50221_STDCAM_CAM_INRESET,
++      EN50221_STDCAM_CAM_OK,
++      EN50221_STDCAM_CAM_BAD,
++};
++
++struct en50221_stdcam {
++      /* one of more of the following may be NULL if a CAM does not support it */
++      struct en50221_app_ai *ai_resource;
++      struct en50221_app_ca *ca_resource;
++      struct en50221_app_mmi *mmi_resource;
++
++      /* if any of these are -1, no connection is in place to this resource yet */
++      int ai_session_number;
++      int ca_session_number;
++      int mmi_session_number;
++
++      /* poll the stdcam instance */
++      enum en50221_stdcam_status (*poll)(struct en50221_stdcam *stdcam);
++
++      /* inform the stdcam of the current DVB time */
++      void (*dvbtime)(struct en50221_stdcam *stdcam, time_t dvbtime);
++
++      /* destroy the stdcam instance */
++      void (*destroy)(struct en50221_stdcam *stdcam, int closefd);
++};
++
++/**
++ * Create an instance of the STDCAM for an LLCI interface.
++ *
++ * @param cafd FD of the CA device.
++ * @param slotnum Slotnum on that CA device.
++ * @param tl Transport layer instance to use.
++ * @param sl Session layer instance to use.
++ * @return en50221_stdcam instance, or NULL on error.
++ */
++extern struct en50221_stdcam *en50221_stdcam_llci_create(int cafd, int slotnum,
++                                                struct en50221_transport_layer *tl,
++                                                struct en50221_session_layer *sl);
++
++/**
++ * Create an instance of the STDCAM for an HLCI interface.
++ *
++ * @param cafd FD of the CA device.
++ * @param slotnum Slotnum on that CA device.
++ * @return en50221_stdcam instance, or NULL on error.
++ */
++extern struct en50221_stdcam *en50221_stdcam_hlci_create(int cafd, int slotnum);
++
++/**
++ * Convenience method to create a STDCAM interface for a ca device on a particular adapter.
++ *
++ * @param adapter The DVB adapter concerned.
++ * @param slotnum The ca slot number on that adapter.
++ * @param tl Transport layer instance to use (unused for HLCI cams).
++ * @param sl Session layer instance to use (unused for HLCI cams).
++ * @return en50221_stdcam instance, or NULL on error.
++ */
++extern struct en50221_stdcam *en50221_stdcam_create(int adapter, int slotnum,
++                                                  struct en50221_transport_layer *tl,
++                                                  struct en50221_session_layer *sl);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_stdcam_hlci.c dvb-apps/lib/libdvben50221/en50221_stdcam_hlci.c
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_stdcam_hlci.c     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_stdcam_hlci.c   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,216 @@
++/*
++      en50221 encoder An implementation for libdvb
++      an implementation for the en50221 transport layer
++
++      Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++      This program is free software; you can redistribute it and/or modify
++      it under the terms of the GNU Lesser General Public License as
++      published by the Free Software Foundation; either version 2.1 of
++      the License, or (at your option) any later version.
++
++      This program is distributed in the hope that it will be useful,
++      but WITHOUT ANY WARRANTY; without even the implied warranty of
++      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++      GNU Lesser General Public License for more details.
++
++      You should have received a copy of the GNU Lesser General Public
++      License along with this library; if not, write to the Free Software
++      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#include <stdio.h>
++#include <unistd.h>
++#include <limits.h>
++#include <string.h>
++#include <errno.h>
++#include <libdvbapi/dvbca.h>
++#include "en50221_app_utils.h"
++#include "en50221_app_tags.h"
++#include "en50221_stdcam.h"
++
++
++struct en50221_stdcam_hlci {
++      struct en50221_stdcam stdcam;
++
++      int cafd;
++      int slotnum;
++      int initialised;
++      struct en50221_app_send_functions sendfuncs;
++};
++
++static void en50221_stdcam_hlci_destroy(struct en50221_stdcam *stdcam, int closefd);
++static enum en50221_stdcam_status en50221_stdcam_hlci_poll(struct en50221_stdcam *stdcam);
++static int hlci_cam_added(struct en50221_stdcam_hlci *hlci);
++static int hlci_send_data(void *arg, uint16_t session_number,
++                        uint8_t * data, uint16_t data_length);
++static int hlci_send_datav(void *arg, uint16_t session_number,
++                         struct iovec *vector, int iov_count);
++
++
++
++
++struct en50221_stdcam *en50221_stdcam_hlci_create(int cafd, int slotnum)
++{
++      // try and allocate space for the HLCI stdcam
++      struct en50221_stdcam_hlci *hlci =
++              malloc(sizeof(struct en50221_stdcam_hlci));
++      if (hlci == NULL) {
++              return NULL;
++      }
++      memset(hlci, 0, sizeof(struct en50221_stdcam_hlci));
++
++      // create the sendfuncs
++      hlci->sendfuncs.arg = hlci;
++      hlci->sendfuncs.send_data = hlci_send_data;
++      hlci->sendfuncs.send_datav = hlci_send_datav;
++
++      // create the resources (NOTE: we just use fake session numbers here)
++      hlci->stdcam.ai_resource = en50221_app_ai_create(&hlci->sendfuncs);
++      hlci->stdcam.ai_session_number = 0;
++      hlci->stdcam.ca_resource = en50221_app_ca_create(&hlci->sendfuncs);
++      hlci->stdcam.ca_session_number = 1;
++//      hlci->stdcam.mmi_resource = en50221_app_mmi_create(&hlci->sendfuncs);
++      hlci->stdcam.mmi_session_number = -1;
++
++      // done
++      hlci->stdcam.destroy = en50221_stdcam_hlci_destroy;
++      hlci->stdcam.poll = en50221_stdcam_hlci_poll;
++      hlci->slotnum = slotnum;
++      hlci->cafd = cafd;
++      return &hlci->stdcam;
++}
++
++static void en50221_stdcam_hlci_destroy(struct en50221_stdcam *stdcam, int closefd)
++{
++      struct en50221_stdcam_hlci *hlci = (struct en50221_stdcam_hlci *) stdcam;
++
++      if (hlci->stdcam.ai_resource)
++              en50221_app_ai_destroy(hlci->stdcam.ai_resource);
++      if (hlci->stdcam.ca_resource)
++              en50221_app_ca_destroy(hlci->stdcam.ca_resource);
++      if (hlci->stdcam.mmi_resource)
++              en50221_app_mmi_destroy(hlci->stdcam.mmi_resource);
++
++      if (closefd)
++              close(hlci->cafd);
++
++      free(hlci);
++}
++
++static enum en50221_stdcam_status en50221_stdcam_hlci_poll(struct en50221_stdcam *stdcam)
++{
++      struct en50221_stdcam_hlci *hlci = (struct en50221_stdcam_hlci *) stdcam;
++
++      switch(dvbca_get_cam_state(hlci->cafd, hlci->slotnum)) {
++      case DVBCA_CAMSTATE_MISSING:
++              hlci->initialised = 0;
++              break;
++
++      case DVBCA_CAMSTATE_READY:
++      case DVBCA_CAMSTATE_INITIALISING:
++              if (!hlci->initialised)
++                      hlci_cam_added(hlci);
++              break;
++      }
++
++      // delay to prevent busy loop
++      usleep(10);
++
++      if (!hlci->initialised) {
++              return EN50221_STDCAM_CAM_NONE;
++      }
++      return EN50221_STDCAM_CAM_OK;
++}
++
++
++
++static int hlci_cam_added(struct en50221_stdcam_hlci *hlci)
++{
++      uint8_t buf[256];
++      int size;
++
++      // get application information
++      if (en50221_app_ai_enquiry(hlci->stdcam.ai_resource, 0)) {
++              return -EIO;
++      }
++      if ((size = dvbca_hlci_read(hlci->cafd, TAG_APP_INFO, buf, sizeof(buf))) < 0) {
++              return size;
++      }
++      if (en50221_app_ai_message(hlci->stdcam.ai_resource, 0, 0, EN50221_APP_AI_RESOURCEID, buf, size)) {
++              return -EIO;
++      }
++
++      // we forge a fake CA_INFO here so the main app works - since it will expect a CA_INFO
++      // this will be replaced with a proper call (below) when the driver support is there
++      buf[0] = TAG_CA_INFO >> 16;
++      buf[1] = (uint8_t) (TAG_CA_INFO >> 8);
++      buf[2] = (uint8_t) TAG_CA_INFO;
++      buf[3] = 0;
++      if (en50221_app_ca_message(hlci->stdcam.ca_resource, 0, 0, EN50221_APP_CA_RESOURCEID, buf, 4)) {
++              return -EIO;
++      }
++
++      /*
++      // get CA information
++         if (en50221_app_ca_info_enq(ca_resource, 0)) {
++         fprintf(stderr, "Failed to send CA INFO enquiry\n");
++         cafd = -1;
++         return -1;
++         }
++         if ((size = dvbca_hlci_read(cafd, TAG_CA_INFO, buf, sizeof(buf))) < 0) {
++         fprintf(stderr, "Failed to read CA INFO\n");
++         cafd = -1;
++         return -1;
++         }
++         if (en50221_app_ca_message(ca_resource, 0, 0, EN50221_APP_CA_RESOURCEID, buf, size)) {
++         fprintf(stderr, "Failed to parse CA INFO\n");
++         cafd = -1;
++         return -1;
++         }
++       */
++
++      // done
++      hlci->initialised = 1;
++      return 0;
++}
++
++static int hlci_send_data(void *arg, uint16_t session_number,
++                        uint8_t * data, uint16_t data_length)
++{
++      (void) session_number;
++      struct en50221_stdcam_hlci *hlci = arg;
++
++      return dvbca_hlci_write(hlci->cafd, data, data_length);
++}
++
++static int hlci_send_datav(void *arg, uint16_t session_number,
++                         struct iovec *vector, int iov_count)
++{
++      (void) session_number;
++      struct en50221_stdcam_hlci *hlci = arg;
++
++      // calculate the total length of the data to send
++      uint32_t data_size = 0;
++      int i;
++      for (i = 0; i < iov_count; i++) {
++              data_size += vector[i].iov_len;
++      }
++
++      // allocate memory for it
++      uint8_t *buf = malloc(data_size);
++      if (buf == NULL) {
++              return -1;
++      }
++      // merge the iovecs
++      uint32_t pos = 0;
++      for (i = 0; i < iov_count; i++) {
++              memcpy(buf + pos, vector[i].iov_base, vector[i].iov_len);
++              pos += vector[i].iov_len;
++      }
++
++      // sendit and cleanup
++      int status = dvbca_hlci_write(hlci->cafd, buf, data_size);
++      free(buf);
++      return status;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_stdcam_llci.c dvb-apps/lib/libdvben50221/en50221_stdcam_llci.c
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_stdcam_llci.c     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_stdcam_llci.c   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,437 @@
++/*
++      en50221 encoder An implementation for libdvb
++      an implementation for the en50221 transport layer
++
++      Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++      This program is free software; you can redistribute it and/or modify
++      it under the terms of the GNU Lesser General Public License as
++      published by the Free Software Foundation; either version 2.1 of
++      the License, or (at your option) any later version.
++
++      This program is distributed in the hope that it will be useful,
++      but WITHOUT ANY WARRANTY; without even the implied warranty of
++      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++      GNU Lesser General Public License for more details.
++
++      You should have received a copy of the GNU Lesser General Public
++      License along with this library; if not, write to the Free Software
++      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#include <stdio.h>
++#include <unistd.h>
++#include <limits.h>
++#include <string.h>
++#include <errno.h>
++#include <libdvbapi/dvbca.h>
++#include <libdvbmisc/dvbmisc.h>
++#include "en50221_app_rm.h"
++#include "en50221_app_datetime.h"
++#include "en50221_app_utils.h"
++#include "en50221_app_tags.h"
++#include "en50221_stdcam.h"
++
++#define LLCI_RESPONSE_TIMEOUT_MS 1000
++#define LLCI_POLL_DELAY_MS 100
++
++/* resource IDs we support */
++static uint32_t resource_ids[] =
++{     EN50221_APP_RM_RESOURCEID,
++      EN50221_APP_CA_RESOURCEID,
++      EN50221_APP_AI_RESOURCEID,
++      EN50221_APP_MMI_RESOURCEID,
++      EN50221_APP_DATETIME_RESOURCEID,
++};
++#define RESOURCE_IDS_COUNT sizeof(resource_ids)/4
++
++struct llci_resource {
++      struct en50221_app_public_resource_id resid;
++      uint32_t binary_resource_id;
++      en50221_sl_resource_callback callback;
++      void *arg;
++};
++
++struct en50221_stdcam_llci {
++      struct en50221_stdcam stdcam;
++
++      int cafd;
++      int slotnum;
++      int state;
++
++      struct llci_resource resources[RESOURCE_IDS_COUNT];
++
++      struct en50221_transport_layer *tl;
++      struct en50221_session_layer *sl;
++      struct en50221_app_send_functions sendfuncs;
++      int tl_slot_id;
++
++      struct en50221_app_rm *rm_resource;
++
++      struct en50221_app_datetime *datetime_resource;
++      int datetime_session_number;
++      uint8_t datetime_response_interval;
++      time_t datetime_next_send;
++      time_t datetime_dvbtime;
++};
++
++static enum en50221_stdcam_status en50221_stdcam_llci_poll(struct en50221_stdcam *stdcam);
++static void en50221_stdcam_llci_dvbtime(struct en50221_stdcam *stdcam, time_t dvbtime);
++static void en50221_stdcam_llci_destroy(struct en50221_stdcam *stdcam, int closefd);
++static void llci_cam_added(struct en50221_stdcam_llci *llci);
++static void llci_cam_in_reset(struct en50221_stdcam_llci *llci);
++static void llci_cam_removed(struct en50221_stdcam_llci *llci);
++
++
++static int llci_lookup_callback(void *arg, uint8_t _slot_id, uint32_t requested_resource_id,
++                              en50221_sl_resource_callback *callback_out, void **arg_out,
++                              uint32_t *connected_resource_id);
++static int llci_session_callback(void *arg, int reason, uint8_t _slot_id, uint16_t session_number, uint32_t resource_id);
++static int llci_rm_enq_callback(void *arg, uint8_t _slot_id, uint16_t session_number);
++static int llci_rm_reply_callback(void *arg, uint8_t _slot_id, uint16_t session_number, uint32_t resource_id_count, uint32_t *_resource_ids);
++static int llci_rm_changed_callback(void *arg, uint8_t _slot_id, uint16_t session_number);
++
++static int llci_datetime_enquiry_callback(void *arg, uint8_t _slot_id, uint16_t session_number, uint8_t response_interval);
++
++
++struct en50221_stdcam *en50221_stdcam_llci_create(int cafd, int slotnum,
++                                                struct en50221_transport_layer *tl,
++                                                struct en50221_session_layer *sl)
++{
++      // try and allocate space for the LLCI stdcam
++      struct en50221_stdcam_llci *llci =
++              malloc(sizeof(struct en50221_stdcam_llci));
++      if (llci == NULL) {
++              return NULL;
++      }
++      memset(llci, 0, sizeof(struct en50221_stdcam_llci));
++
++      // create the sendfuncs
++      llci->sendfuncs.arg  = sl;
++      llci->sendfuncs.send_data  = (en50221_send_data) en50221_sl_send_data;
++      llci->sendfuncs.send_datav = (en50221_send_datav) en50221_sl_send_datav;
++
++      // create the resource manager resource
++      int resource_idx = 0;
++      llci->rm_resource = en50221_app_rm_create(&llci->sendfuncs);
++      en50221_app_decode_public_resource_id(&llci->resources[resource_idx].resid, EN50221_APP_RM_RESOURCEID);
++      llci->resources[resource_idx].binary_resource_id = EN50221_APP_RM_RESOURCEID;
++      llci->resources[resource_idx].callback = (en50221_sl_resource_callback) en50221_app_rm_message;
++      llci->resources[resource_idx].arg = llci->rm_resource;
++      en50221_app_rm_register_enq_callback(llci->rm_resource, llci_rm_enq_callback, llci);
++      en50221_app_rm_register_reply_callback(llci->rm_resource, llci_rm_reply_callback, llci);
++      en50221_app_rm_register_changed_callback(llci->rm_resource, llci_rm_changed_callback, llci);
++      resource_idx++;
++
++      // create the datetime resource
++      llci->datetime_resource = en50221_app_datetime_create(&llci->sendfuncs);
++      en50221_app_decode_public_resource_id(&llci->resources[resource_idx].resid, EN50221_APP_DATETIME_RESOURCEID);
++      llci->resources[resource_idx].binary_resource_id = EN50221_APP_DATETIME_RESOURCEID;
++      llci->resources[resource_idx].callback = (en50221_sl_resource_callback) en50221_app_datetime_message;
++      llci->resources[resource_idx].arg = llci->datetime_resource;
++      en50221_app_datetime_register_enquiry_callback(llci->datetime_resource, llci_datetime_enquiry_callback, llci);
++      resource_idx++;
++      llci->datetime_session_number = -1;
++      llci->datetime_response_interval = 0;
++      llci->datetime_next_send = 0;
++      llci->datetime_dvbtime = 0;
++
++      // create the application information resource
++      llci->stdcam.ai_resource = en50221_app_ai_create(&llci->sendfuncs);
++      en50221_app_decode_public_resource_id(&llci->resources[resource_idx].resid, EN50221_APP_AI_RESOURCEID);
++      llci->resources[resource_idx].binary_resource_id = EN50221_APP_AI_RESOURCEID;
++      llci->resources[resource_idx].callback = (en50221_sl_resource_callback) en50221_app_ai_message;
++      llci->resources[resource_idx].arg = llci->stdcam.ai_resource;
++      llci->stdcam.ai_session_number = -1;
++      resource_idx++;
++
++      // create the CA resource
++      llci->stdcam.ca_resource = en50221_app_ca_create(&llci->sendfuncs);
++      en50221_app_decode_public_resource_id(&llci->resources[resource_idx].resid, EN50221_APP_CA_RESOURCEID);
++      llci->resources[resource_idx].binary_resource_id = EN50221_APP_CA_RESOURCEID;
++      llci->resources[resource_idx].callback = (en50221_sl_resource_callback) en50221_app_ca_message;
++      llci->resources[resource_idx].arg = llci->stdcam.ca_resource;
++      llci->stdcam.ca_session_number = -1;
++      resource_idx++;
++
++      // create the MMI resource
++      llci->stdcam.mmi_resource = en50221_app_mmi_create(&llci->sendfuncs);
++      en50221_app_decode_public_resource_id(&llci->resources[resource_idx].resid, EN50221_APP_MMI_RESOURCEID);
++      llci->resources[resource_idx].binary_resource_id = EN50221_APP_MMI_RESOURCEID;
++      llci->resources[resource_idx].callback = (en50221_sl_resource_callback) en50221_app_mmi_message;
++      llci->resources[resource_idx].arg = llci->stdcam.mmi_resource;
++      llci->stdcam.mmi_session_number = -1;
++      resource_idx++;
++
++      // register session layer callbacks
++      en50221_sl_register_lookup_callback(sl, llci_lookup_callback, llci);
++      en50221_sl_register_session_callback(sl, llci_session_callback, llci);
++
++      // done
++      llci->stdcam.destroy = en50221_stdcam_llci_destroy;
++      llci->stdcam.poll = en50221_stdcam_llci_poll;
++      llci->stdcam.dvbtime = en50221_stdcam_llci_dvbtime;
++      llci->cafd = cafd;
++      llci->slotnum = slotnum;
++      llci->tl = tl;
++      llci->sl = sl;
++      llci->tl_slot_id = -1;
++      llci->state = EN50221_STDCAM_CAM_NONE;
++      return &llci->stdcam;
++}
++
++static void en50221_stdcam_llci_dvbtime(struct en50221_stdcam *stdcam, time_t dvbtime)
++{
++      struct en50221_stdcam_llci *llci = (struct en50221_stdcam_llci *) stdcam;
++
++      llci->datetime_dvbtime = dvbtime;
++}
++
++static void en50221_stdcam_llci_destroy(struct en50221_stdcam *stdcam, int closefd)
++{
++      struct en50221_stdcam_llci *llci = (struct en50221_stdcam_llci *) stdcam;
++
++      // "remove" the cam
++      llci_cam_removed(llci);
++
++      // destroy resources
++      if (llci->rm_resource)
++              en50221_app_rm_destroy(llci->rm_resource);
++      if (llci->datetime_resource)
++              en50221_app_datetime_destroy(llci->datetime_resource);
++      if (llci->stdcam.ai_resource)
++              en50221_app_ai_destroy(llci->stdcam.ai_resource);
++      if (llci->stdcam.ca_resource)
++              en50221_app_ca_destroy(llci->stdcam.ca_resource);
++      if (llci->stdcam.mmi_resource)
++              en50221_app_mmi_destroy(llci->stdcam.mmi_resource);
++
++      if (closefd)
++              close(llci->cafd);
++
++      free(llci);
++}
++
++
++
++
++static enum en50221_stdcam_status en50221_stdcam_llci_poll(struct en50221_stdcam *stdcam)
++{
++      struct en50221_stdcam_llci *llci = (struct en50221_stdcam_llci *) stdcam;
++
++      switch(dvbca_get_cam_state(llci->cafd, llci->slotnum)) {
++      case DVBCA_CAMSTATE_MISSING:
++              if (llci->state != EN50221_STDCAM_CAM_NONE)
++                      llci_cam_removed(llci);
++              break;
++
++      case DVBCA_CAMSTATE_READY:
++              if (llci->state == EN50221_STDCAM_CAM_NONE)
++                      llci_cam_added(llci);
++              else if (llci->state == EN50221_STDCAM_CAM_INRESET)
++                      llci_cam_in_reset(llci);
++              break;
++      }
++
++      // poll the stack
++      int error;
++      if ((error = en50221_tl_poll(llci->tl)) != 0) {
++              print(LOG_LEVEL, ERROR, 1, "Error reported by stack:%i\n", en50221_tl_get_error(llci->tl));
++      }
++
++      // send date/time response
++      if (llci->datetime_session_number != -1) {
++              time_t cur_time = time(NULL);
++              if (llci->datetime_response_interval && (cur_time > llci->datetime_next_send)) {
++                      en50221_app_datetime_send(llci->datetime_resource,
++                                              llci->datetime_session_number,
++                                              llci->datetime_dvbtime, 0);
++                      llci->datetime_next_send = cur_time + llci->datetime_response_interval;
++              }
++      }
++
++      return llci->state;
++}
++
++static void llci_cam_added(struct en50221_stdcam_llci *llci)
++{
++      // clear down any old structures
++      if (llci->tl_slot_id != -1) {
++              llci_cam_removed(llci);
++      }
++
++      // reset the CAM
++      dvbca_reset(llci->cafd, llci->slotnum);
++      llci->state = EN50221_STDCAM_CAM_INRESET;
++}
++
++static void llci_cam_in_reset(struct en50221_stdcam_llci *llci)
++{
++      if (dvbca_get_cam_state(llci->cafd, llci->slotnum) != DVBCA_CAMSTATE_READY) {
++              return;
++      }
++
++      // register the slot
++      if ((llci->tl_slot_id = en50221_tl_register_slot(llci->tl, llci->cafd, llci->slotnum,
++                                                       LLCI_RESPONSE_TIMEOUT_MS, LLCI_POLL_DELAY_MS)) < 0) {
++              llci->state = EN50221_STDCAM_CAM_BAD;
++              return;
++      }
++
++      // create a new connection on the slot
++      if (en50221_tl_new_tc(llci->tl, llci->tl_slot_id) < 0) {
++              llci->state = EN50221_STDCAM_CAM_BAD;
++              llci->tl_slot_id = -1;
++              en50221_tl_destroy_slot(llci->tl, llci->tl_slot_id);
++              return;
++      }
++
++      llci->state = EN50221_STDCAM_CAM_OK;
++}
++
++static void llci_cam_removed(struct en50221_stdcam_llci *llci)
++{
++      if (llci->tl_slot_id != -1) {
++              en50221_tl_destroy_slot(llci->tl, llci->tl_slot_id);
++              llci->tl_slot_id = -1;
++              llci->datetime_session_number = -1;
++              llci->stdcam.ai_session_number = -1;
++              llci->stdcam.ca_session_number = -1;
++              llci->stdcam.mmi_session_number = -1;
++      }
++      llci->state = EN50221_STDCAM_CAM_NONE;
++}
++
++
++
++static int llci_lookup_callback(void *arg, uint8_t _slot_id, uint32_t requested_resource_id,
++                              en50221_sl_resource_callback *callback_out, void **arg_out,
++                              uint32_t *connected_resource_id)
++{
++      struct en50221_app_public_resource_id resid;
++      struct en50221_stdcam_llci *llci = (struct en50221_stdcam_llci *) arg;
++      (void) _slot_id;
++
++      // decode the resource id
++      if (!en50221_app_decode_public_resource_id(&resid, requested_resource_id)) {
++              return -1;
++      }
++
++      // try and find an instance of the resource
++      uint32_t i;
++      for(i=0; i<RESOURCE_IDS_COUNT; i++) {
++              if ((resid.resource_class == llci->resources[i].resid.resource_class) &&
++                  (resid.resource_type == llci->resources[i].resid.resource_type)) {
++
++                      // limit sessions to certain resources
++                      switch(requested_resource_id) {
++                      case EN50221_APP_DATETIME_RESOURCEID:
++                              if (llci->datetime_session_number != -1)
++                                      return -3;
++                              break;
++                      case EN50221_APP_AI_RESOURCEID:
++                              if (llci->stdcam.ai_session_number != -1)
++                                      return -3;
++                              break;
++                      case EN50221_APP_CA_RESOURCEID:
++                              if (llci->stdcam.ca_session_number != -1)
++                                      return -3;
++                              break;
++                      case EN50221_APP_MMI_RESOURCEID:
++                              if (llci->stdcam.mmi_session_number != -1)
++                                      return -3;
++                              break;
++                      }
++
++                      // resource is ok.
++                      *callback_out = llci->resources[i].callback;
++                      *arg_out = llci->resources[i].arg;
++                      *connected_resource_id = llci->resources[i].binary_resource_id;
++                      return 0;
++              }
++      }
++
++      return -1;
++}
++
++static int llci_session_callback(void *arg, int reason, uint8_t _slot_id, uint16_t session_number, uint32_t resource_id)
++{
++      struct en50221_stdcam_llci *llci = (struct en50221_stdcam_llci *) arg;
++      (void) _slot_id;
++
++      switch(reason) {
++      case S_SCALLBACK_REASON_CAMCONNECTED:
++              if (resource_id == EN50221_APP_RM_RESOURCEID) {
++                      en50221_app_rm_enq(llci->rm_resource, session_number);
++              } else if (resource_id == EN50221_APP_DATETIME_RESOURCEID) {
++                      llci->datetime_session_number = session_number;
++              } else if (resource_id == EN50221_APP_AI_RESOURCEID) {
++                      en50221_app_ai_enquiry(llci->stdcam.ai_resource, session_number);
++                      llci->stdcam.ai_session_number = session_number;
++              } else if (resource_id == EN50221_APP_CA_RESOURCEID) {
++                      en50221_app_ca_info_enq(llci->stdcam.ca_resource, session_number);
++                      llci->stdcam.ca_session_number = session_number;
++              } else if (resource_id == EN50221_APP_MMI_RESOURCEID) {
++                      llci->stdcam.mmi_session_number = session_number;
++              }
++
++              break;
++    case S_SCALLBACK_REASON_CLOSE:
++        if (resource_id == EN50221_APP_MMI_RESOURCEID) {
++            llci->stdcam.mmi_session_number = -1;
++        }
++
++        break;
++      }
++      return 0;
++}
++
++static int llci_rm_enq_callback(void *arg, uint8_t _slot_id, uint16_t session_number)
++{
++      struct en50221_stdcam_llci *llci = (struct en50221_stdcam_llci *) arg;
++      (void) _slot_id;
++
++      if (en50221_app_rm_reply(llci->rm_resource, session_number, RESOURCE_IDS_COUNT, resource_ids)) {
++              print(LOG_LEVEL, ERROR, 1, "Failed to send RM ENQ on slot %02x\n", _slot_id);
++      }
++      return 0;
++}
++
++static int llci_rm_reply_callback(void *arg, uint8_t _slot_id, uint16_t session_number, uint32_t resource_id_count, uint32_t *_resource_ids)
++{
++      struct en50221_stdcam_llci *llci = (struct en50221_stdcam_llci *) arg;
++      (void) _slot_id;
++      (void) resource_id_count;
++      (void) _resource_ids;
++
++      if (en50221_app_rm_changed(llci->rm_resource, session_number)) {
++              print(LOG_LEVEL, ERROR, 1, "Failed to send RM REPLY on slot %02x\n", _slot_id);
++      }
++      return 0;
++}
++
++static int llci_rm_changed_callback(void *arg, uint8_t _slot_id, uint16_t session_number)
++{
++      struct en50221_stdcam_llci *llci = (struct en50221_stdcam_llci *) arg;
++      (void) _slot_id;
++
++      if (en50221_app_rm_enq(llci->rm_resource, session_number)) {
++              print(LOG_LEVEL, ERROR, 1, "Failed to send RM CHANGED on slot %02x\n", _slot_id);
++      }
++      return 0;
++}
++
++static int llci_datetime_enquiry_callback(void *arg, uint8_t _slot_id, uint16_t session_number, uint8_t response_interval)
++{
++      struct en50221_stdcam_llci *llci = (struct en50221_stdcam_llci *) arg;
++      (void) _slot_id;
++
++      llci->datetime_response_interval = response_interval;
++      llci->datetime_next_send = 0;
++      if (response_interval) {
++              llci->datetime_next_send = time(NULL) + response_interval;
++      }
++      en50221_app_datetime_send(llci->datetime_resource, session_number, llci->datetime_dvbtime, 0);
++
++      return 0;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_transport.c dvb-apps/lib/libdvben50221/en50221_transport.c
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_transport.c       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_transport.c     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,1296 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 transport layer
++
++    Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++    Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
++    Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#include <stdio.h>
++#include <unistd.h>
++#include <string.h>
++#include <pthread.h>
++#include <fcntl.h>
++#include <sys/ioctl.h>
++#include <sys/poll.h>
++#include <time.h>
++#include <libdvbmisc/dvbmisc.h>
++#include <libdvbapi/dvbca.h>
++#include "en50221_errno.h"
++#include "en50221_transport.h"
++#include "asn_1.h"
++
++// these are the Transport Tags, like
++// described in EN50221, Annex A.4.1.13 (pg70)
++#define T_SB                0x80      // sb                           primitive   h<--m
++#define T_RCV               0x81      // receive                      primitive   h-->m
++#define T_CREATE_T_C        0x82      // create transport connection  primitive   h-->m
++#define T_C_T_C_REPLY       0x83      // ctc reply                    primitive   h<--m
++#define T_DELETE_T_C        0x84      // delete tc                    primitive   h<->m
++#define T_D_T_C_REPLY       0x85      // dtc reply                    primitive   h<->m
++#define T_REQUEST_T_C       0x86      // request transport connection primitive   h<--m
++#define T_NEW_T_C           0x87      // new tc / reply to t_request  primitive   h-->m
++#define T_T_C_ERROR         0x77      // error creating tc            primitive   h-->m
++#define T_DATA_LAST         0xA0      // convey data from higher      constructed h<->m
++                               // layers
++#define T_DATA_MORE         0xA1      // convey data from higher      constructed h<->m
++                               // layers
++
++struct en50221_message {
++      struct en50221_message *next;
++      uint32_t length;
++      uint8_t data[0];
++};
++
++struct en50221_connection {
++      uint32_t state;         // the current state: idle/in_delete/in_create/active
++      struct timeval tx_time; // time last request was sent from host->module, or 0 if ok
++      struct timeval last_poll_time;  // time of last poll transmission
++      uint8_t *chain_buffer;  // used to save parts of chained packets
++      uint32_t buffer_length;
++
++      struct en50221_message *send_queue;
++      struct en50221_message *send_queue_tail;
++};
++
++struct en50221_slot {
++      int ca_hndl;
++      uint8_t slot;           // CAM slot
++      struct en50221_connection *connections;
++
++      pthread_mutex_t slot_lock;
++
++      uint32_t response_timeout;
++      uint32_t poll_delay;
++};
++
++struct en50221_transport_layer {
++      uint8_t max_slots;
++      uint8_t max_connections_per_slot;
++      struct en50221_slot *slots;
++      struct pollfd *slot_pollfds;
++      int slots_changed;
++
++      pthread_mutex_t global_lock;
++      pthread_mutex_t setcallback_lock;
++
++      int error;
++      int error_slot;
++
++      en50221_tl_callback callback;
++      void *callback_arg;
++};
++
++static int en50221_tl_process_data(struct en50221_transport_layer *tl,
++                                 uint8_t slot_id, uint8_t * data,
++                                 uint32_t data_length);
++static int en50221_tl_poll_tc(struct en50221_transport_layer *tl,
++                            uint8_t slot_id, uint8_t connection_id);
++static int en50221_tl_alloc_new_tc(struct en50221_transport_layer *tl,
++                                 uint8_t slot_id);
++static void queue_message(struct en50221_transport_layer *tl,
++                        uint8_t slot_id, uint8_t connection_id,
++                        struct en50221_message *msg);
++static int en50221_tl_handle_create_tc_reply(struct en50221_transport_layer
++                                           *tl, uint8_t slot_id,
++                                           uint8_t connection_id);
++static int en50221_tl_handle_delete_tc(struct en50221_transport_layer *tl,
++                                     uint8_t slot_id,
++                                     uint8_t connection_id);
++static int en50221_tl_handle_delete_tc_reply(struct en50221_transport_layer
++                                           *tl, uint8_t slot_id,
++                                           uint8_t connection_id);
++static int en50221_tl_handle_request_tc(struct en50221_transport_layer *tl,
++                                      uint8_t slot_id,
++                                      uint8_t connection_id);
++static int en50221_tl_handle_data_more(struct en50221_transport_layer *tl,
++                                     uint8_t slot_id,
++                                     uint8_t connection_id,
++                                     uint8_t * data,
++                                     uint32_t data_length);
++static int en50221_tl_handle_data_last(struct en50221_transport_layer *tl,
++                                     uint8_t slot_id,
++                                     uint8_t connection_id,
++                                     uint8_t * data,
++                                     uint32_t data_length);
++static int en50221_tl_handle_sb(struct en50221_transport_layer *tl,
++                              uint8_t slot_id, uint8_t connection_id,
++                              uint8_t * data, uint32_t data_length);
++
++
++struct en50221_transport_layer *en50221_tl_create(uint8_t max_slots,
++                                                uint8_t
++                                                max_connections_per_slot)
++{
++      struct en50221_transport_layer *tl = NULL;
++      int i;
++      int j;
++
++      // setup structure
++      tl = (struct en50221_transport_layer *)
++              malloc(sizeof(struct en50221_transport_layer));
++      if (tl == NULL)
++              goto error_exit;
++      tl->max_slots = max_slots;
++      tl->max_connections_per_slot = max_connections_per_slot;
++      tl->slots = NULL;
++      tl->slot_pollfds = NULL;
++      tl->slots_changed = 1;
++      tl->callback = NULL;
++      tl->callback_arg = NULL;
++      tl->error_slot = 0;
++      tl->error = 0;
++      pthread_mutex_init(&tl->global_lock, NULL);
++      pthread_mutex_init(&tl->setcallback_lock, NULL);
++
++      // create the slots
++      tl->slots = malloc(sizeof(struct en50221_slot) * max_slots);
++      if (tl->slots == NULL)
++              goto error_exit;
++
++      // set them up
++      for (i = 0; i < max_slots; i++) {
++              tl->slots[i].ca_hndl = -1;
++
++              // create the connections for this slot
++              tl->slots[i].connections =
++                  malloc(sizeof(struct en50221_connection) * max_connections_per_slot);
++              if (tl->slots[i].connections == NULL)
++                      goto error_exit;
++
++              // create a mutex for the slot
++              pthread_mutex_init(&tl->slots[i].slot_lock, NULL);
++
++              // set them up
++              for (j = 0; j < max_connections_per_slot; j++) {
++                      tl->slots[i].connections[j].state = T_STATE_IDLE;
++                      tl->slots[i].connections[j].tx_time.tv_sec = 0;
++                      tl->slots[i].connections[j].last_poll_time.tv_sec = 0;
++                      tl->slots[i].connections[j].last_poll_time.tv_usec = 0;
++                      tl->slots[i].connections[j].chain_buffer = NULL;
++                      tl->slots[i].connections[j].buffer_length = 0;
++                      tl->slots[i].connections[j].send_queue = NULL;
++                      tl->slots[i].connections[j].send_queue_tail = NULL;
++              }
++      }
++
++      // create the pollfds
++      tl->slot_pollfds = malloc(sizeof(struct pollfd) * max_slots);
++      if (tl->slot_pollfds == NULL) {
++              goto error_exit;
++      }
++      memset(tl->slot_pollfds, 0, sizeof(struct pollfd) * max_slots);
++
++      return tl;
++
++      error_exit:
++      en50221_tl_destroy(tl);
++      return NULL;
++}
++
++// Destroy an instance of the transport layer
++void en50221_tl_destroy(struct en50221_transport_layer *tl)
++{
++      int i, j;
++
++      if (tl) {
++              if (tl->slots) {
++                      for (i = 0; i < tl->max_slots; i++) {
++                              if (tl->slots[i].connections) {
++                                      for (j = 0; j < tl->max_connections_per_slot; j++) {
++                                              if (tl->slots[i].connections[j].chain_buffer) {
++                                                      free(tl->slots[i].connections[j].chain_buffer);
++                                              }
++
++                                              struct en50221_message *cur_msg =
++                                                      tl->slots[i].connections[j].send_queue;
++                                              while (cur_msg) {
++                                                      struct en50221_message *next_msg = cur_msg->next;
++                                                      free(cur_msg);
++                                                      cur_msg = next_msg;
++                                              }
++                                              tl->slots[i].connections[j].send_queue = NULL;
++                                              tl->slots[i].connections[j].send_queue_tail = NULL;
++                                      }
++                                      free(tl->slots[i].connections);
++                                      pthread_mutex_destroy(&tl->slots[i].slot_lock);
++                              }
++                      }
++                      free(tl->slots);
++              }
++              if (tl->slot_pollfds) {
++                      free(tl->slot_pollfds);
++              }
++              pthread_mutex_destroy(&tl->setcallback_lock);
++              pthread_mutex_destroy(&tl->global_lock);
++              free(tl);
++      }
++}
++
++// this can be called from the user-space app to
++// register new slots that we should work with
++int en50221_tl_register_slot(struct en50221_transport_layer *tl,
++                           int ca_hndl, uint8_t slot,
++                           uint32_t response_timeout,
++                           uint32_t poll_delay)
++{
++      // lock
++      pthread_mutex_lock(&tl->global_lock);
++
++      // we browse through the array of slots
++      // to look for the first unused one
++      int i;
++      int16_t slot_id = -1;
++      for (i = 0; i < tl->max_slots; i++) {
++              if (tl->slots[i].ca_hndl == -1) {
++                      slot_id = i;
++                      break;
++              }
++      }
++      if (slot_id == -1) {
++              tl->error = EN50221ERR_OUTOFSLOTS;
++              pthread_mutex_unlock(&tl->global_lock);
++              return -1;
++      }
++      // set up the slot struct
++      pthread_mutex_lock(&tl->slots[slot_id].slot_lock);
++      tl->slots[slot_id].ca_hndl = ca_hndl;
++      tl->slots[slot_id].slot = slot;
++      tl->slots[slot_id].response_timeout = response_timeout;
++      tl->slots[slot_id].poll_delay = poll_delay;
++      pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++
++      tl->slots_changed = 1;
++      pthread_mutex_unlock(&tl->global_lock);
++      return slot_id;
++}
++
++void en50221_tl_destroy_slot(struct en50221_transport_layer *tl,
++                           uint8_t slot_id)
++{
++      int i;
++
++      if (slot_id >= tl->max_slots)
++              return;
++
++      // lock
++      pthread_mutex_lock(&tl->global_lock);
++
++      // clear the slot
++      pthread_mutex_lock(&tl->slots[slot_id].slot_lock);
++      tl->slots[slot_id].ca_hndl = -1;
++      for (i = 0; i < tl->max_connections_per_slot; i++) {
++              tl->slots[slot_id].connections[i].state = T_STATE_IDLE;
++              tl->slots[slot_id].connections[i].tx_time.tv_sec = 0;
++              tl->slots[slot_id].connections[i].last_poll_time.tv_sec = 0;
++              tl->slots[slot_id].connections[i].last_poll_time.tv_usec = 0;
++              if (tl->slots[slot_id].connections[i].chain_buffer) {
++                      free(tl->slots[slot_id].connections[i].
++                           chain_buffer);
++              }
++              tl->slots[slot_id].connections[i].chain_buffer = NULL;
++              tl->slots[slot_id].connections[i].buffer_length = 0;
++
++              struct en50221_message *cur_msg =
++                  tl->slots[slot_id].connections[i].send_queue;
++              while (cur_msg) {
++                      struct en50221_message *next_msg = cur_msg->next;
++                      free(cur_msg);
++                      cur_msg = next_msg;
++              }
++              tl->slots[slot_id].connections[i].send_queue = NULL;
++              tl->slots[slot_id].connections[i].send_queue_tail = NULL;
++      }
++      pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++
++      // tell upper layers
++      pthread_mutex_lock(&tl->setcallback_lock);
++      en50221_tl_callback cb = tl->callback;
++      void *cb_arg = tl->callback_arg;
++      pthread_mutex_unlock(&tl->setcallback_lock);
++      if (cb)
++              cb(cb_arg, T_CALLBACK_REASON_SLOTCLOSE, NULL, 0, slot_id, 0);
++
++      tl->slots_changed = 1;
++      pthread_mutex_unlock(&tl->global_lock);
++}
++
++int en50221_tl_poll(struct en50221_transport_layer *tl)
++{
++      uint8_t data[4096];
++      int slot_id;
++      int j;
++
++      // make up pollfds if the slots have changed
++      pthread_mutex_lock(&tl->global_lock);
++      if (tl->slots_changed) {
++              for (slot_id = 0; slot_id < tl->max_slots; slot_id++) {
++                      if (tl->slots[slot_id].ca_hndl != -1) {
++                              tl->slot_pollfds[slot_id].fd = tl->slots[slot_id].ca_hndl;
++                              tl->slot_pollfds[slot_id].events = POLLIN | POLLPRI | POLLERR;
++                              tl->slot_pollfds[slot_id].revents = 0;
++                      } else {
++                              tl->slot_pollfds[slot_id].fd = 0;
++                              tl->slot_pollfds[slot_id].events = 0;
++                              tl->slot_pollfds[slot_id].revents = 0;
++                      }
++              }
++              tl->slots_changed = 0;
++      }
++      pthread_mutex_unlock(&tl->global_lock);
++
++      // anything happened?
++      if (poll(tl->slot_pollfds, tl->max_slots, 10) < 0) {
++              tl->error_slot = -1;
++              tl->error = EN50221ERR_CAREAD;
++              return -1;
++      }
++      // go through all slots (even though poll may not have reported any events
++      for (slot_id = 0; slot_id < tl->max_slots; slot_id++) {
++
++              // check if this slot is still used and get its handle
++              pthread_mutex_lock(&tl->slots[slot_id].slot_lock);
++              if (tl->slots[slot_id].ca_hndl == -1) {
++                      pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++                      continue;
++              }
++              int ca_hndl = tl->slots[slot_id].ca_hndl;
++
++              if (tl->slot_pollfds[slot_id].revents & (POLLPRI | POLLIN)) {
++                      // read data
++                      uint8_t r_slot_id;
++                      uint8_t connection_id;
++                      int readcnt = dvbca_link_read(ca_hndl, &r_slot_id,
++                                                    &connection_id,
++                                                    data, sizeof(data));
++                      if (readcnt < 0) {
++                              tl->error_slot = slot_id;
++                              tl->error = EN50221ERR_CAREAD;
++                              pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++                              return -1;
++                      }
++                      // process it if we got some
++                      if (readcnt > 0) {
++                              if (tl->slots[slot_id].slot != r_slot_id) {
++                                      // this message is for an other CAM of the same CA
++                                      int new_slot_id;
++                                      for (new_slot_id = 0; new_slot_id < tl->max_slots; new_slot_id++) {
++                                              if ((tl->slots[new_slot_id].ca_hndl == ca_hndl) &&
++                                                  (tl->slots[new_slot_id].slot == r_slot_id))
++                                                      break;
++                                      }
++                                      if (new_slot_id != tl->max_slots) {
++                                              // we found the requested CAM
++                                              pthread_mutex_lock(&tl->slots[new_slot_id].slot_lock);
++                                              if (en50221_tl_process_data(tl, new_slot_id, data, readcnt)) {
++                                                      pthread_mutex_unlock(&tl->slots[new_slot_id].slot_lock);
++                                                      pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++                                                      return -1;
++                                              }
++                                              pthread_mutex_unlock(&tl->slots[new_slot_id].slot_lock);
++                                      } else {
++                                              tl->error = EN50221ERR_BADSLOTID;
++                                              pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++                                              return -1;
++                                      }
++                              } else
++                                  if (en50221_tl_process_data(tl, slot_id, data, readcnt)) {
++                                      pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++                                      return -1;
++                              }
++                      }
++              } else if (tl->slot_pollfds[slot_id].revents & POLLERR) {
++                      // an error was reported
++                      tl->error_slot = slot_id;
++                      tl->error = EN50221ERR_CAREAD;
++                      pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++                      return -1;
++              }
++              // poll the connections on this slot + check for timeouts
++              for (j = 0; j < tl->max_connections_per_slot; j++) {
++                      // ignore connection if idle
++                      if (tl->slots[slot_id].connections[j].state == T_STATE_IDLE) {
++                              continue;
++                      }
++                      // send queued data
++                      if (tl->slots[slot_id].connections[j].state &
++                              (T_STATE_IN_CREATION | T_STATE_ACTIVE | T_STATE_ACTIVE_DELETEQUEUED)) {
++                              // send data if there is some to go and we're not waiting for a response already
++                              if (tl->slots[slot_id].connections[j].send_queue &&
++                                  (tl->slots[slot_id].connections[j].tx_time.tv_sec == 0)) {
++
++                                      // get the message
++                                      struct en50221_message *msg =
++                                              tl->slots[slot_id].connections[j].send_queue;
++                                      if (msg->next != NULL) {
++                                              tl->slots[slot_id].connections[j].send_queue = msg->next;
++                                      } else {
++                                              tl->slots[slot_id].connections[j].send_queue = NULL;
++                                              tl->slots[slot_id].connections[j].send_queue_tail = NULL;
++                                      }
++
++                                      // send the message
++                                      if (dvbca_link_write(tl->slots[slot_id].ca_hndl,
++                                                           tl->slots[slot_id].slot,
++                                                           j,
++                                                           msg->data, msg->length) < 0) {
++                                              free(msg);
++                                              pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++                                              tl->error_slot = slot_id;
++                                              tl->error = EN50221ERR_CAWRITE;
++                                              print(LOG_LEVEL, ERROR, 1, "CAWrite failed");
++                                              return -1;
++                                      }
++                                      gettimeofday(&tl->slots[slot_id].connections[j].tx_time, 0);
++
++                                      // fixup connection state for T_DELETE_T_C
++                                      if (msg->length && (msg->data[0] == T_DELETE_T_C)) {
++                                              tl->slots[slot_id].connections[j].state = T_STATE_IN_DELETION;
++                                              if (tl->slots[slot_id].connections[j].chain_buffer) {
++                                                      free(tl->slots[slot_id].connections[j].chain_buffer);
++                                              }
++                                              tl->slots[slot_id].connections[j].chain_buffer = NULL;
++                                              tl->slots[slot_id].connections[j].buffer_length = 0;
++                                      }
++
++                                      free(msg);
++                              }
++                      }
++                      // poll it if we're not expecting a reponse and the poll time has elapsed
++                      if (tl->slots[slot_id].connections[j].state & T_STATE_ACTIVE) {
++                              if ((tl->slots[slot_id].connections[j].tx_time.tv_sec == 0) &&
++                                  (time_after(tl->slots[slot_id].connections[j].last_poll_time,
++                                              tl->slots[slot_id].poll_delay))) {
++
++                                      gettimeofday(&tl->slots[slot_id].connections[j].last_poll_time, 0);
++                                      if (en50221_tl_poll_tc(tl, slot_id, j)) {
++                                              pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++                                              return -1;
++                                      }
++                              }
++                      }
++
++                      // check for timeouts - in any state
++                      if (tl->slots[slot_id].connections[j].tx_time.tv_sec &&
++                          (time_after(tl->slots[slot_id].connections[j].tx_time,
++                                      tl->slots[slot_id].response_timeout))) {
++
++                              if (tl->slots[slot_id].connections[j].state &
++                                  (T_STATE_IN_CREATION |T_STATE_IN_DELETION)) {
++                                      tl->slots[slot_id].connections[j].state = T_STATE_IDLE;
++                              } else if (tl->slots[slot_id].connections[j].state &
++                                         (T_STATE_ACTIVE | T_STATE_ACTIVE_DELETEQUEUED)) {
++                                      tl->error_slot = slot_id;
++                                      tl->error = EN50221ERR_TIMEOUT;
++                                      pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++                                      return -1;
++                              }
++                      }
++              }
++              pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++      }
++
++      return 0;
++}
++
++void en50221_tl_register_callback(struct en50221_transport_layer *tl,
++                                en50221_tl_callback callback, void *arg)
++{
++      pthread_mutex_lock(&tl->setcallback_lock);
++      tl->callback = callback;
++      tl->callback_arg = arg;
++      pthread_mutex_unlock(&tl->setcallback_lock);
++}
++
++int en50221_tl_get_error_slot(struct en50221_transport_layer *tl)
++{
++      return tl->error_slot;
++}
++
++int en50221_tl_get_error(struct en50221_transport_layer *tl)
++{
++      return tl->error;
++}
++
++int en50221_tl_send_data(struct en50221_transport_layer *tl,
++                       uint8_t slot_id, uint8_t connection_id,
++                       uint8_t * data, uint32_t data_size)
++{
++#ifdef DEBUG_TXDATA
++      printf("[[[[[[[[[[[[[[[[[[[[\n");
++      uint32_t ii = 0;
++      for (ii = 0; ii < data_size; ii++) {
++              printf("%02x: %02x\n", ii, data[ii]);
++      }
++      printf("]]]]]]]]]]]]]]]]]]]]\n");
++#endif
++
++      if (slot_id >= tl->max_slots) {
++              tl->error = EN50221ERR_BADSLOTID;
++              return -1;
++      }
++
++      pthread_mutex_lock(&tl->slots[slot_id].slot_lock);
++      if (tl->slots[slot_id].ca_hndl == -1) {
++              tl->error = EN50221ERR_BADSLOTID;
++              pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++              return -1;
++      }
++      if (connection_id >= tl->max_connections_per_slot) {
++              tl->error_slot = slot_id;
++              tl->error = EN50221ERR_BADCONNECTIONID;
++              pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++              return -1;
++      }
++      if (tl->slots[slot_id].connections[connection_id].state != T_STATE_ACTIVE) {
++              tl->error = EN50221ERR_BADCONNECTIONID;
++              pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++              return -1;
++      }
++      // allocate msg structure
++      struct en50221_message *msg =
++          malloc(sizeof(struct en50221_message) + data_size + 10);
++      if (msg == NULL) {
++              tl->error_slot = slot_id;
++              tl->error = EN50221ERR_OUTOFMEMORY;
++              pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++              return -1;
++      }
++      // make up data to send
++      int length_field_len;
++      msg->data[0] = T_DATA_LAST;
++      if ((length_field_len = asn_1_encode(data_size + 1, msg->data + 1, 3)) < 0) {
++              free(msg);
++              tl->error_slot = slot_id;
++              tl->error = EN50221ERR_ASNENCODE;
++              pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++              return -1;
++      }
++      msg->data[1 + length_field_len] = connection_id;
++      memcpy(msg->data + 1 + length_field_len + 1, data, data_size);
++      msg->length = 1 + length_field_len + 1 + data_size;
++
++      // queue it for transmission
++      queue_message(tl, slot_id, connection_id, msg);
++
++      pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++      return 0;
++}
++
++int en50221_tl_send_datav(struct en50221_transport_layer *tl,
++                        uint8_t slot_id, uint8_t connection_id,
++                        struct iovec *vector, int iov_count)
++{
++#ifdef DEBUG_TXDATA
++      printf("[[[[[[[[[[[[[[[[[[[[\n");
++      uint32_t ii = 0;
++      uint32_t iipos = 0;
++      for (ii = 0; ii < (uint32_t) iov_count; ii++) {
++              uint32_t jj;
++              for (jj = 0; jj < vector[ii].iov_len; jj++) {
++                      printf("%02x: %02x\n", jj + iipos,
++                             *((uint8_t *) (vector[ii].iov_base) + jj));
++              }
++              iipos += vector[ii].iov_len;
++      }
++      printf("]]]]]]]]]]]]]]]]]]]]\n");
++#endif
++
++      if (slot_id >= tl->max_slots) {
++              tl->error = EN50221ERR_BADSLOTID;
++              return -1;
++      }
++
++      pthread_mutex_lock(&tl->slots[slot_id].slot_lock);
++      if (tl->slots[slot_id].ca_hndl == -1) {
++              tl->error = EN50221ERR_BADSLOTID;
++              pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++              return -1;
++      }
++      if (connection_id >= tl->max_connections_per_slot) {
++              tl->error_slot = slot_id;
++              tl->error = EN50221ERR_BADCONNECTIONID;
++              pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++              return -1;
++      }
++      if (tl->slots[slot_id].connections[connection_id].state != T_STATE_ACTIVE) {
++              tl->error = EN50221ERR_BADCONNECTIONID;
++              pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++              return -1;
++      }
++      // calculate the total length of the data to send
++      uint32_t data_size = 0;
++      int i;
++      for (i = 0; i < iov_count; i++) {
++              data_size += vector[i].iov_len;
++      }
++
++      // allocate msg structure
++      struct en50221_message *msg =
++          malloc(sizeof(struct en50221_message) + data_size + 10);
++      if (msg == NULL) {
++              tl->error_slot = slot_id;
++              tl->error = EN50221ERR_OUTOFMEMORY;
++              pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++              return -1;
++      }
++      // make up data to send
++      int length_field_len;
++      msg->data[0] = T_DATA_LAST;
++      if ((length_field_len = asn_1_encode(data_size + 1, msg->data + 1, 3)) < 0) {
++              free(msg);
++              tl->error_slot = slot_id;
++              tl->error = EN50221ERR_ASNENCODE;
++              pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++              return -1;
++      }
++      msg->data[1 + length_field_len] = connection_id;
++      msg->length = 1 + length_field_len + 1 + data_size;
++      msg->next = NULL;
++
++      // merge the iovecs
++      uint32_t pos = 1 + length_field_len + 1;
++      for (i = 0; i < iov_count; i++) {
++              memcpy(msg->data + pos, vector[i].iov_base,
++                     vector[i].iov_len);
++              pos += vector[i].iov_len;
++      }
++
++      // queue it for transmission
++      queue_message(tl, slot_id, connection_id, msg);
++
++      pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++      return 0;
++}
++
++int en50221_tl_new_tc(struct en50221_transport_layer *tl, uint8_t slot_id)
++{
++      // check
++      if (slot_id >= tl->max_slots) {
++              tl->error = EN50221ERR_BADSLOTID;
++              return -1;
++      }
++
++      pthread_mutex_lock(&tl->slots[slot_id].slot_lock);
++      if (tl->slots[slot_id].ca_hndl == -1) {
++              tl->error = EN50221ERR_BADSLOTID;
++              pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++              return -1;
++      }
++      // allocate a new connection if possible
++      int conid = en50221_tl_alloc_new_tc(tl, slot_id);
++      if (conid == -1) {
++              tl->error_slot = slot_id;
++              tl->error = EN50221ERR_OUTOFCONNECTIONS;
++              pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++              return -1;
++      }
++      // allocate msg structure
++      struct en50221_message *msg =
++          malloc(sizeof(struct en50221_message) + 3);
++      if (msg == NULL) {
++              tl->error_slot = slot_id;
++              tl->error = EN50221ERR_OUTOFMEMORY;
++              pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++              return -1;
++      }
++      // make up the data to send
++      msg->data[0] = T_CREATE_T_C;
++      msg->data[1] = 1;
++      msg->data[2] = conid;
++      msg->length = 3;
++      msg->next = NULL;
++
++      // queue it for transmission
++      queue_message(tl, slot_id, conid, msg);
++
++      // done
++      pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++      return conid;
++}
++
++int en50221_tl_del_tc(struct en50221_transport_layer *tl, uint8_t slot_id,
++                    uint8_t connection_id)
++{
++      // check
++      if (slot_id >= tl->max_slots) {
++              tl->error = EN50221ERR_BADSLOTID;
++              return -1;
++      }
++
++      pthread_mutex_lock(&tl->slots[slot_id].slot_lock);
++      if (tl->slots[slot_id].ca_hndl == -1) {
++              tl->error = EN50221ERR_BADSLOTID;
++              pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++              return -1;
++      }
++      if (connection_id >= tl->max_connections_per_slot) {
++              tl->error_slot = slot_id;
++              tl->error = EN50221ERR_BADCONNECTIONID;
++              pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++              return -1;
++      }
++      if (!(tl->slots[slot_id].connections[connection_id].state &
++            (T_STATE_ACTIVE | T_STATE_IN_DELETION))) {
++              tl->error_slot = slot_id;
++              tl->error = EN50221ERR_BADSTATE;
++              pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++              return -1;
++      }
++      // allocate msg structure
++      struct en50221_message *msg =
++          malloc(sizeof(struct en50221_message) + 3);
++      if (msg == NULL) {
++              tl->error_slot = slot_id;
++              tl->error = EN50221ERR_OUTOFMEMORY;
++              pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++              return -1;
++      }
++      // make up the data to send
++      msg->data[0] = T_DELETE_T_C;
++      msg->data[1] = 1;
++      msg->data[2] = connection_id;
++      msg->length = 3;
++      msg->next = NULL;
++
++      // queue it for transmission
++      queue_message(tl, slot_id, connection_id, msg);
++      tl->slots[slot_id].connections[connection_id].state =
++          T_STATE_ACTIVE_DELETEQUEUED;
++
++      pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++      return 0;
++}
++
++int en50221_tl_get_connection_state(struct en50221_transport_layer *tl,
++                                  uint8_t slot_id, uint8_t connection_id)
++{
++      if (slot_id >= tl->max_slots) {
++              tl->error = EN50221ERR_BADSLOTID;
++              return -1;
++      }
++
++      pthread_mutex_lock(&tl->slots[slot_id].slot_lock);
++      if (tl->slots[slot_id].ca_hndl == -1) {
++              tl->error = EN50221ERR_BADSLOTID;
++              pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++              return -1;
++      }
++      if (connection_id >= tl->max_connections_per_slot) {
++              tl->error_slot = slot_id;
++              tl->error = EN50221ERR_BADCONNECTIONID;
++              pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++              return -1;
++      }
++      int state = tl->slots[slot_id].connections[connection_id].state;
++      pthread_mutex_unlock(&tl->slots[slot_id].slot_lock);
++
++      return state;
++}
++
++
++
++
++// ask the module for new data
++static int en50221_tl_poll_tc(struct en50221_transport_layer *tl,
++                            uint8_t slot_id, uint8_t connection_id)
++{
++      gettimeofday(&tl->slots[slot_id].connections[connection_id].
++                   tx_time, 0);
++
++      // send command
++      uint8_t hdr[3];
++      hdr[0] = T_DATA_LAST;
++      hdr[1] = 1;
++      hdr[2] = connection_id;
++      if (dvbca_link_write(tl->slots[slot_id].ca_hndl,
++                           tl->slots[slot_id].slot,
++                           connection_id, hdr, 3) < 0) {
++              tl->error_slot = slot_id;
++              tl->error = EN50221ERR_CAWRITE;
++              return -1;
++      }
++      return 0;
++}
++
++// handle incoming data
++static int en50221_tl_process_data(struct en50221_transport_layer *tl,
++                                 uint8_t slot_id, uint8_t * data,
++                                 uint32_t data_length)
++{
++      int result;
++
++#ifdef DEBUG_RXDATA
++      printf("-------------------\n");
++      uint32_t ii = 0;
++      for (ii = 0; ii < data_length; ii++) {
++              printf("%02x: %02x\n", ii, data[ii]);
++      }
++      printf("+++++++++++++++++++\n");
++#endif
++
++      // process the received data
++      while (data_length) {
++              // parse the header
++              uint8_t tpdu_tag = data[0];
++              uint16_t asn_data_length;
++              int length_field_len;
++              if ((length_field_len = asn_1_decode(&asn_data_length, data + 1, data_length - 1)) < 0) {
++                      print(LOG_LEVEL, ERROR, 1,
++                            "Received data with invalid asn from module on slot %02x\n",
++                            slot_id);
++                      tl->error_slot = slot_id;
++                      tl->error = EN50221ERR_BADCAMDATA;
++                      return -1;
++              }
++              if ((asn_data_length < 1) ||
++                  (asn_data_length > (data_length - (1 + length_field_len)))) {
++                      print(LOG_LEVEL, ERROR, 1,
++                            "Received data with invalid length from module on slot %02x\n",
++                            slot_id);
++                      tl->error_slot = slot_id;
++                      tl->error = EN50221ERR_BADCAMDATA;
++                      return -1;
++              }
++              uint8_t connection_id = data[1 + length_field_len];
++              data += 1 + length_field_len + 1;
++              data_length -= (1 + length_field_len + 1);
++              asn_data_length--;
++
++              // check the connection_id
++              if (connection_id >= tl->max_connections_per_slot) {
++                      print(LOG_LEVEL, ERROR, 1,
++                            "Received bad connection id %02x from module on slot %02x\n",
++                            connection_id, slot_id);
++                      tl->error_slot = slot_id;
++                      tl->error = EN50221ERR_BADCONNECTIONID;
++                      return -1;
++              }
++              // process the TPDUs
++              switch (tpdu_tag) {
++              case T_C_T_C_REPLY:
++                      if ((result = en50221_tl_handle_create_tc_reply(tl, slot_id, connection_id)) < 0) {
++                              return -1;
++                      }
++                      break;
++              case T_DELETE_T_C:
++                      if ((result = en50221_tl_handle_delete_tc(tl, slot_id, connection_id)) < 0) {
++                              return -1;
++                      }
++                      break;
++              case T_D_T_C_REPLY:
++                      if ((result = en50221_tl_handle_delete_tc_reply(tl, slot_id, connection_id)) < 0) {
++                              return -1;
++                      }
++                      break;
++              case T_REQUEST_T_C:
++                      if ((result = en50221_tl_handle_request_tc(tl, slot_id, connection_id)) < 0) {
++                              return -1;
++                      }
++                      break;
++              case T_DATA_MORE:
++                      if ((result = en50221_tl_handle_data_more(tl, slot_id,
++                                                                connection_id,
++                                                                data,
++                                                                asn_data_length)) < 0) {
++                              return -1;
++                      }
++                      break;
++              case T_DATA_LAST:
++                      if ((result = en50221_tl_handle_data_last(tl, slot_id,
++                                                                connection_id,
++                                                                data,
++                                                                asn_data_length)) < 0) {
++                              return -1;
++                      }
++                      break;
++              case T_SB:
++                      if ((result = en50221_tl_handle_sb(tl, slot_id,
++                                                         connection_id,
++                                                         data,
++                                                         asn_data_length)) < 0) {
++                              return -1;
++                      }
++                      break;
++              default:
++                      print(LOG_LEVEL, ERROR, 1,
++                            "Recieved unexpected TPDU tag %02x from module on slot %02x\n",
++                            tpdu_tag, slot_id);
++                      tl->error_slot = slot_id;
++                      tl->error = EN50221ERR_BADCAMDATA;
++                      return -1;
++              }
++
++              // skip over the consumed data
++              data += asn_data_length;
++              data_length -= asn_data_length;
++      }
++
++      return 0;
++}
++
++static int en50221_tl_handle_create_tc_reply(struct en50221_transport_layer
++                                           *tl, uint8_t slot_id,
++                                           uint8_t connection_id)
++{
++      // set this connection to state active
++      if (tl->slots[slot_id].connections[connection_id].state == T_STATE_IN_CREATION) {
++              tl->slots[slot_id].connections[connection_id].state = T_STATE_ACTIVE;
++              tl->slots[slot_id].connections[connection_id].tx_time.tv_sec = 0;
++
++              // tell upper layers
++              pthread_mutex_lock(&tl->setcallback_lock);
++              en50221_tl_callback cb = tl->callback;
++              void *cb_arg = tl->callback_arg;
++              pthread_mutex_unlock(&tl->setcallback_lock);
++              if (cb)
++                      cb(cb_arg, T_CALLBACK_REASON_CONNECTIONOPEN, NULL, 0, slot_id, connection_id);
++      } else {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received T_C_T_C_REPLY for connection not in "
++                    "T_STATE_IN_CREATION from module on slot %02x\n",
++                    slot_id);
++              tl->error_slot = slot_id;
++              tl->error = EN50221ERR_BADCAMDATA;
++              return -1;
++      }
++
++      return 0;
++}
++
++static int en50221_tl_handle_delete_tc(struct en50221_transport_layer *tl,
++                                     uint8_t slot_id,
++                                     uint8_t connection_id)
++{
++      // immediately delete this connection and send D_T_C_REPLY
++      if (tl->slots[slot_id].connections[connection_id].state &
++          (T_STATE_ACTIVE | T_STATE_IN_DELETION)) {
++              // clear down the slot
++              tl->slots[slot_id].connections[connection_id].state = T_STATE_IDLE;
++              if (tl->slots[slot_id].connections[connection_id].chain_buffer) {
++                      free(tl->slots[slot_id].connections[connection_id].chain_buffer);
++              }
++              tl->slots[slot_id].connections[connection_id].chain_buffer = NULL;
++              tl->slots[slot_id].connections[connection_id].buffer_length = 0;
++
++              // send the reply
++              uint8_t hdr[3];
++              hdr[0] = T_D_T_C_REPLY;
++              hdr[1] = 1;
++              hdr[2] = connection_id;
++              if (dvbca_link_write(tl->slots[slot_id].ca_hndl,
++                                   tl->slots[slot_id].slot,
++                                   connection_id, hdr, 3) < 0) {
++                      tl->error_slot = slot_id;
++                      tl->error = EN50221ERR_CAWRITE;
++                      return -1;
++              }
++              // tell upper layers
++              pthread_mutex_lock(&tl->setcallback_lock);
++              en50221_tl_callback cb = tl->callback;
++              void *cb_arg = tl->callback_arg;
++              pthread_mutex_unlock(&tl->setcallback_lock);
++              if (cb)
++                      cb(cb_arg, T_CALLBACK_REASON_CONNECTIONCLOSE, NULL, 0, slot_id, connection_id);
++      } else {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received T_DELETE_T_C for inactive connection from module on slot %02x\n",
++                    slot_id);
++              tl->error_slot = slot_id;
++              tl->error = EN50221ERR_BADCAMDATA;
++              return -1;
++      }
++
++      return 0;
++}
++
++static int en50221_tl_handle_delete_tc_reply(struct en50221_transport_layer
++                                           *tl, uint8_t slot_id,
++                                           uint8_t connection_id)
++{
++      // delete this connection, should be in T_STATE_IN_DELETION already
++      if (tl->slots[slot_id].connections[connection_id].state == T_STATE_IN_DELETION) {
++              tl->slots[slot_id].connections[connection_id].state = T_STATE_IDLE;
++      } else {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received T_D_T_C_REPLY received for connection not in "
++                    "T_STATE_IN_DELETION from module on slot %02x\n",
++                    slot_id);
++              tl->error_slot = slot_id;
++              tl->error = EN50221ERR_BADCAMDATA;
++              return -1;
++      }
++
++      return 0;
++}
++
++static int en50221_tl_handle_request_tc(struct en50221_transport_layer *tl,
++                                      uint8_t slot_id,
++                                      uint8_t connection_id)
++{
++      // allocate a new connection if possible
++      int conid = en50221_tl_alloc_new_tc(tl, slot_id);
++      int ca_hndl = tl->slots[slot_id].ca_hndl;
++      if (conid == -1) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Too many connections requested by module on slot %02x\n",
++                    slot_id);
++
++              // send the error
++              uint8_t hdr[4];
++              hdr[0] = T_T_C_ERROR;
++              hdr[1] = 2;
++              hdr[2] = connection_id;
++              hdr[3] = 1;
++              if (dvbca_link_write(ca_hndl, tl->slots[slot_id].slot, connection_id, hdr, 4) < 0) {
++                      tl->error_slot = slot_id;
++                      tl->error = EN50221ERR_CAWRITE;
++                      return -1;
++              }
++              tl->slots[slot_id].connections[connection_id].tx_time.
++                  tv_sec = 0;
++      } else {
++              // send the NEW_T_C on the connection we received it on
++              uint8_t hdr[4];
++              hdr[0] = T_NEW_T_C;
++              hdr[1] = 2;
++              hdr[2] = connection_id;
++              hdr[3] = conid;
++              if (dvbca_link_write(ca_hndl, tl->slots[slot_id].slot, connection_id, hdr, 4) < 0) {
++                      tl->slots[slot_id].connections[conid].state = T_STATE_IDLE;
++                      tl->error_slot = slot_id;
++                      tl->error = EN50221ERR_CAWRITE;
++                      return -1;
++              }
++              tl->slots[slot_id].connections[connection_id].tx_time.tv_sec = 0;
++
++              // send the CREATE_T_C on the new connnection
++              hdr[0] = T_CREATE_T_C;
++              hdr[1] = 1;
++              hdr[2] = conid;
++              if (dvbca_link_write(ca_hndl, tl->slots[slot_id].slot, conid, hdr, 3) < 0) {
++                      tl->slots[slot_id].connections[conid].state = T_STATE_IDLE;
++                      tl->error_slot = slot_id;
++                      tl->error = EN50221ERR_CAWRITE;
++                      return -1;
++              }
++              gettimeofday(&tl->slots[slot_id].connections[conid].tx_time, 0);
++
++              // tell upper layers
++              pthread_mutex_lock(&tl->setcallback_lock);
++              en50221_tl_callback cb = tl->callback;
++              void *cb_arg = tl->callback_arg;
++              pthread_mutex_unlock(&tl->setcallback_lock);
++              if (cb)
++                      cb(cb_arg, T_CALLBACK_REASON_CAMCONNECTIONOPEN, NULL, 0, slot_id, conid);
++      }
++
++      return 0;
++}
++
++static int en50221_tl_handle_data_more(struct en50221_transport_layer *tl,
++                                     uint8_t slot_id,
++                                     uint8_t connection_id,
++                                     uint8_t * data,
++                                     uint32_t data_length)
++{
++      // connection in correct state?
++      if (tl->slots[slot_id].connections[connection_id].state != T_STATE_ACTIVE) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received T_DATA_MORE for connection not in "
++                    "T_STATE_ACTIVE from module on slot %02x\n",
++                    slot_id);
++              tl->error_slot = slot_id;
++              tl->error = EN50221ERR_BADCAMDATA;
++              return -1;
++      }
++      // a chained data packet is coming in, save
++      // it to the buffer and wait for more
++      tl->slots[slot_id].connections[connection_id].tx_time.tv_sec = 0;
++      int new_data_length =
++          tl->slots[slot_id].connections[connection_id].buffer_length + data_length;
++      uint8_t *new_data_buffer =
++          realloc(tl->slots[slot_id].connections[connection_id].chain_buffer, new_data_length);
++      if (new_data_buffer == NULL) {
++              tl->error_slot = slot_id;
++              tl->error = EN50221ERR_OUTOFMEMORY;
++              return -1;
++      }
++      tl->slots[slot_id].connections[connection_id].chain_buffer = new_data_buffer;
++
++      memcpy(tl->slots[slot_id].connections[connection_id].chain_buffer +
++             tl->slots[slot_id].connections[connection_id].buffer_length,
++             data, data_length);
++      tl->slots[slot_id].connections[connection_id].buffer_length = new_data_length;
++
++      return 0;
++}
++
++static int en50221_tl_handle_data_last(struct en50221_transport_layer *tl,
++                                     uint8_t slot_id,
++                                     uint8_t connection_id,
++                                     uint8_t * data,
++                                     uint32_t data_length)
++{
++      // connection in correct state?
++      if (tl->slots[slot_id].connections[connection_id].state != T_STATE_ACTIVE) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received T_DATA_LAST received for connection not in "
++                    "T_STATE_ACTIVE from module on slot %02x\n",
++                    slot_id);
++              tl->error_slot = slot_id;
++              tl->error = EN50221ERR_BADCAMDATA;
++              return -1;
++      }
++      // last package of a chain or single package comes in
++      tl->slots[slot_id].connections[connection_id].tx_time.tv_sec = 0;
++      if (tl->slots[slot_id].connections[connection_id].chain_buffer == NULL) {
++              // single package => dispatch immediately
++              pthread_mutex_lock(&tl->setcallback_lock);
++              en50221_tl_callback cb = tl->callback;
++              void *cb_arg = tl->callback_arg;
++              pthread_mutex_unlock(&tl->setcallback_lock);
++
++              if (cb && data_length) {
++                      pthread_mutex_unlock(&tl->slots[slot_id].
++                                           slot_lock);
++                      cb(cb_arg, T_CALLBACK_REASON_DATA, data, data_length, slot_id, connection_id);
++                      pthread_mutex_lock(&tl->slots[slot_id].slot_lock);
++              }
++      } else {
++              int new_data_length =
++                  tl->slots[slot_id].connections[connection_id].buffer_length + data_length;
++              uint8_t *new_data_buffer =
++                  realloc(tl->slots[slot_id].connections[connection_id].chain_buffer, new_data_length);
++              if (new_data_buffer == NULL) {
++                      tl->error_slot = slot_id;
++                      tl->error = EN50221ERR_OUTOFMEMORY;
++                      return -1;
++              }
++
++              memcpy(new_data_buffer +
++                     tl->slots[slot_id].connections[connection_id].
++                     buffer_length, data, data_length);
++
++              // clean the buffer position
++              tl->slots[slot_id].connections[connection_id].chain_buffer = NULL;
++              tl->slots[slot_id].connections[connection_id].buffer_length = 0;
++
++              // tell the upper layers
++              pthread_mutex_lock(&tl->setcallback_lock);
++              en50221_tl_callback cb = tl->callback;
++              void *cb_arg = tl->callback_arg;
++              pthread_mutex_unlock(&tl->setcallback_lock);
++              if (cb && data_length) {
++                      pthread_mutex_unlock(&tl->slots[slot_id].
++                                           slot_lock);
++                      cb(cb_arg, T_CALLBACK_REASON_DATA, new_data_buffer,
++                         new_data_length, slot_id, connection_id);
++                      pthread_mutex_lock(&tl->slots[slot_id].slot_lock);
++              }
++
++              free(new_data_buffer);
++      }
++
++      return 0;
++}
++
++static int en50221_tl_handle_sb(struct en50221_transport_layer *tl,
++                              uint8_t slot_id, uint8_t connection_id,
++                              uint8_t * data, uint32_t data_length)
++{
++      // is the connection id ok?
++      if (tl->slots[slot_id].connections[connection_id].state != T_STATE_ACTIVE) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Received T_SB for connection not in T_STATE_ACTIVE from module on slot %02x\n",
++                    slot_id);
++              tl->error_slot = slot_id;
++              tl->error = EN50221ERR_BADCAMDATA;
++              return -1;
++      }
++      // did we get enough data in the T_SB?
++      if (data_length != 1) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "Recieved T_SB with invalid length from module on slot %02x\n",
++                    slot_id);
++              tl->error_slot = slot_id;
++              tl->error = EN50221ERR_BADCAMDATA;
++              return -1;
++      }
++      // tell it to send the data if it says there is some
++      if (data[0] & 0x80) {
++              int ca_hndl = tl->slots[slot_id].ca_hndl;
++
++              // send the RCV
++              uint8_t hdr[3];
++              hdr[0] = T_RCV;
++              hdr[1] = 1;
++              hdr[2] = connection_id;
++              if (dvbca_link_write(ca_hndl, tl->slots[slot_id].slot, connection_id, hdr, 3) < 0) {
++                      tl->error_slot = slot_id;
++                      tl->error = EN50221ERR_CAWRITE;
++                      return -1;
++              }
++              gettimeofday(&tl->slots[slot_id].connections[connection_id].tx_time, 0);
++
++      } else {
++              // no data - indicate not waiting for anything now
++              tl->slots[slot_id].connections[connection_id].tx_time.tv_sec = 0;
++      }
++
++      return 0;
++}
++
++static int en50221_tl_alloc_new_tc(struct en50221_transport_layer *tl,
++                                 uint8_t slot_id)
++{
++      // we browse through the array of connection
++      // types, to look for the first unused one
++      int i, conid = -1;
++      for (i = 1; i < tl->max_connections_per_slot; i++) {
++              if (tl->slots[slot_id].connections[i].state == T_STATE_IDLE) {
++                      conid = i;
++                      break;
++              }
++      }
++      if (conid == -1) {
++              print(LOG_LEVEL, ERROR, 1,
++                    "CREATE_T_C failed: no more connections available\n");
++              return -1;
++      }
++      // set up the connection struct
++      tl->slots[slot_id].connections[conid].state = T_STATE_IN_CREATION;
++      tl->slots[slot_id].connections[conid].chain_buffer = NULL;
++      tl->slots[slot_id].connections[conid].buffer_length = 0;
++
++      return conid;
++}
++
++static void queue_message(struct en50221_transport_layer *tl,
++                        uint8_t slot_id, uint8_t connection_id,
++                        struct en50221_message *msg)
++{
++      msg->next = NULL;
++      if (tl->slots[slot_id].connections[connection_id].send_queue_tail) {
++              tl->slots[slot_id].connections[connection_id].send_queue_tail->next = msg;
++              tl->slots[slot_id].connections[connection_id].send_queue_tail = msg;
++      } else {
++              tl->slots[slot_id].connections[connection_id].send_queue = msg;
++              tl->slots[slot_id].connections[connection_id].send_queue_tail = msg;
++      }
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_transport.h dvb-apps/lib/libdvben50221/en50221_transport.h
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/en50221_transport.h       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/en50221_transport.h     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,234 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 session layer
++
++    Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++    Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
++    Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++
++#ifndef __EN50221_TRANSPORT_H__
++#define __EN50221_TRANSPORT_H__
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include <stdlib.h>
++#include <stdint.h>
++#include <sys/uio.h>
++
++/**
++ * Callback reasons.
++ */
++#define T_CALLBACK_REASON_CONNECTIONOPEN       0x00   // A connection we opened _to_ the cam has been ACKed
++#define T_CALLBACK_REASON_CAMCONNECTIONOPEN    0x01   // The cam has opened a connection to _us_.
++#define T_CALLBACK_REASON_DATA                 0x02   // Data received
++#define T_CALLBACK_REASON_CONNECTIONCLOSE      0x03   // The cam has told us to close a connection.
++#define T_CALLBACK_REASON_SLOTCLOSE            0x04   // The cam in the supplied slot id has been removed.
++
++// these are the states a TC can be in
++#define T_STATE_IDLE            0x01  // this transport connection is not in use
++#define T_STATE_ACTIVE          0x02  // this transport connection is in use
++#define T_STATE_ACTIVE_DELETEQUEUED 0x04      // this transport connection is about to be deleted
++#define T_STATE_IN_CREATION     0x08  // this transport waits for a T_C_T_C_REPLY to become active
++#define T_STATE_IN_DELETION     0x10  // this transport waits for T_D_T_C_REPLY to become idle again
++
++/**
++ * Opaque type representing a transport layer.
++ */
++struct en50221_transport_layer;
++
++/**
++ * Type definition for callback function - used when events are received from a module.
++ *
++ * **IMPORTANT** For all callback reasons except T_CALLBACK_REASON_DATA, an internal lock is held in the
++ * transport layer. Therefore, to avoid deadlock, you *must not* call back into the transport layer for
++ * these reasons.
++ *
++ * However, for T_CALLBACK_REASON_DATA, the internal lock is not held, so calling back into the transport
++ * layer is fine in this case.
++ *
++ * @param arg Private data.
++ * @param reason One of the T_CALLBACK_REASON_* values.
++ * @param data The data.
++ * @param data_length Length of the data.
++ * @param slot_id Slot_id the data was received from.
++ * @param connection_id Connection_id the data was received from.
++ */
++typedef void (*en50221_tl_callback) (void *arg, int reason,
++                                   uint8_t * data,
++                                   uint32_t data_length,
++                                   uint8_t slot_id,
++                                   uint8_t connection_id);
++
++
++/**
++ * Construct a new instance of the transport layer.
++ *
++ * @param max_slots Maximum number of slots to support.
++ * @param max_connections_per_slot Maximum connections per slot.
++ * @return The en50221_transport_layer instance, or NULL on error.
++ */
++extern struct en50221_transport_layer *en50221_tl_create(uint8_t max_slots,
++                                                       uint8_t max_connections_per_slot);
++
++/**
++ * Destroy an instance of the transport layer.
++ *
++ * @param tl The en50221_transport_layer instance.
++ */
++extern void en50221_tl_destroy(struct en50221_transport_layer *tl);
++
++/**
++ * Register a new slot with the library.
++ *
++ * @param tl The en50221_transport_layer instance.
++ * @param ca_hndl FD for talking to the slot.
++ * @param slot CAM slot where the requested CAM of the CA is in.
++ * @param response_timeout Maximum timeout in ms to a response we send before signalling a timeout.
++ * @param poll_delay Interval between polls in ms.
++ * @return slot_id on sucess, or -1 on error.
++ */
++extern int en50221_tl_register_slot(struct en50221_transport_layer *tl,
++                                  int ca_hndl, uint8_t slot,
++                                  uint32_t response_timeout,
++                                  uint32_t poll_delay);
++
++/**
++ * Destroy a registered slot - e.g. if a CAM is removed, or an error occurs. Does
++ * not attempt to reset the CAM.
++ *
++ * @param tl The en50221_transport_layer instance.
++ * @param slot_id Slot to destroy.
++ */
++extern void en50221_tl_destroy_slot(struct en50221_transport_layer *tl, uint8_t slot_id);
++
++/**
++ * Performs one iteration of the transport layer poll -
++ * checking for incoming data furthermore it will handle
++ * the timeouts of certain commands like T_DELETE_T_C it
++ * should be called by the application regularly, generally
++ * faster than the poll delay.
++ *
++ * @param tl The en50221_transport_layer instance.
++ * @return 0 on succes, or -1 if there was an error of some sort.
++ */
++extern int en50221_tl_poll(struct en50221_transport_layer *tl);
++
++/**
++ * Register the callback for data reception.
++ *
++ * @param tl The en50221_transport_layer instance.
++ * @param callback The callback. Set to NULL to remove the callback completely.
++ * @param arg Private data passed as arg0 of the callback.
++ */
++extern void en50221_tl_register_callback(struct en50221_transport_layer *tl,
++                                       en50221_tl_callback callback, void *arg);
++
++/**
++ * Gets the ID of the slot an error occurred on.
++ *
++ * @param tl The en50221_transport_layer instance.
++ * @return The offending slot id.
++ */
++extern int en50221_tl_get_error_slot(struct en50221_transport_layer *tl);
++
++/**
++ * Gets the last error.
++ *
++ * @param tl The en50221_transport_layer instance.
++ * @return One of the EN50221ERR_* values.
++ */
++extern int en50221_tl_get_error(struct en50221_transport_layer *tl);
++
++/**
++ * This function is used to take a data-block, pack into
++ * into a TPDU (DATA_LAST) and send it to the device
++ *
++ * @param tl The en50221_transport_layer instance.
++ * @param slot_id ID of the slot.
++ * @param connection_id Connection id.
++ * @param data Data to send.
++ * @param data_length Number of bytes to send.
++ * @return 0 on success, or -1 on error.
++ */
++extern int en50221_tl_send_data(struct en50221_transport_layer *tl,
++                              uint8_t slot_id,
++                              uint8_t connection_id,
++                              uint8_t * data,
++                              uint32_t data_length);
++
++/**
++ * This function is used to take a data-block, pack into
++ * into a TPDU (DATA_LAST) and send it to the device
++ *
++ * @param tl The en50221_transport_layer instance.
++ * @param slot_id ID of the slot.
++ * @param connection_id Connection id.
++ * @param vector iov to send.
++ * @param io_count Number of elements in vector.
++ * @return 0 on success, or -1 on error.
++ */
++extern int en50221_tl_send_datav(struct en50221_transport_layer *tl,
++                               uint8_t slot_id, uint8_t connection_id,
++                               struct iovec *vector, int iov_count);
++
++/**
++ * Create a new transport connection to the cam.
++ *
++ * **IMPORTANT** When this function returns, it means the request to create a connection
++ * has been submitted. You will need to poll using en50221_tl_get_connection_state() to find out
++ * if/when the connection is established. A callback with T_CALLBACK_REASON_CONNECTIONOPEN reason
++ * will also be sent when it is acked by the CAM.
++ *
++ * @param tl The en50221_transport_layer instance.
++ * @param slot_id ID of the slot.
++ * @return The allocated connection id on success, or -1 on error.
++ */
++extern int en50221_tl_new_tc(struct en50221_transport_layer *tl, uint8_t slot_id);
++
++/**
++ * Deallocates a transport connection.
++ *
++ * **IMPORTANT** When this function returns, it means the request to destroy a connection
++ * has been submitted. You will need to poll using en50221_tl_get_connection_state() to find out
++ * if/when the connection is destroyed.
++ *
++ * @param tl The en50221_transport_layer instance.
++ * @param slot_id ID of the slot.
++ * @param connection_id Connection id to send the request _on_.
++ * @return 0 on success, or -1 on error.
++ */
++extern int en50221_tl_del_tc(struct en50221_transport_layer *tl, uint8_t slot_id, uint8_t connection_id);
++
++/**
++ * Checks the state of a connection.
++ *
++ * @param tl The en50221_transport_layer instance.
++ * @param slot_id ID of the slot.
++ * @param connection_id Connection id to send the request _on_.
++ * @return One of the T_STATE_* values.
++ */
++extern int en50221_tl_get_connection_state(struct en50221_transport_layer *tl,
++                                         uint8_t slot_id, uint8_t connection_id);
++
++#ifdef __cplusplus
++}
++#endif
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvben50221/Makefile dvb-apps/lib/libdvben50221/Makefile
+--- linuxtv-dvb-apps-1.1.1/lib/libdvben50221/Makefile  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvben50221/Makefile        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,49 @@
++# Makefile for linuxtv.org dvb-apps/lib/libdvben50221
++
++includes = asn_1.h                 \
++           en50221_app_ai.h        \
++           en50221_app_auth.h      \
++           en50221_app_ca.h        \
++           en50221_app_datetime.h  \
++           en50221_app_dvb.h       \
++           en50221_app_epg.h       \
++           en50221_app_lowspeed.h  \
++           en50221_app_mmi.h       \
++           en50221_app_rm.h        \
++           en50221_app_smartcard.h \
++           en50221_app_tags.h      \
++           en50221_app_teletext.h  \
++           en50221_app_utils.h     \
++           en50221_errno.h         \
++           en50221_session.h       \
++           en50221_stdcam.h        \
++           en50221_transport.h
++
++objects  = asn_1.o                 \
++           en50221_app_ai.o        \
++           en50221_app_auth.o      \
++           en50221_app_ca.o        \
++           en50221_app_datetime.o  \
++           en50221_app_dvb.o       \
++           en50221_app_epg.o       \
++           en50221_app_lowspeed.o  \
++           en50221_app_mmi.o       \
++           en50221_app_rm.o        \
++           en50221_app_smartcard.o \
++           en50221_app_teletext.o  \
++           en50221_app_utils.o     \
++           en50221_session.o       \
++           en50221_stdcam.o        \
++           en50221_stdcam_hlci.o   \
++           en50221_stdcam_llci.o   \
++           en50221_transport.o
++
++lib_name = libdvben50221
++
++CPPFLAGS += -I../../lib -DLOG_LEVEL=1 # FIXME
++
++.PHONY: all
++
++all: library
++
++include ../../Make.rules
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvbmisc/dvbmisc.h dvb-apps/lib/libdvbmisc/dvbmisc.h
+--- linuxtv-dvb-apps-1.1.1/lib/libdvbmisc/dvbmisc.h    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvbmisc/dvbmisc.h  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,72 @@
++/*
++      libdvbmisc - DVB miscellaneous library
++
++      Copyright (C) 2005 Manu Abraham <abraham.manu@gmail.com>
++
++      This library is free software; you can redistribute it and/or
++      modify it under the terms of the GNU Lesser General Public
++      License as published by the Free Software Foundation; either
++      version 2.1 of the License, or (at your option) any later version.
++      This library is distributed in the hope that it will be useful,
++      but WITHOUT ANY WARRANTY; without even the implied warranty of
++      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++      Lesser General Public License for more details.
++      You should have received a copy of the GNU Lesser General Public
++      License along with this library; if not, write to the Free Software
++      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++*/
++
++#ifndef DVB_MISC_H
++#define DVB_MISC_H
++
++#include <stdarg.h>
++#include <stdint.h>
++#include <stdio.h>
++#include <sys/time.h>
++
++#define ERROR         0
++#define NOTICE                1
++#define INFO          2
++#define DEBUG         3
++
++#define print(x, y, z, fmt, arg...) do {                              \
++      if (z) {                                                        \
++              if      ((x > ERROR) && (x > y))                        \
++                      vprint("%s: " fmt "\n", __func__ , ##arg);      \
++              else if ((x > NOTICE) && (x > y))                       \
++                      vprint("%s: " fmt "\n",__func__ , ##arg);       \
++              else if ((x > INFO) && (x > y))                         \
++                      vprint("%s: " fmt "\n", __func__ , ##arg);      \
++              else if ((x > DEBUG) && (x > y))                        \
++                      vprint("%s: " fmt "\n", __func__ , ##arg);      \
++      } else {                                                        \
++              if (x > y)                                              \
++                      vprint(fmt, ##arg);                             \
++      }                                                               \
++} while(0)
++
++static inline void vprint(char *fmt, ...)
++{
++      va_list args;
++
++      va_start(args, fmt);
++      vfprintf(stderr, fmt, args);
++      va_end(args);
++}
++
++static inline int time_after(struct timeval oldtime, uint32_t delta_ms)
++{
++      // calculate the oldtime + add on the delta
++      uint64_t oldtime_ms = (oldtime.tv_sec * 1000) + (oldtime.tv_usec / 1000);
++      oldtime_ms += delta_ms;
++
++      // calculate the nowtime
++      struct timeval nowtime;
++      gettimeofday(&nowtime, 0);
++      uint64_t nowtime_ms = (nowtime.tv_sec * 1000) + (nowtime.tv_usec / 1000);
++
++      // check
++      return nowtime_ms > oldtime_ms;
++}
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvbsec/dvbsec_api.c dvb-apps/lib/libdvbsec/dvbsec_api.c
+--- linuxtv-dvb-apps-1.1.1/lib/libdvbsec/dvbsec_api.c  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvbsec/dvbsec_api.c        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,951 @@
++/*
++      libdvbsec - an SEC library
++
++      Copyright (C) 2005 Manu Abraham <abraham.manu@gmail.com>
++      Copyright (C) 2006 Andrew de Quincey <adq_dvb@lidskialf.net>
++
++      This library is free software; you can redistribute it and/or
++      modify it under the terms of the GNU Lesser General Public
++      License as published by the Free Software Foundation; either
++      version 2.1 of the License, or (at your option) any later version.
++      This library is distributed in the hope that it will be useful,
++      but WITHOUT ANY WARRANTY; without even the implied warranty of
++      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++      Lesser General Public License for more details.
++      You should have received a copy of the GNU Lesser General Public
++      License along with this library; if not, write to the Free Software
++      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++*/
++
++#include <stdlib.h>
++#include <unistd.h>
++#include <errno.h>
++#include <string.h>
++#include <stdio.h>
++#include <ctype.h>
++#include <linux/types.h>
++#include <libdvbapi/dvbfe.h>
++#include "dvbsec_api.h"
++
++// uncomment this to make dvbsec_command print out debug instead of talking to a frontend
++// #define TEST_SEC_COMMAND 1
++
++int dvbsec_set(struct dvbfe_handle *fe,
++                 struct dvbsec_config *sec_config,
++                 enum dvbsec_diseqc_polarization polarization,
++                 enum dvbsec_diseqc_switch sat_pos,
++                 enum dvbsec_diseqc_switch switch_option,
++                 struct dvbfe_parameters *params,
++                 int timeout)
++{
++      int tmp;
++      struct dvbfe_parameters localparams;
++      struct dvbfe_parameters *topass = params;
++
++      // perform SEC
++      if (sec_config != NULL) {
++              switch(sec_config->config_type) {
++              case DVBSEC_CONFIG_NONE:
++                      break;
++
++              case DVBSEC_CONFIG_POWER:
++                      dvbfe_set_voltage(fe, DVBFE_SEC_VOLTAGE_13);
++                      break;
++
++              case DVBSEC_CONFIG_STANDARD:
++              {
++                      // calculate the correct oscillator value
++                      enum dvbsec_diseqc_oscillator osc = DISEQC_OSCILLATOR_LOW;
++                      if (sec_config->switch_frequency && (sec_config->switch_frequency < params->frequency))
++                              osc = DISEQC_OSCILLATOR_HIGH;
++
++                      if ((tmp = dvbsec_std_sequence(fe,
++                                                        osc,
++                                                        polarization,
++                                                        sat_pos,
++                                                        switch_option)) < 0)
++                              return tmp;
++                      break;
++              }
++
++              case DVBSEC_CONFIG_ADVANCED:
++              {
++                      // are we high or not?
++                      int high = 0;
++                      if (sec_config->switch_frequency && (sec_config->switch_frequency < params->frequency))
++                              high = 1;
++
++                      //  determine correct string
++                      char *cmd = NULL;
++                      switch(polarization) {
++                      case DISEQC_POLARIZATION_H:
++                              if (!high)
++                                      cmd = sec_config->adv_cmd_lo_h;
++                              else
++                                      cmd = sec_config->adv_cmd_hi_h;
++                              break;
++                      case DISEQC_POLARIZATION_V:
++                              if (!high)
++                                      cmd = sec_config->adv_cmd_lo_v;
++                              else
++                                      cmd = sec_config->adv_cmd_hi_v;
++                              break;
++                      case DISEQC_POLARIZATION_L:
++                              if (!high)
++                                      cmd = sec_config->adv_cmd_lo_l;
++                              else
++                                      cmd = sec_config->adv_cmd_hi_l;
++                              break;
++                      case DISEQC_POLARIZATION_R:
++                              if (!high)
++                                      cmd = sec_config->adv_cmd_lo_r;
++                              else
++                                      cmd = sec_config->adv_cmd_hi_r;
++                              break;
++                      default:
++                              return -EINVAL;
++                      }
++
++                      // do it
++                      if (cmd)
++                              if ((tmp = dvbsec_command(fe, cmd)) < 0)
++                                      return tmp;
++                      break;
++              }
++              }
++
++              // work out the correct LOF value
++              uint32_t lof = 0;
++              if ((sec_config->switch_frequency == 0) || (params->frequency < sec_config->switch_frequency)) {
++                      // LOW band
++                      switch(polarization) {
++                      case DISEQC_POLARIZATION_H:
++                              lof = sec_config->lof_lo_h;
++                              break;
++                      case DISEQC_POLARIZATION_V:
++                              lof = sec_config->lof_lo_v;
++                              break;
++                      case DISEQC_POLARIZATION_L:
++                              lof = sec_config->lof_lo_l;
++                              break;
++                      case DISEQC_POLARIZATION_R:
++                              lof = sec_config->lof_lo_r;
++                              break;
++                      case DISEQC_POLARIZATION_UNCHANGED:
++                              break;
++                      }
++              } else {
++                      // HIGH band
++                      switch(polarization) {
++                      case DISEQC_POLARIZATION_H:
++                              lof = sec_config->lof_hi_h;
++                              break;
++                      case DISEQC_POLARIZATION_V:
++                              lof = sec_config->lof_hi_v;
++                              break;
++                      case DISEQC_POLARIZATION_L:
++                              lof = sec_config->lof_hi_l;
++                              break;
++                      case DISEQC_POLARIZATION_R:
++                              lof = sec_config->lof_hi_r;
++                              break;
++                      case DISEQC_POLARIZATION_UNCHANGED:
++                              break;
++                      }
++              }
++
++              // do frequency adjustment
++              if (lof) {
++                      memcpy(&localparams, params, sizeof(struct dvbfe_parameters));
++                      int tmpfreq = localparams.frequency - lof;
++
++                      if (tmpfreq < 0)
++                              tmpfreq *= -1;
++                      localparams.frequency = (uint32_t) tmpfreq;
++                      topass = &localparams;
++              }
++      }
++
++      // set the frontend!
++      return dvbfe_set(fe, topass, timeout);
++}
++
++int dvbsec_std_sequence(struct dvbfe_handle *fe,
++                         enum dvbsec_diseqc_oscillator oscillator,
++                         enum dvbsec_diseqc_polarization polarization,
++                         enum dvbsec_diseqc_switch sat_pos,
++                         enum dvbsec_diseqc_switch switch_option)
++{
++      dvbfe_set_22k_tone(fe, DVBFE_SEC_TONE_OFF);
++
++      switch(polarization) {
++      case DISEQC_POLARIZATION_V:
++      case DISEQC_POLARIZATION_R:
++              dvbfe_set_voltage(fe, DVBFE_SEC_VOLTAGE_13);
++              break;
++      case DISEQC_POLARIZATION_H:
++      case DISEQC_POLARIZATION_L:
++              dvbfe_set_voltage(fe, DVBFE_SEC_VOLTAGE_18);
++              break;
++      default:
++              return -EINVAL;
++      }
++
++      dvbsec_diseqc_set_committed_switches(fe,
++                                          DISEQC_ADDRESS_ANY_DEVICE,
++                                          oscillator,
++                                          polarization,
++                                          sat_pos,
++                                          switch_option);
++
++      usleep(15000);
++
++      switch(sat_pos) {
++      case DISEQC_SWITCH_A:
++              dvbfe_set_tone_data_burst(fe, DVBFE_SEC_MINI_A);
++              break;
++      case DISEQC_SWITCH_B:
++              dvbfe_set_tone_data_burst(fe, DVBFE_SEC_MINI_B);
++              break;
++      default:
++              break;
++      }
++
++      if (sat_pos != DISEQC_SWITCH_UNCHANGED)
++              usleep(15000);
++
++      switch(oscillator) {
++      case DISEQC_OSCILLATOR_LOW:
++              dvbfe_set_22k_tone(fe, DVBFE_SEC_TONE_OFF);
++              break;
++      case DISEQC_OSCILLATOR_HIGH:
++              dvbfe_set_22k_tone(fe, DVBFE_SEC_TONE_ON);
++              break;
++      default:
++              break;
++      }
++
++      return 0;
++}
++
++int dvbsec_diseqc_set_reset(struct dvbfe_handle *fe,
++                         enum dvbsec_diseqc_address address,
++                         enum dvbsec_diseqc_reset state)
++{
++      uint8_t data[] = { DISEQC_FRAMING_MASTER_NOREPLY, address, 0x00 };
++
++      if (state == DISEQC_RESET_CLEAR)
++              data[2] = 0x01;
++
++      return dvbfe_do_diseqc_command(fe, data, sizeof(data));
++}
++
++int dvbsec_diseqc_set_power(struct dvbfe_handle *fe,
++                         enum dvbsec_diseqc_address address,
++                         enum dvbsec_diseqc_power state)
++{
++      uint8_t data[] = { DISEQC_FRAMING_MASTER_NOREPLY, address, 0x02 };
++
++      if (state == DISEQC_POWER_ON)
++              data[2] = 0x03;
++
++      return dvbfe_do_diseqc_command(fe, data, sizeof(data));
++}
++
++int dvbsec_diseqc_set_listen(struct dvbfe_handle *fe,
++                          enum dvbsec_diseqc_address address,
++                          enum dvbsec_diseqc_listen state)
++{
++      uint8_t data[] = { DISEQC_FRAMING_MASTER_NOREPLY, address, 0x30 };
++
++      if (state == DISEQC_LISTEN_AWAKE)
++              data[2] = 0x31;
++
++      return dvbfe_do_diseqc_command(fe, data, sizeof(data));
++}
++
++int dvbsec_diseqc_set_committed_switches(struct dvbfe_handle *fe,
++                                      enum dvbsec_diseqc_address address,
++                                      enum dvbsec_diseqc_oscillator oscillator,
++                                      enum dvbsec_diseqc_polarization polarization,
++                                      enum dvbsec_diseqc_switch sat_pos,
++                                      enum dvbsec_diseqc_switch switch_option)
++{
++      uint8_t data[] = { DISEQC_FRAMING_MASTER_NOREPLY, address, 0x38, 0x00 };
++
++      switch(oscillator) {
++      case DISEQC_OSCILLATOR_LOW:
++              data[3] |= 0x10;
++              break;
++      case DISEQC_OSCILLATOR_HIGH:
++              data[3] |= 0x11;
++              break;
++      case DISEQC_OSCILLATOR_UNCHANGED:
++              break;
++      }
++      switch(polarization) {
++      case DISEQC_POLARIZATION_V:
++      case DISEQC_POLARIZATION_R:
++              data[3] |= 0x20;
++              break;
++      case DISEQC_POLARIZATION_H:
++      case DISEQC_POLARIZATION_L:
++              data[3] |= 0x22;
++              break;
++      default:
++              break;
++      }
++      switch(sat_pos) {
++      case DISEQC_SWITCH_A:
++              data[3] |= 0x40;
++              break;
++      case DISEQC_SWITCH_B:
++              data[3] |= 0x44;
++              break;
++      case DISEQC_SWITCH_UNCHANGED:
++              break;
++      }
++      switch(switch_option) {
++      case DISEQC_SWITCH_A:
++              data[3] |= 0x80;
++              break;
++      case DISEQC_SWITCH_B:
++              data[3] |= 0x88;
++              break;
++      case DISEQC_SWITCH_UNCHANGED:
++              break;
++      }
++
++      if (data[3] == 0)
++              return 0;
++
++      return dvbfe_do_diseqc_command(fe, data, sizeof(data));
++}
++
++int dvbsec_diseqc_set_uncommitted_switches(struct dvbfe_handle *fe,
++                                        enum dvbsec_diseqc_address address,
++                                        enum dvbsec_diseqc_switch s1,
++                                        enum dvbsec_diseqc_switch s2,
++                                        enum dvbsec_diseqc_switch s3,
++                                        enum dvbsec_diseqc_switch s4)
++{
++      uint8_t data[] = { DISEQC_FRAMING_MASTER_NOREPLY, address, 0x39, 0x00 };
++
++      switch(s1) {
++      case DISEQC_SWITCH_A:
++              data[3] |= 0x10;
++              break;
++      case DISEQC_SWITCH_B:
++              data[3] |= 0x11;
++              break;
++      case DISEQC_SWITCH_UNCHANGED:
++              break;
++      }
++      switch(s2) {
++      case DISEQC_SWITCH_A:
++              data[3] |= 0x20;
++              break;
++      case DISEQC_SWITCH_B:
++              data[3] |= 0x22;
++              break;
++      case DISEQC_SWITCH_UNCHANGED:
++              break;
++      }
++      switch(s3) {
++      case DISEQC_SWITCH_A:
++              data[3] |= 0x40;
++              break;
++      case DISEQC_SWITCH_B:
++              data[3] |= 0x44;
++              break;
++      case DISEQC_SWITCH_UNCHANGED:
++              break;
++      }
++      switch(s4) {
++      case DISEQC_SWITCH_A:
++              data[3] |= 0x80;
++              break;
++      case DISEQC_SWITCH_B:
++              data[3] |= 0x88;
++              break;
++      case DISEQC_SWITCH_UNCHANGED:
++              break;
++      }
++
++      if (data[3] == 0)
++              return 0;
++
++      return dvbfe_do_diseqc_command(fe, data, sizeof(data));
++}
++
++int dvbsec_diseqc_set_analog_value(struct dvbfe_handle *fe,
++                                enum dvbsec_diseqc_address address,
++                                enum dvbsec_diseqc_analog_id id,
++                                uint8_t value)
++{
++      uint8_t data[] = { DISEQC_FRAMING_MASTER_NOREPLY, address, 0x48, value };
++
++      if (id == DISEQC_ANALOG_ID_A1)
++              data[2] = 0x49;
++
++      return dvbfe_do_diseqc_command(fe, data, sizeof(data));
++}
++
++int dvbsec_diseqc_set_frequency(struct dvbfe_handle *fe,
++                             enum dvbsec_diseqc_address address,
++                             uint32_t frequency)
++{
++      uint8_t data[] = { DISEQC_FRAMING_MASTER_NOREPLY, address, 0x58, 0x00, 0x00, 0x00 };
++      int len = 5;
++
++      uint32_t bcdval = 0;
++      int i;
++      for(i=0; i<=24;i+=4) {
++              bcdval |= ((frequency % 10) << i);
++              frequency /= 10;
++      }
++
++      data[3] = bcdval >> 16;
++      data[4] = bcdval >> 8;
++      if (bcdval & 0xff) {
++              data[5] = bcdval;
++              len++;
++      }
++
++      return dvbfe_do_diseqc_command(fe, data, len);
++}
++
++int dvbsec_diseqc_set_channel(struct dvbfe_handle *fe,
++                           enum dvbsec_diseqc_address address,
++                           uint16_t channel)
++{
++      uint8_t data[] = { DISEQC_FRAMING_MASTER_NOREPLY, address, 0x59, 0x00, 0x00};
++
++      data[3] = channel >> 8;
++      data[4] = channel;
++
++      return dvbfe_do_diseqc_command(fe, data, sizeof(data));
++}
++
++int dvbsec_diseqc_halt_satpos(struct dvbfe_handle *fe,
++                           enum dvbsec_diseqc_address address)
++{
++      uint8_t data[] = { DISEQC_FRAMING_MASTER_NOREPLY, address, 0x60};
++
++      return dvbfe_do_diseqc_command(fe, data, sizeof(data));
++}
++
++int dvbsec_diseqc_disable_satpos_limits(struct dvbfe_handle *fe,
++                                     enum dvbsec_diseqc_address address)
++{
++      uint8_t data[] = { DISEQC_FRAMING_MASTER_NOREPLY, address, 0x63};
++
++      return dvbfe_do_diseqc_command(fe, data, sizeof(data));
++}
++
++int dvbsec_diseqc_set_satpos_limit(struct dvbfe_handle *fe,
++                                enum dvbsec_diseqc_address address,
++                                enum dvbsec_diseqc_direction direction)
++{
++      uint8_t data[] = { DISEQC_FRAMING_MASTER_NOREPLY, address, 0x66};
++
++      if (direction == DISEQC_DIRECTION_WEST)
++              data[2] = 0x67;
++
++      return dvbfe_do_diseqc_command(fe, data, sizeof(data));
++}
++
++int dvbsec_diseqc_drive_satpos_motor(struct dvbfe_handle *fe,
++                                  enum dvbsec_diseqc_address address,
++                                  enum dvbsec_diseqc_direction direction,
++                                  enum dvbsec_diseqc_drive_mode mode,
++                                  uint8_t value)
++{
++      uint8_t data[] = { DISEQC_FRAMING_MASTER_NOREPLY, address, 0x68, 0x00};
++
++      if (direction == DISEQC_DIRECTION_WEST)
++              data[2] = 0x69;
++
++      switch(mode) {
++      case DISEQC_DRIVE_MODE_STEPS:
++              data[3] = (value & 0x7f) | 0x80;
++              break;
++      case DISEQC_DRIVE_MODE_TIMEOUT:
++              data[3] = value & 0x7f;
++              break;
++      }
++
++      return dvbfe_do_diseqc_command(fe, data, sizeof(data));
++}
++
++int dvbsec_diseqc_store_satpos_preset(struct dvbfe_handle *fe,
++                                   enum dvbsec_diseqc_address address,
++                                   uint8_t id)
++{
++      uint8_t data[] = { DISEQC_FRAMING_MASTER_NOREPLY, address, 0x6A, id};
++
++      return dvbfe_do_diseqc_command(fe, data, sizeof(data));
++}
++
++int dvbsec_diseqc_goto_satpos_preset(struct dvbfe_handle *fe,
++                                  enum dvbsec_diseqc_address address,
++                                  uint8_t id)
++{
++      uint8_t data[] = { DISEQC_FRAMING_MASTER_NOREPLY, address, 0x6B, id};
++
++      return dvbfe_do_diseqc_command(fe, data, sizeof(data));
++}
++
++int dvbsec_diseqc_recalculate_satpos_positions(struct dvbfe_handle *fe,
++                                            enum dvbsec_diseqc_address address,
++                                            int val1,
++                                            int val2)
++{
++      uint8_t data[] = { DISEQC_FRAMING_MASTER_NOREPLY, address, 0x6F, 0x00, 0x00};
++      int len = 3;
++
++      if (val1 != -1) {
++              data[3] = val1;
++              len++;
++      }
++      if (val2 != -1) {
++              data[4] = val2;
++              len = 5;
++      }
++
++      return dvbfe_do_diseqc_command(fe, data, len);
++}
++
++int dvbsec_diseqc_goto_rotator_bearing(struct dvbfe_handle *fe,
++                                    enum dvbsec_diseqc_address address,
++                                    float angle)
++{
++      int integer = (int) angle;
++      uint8_t data[] = { DISEQC_FRAMING_MASTER_NOREPLY, address, 0x6e, 0x00, 0x00};
++
++      // transform the fraction into the correct representation
++      int fraction = (int) (((angle - integer) * 16.0) + 0.9) & 0x0f;
++      switch(fraction) {
++      case 1:
++      case 4:
++      case 7:
++      case 9:
++      case 12:
++      case 15:
++              fraction--;
++              break;
++      }
++
++      // generate the command
++      if (integer < -256) {
++              return -EINVAL;
++      } else if (integer < 0) {
++              integer = -integer;
++              data[3] = 0xf0;
++      } else if (integer < 256) {
++              data[3] = 0x00;
++      } else if (integer < 512) {
++              integer -= 256;
++              data[3] = 0x10;
++      } else {
++              return -EINVAL;
++      }
++      data[3] |= ((integer / 16) & 0x0f);
++      integer = integer % 16;
++      data[4] |= ((integer & 0x0f) << 4) | fraction;
++
++      return dvbfe_do_diseqc_command(fe, data, sizeof(data));
++}
++
++static int skipwhite(char **line, char *end)
++{
++      while(**line) {
++              if (end && (*line >= end))
++                      return -1;
++              if (!isspace(**line))
++                      return 0;
++              (*line)++;
++      }
++
++      return -1;
++}
++
++static int getstringupto(char **line, char *end, char *matches, char **ptrdest, int *ptrlen)
++{
++      char *start = *line;
++
++      while(**line) {
++              if (end && (*line >= end))
++                      break;
++              if (strchr(matches, **line)) {
++                      *ptrdest = start;
++                      *ptrlen = *line - start;
++                      return 0;
++              }
++              (*line)++;
++      }
++
++      *ptrdest = start;
++      *ptrlen = *line - start;
++      return 0;
++}
++
++static int parsefunction(char **line,
++                       char **nameptr, int *namelen,
++                       char **argsptr, int *argslen)
++{
++      if (skipwhite(line, NULL))
++              return -1;
++
++      if (getstringupto(line, NULL, "(", nameptr, namelen))
++              return -1;
++      if ((*line) == 0)
++              return -1;
++      (*line)++; // skip the '('
++      if (getstringupto(line, NULL, ")", argsptr, argslen))
++              return -1;
++      if ((*line) == 0)
++              return -1;
++      (*line)++; // skip the ')'
++
++      return 0;
++}
++
++static int parseintarg(char **args, char *argsend, int *result)
++{
++      char tmp[32];
++      char *arg;
++      int arglen;
++
++      // skip whitespace
++      if (skipwhite(args, argsend))
++              return -1;
++
++      // get the arg
++      if (getstringupto(args, argsend, ",", &arg, &arglen))
++              return -1;
++      if ((**args) == ',')
++              (*args)++; // skip the ',' if present
++      if (arglen > 31)
++              arglen = 31;
++      strncpy(tmp, arg, arglen);
++      tmp[arglen] = 0;
++
++      if (sscanf(tmp, "%i", result) != 1)
++              return -1;
++
++      return 0;
++}
++
++static int parsechararg(char **args, char *argsend, int *result)
++{
++      char *arg;
++      int arglen;
++
++      // skip whitespace
++      if (skipwhite(args, argsend))
++              return -1;
++
++      // get the arg
++      if (getstringupto(args, argsend, ",", &arg, &arglen))
++              return -1;
++      if ((**args) == ',')
++              (*args)++; // skip the ',' if present
++      if (arglen > 0)
++              *result = arg[0];
++
++      return 0;
++}
++
++static int parsefloatarg(char **args, char *argsend, float *result)
++{
++      char tmp[32];
++      char *arg;
++      int arglen;
++
++      // skip whitespace
++      if (skipwhite(args, argsend))
++              return -1;
++
++      // get the arg
++      if (getstringupto(args, argsend, ",", &arg, &arglen))
++              return -1;
++      if ((**args) == ',')
++              (*args)++; // skip the ',' if present
++      if (arglen > 31)
++              arglen = 31;
++      strncpy(tmp, arg, arglen);
++      arg[arglen] = 0;
++
++      if (sscanf(tmp, "%f", result) != 1)
++              return -1;
++
++      return 0;
++}
++
++static enum dvbsec_diseqc_switch parse_switch(int c)
++{
++      switch(toupper(c)) {
++      case 'A':
++              return DISEQC_SWITCH_A;
++      case 'B':
++              return DISEQC_SWITCH_B;
++      default:
++              return DISEQC_SWITCH_UNCHANGED;
++      }
++}
++
++int dvbsec_command(struct dvbfe_handle *fe, char *command)
++{
++      char *name;
++      char *args;
++      int namelen;
++      int argslen;
++      int address;
++      int iarg;
++      int iarg2;
++      int iarg3;
++      int iarg4;
++      float farg;
++
++      while(!parsefunction(&command, &name, &namelen, &args, &argslen)) {
++              char *argsend = args+argslen;
++
++              if (!strncasecmp(name, "tone", namelen)) {
++                      if (parsechararg(&args, argsend, &iarg))
++                              return -1;
++
++#ifdef TEST_SEC_COMMAND
++                      printf("tone: %c\n", iarg);
++#else
++                      if (toupper(iarg) == 'B') {
++                              dvbfe_set_22k_tone(fe, DVBFE_SEC_TONE_ON);
++                      } else {
++                              dvbfe_set_22k_tone(fe, DVBFE_SEC_TONE_OFF);
++                      }
++#endif
++              } else if (!strncasecmp(name, "voltage", namelen)) {
++                      if (parseintarg(&args, argsend, &iarg))
++                              return -1;
++
++#ifdef TEST_SEC_COMMAND
++                      printf("voltage: %i\n", iarg);
++#else
++                      switch(iarg) {
++                      case 0:
++                              dvbfe_set_voltage(fe, DVBFE_SEC_VOLTAGE_OFF);
++                              break;
++                      case 13:
++                              dvbfe_set_voltage(fe, DVBFE_SEC_VOLTAGE_13);
++                              break;
++                      case 18:
++                              dvbfe_set_voltage(fe, DVBFE_SEC_VOLTAGE_18);
++                              break;
++                      default:
++                              return -1;
++                      }
++#endif
++              } else if (!strncasecmp(name, "toneburst", namelen)) {
++                      if (parsechararg(&args, argsend, &iarg))
++                              return -1;
++
++#ifdef TEST_SEC_COMMAND
++                      printf("toneburst: %c\n", iarg);
++#else
++                      if (toupper(iarg) == 'B') {
++                              dvbfe_set_tone_data_burst(fe, DVBFE_SEC_MINI_B);
++                      } else {
++                              dvbfe_set_tone_data_burst(fe, DVBFE_SEC_MINI_A);
++                      }
++#endif
++              } else if (!strncasecmp(name, "highvoltage", namelen)) {
++                      if (parseintarg(&args, argsend, &iarg))
++                              return -1;
++
++#ifdef TEST_SEC_COMMAND
++                      printf("highvoltage: %i\n", iarg);
++#else
++                      dvbfe_set_high_lnb_voltage(fe, iarg ? 1 : 0);
++#endif
++              } else if (!strncasecmp(name, "dishnetworks", namelen)) {
++                      if (parseintarg(&args, argsend, &iarg))
++                              return -1;
++
++#ifdef TEST_SEC_COMMAND
++                      printf("dishnetworks: %i\n", iarg);
++#else
++                      dvbfe_do_dishnetworks_legacy_command(fe, iarg);
++#endif
++              } else if (!strncasecmp(name, "wait", namelen)) {
++                      if (parseintarg(&args, argsend, &iarg))
++                              return -1;
++
++#ifdef TEST_SEC_COMMAND
++                      printf("wait: %i\n", iarg);
++#else
++                      if (iarg)
++                              usleep(iarg * 1000);
++#endif
++              } else if (!strncasecmp(name, "Dreset", namelen)) {
++                      if (parseintarg(&args, argsend, &address))
++                              return -1;
++                      if (parseintarg(&args, argsend, &iarg))
++                              return -1;
++
++#ifdef TEST_SEC_COMMAND
++                      printf("Dreset: %i %i\n", address, iarg);
++#else
++                      if (iarg) {
++                              dvbsec_diseqc_set_reset(fe, address, DISEQC_RESET);
++                      } else {
++                              dvbsec_diseqc_set_reset(fe, address, DISEQC_RESET_CLEAR);
++                      }
++#endif
++              } else if (!strncasecmp(name, "Dpower", namelen)) {
++                      if (parseintarg(&args, argsend, &address))
++                              return -1;
++                      if (parseintarg(&args, argsend, &iarg))
++                              return -1;
++
++#ifdef TEST_SEC_COMMAND
++                      printf("Dpower: %i %i\n", address, iarg);
++#else
++                      if (iarg) {
++                              dvbsec_diseqc_set_power(fe, address, DISEQC_POWER_ON);
++                      } else {
++                              dvbsec_diseqc_set_power(fe, address, DISEQC_POWER_OFF);
++                      }
++#endif
++              } else if (!strncasecmp(name, "Dcommitted", namelen)) {
++                      if (parseintarg(&args, argsend, &address))
++                              return -1;
++                      if (parsechararg(&args, argsend, &iarg))
++                              return -1;
++                      if (parsechararg(&args, argsend, &iarg2))
++                              return -1;
++                      if (parsechararg(&args, argsend, &iarg3))
++                              return -1;
++                      if (parsechararg(&args, argsend, &iarg4))
++                              return -1;
++
++                      enum dvbsec_diseqc_oscillator oscillator;
++                      switch(toupper(iarg)) {
++                      case 'H':
++                              oscillator = DISEQC_OSCILLATOR_HIGH;
++                              break;
++                      case 'L':
++                              oscillator = DISEQC_OSCILLATOR_LOW;
++                              break;
++                      default:
++                              oscillator = DISEQC_OSCILLATOR_UNCHANGED;
++                              break;
++                      }
++
++                      int polarization = -1;
++                      switch(toupper(iarg2)) {
++                      case 'H':
++                              polarization = DISEQC_POLARIZATION_H;
++                              break;
++                      case 'V':
++                              polarization = DISEQC_POLARIZATION_V;
++                              break;
++                      case 'L':
++                              polarization = DISEQC_POLARIZATION_L;
++                              break;
++                      case 'R':
++                              polarization = DISEQC_POLARIZATION_R;
++                              break;
++                      default:
++                              polarization = -1;
++                              break;
++                      }
++
++#ifdef TEST_SEC_COMMAND
++                      printf("Dcommitted: %i %i %i %i %i\n", address,
++                             oscillator,
++                             polarization,
++                             parse_switch(iarg3),
++                             parse_switch(iarg4));
++#else
++                      dvbsec_diseqc_set_committed_switches(fe, address,
++                                                          oscillator,
++                                                          polarization,
++                                                          parse_switch(iarg3),
++                                                          parse_switch(iarg4));
++#endif
++              } else if (!strncasecmp(name, "Duncommitted", namelen)) {
++                      if (parsechararg(&args, argsend, &address))
++                              return -1;
++                      if (parsechararg(&args, argsend, &iarg))
++                              return -1;
++                      if (parsechararg(&args, argsend, &iarg2))
++                              return -1;
++                      if (parsechararg(&args, argsend, &iarg3))
++                              return -1;
++                      if (parsechararg(&args, argsend, &iarg4))
++                              return -1;
++
++#ifdef TEST_SEC_COMMAND
++                      printf("Duncommitted: %i %i %i %i %i\n", address,
++                             parse_switch(iarg),
++                             parse_switch(iarg2),
++                             parse_switch(iarg3),
++                             parse_switch(iarg4));
++#else
++                      dvbsec_diseqc_set_uncommitted_switches(fe, address,
++                                      parse_switch(iarg),
++                                      parse_switch(iarg2),
++                                      parse_switch(iarg3),
++                                      parse_switch(iarg4));
++#endif
++              } else if (!strncasecmp(name, "Dfrequency", namelen)) {
++                      if (parseintarg(&args, argsend, &address))
++                              return -1;
++                      if (parseintarg(&args, argsend, &iarg))
++                              return -1;
++
++#ifdef TEST_SEC_COMMAND
++                      printf("Dfrequency: %i %i\n", address, iarg);
++#else
++                      dvbsec_diseqc_set_frequency(fe, address, iarg);
++#endif
++              } else if (!strncasecmp(name, "Dchannel", namelen)) {
++                      if (parseintarg(&args, argsend, &address))
++                              return -1;
++                      if (parseintarg(&args, argsend, &iarg))
++                              return -1;
++
++#ifdef TEST_SEC_COMMAND
++                      printf("Dchannel: %i %i\n", address, iarg);
++#else
++                      dvbsec_diseqc_set_channel(fe, address, iarg);
++#endif
++              } else if (!strncasecmp(name, "Dgotopreset", namelen)) {
++                      if (parseintarg(&args, argsend, &address))
++                              return -1;
++                      if (parseintarg(&args, argsend, &iarg))
++                              return -1;
++
++#ifdef TEST_SEC_COMMAND
++                      printf("Dgotopreset: %i %i\n", address, iarg);
++#else
++                      dvbsec_diseqc_goto_satpos_preset(fe, address, iarg);
++#endif
++              } else if (!strncasecmp(name, "Dgotobearing", namelen)) {
++                      if (parseintarg(&args, argsend, &address))
++                              return -1;
++                      if (parsefloatarg(&args, argsend, &farg))
++                              return -1;
++
++#ifdef TEST_SEC_COMMAND
++                      printf("Dgotobearing: %i %f\n", address, farg);
++#else
++                      dvbsec_diseqc_goto_rotator_bearing(fe, address, farg);
++#endif
++              } else {
++                      return -1;
++              }
++      }
++
++      return 0;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvbsec/dvbsec_api.h dvb-apps/lib/libdvbsec/dvbsec_api.h
+--- linuxtv-dvb-apps-1.1.1/lib/libdvbsec/dvbsec_api.h  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvbsec/dvbsec_api.h        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,436 @@
++/*
++      libdvbsec - an SEC library
++
++      Copyright (C) 2005 Manu Abraham <abraham.manu@gmail.com>
++      Copyright (C) 2006 Andrew de Quincey <adq_dvb@lidskialf.net>
++
++      This library is free software; you can redistribute it and/or
++      modify it under the terms of the GNU Lesser General Public
++      License as published by the Free Software Foundation; either
++      version 2.1 of the License, or (at your option) any later version.
++      This library is distributed in the hope that it will be useful,
++      but WITHOUT ANY WARRANTY; without even the implied warranty of
++      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++      Lesser General Public License for more details.
++      You should have received a copy of the GNU Lesser General Public
++      License along with this library; if not, write to the Free Software
++      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++*/
++
++#ifndef DVBSEC_API_H
++#define DVBSEC_API_H 1
++
++#include <stdint.h>
++
++struct dvbfe_handle;
++struct dvbfe_parameters;
++
++enum dvbsec_diseqc_framing {
++      DISEQC_FRAMING_MASTER_NOREPLY           = 0xE0,
++      DISEQC_FRAMING_MASTER_NOREPLY_REPEAT    = 0xE1,
++      DISEQC_FRAMING_MASTER_REPLY             = 0xE2,
++      DISEQC_FRAMING_MASTER_REPLY_REPEAT      = 0xE3,
++      DISEQC_FRAMING_SLAVE_OK                 = 0xE4,
++      DISEQC_FRAMING_SLAVE_UNSUPPORTED        = 0xE5,
++      DISEQC_FRAMING_SLAVE_PARITY_ERROR       = 0xE6,
++      DISEQC_FRAMING_SLAVE_UNRECOGNISED       = 0xE7,
++};
++
++enum dvbsec_diseqc_address {
++      DISEQC_ADDRESS_ANY_DEVICE               = 0x00,
++
++      DISEQC_ADDRESS_ANY_LNB_SWITCHER_SMATV   = 0x10,
++      DISEQC_ADDRESS_LNB                      = 0x11,
++      DISEQC_ADDRESS_LNB_WITH_LOOP            = 0x12,
++      DISEQC_ADDRESS_SWITCHER                 = 0x14,
++      DISEQC_ADDRESS_SWITCHER_WITH_LOOP       = 0x15,
++      DISEQC_ADDRESS_SMATV                    = 0x18,
++
++      DISEQC_ADDRESS_ANY_POLARISER            = 0x20,
++      DISEQC_ADDRESS_LINEAR_POLARISER         = 0x21,
++
++      DISEQC_ADDRESS_ANY_POSITIONER           = 0x30,
++      DISEQC_ADDRESS_POLAR_AZIMUTH_POSITIONER = 0x31,
++      DISEQC_ADDRESS_ELEVATION_POSITIONER     = 0x32,
++
++      DISEQC_ADDRESS_ANY_INSTALLER_AID        = 0x40,
++      DISEQC_ADDRESS_SIGNAL_STRENGTH          = 0x41,
++
++      DISEQC_ADDRESS_ANY_INTERFACE            = 0x70,
++      DISEQC_ADDRESS_HEADEND_INTERFACE        = 0x71,
++
++      DISEQC_ADDRESS_REALLOC_BASE             = 0x60,
++      DISEQC_ADDRESS_OEM_BASE                 = 0xf0,
++};
++
++enum dvbsec_diseqc_reset {
++      DISEQC_RESET,
++      DISEQC_RESET_CLEAR,
++};
++
++enum dvbsec_diseqc_power {
++      DISEQC_POWER_OFF,
++      DISEQC_POWER_ON,
++};
++
++enum dvbsec_diseqc_listen {
++      DISEQC_LISTEN_SLEEP,
++      DISEQC_LISTEN_AWAKE,
++};
++
++enum dvbsec_diseqc_polarization {
++      DISEQC_POLARIZATION_UNCHANGED = 0,
++      DISEQC_POLARIZATION_H = 'h',
++      DISEQC_POLARIZATION_V = 'v',
++      DISEQC_POLARIZATION_L = 'l',
++      DISEQC_POLARIZATION_R = 'r',
++};
++
++enum dvbsec_diseqc_oscillator {
++      DISEQC_OSCILLATOR_UNCHANGED = 0,
++      DISEQC_OSCILLATOR_LOW,
++      DISEQC_OSCILLATOR_HIGH,
++};
++
++enum dvbsec_diseqc_switch {
++      DISEQC_SWITCH_UNCHANGED = 0,
++      DISEQC_SWITCH_A,
++      DISEQC_SWITCH_B,
++};
++
++enum dvbsec_diseqc_analog_id {
++      DISEQC_ANALOG_ID_A0,
++      DISEQC_ANALOG_ID_A1,
++};
++
++enum dvbsec_diseqc_drive_mode {
++      DISEQC_DRIVE_MODE_STEPS,
++      DISEQC_DRIVE_MODE_TIMEOUT,
++};
++
++enum dvbsec_diseqc_direction {
++      DISEQC_DIRECTION_EAST,
++      DISEQC_DIRECTION_WEST,
++};
++
++enum dvbsec_config_type {
++      DVBSEC_CONFIG_NONE = 0,
++      DVBSEC_CONFIG_POWER,
++      DVBSEC_CONFIG_STANDARD,
++      DVBSEC_CONFIG_ADVANCED,
++};
++
++
++#define MAX_SEC_CMD_LEN 100
++
++struct dvbsec_config
++{
++      char id[32]; /* ID of this SEC config structure */
++      uint32_t switch_frequency; /* switching frequency - supply 0 for none. */
++      uint32_t lof_lo_v; /* frequency to subtract for V + LOW band channels - or for switch_frequency == 0 */
++      uint32_t lof_lo_h; /* frequency to subtract for H + LOW band channels - or for switch_frequency == 0 */
++      uint32_t lof_lo_l; /* frequency to subtract for L + LOW band channels - or for switch_frequency == 0 */
++      uint32_t lof_lo_r; /* frequency to subtract for R + LOW band channels - or for switch_frequency == 0 */
++      uint32_t lof_hi_v; /* frequency to subtract for V + HIGH band channels */
++      uint32_t lof_hi_h; /* frequency to subtract for H + HIGH band channels */
++      uint32_t lof_hi_l; /* frequency to subtract for L + HIGH band channels */
++      uint32_t lof_hi_r; /* frequency to subtract for R + HIGH band channels */
++
++      /**
++       * The SEC control to be used depends on the type:
++       *
++       * NONE - no SEC commands will be issued. (Frequency adjustment will still be performed).
++       *
++       * POWER - only the SEC power will be turned on.
++       *
++       * STANDARD - the standard DISEQC back compatable sequence is used.
++       *
++       * ADVANCED - SEC strings are supplied by the user describing the exact sequence
++       * of operations to use.
++       */
++      enum dvbsec_config_type config_type;
++
++      /* stuff for type == dvbsec_config_ADVANCED */
++      char adv_cmd_lo_h[MAX_SEC_CMD_LEN];                     /* ADVANCED SEC command to use for LOW/H. */
++      char adv_cmd_lo_v[MAX_SEC_CMD_LEN];                     /* ADVANCED SEC command to use for LOW/V. */
++      char adv_cmd_lo_l[MAX_SEC_CMD_LEN];                     /* ADVANCED SEC command to use for LOW/L. */
++      char adv_cmd_lo_r[MAX_SEC_CMD_LEN];                     /* ADVANCED SEC command to use for LOW/R. */
++      char adv_cmd_hi_h[MAX_SEC_CMD_LEN];                     /* ADVANCED SEC command to use for HI/H. */
++      char adv_cmd_hi_v[MAX_SEC_CMD_LEN];                     /* ADVANCED SEC command to use for HI/V. */
++      char adv_cmd_hi_l[MAX_SEC_CMD_LEN];                     /* ADVANCED SEC command to use for HI/L. */
++      char adv_cmd_hi_r[MAX_SEC_CMD_LEN];                     /* ADVANCED SEC command to use for HI/R. */
++};
++
++/**
++ * Helper function for tuning adapters with SEC support. This function will do
++ * everything required, including frequency adjustment based on the parameters
++ * in sec_config.
++ *
++ * Note: Since the SEC configuration structure can be set to disable any SEC
++ * operations, this function can be reused for ALL DVB style devices (just
++ * set all LOF=0,type=dvbsec_config_NONE for devices which do not require
++ * SEC control).
++ *
++ * The sec configuration structures can be looked up using the dvbcfg_sec library.
++ *
++ * @param fe Frontend concerned.
++ * @param sec_config SEC configuration structure. May be NULL to disable SEC/frequency adjustment.
++ * @param polarization Polarization of signal.
++ * @param sat_pos Satellite position - only used if type == DISEQC_SEC_CONFIG_STANDARD.
++ * @param switch_option Switch option - only used if type == DISEQC_SEC_CONFIG_STANDARD.
++ * @param params Tuning parameters.
++ * @param timeout <0 => wait forever for lock. 0=>return immediately, >0=>
++ * number of milliseconds to wait for a lock.
++ * @return 0 on locked (or if timeout==0 and everything else worked), or
++ * nonzero on failure (including no lock).
++ */
++extern int dvbsec_set(struct dvbfe_handle *fe,
++                        struct dvbsec_config *sec_config,
++                        enum dvbsec_diseqc_polarization polarization,
++                        enum dvbsec_diseqc_switch sat_pos,
++                        enum dvbsec_diseqc_switch switch_option,
++                        struct dvbfe_parameters *params,
++                        int timeout);
++
++/**
++ * This will issue the standardised back-compatable DISEQC/SEC command
++ * sequence as defined in the DISEQC spec:
++ *
++ * i.e. tone off, set voltage, wait15, DISEQC, wait15, toneburst, wait15, set tone.
++ *
++ * @param fe Frontend concerned.
++ * @param oscillator Value to set the lo/hi switch to.
++ * @param polarization Value to set the polarisation switch to.
++ * @param sat_pos Value to set the satellite position switch to.
++ * @param switch_option Value to set the "swtch option" switch to.
++ * @return 0 on success, or nonzero on error.
++ */
++extern int dvbsec_std_sequence(struct dvbfe_handle *fe,
++                                enum dvbsec_diseqc_oscillator oscillator,
++                                enum dvbsec_diseqc_polarization polarization,
++                                enum dvbsec_diseqc_switch sat_pos,
++                                enum dvbsec_diseqc_switch switch_option);
++
++/**
++ * Execute an SEC command string on the provided frontend. Please see the documentation
++ * in dvbsec_cfg.h on the command format,
++ *
++ * @param fe Frontend concerned.
++ * @param command The command to execute.
++ * @return 0 on success, or nonzero on error.
++ */
++extern int dvbsec_command(struct dvbfe_handle *fe, char *command);
++
++/**
++ * Control the reset status of an attached DISEQC device.
++ *
++ * @param fe Frontend concerned.
++ * @param address Address of the device.
++ * @param state The state to set.
++ * @return 0 on success, or nonzero on error.
++ */
++extern int dvbsec_diseqc_set_reset(struct dvbfe_handle *fe,
++                                enum dvbsec_diseqc_address address,
++                                enum dvbsec_diseqc_reset state);
++
++/**
++ * Control the power status of an attached DISEQC peripheral.
++ *
++ * @param fe Frontend concerned.
++ * @param address Address of the device.
++ * @param state The state to set.
++ * @return 0 on success, or nonzero on error.
++ */
++extern int dvbsec_diseqc_set_power(struct dvbfe_handle *fe,
++                                enum dvbsec_diseqc_address address,
++                                enum dvbsec_diseqc_power state);
++
++/**
++ * Control the listening status of an attached DISEQC peripheral.
++ *
++ * @param fe Frontend concerned.
++ * @param address Address of the device.
++ * @param state The state to set.
++ * @return 0 on success, or nonzero on error.
++ */
++extern int dvbsec_diseqc_set_listen(struct dvbfe_handle *fe,
++                                 enum dvbsec_diseqc_address address,
++                                 enum dvbsec_diseqc_listen state);
++
++/**
++ * Set the state of the committed switches of a DISEQC device.
++ * These are switches which are defined to have a standard name.
++ *
++ * @param fe Frontend concerned.
++ * @param address Address of the device.
++ * @param oscillator Value to set the lo/hi switch to.
++ * @param polarization Value to set the polarization switch to.
++ * @param sat_pos Value to set the satellite position switch to.
++ * @param switch_option Value to set the switch option switch to.
++ * @return 0 on success, or nonzero on error.
++ */
++extern int dvbsec_diseqc_set_committed_switches(struct dvbfe_handle *fe,
++                                             enum dvbsec_diseqc_address address,
++                                             enum dvbsec_diseqc_oscillator oscillator,
++                                             enum dvbsec_diseqc_polarization polarization,
++                                             enum dvbsec_diseqc_switch sat_pos,
++                                             enum dvbsec_diseqc_switch switch_option);
++
++/**
++ * Set the state of the uncommitted switches of a DISEQC device.
++ * These provide another four switching possibilities.
++ *
++ * @param fe Frontend concerned.
++ * @param address Address of the device.
++ * @param s1 Value to set the S1 switch to.
++ * @param s2 Value to set the S2 switch to.
++ * @param s3 Value to set the S3 switch to.
++ * @param s3 Value to set the S4 switch to.
++ * @return 0 on success, or nonzero on error.
++ */
++extern int dvbsec_diseqc_set_uncommitted_switches(struct dvbfe_handle *fe,
++                                               enum dvbsec_diseqc_address address,
++                                               enum dvbsec_diseqc_switch s1,
++                                               enum dvbsec_diseqc_switch s2,
++                                               enum dvbsec_diseqc_switch s3,
++                                               enum dvbsec_diseqc_switch s4);
++
++/**
++ * Set an analogue value.
++ *
++ * @param fe Frontend concerned.
++ * @param address Address of the device.
++ * @param id The id of the analogue value to set.
++ * @param value The value to set.
++ * @return 0 on success, or nonzero on error.
++ */
++extern int dvbsec_diseqc_set_analog_value(struct dvbfe_handle *fe,
++                                       enum dvbsec_diseqc_address address,
++                                       enum dvbsec_diseqc_analog_id id,
++                                       uint8_t value);
++
++/**
++ * Set the desired frequency.
++ *
++ * @param fe Frontend concerned.
++ * @param address Address of the device.
++ * @param frequency The frequency to set in GHz.
++ * @return 0 on success, or nonzero on error.
++ */
++extern int dvbsec_diseqc_set_frequency(struct dvbfe_handle *fe,
++                                    enum dvbsec_diseqc_address address,
++                                    uint32_t frequency);
++
++/**
++ * Set the desired channel.
++ *
++ * @param fe Frontend concerned.
++ * @param address Address of the device.
++ * @param channel ID of the channel to set.
++ * @return 0 on success, or nonzero on error.
++ */
++extern int dvbsec_diseqc_set_channel(struct dvbfe_handle *fe,
++                                  enum dvbsec_diseqc_address address,
++                                  uint16_t channel);
++
++/**
++ * Halt the satellite positioner.
++ *
++ * @param fe Frontend concerned.
++ * @param address Address of the device.
++ * @return 0 on success, or nonzero on error.
++ */
++extern int dvbsec_diseqc_halt_satpos(struct dvbfe_handle *fe,
++                                  enum dvbsec_diseqc_address address);
++
++/**
++ * Disable satellite positioner limits.
++ *
++ * @param fe Frontend concerned.
++ * @param address Address of the device.
++ * @return 0 on success, or nonzero on error.
++ */
++extern int dvbsec_diseqc_disable_satpos_limits(struct dvbfe_handle *fe,
++                                            enum dvbsec_diseqc_address address);
++
++/**
++ * Set satellite positioner limits.
++ *
++ * @param fe Frontend concerned.
++ * @param address Address of the device.
++ * @return 0 on success, or nonzero on error.
++ */
++extern int dvbsec_diseqc_set_satpos_limit(struct dvbfe_handle *fe,
++                                       enum dvbsec_diseqc_address address,
++                                       enum dvbsec_diseqc_direction direction);
++
++/**
++ * Drive satellite positioner motor.
++ *
++ * @param fe Frontend concerned.
++ * @param address Address of the device.
++ * @param direction Direction to drive in.
++ * @param mode Drive mode to use
++ *           (TIMEOUT=>value is a timeout in seconds, or STEPS=>value is a count of steps to use)
++ * @param value Value associated with the drive mode (range 0->127)
++ * @return 0 on success, or nonzero on error.
++ */
++extern int dvbsec_diseqc_drive_satpos_motor(struct dvbfe_handle *fe,
++                                         enum dvbsec_diseqc_address address,
++                                         enum dvbsec_diseqc_direction direction,
++                                         enum dvbsec_diseqc_drive_mode mode,
++                                         uint8_t value);
++
++/**
++ * Store satellite positioner preset id at current position.
++ *
++ * @param fe Frontend concerned.
++ * @param address Address of the device.
++ * @param id ID of the preset.
++ * @return 0 on success, or nonzero on error.
++ */
++extern int dvbsec_diseqc_store_satpos_preset(struct dvbfe_handle *fe,
++                                          enum dvbsec_diseqc_address address,
++                                          uint8_t id);
++
++/**
++ * Send a satellite positioner to a pre-set position.
++ *
++ * @param fe Frontend concerned.
++ * @param address Address of the device.
++ * @param id ID of the preset.
++ * @return 0 on success, or nonzero on error.
++ */
++extern int dvbsec_diseqc_goto_satpos_preset(struct dvbfe_handle *fe,
++                                         enum dvbsec_diseqc_address address,
++                                         uint8_t id);
++
++/**
++ * Recalculate satellite positions based on the current position, using
++ * magic positioner specific values.
++ *
++ * @param fe Frontend concerned.
++ * @param address Address of the device.
++ * @param val1 value1 (range 0->255, pass -1 to ignore).
++ * @param val2 value2 (range 0->255, pass -1 to ignore).
++ * @return 0 on success, or nonzero on error.
++ */
++extern int dvbsec_diseqc_recalculate_satpos_positions(struct dvbfe_handle *fe,
++                                                   enum dvbsec_diseqc_address address,
++                                                   int val1,
++                                                   int val2);
++
++/**
++ * Send a terrestrial aerial rotator to a particular bearing
++ * (0 degrees = north, fractional angles allowed).
++ *
++ * @param fe Frontend concerned.
++ * @param address Address of the device.
++ * @param angle Angle to rotate to (-256.0 -> 512.0)
++ * @return 0 on success, or nonzero on error.
++ */
++extern int dvbsec_diseqc_goto_rotator_bearing(struct dvbfe_handle *fe,
++                                           enum dvbsec_diseqc_address address,
++                                           float angle);
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvbsec/dvbsec_cfg.c dvb-apps/lib/libdvbsec/dvbsec_cfg.c
+--- linuxtv-dvb-apps-1.1.1/lib/libdvbsec/dvbsec_cfg.c  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvbsec/dvbsec_cfg.c        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,366 @@
++/**
++ * dvbsec_cfg (i.e. linuxtv sec format) configuration file support.
++ *
++ * Copyright (c) 2005 by Andrew de Quincey <adq_dvb@lidskialf.net>
++ *
++ *
++ * This library is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU Lesser General Public License as
++ * published by the Free Software Foundation; either version 2.1 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++ */
++
++#define _GNU_SOURCE
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <ctype.h>
++#include <errno.h>
++#include <linux/types.h>
++#include "dvbsec_cfg.h"
++
++int dvbcfg_issection(char* line, char* sectionname)
++{
++      int len;
++
++      len = strlen(line);
++      if (len < 2)
++              return 0;
++
++      if ((line[0] != '[') || (line[len-1] != ']'))
++              return 0;
++
++      line++;
++      while(isspace(*line))
++              line++;
++
++      if (strncmp(line, sectionname, strlen(sectionname)))
++              return 0;
++
++      return 1;
++}
++
++char* dvbcfg_iskey(char* line, char* keyname)
++{
++      int len = strlen(keyname);
++
++      /* does the key match? */
++      if (strncmp(line, keyname, len))
++              return NULL;
++
++      /* skip keyname & any whitespace */
++      line += len;
++      while(isspace(*line))
++              line++;
++
++      /* should be the '=' sign */
++      if (*line != '=')
++              return 0;
++
++      /* more whitespace skipping */
++      line++;
++      while(isspace(*line))
++              line++;
++
++      /* finally, return the value */
++      return line;
++}
++
++int dvbsec_cfg_load(FILE *f,
++                  void *arg,
++                  dvbsec_cfg_callback cb)
++{
++      struct dvbsec_config tmpsec;
++      char *linebuf = NULL;
++      size_t line_size = 0;
++      int len;
++      int insection = 0;
++      char *value;
++
++      /* process each line */
++      while((len = getline(&linebuf, &line_size, f)) > 0) {
++              char *line = linebuf;
++
++              /* chop any comments */
++              char *hashpos = strchr(line, '#');
++              if (hashpos)
++                      *hashpos = 0;
++              char *lineend = line + strlen(line);
++
++              /* trim the line */
++              while(*line && isspace(*line))
++                      line++;
++              while((lineend != line) && isspace(*(lineend-1)))
++                      lineend--;
++              *lineend = 0;
++
++              /* skip blank lines */
++              if (*line == 0)
++                      continue;
++
++              if (dvbcfg_issection(line, "sec")) {
++                      if (insection) {
++                              if (cb(arg, &tmpsec))
++                                      return 0;
++                      }
++                      insection = 1;
++                      memset(&tmpsec, 0, sizeof(tmpsec));
++
++              } else if ((value = dvbcfg_iskey(line, "name")) != NULL) {
++                      strncpy(tmpsec.id, value, sizeof(tmpsec.id));
++              } else if ((value = dvbcfg_iskey(line, "switch-frequency")) != NULL) {
++                      tmpsec.switch_frequency = atoi(value);
++              } else if ((value = dvbcfg_iskey(line, "lof-lo-v")) != NULL) {
++                      tmpsec.lof_lo_v = atoi(value);
++              } else if ((value = dvbcfg_iskey(line, "lof-lo-h")) != NULL) {
++                      tmpsec.lof_lo_h = atoi(value);
++              } else if ((value = dvbcfg_iskey(line, "lof-lo-l")) != NULL) {
++                      tmpsec.lof_lo_l = atoi(value);
++              } else if ((value = dvbcfg_iskey(line, "lof-lo-r")) != NULL) {
++                      tmpsec.lof_lo_r = atoi(value);
++              } else if ((value = dvbcfg_iskey(line, "lof-hi-v")) != NULL) {
++                      tmpsec.lof_hi_v = atoi(value);
++              } else if ((value = dvbcfg_iskey(line, "lof-hi-h")) != NULL) {
++                      tmpsec.lof_hi_h = atoi(value);
++              } else if ((value = dvbcfg_iskey(line, "lof-hi-l")) != NULL) {
++                      tmpsec.lof_hi_l = atoi(value);
++              } else if ((value = dvbcfg_iskey(line, "lof-hi-r")) != NULL) {
++                      tmpsec.lof_hi_r = atoi(value);
++              } else if ((value = dvbcfg_iskey(line, "config-type")) != NULL) {
++                      if (!strcasecmp(value, "none")) {
++                              tmpsec.config_type = DVBSEC_CONFIG_NONE;
++                      } else if (!strcasecmp(value, "power")) {
++                              tmpsec.config_type = DVBSEC_CONFIG_POWER;
++                      } else if (!strcasecmp(value, "standard")) {
++                              tmpsec.config_type = DVBSEC_CONFIG_STANDARD;
++                      } else if (!strcasecmp(value, "advanced")) {
++                              tmpsec.config_type = DVBSEC_CONFIG_ADVANCED;
++                      } else {
++                              insection = 0;
++                      }
++              } else if ((value = dvbcfg_iskey(line, "cmd-lo-v")) != NULL) {
++                      strncpy(tmpsec.adv_cmd_lo_v, value, sizeof(tmpsec.adv_cmd_lo_v));
++              } else if ((value = dvbcfg_iskey(line, "cmd-lo-h")) != NULL) {
++                      strncpy(tmpsec.adv_cmd_lo_h, value, sizeof(tmpsec.adv_cmd_lo_h));
++              } else if ((value = dvbcfg_iskey(line, "cmd-lo-r")) != NULL) {
++                      strncpy(tmpsec.adv_cmd_lo_r, value, sizeof(tmpsec.adv_cmd_lo_r));
++              } else if ((value = dvbcfg_iskey(line, "cmd-lo-l")) != NULL) {
++                      strncpy(tmpsec.adv_cmd_lo_l, value, sizeof(tmpsec.adv_cmd_lo_l));
++              } else if ((value = dvbcfg_iskey(line, "cmd-hi-v")) != NULL) {
++                      strncpy(tmpsec.adv_cmd_hi_v, value, sizeof(tmpsec.adv_cmd_hi_v));
++              } else if ((value = dvbcfg_iskey(line, "cmd-hi-h")) != NULL) {
++                      strncpy(tmpsec.adv_cmd_hi_h, value, sizeof(tmpsec.adv_cmd_hi_h));
++              } else if ((value = dvbcfg_iskey(line, "cmd-hi-r")) != NULL) {
++                      strncpy(tmpsec.adv_cmd_hi_r, value, sizeof(tmpsec.adv_cmd_hi_r));
++              } else if ((value = dvbcfg_iskey(line, "cmd-hi-l")) != NULL) {
++                      strncpy(tmpsec.adv_cmd_hi_l, value, sizeof(tmpsec.adv_cmd_hi_l));
++              } else {
++                      insection = 0;
++              }
++      }
++
++      // output the final section if there is one
++      if (insection) {
++              if (cb(arg, &tmpsec))
++                      return 0;
++      }
++
++      if (linebuf)
++              free(linebuf);
++      return 0;
++}
++
++static int dvbsec_cfg_find_callback(void *arg, struct dvbsec_config *sec);
++static int dvbsec_cfg_find_default(const char *sec_id, struct dvbsec_config *sec);
++
++struct findparams {
++      const char *sec_id;
++      struct dvbsec_config *sec_dest;
++};
++
++int dvbsec_cfg_find(const char *config_file,
++                  const char *sec_id,
++                  struct dvbsec_config *sec)
++{
++      struct findparams findp;
++
++      // clear the structure
++      memset(sec, 0, sizeof(struct dvbsec_config));
++
++      // open the file
++      if (config_file != NULL) {
++              FILE *f = fopen(config_file, "r");
++              if (f == NULL)
++                      return -EIO;
++
++              // parse each entry
++              findp.sec_id = sec_id;
++              findp.sec_dest = sec;
++              dvbsec_cfg_load(f, &findp, dvbsec_cfg_find_callback);
++
++              // done
++              fclose(f);
++
++              // find it?
++              if (sec->id[0])
++                      return 0;
++      }
++
++      return dvbsec_cfg_find_default(sec_id, sec);
++}
++
++static int dvbsec_cfg_find_callback(void *arg, struct dvbsec_config *sec)
++{
++      struct findparams *findp = arg;
++
++      if (strcmp(findp->sec_id, sec->id))
++              return 0;
++
++      memcpy(findp->sec_dest, sec, sizeof(struct dvbsec_config));
++      return 1;
++}
++
++int dvbsec_cfg_save(FILE *f,
++                  struct dvbsec_config *secs,
++                  int count)
++{
++      int i;
++
++      for(i=0; i<count; i++) {
++              char *config_type = "";
++              switch(secs[i].config_type) {
++              case DVBSEC_CONFIG_NONE:
++                      config_type = "none";
++                      break;
++              case DVBSEC_CONFIG_POWER:
++                      config_type = "power";
++                      break;
++              case DVBSEC_CONFIG_STANDARD:
++                      config_type = "standard";
++                      break;
++              case DVBSEC_CONFIG_ADVANCED:
++                      config_type = "advanced";
++                      break;
++              }
++
++              fprintf(f, "[lnb]\n");
++              fprintf(f, "switch-frequency=%i\n", secs[i].switch_frequency);
++              if (secs[i].lof_lo_v)
++                      fprintf(f, "lof-lo-v=%i\n", secs[i].lof_lo_v);
++              if (secs[i].lof_lo_h)
++                      fprintf(f, "lof-lo-h=%i\n", secs[i].lof_lo_h);
++              if (secs[i].lof_lo_l)
++                      fprintf(f, "lof-lo-l=%i\n", secs[i].lof_lo_l);
++              if (secs[i].lof_lo_r)
++                      fprintf(f, "lof-lo-r=%i\n", secs[i].lof_lo_r);
++              if (secs[i].lof_hi_v)
++                      fprintf(f, "lof-hi-v=%i\n", secs[i].lof_hi_v);
++              if (secs[i].lof_hi_h)
++                      fprintf(f, "lof-hi-h=%i\n", secs[i].lof_hi_h);
++              if (secs[i].lof_hi_l)
++                      fprintf(f, "lof-hi-l=%i\n", secs[i].lof_hi_l);
++              if (secs[i].lof_hi_r)
++                      fprintf(f, "lof-hi-r=%i\n", secs[i].lof_hi_r);
++              fprintf(f, "config-type=%s\n", config_type);
++
++              if (secs[i].config_type == DVBSEC_CONFIG_ADVANCED) {
++                      if (secs[i].adv_cmd_lo_h[0])
++                              fprintf(f, "cmd-lo-h=%s\n", secs[i].adv_cmd_lo_h);
++                      if (secs[i].adv_cmd_lo_v[0])
++                              fprintf(f, "cmd-lo-v=%s\n", secs[i].adv_cmd_lo_v);
++                      if (secs[i].adv_cmd_lo_r[0])
++                              fprintf(f, "cmd-lo-r=%s\n", secs[i].adv_cmd_lo_r);
++                      if (secs[i].adv_cmd_lo_l[0])
++                              fprintf(f, "cmd-lo-l=%s\n", secs[i].adv_cmd_lo_l);
++                      if (secs[i].adv_cmd_hi_h[0])
++                              fprintf(f, "cmd-hi-h=%s\n", secs[i].adv_cmd_hi_h);
++                      if (secs[i].adv_cmd_hi_v[0])
++                              fprintf(f, "cmd-hi-v=%s\n", secs[i].adv_cmd_hi_v);
++                      if (secs[i].adv_cmd_hi_r[0])
++                              fprintf(f, "cmd-hi-r=%s\n", secs[i].adv_cmd_hi_r);
++                      if (secs[i].adv_cmd_hi_l[0])
++                              fprintf(f, "cmd-hi-l=%s\n", secs[i].adv_cmd_hi_l);
++              }
++
++              fprintf(f, "\n");
++      }
++
++      return 0;
++}
++
++static struct dvbsec_config defaults[] = {
++
++      {
++              .id = "NULL",
++              .config_type = DVBSEC_CONFIG_STANDARD,
++      },
++      {
++              .id = "UNIVERSAL",
++              .switch_frequency = 11700000,
++              .lof_lo_v = 9750000,
++              .lof_lo_h = 9750000,
++              .lof_hi_v = 10600000,
++              .lof_hi_h = 10600000,
++              .config_type = DVBSEC_CONFIG_STANDARD,
++      },
++      {
++              .id = "DBS",
++              .switch_frequency = 0,
++              .lof_lo_v = 11250000,
++              .lof_lo_h = 11250000,
++              .config_type = DVBSEC_CONFIG_STANDARD,
++      },
++      {
++              .id = "STANDARD",
++              .switch_frequency = 0,
++              .lof_lo_v = 10000000,
++              .lof_lo_h = 10000000,
++              .config_type = DVBSEC_CONFIG_STANDARD,
++      },
++      {
++              .id = "ENHANCED",
++              .switch_frequency = 0,
++              .lof_lo_v = 9750000,
++              .lof_lo_h = 9750000,
++              .config_type = DVBSEC_CONFIG_STANDARD,
++      },
++      {
++              .id = "C-BAND",
++              .switch_frequency = 0,
++              .lof_lo_v = 5150000,
++              .lof_lo_h = 5150000,
++              .config_type = DVBSEC_CONFIG_POWER,
++      },
++      {
++              .id = "C-MULTI",
++              .switch_frequency = 0,
++              .lof_lo_v = 5150000,
++              .lof_lo_h = 5750000,
++              .config_type = DVBSEC_CONFIG_POWER,
++      },
++};
++#define defaults_count (sizeof(defaults) / sizeof(struct dvbsec_config))
++
++static int dvbsec_cfg_find_default(const char *sec_id,
++                                 struct dvbsec_config *sec)
++{
++      unsigned int i;
++
++      for(i=0; i< defaults_count; i++) {
++              if (!strncmp(sec_id, defaults[i].id, sizeof(defaults[i].id))) {
++                      memcpy(sec, &defaults[i], sizeof(struct dvbsec_config));
++                      return 0;
++              }
++      }
++
++      return -1;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvbsec/dvbsec_cfg.h dvb-apps/lib/libdvbsec/dvbsec_cfg.h
+--- linuxtv-dvb-apps-1.1.1/lib/libdvbsec/dvbsec_cfg.h  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvbsec/dvbsec_cfg.h        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,203 @@
++/**
++ * dvbsec_cfg (i.e. linuxtv SEC format) configuration file support.
++ *
++ * Copyright (c) 2006 by Andrew de Quincey <adq_dvb@lidskialf.net>
++ *
++ * This library is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU Lesser General Public License as
++ * published by the Free Software Foundation; either version 2.1 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++ */
++
++/**
++ * This library allows SEC (Satellite Equipment Control) configurations
++ * to be retrieved. Each configuration is identified by a unique satellite_id.
++ *
++ * In order to make things as easy as possible for users, there are a set of
++ * defaults hardcoded into the library covering the majority of LNB types. When
++ * these are used, the standard back-compatable sequence defined in the DISEQC
++ * standard will be used - this will suffice for _most_ situations.
++ *
++ * UNIVERSAL - Europe, 10800 to 11800 MHz and 11600 to 12700 Mhz, Dual LO, loband 9750, hiband 10600 MHz.
++ * DBS - Expressvu, North America, 12200 to 12700 MHz, Single LO, 11250 MHz.
++ * STANDARD - 10945 to 11450 Mhz, Single LO, 10000Mhz.
++ * ENHANCED - Astra, 10700 to 11700 MHz, Single LO, 9750MHz.
++ * C-BAND - Big Dish, 3700 to 4200 MHz, Single LO, 5150Mhz.
++ * C-MULTI - Big Dish - Multipoint LNBf, 3700 to 4200 MHz, Dual LO, H:5150MHz, V:5750MHz.
++ *
++ * However, for the power user with a more complex setup, these simple defaults
++ * are not enough. Therefore, it is also possible to define additional SEC
++ * configurations in an external configuration file. This file consists of multiple
++ * entries in the following format:
++ *
++ * [sec]
++ * name=<sec_id>
++ * switch-frequency=<switching frequency (SLOF)>
++ * lof-lo-v=<low band + V + frequency>
++ * lof-lo-h=<low band + H + frequency>
++ * lof-lo-l=<low band + L + frequency>
++ * lof-lo-r=<low band + R + frequency>
++ * lof-hi-v=<high band + V + frequency>
++ * lof-hi-h=<high band + H + frequency>
++ * lof-hi-l=<high band + L + frequency>
++ * lof-hi-r=<high band + R + frequency>
++ * config-type=<none|power|standard|advanced>
++ * cmd-lo-v=<sec sequence>
++ * cmd-lo-h=<sec sequence>
++ * cmd-lo-r=<sec sequence>
++ * cmd-lo-l=<sec sequence>
++ * cmd-hi-v=<sec sequence>
++ * cmd-hi-h=<sec sequence>
++ * cmd-hi-r=<sec sequence>
++ * cmd-hi-l=<sec sequence>
++ *
++ * The sec_id is whatever unique value you wish. If it is the same as one of the hardcoded defaults, the configuration
++ *    details from the file will be used instead of the hardcoded ones.
++ * The switch-frequency (or SLOF) indicates the point seperating low band frequencies from high band frequencies.
++ *    Set this value to 0 if there is only one frequency band.
++ * The lof-lo-v is the frequency adjustment for V + low band (i.e. less than SLOF), or is used if switch-frequency==0.
++ * The lof-lo-h is the frequency adjustment for H + low band (i.e. less than SLOF), or is used if switch-frequency==0.
++ * The lof-lo-l is the frequency adjustment for L + low band (i.e. less than SLOF), or is used if switch-frequency==0.
++ * The lof-lo-r is the frequency adjustment for R + low band (i.e. less than SLOF), or is used if switch-frequency==0.
++ * The lof-hi-v is the frequency adjustment for V + high band (unused if switch-frequency==0).
++ * The lof-hi-h is the frequency adjustment for H + high band (unused if switch-frequency==0).
++ * The lof-hi-l is the frequency adjustment for L + high band (unused if switch-frequency==0).
++ * The lof-hi-r is the frequency adjustment for R + high band (unused if switch-frequency==0).
++ *
++ * config-type indicates the desired type of SEC command to use, it may be:
++ *    none - No SEC commands will be issued (frequency adjustment will still be performed).
++ *    power - Only the SEC power is turned on.
++ *    standard - The standard DISEQC back compatable sequence will be issued.
++ *    advanced - The DISEQC sequence described in the appropriate sec cmd string will be used.
++ *
++ * The cmd-<lo|hi>-<v|h|l|r> describes the SEC cmd string to use in advanced mode for each of the possible combinations of
++ * frequency band and polarisation. If a certain combination is not required, it may be omitted. It consists of a
++ * space seperated combination of commands - those available are as follows:
++ *
++ *    tone(<0|1>)  - control the 22kHz tone 0:off, 1:on
++ *    voltage(<0|13|18>) - control the LNB voltage 0v, 13v, or 18v
++ *    toneburst(<a|b>) - issue a toneburst (mini command) for position A or B.
++ *    highvoltage(<0|1>) - control high lnb voltage for long cable runs 0: normal, 1:add 1v to LNB voltage.
++ *    dishnetworks(<integer>) - issue a dishnetworks legacy command.
++ *    wait(<integer>) - wait for the given number of milliseconds.
++ *    Dreset(<address>, <0|1>) - control the reset state of a DISEC device, 0:disable reset, 1:enable reset.
++ *    Dpower(<address>, <0|1>) - control the power of a DISEC device, 0:off, 1:on.
++ *    Dcommitted(<address>, <h|l|x>, <v|h|l|r|x>, <a|b|x>, <a|b|x>) - Write to the committed switches of a DISEC device.
++ *            The parameters are for band, polarisation, satelliteposition, switchoption:
++ *                    band - h:high band, l:low band
++ *                    polarisation - v: vertical, h:horizontal,r:right,l:left
++ *                    satelliteposition - a:position A, b: position B
++ *                    switchoption - a:position A, b: position B
++ *            The special value 'x' means "no change to this switch".
++ *
++ *    Duncommitted(<address>, <a|b|x>, <a|b|x>, <a|b|x>, <a|b|x>) - Write to the uncommitted switches of the a DISEC device.
++ *            The parameters are for switch1, switch2, switch3, switch4, and may be set to position a or b.
++ *            The special value 'x' means "no change to this switch".
++ *
++ *    Dfrequency(<address>, <frequency in GHz>) - set the frequency of a DISEC device.
++ *    Dchannel(<address>, <channel id>) - set the desired channel id of a DISEC device.
++ *    Dgotopreset(<address>, <preset id>) - tell a DISEC satellite positioner to move to the given preset id.
++ *    Dgotobearing(<address>, <bearing in degrees>) - tell a DISEQC terrestrial rotator to go to the
++ *            given bearing (range -256.0 -> 512.0 degrees, fractions allowed).
++ *
++ *    In the above DISEQC commands, <address> is the integer (normally in hex format) address of the
++ *            diseqc device to communicate with. A list of possiblities is as follows:
++ *
++ *    DISEQC_ADDRESS_ANY_DEVICE               = 0x00
++ *
++ *    DISEQC_ADDRESS_ANY_LNB_SWITCHER_SMATV   = 0x10
++ *    DISEQC_ADDRESS_LNB                      = 0x11
++ *    DISEQC_ADDRESS_LNB_WITH_LOOP            = 0x12
++ *    DISEQC_ADDRESS_SWITCHER                 = 0x14
++ *    DISEQC_ADDRESS_SWITCHER_WITH_LOOP       = 0x15
++ *    DISEQC_ADDRESS_SMATV                    = 0x18
++ *
++ *    DISEQC_ADDRESS_ANY_POLARISER            = 0x20
++ *    DISEQC_ADDRESS_LINEAR_POLARISER         = 0x21
++ *
++ *    DISEQC_ADDRESS_ANY_POSITIONER           = 0x30
++ *    DISEQC_ADDRESS_POLAR_AZIMUTH_POSITIONER = 0x31
++ *    DISEQC_ADDRESS_ELEVATION_POSITIONER     = 0x32
++ *
++ *    DISEQC_ADDRESS_ANY_INSTALLER_AID        = 0x40
++ *    DISEQC_ADDRESS_SIGNAL_STRENGTH          = 0x41
++ *
++ *    DISEQC_ADDRESS_ANY_INTERFACE            = 0x70
++ *    DISEQC_ADDRESS_HEADEND_INTERFACE        = 0x71
++ *
++ *    DISEQC_ADDRESS_REALLOC_BASE             = 0x60
++ *    DISEQC_ADDRESS_OEM_BASE                 = 0xf0
++ */
++
++#ifndef DVBSEC_CFG_H
++#define DVBSEC_CFG_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <stdio.h>
++#include <stdint.h>
++#include <libdvbsec/dvbsec_api.h>
++
++/**
++ * Callback function used in dvbsec_cfg_load().
++ *
++ * @param arg Private information to caller.
++ * @param channel The current channel details.
++ * @return 0 to continue, 1 to stop loading.
++ */
++typedef int (*dvbsec_cfg_callback)(void *arg, struct dvbsec_config *sec);
++
++/**
++ * Load an SEC file.
++ *
++ * @param f File to load from.
++ * @param arg Value to pass to 'arg' in callback above.
++ * @param cb Callback function called for each sec loaded from the file.
++ * @return 0 on success, or nonzero error code on failure.
++ */
++extern int dvbsec_cfg_load(FILE *f, void *arg,
++                         dvbsec_cfg_callback cb);
++
++/**
++ * Convenience function to parse an SEC config file. This will also consult the set
++ * of hardcoded defaults if no config file was supplied, or a match was not found in
++ * the config file.
++ *
++ * @param config_file Config filename to load, or NULL to just check defaults.
++ * @param sec_id ID of SEC configuration.
++ * @param sec Where to put the details if found.
++ * @return 0 on success, nonzero on error.
++ */
++extern int dvbsec_cfg_find(const char *config_file,
++                         const char *sec_id,
++                         struct dvbsec_config *sec);
++
++/**
++ * Save SEC format config file.
++ *
++ * @param f File to save to.
++ * @param secs Pointer to array of SECs to save.
++ * @param count Number of entries in the above array.
++ * @return 0 on success, or nonzero error code on failure.
++ */
++extern int dvbsec_cfg_save(FILE *f,
++                         struct dvbsec_config *secs,
++                         int count);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libdvbsec/Makefile dvb-apps/lib/libdvbsec/Makefile
+--- linuxtv-dvb-apps-1.1.1/lib/libdvbsec/Makefile      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libdvbsec/Makefile    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,17 @@
++# Makefile for linuxtv.org dvb-apps/lib/libdvbsec
++
++includes = dvbsec_api.h        \
++           dvbsec_cfg.h
++
++objects  = dvbsec_api.o        \
++           dvbsec_cfg.o
++
++lib_name = libdvbsec
++
++CPPFLAGS += -I../../lib
++
++.PHONY: all
++
++all: library
++
++include ../../Make.rules
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libesg/bootstrap/access_descriptor.c dvb-apps/lib/libesg/bootstrap/access_descriptor.c
+--- linuxtv-dvb-apps-1.1.1/lib/libesg/bootstrap/access_descriptor.c    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libesg/bootstrap/access_descriptor.c  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,115 @@
++/*
++ * ESG parser
++ *
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <stdlib.h>
++#include <string.h>
++
++#include <libesg/bootstrap/access_descriptor.h>
++
++struct esg_access_descriptor *esg_access_descriptor_decode(uint8_t *buffer, uint32_t size) {
++      uint32_t pos;
++      struct esg_access_descriptor *access_descriptor;
++      struct esg_entry *entry;
++      struct esg_entry *last_entry;
++      uint32_t entry_length;
++      uint16_t entry_index;
++      uint8_t ip_index;
++
++      if ((buffer == NULL) || (size <= 2)) {
++              return NULL;
++      }
++
++      pos = 0;
++
++      access_descriptor = (struct esg_access_descriptor *) malloc(sizeof(struct esg_access_descriptor));
++      memset(access_descriptor, 0, sizeof(struct esg_access_descriptor));
++      access_descriptor->entry_list = NULL;
++
++      access_descriptor->n_o_entries = (buffer[pos] << 8) | buffer[pos+1];
++      pos += 2;
++
++    last_entry = NULL;
++      for (entry_index = 0; entry_index < access_descriptor->n_o_entries; entry_index++) {
++              entry = (struct esg_entry *) malloc(sizeof(struct esg_entry));
++              memset(entry, 0, sizeof(struct esg_entry));
++              entry->_next = NULL;
++
++              if (last_entry == NULL) {
++                      access_descriptor->entry_list = entry;
++              } else {
++                      last_entry->_next = entry;
++              }
++              last_entry = entry;
++
++              entry->version = buffer[pos];
++              pos += 1;
++
++              pos += vluimsbf8(buffer + pos, size - pos, &entry_length);
++
++              if (size < pos + entry_length) {
++                      esg_access_descriptor_free(access_descriptor);
++                      return NULL;
++              }
++
++              entry->multiple_stream_transport = (buffer[pos] & 0x80) ? 1 : 0;
++              entry->ip_version_6 = (buffer[pos] & 0x40) ? 1 : 0;
++              pos += 1;
++
++              entry->provider_id = (buffer[pos] << 8) | buffer[pos+1];
++              pos += 2;
++
++              if (entry->ip_version_6) {
++                      for (ip_index = 0; ip_index < 16; ip_index++) {
++                              entry->source_ip.ipv6[ip_index] = buffer[pos+ip_index];
++                              entry->destination_ip.ipv6[ip_index] = buffer[pos+16+ip_index];
++                      }
++                      pos += 32;
++              } else {
++                      for (ip_index = 0; ip_index < 4; ip_index++) {
++                              entry->source_ip.ipv4[ip_index] = buffer[pos+ip_index];
++                              entry->destination_ip.ipv4[ip_index] = buffer[pos+4+ip_index];
++                      }
++                      pos += 8;
++              }
++              entry->port = (buffer[pos] << 8) | buffer[pos+1];
++              pos += 2;
++
++              entry->tsi = (buffer[pos] << 8) | buffer[pos+1];
++              pos += 2;
++      }
++
++      return access_descriptor;
++}
++
++void esg_access_descriptor_free(struct esg_access_descriptor *access_descriptor) {
++      struct esg_entry *entry;
++      struct esg_entry *next_entry;
++
++      if (access_descriptor == NULL) {
++              return;
++    }
++
++      for(entry = access_descriptor->entry_list; entry; entry = next_entry) {
++              next_entry = entry->_next;
++              free(entry);
++      }
++
++      free(access_descriptor);
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libesg/bootstrap/access_descriptor.h dvb-apps/lib/libesg/bootstrap/access_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libesg/bootstrap/access_descriptor.h    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libesg/bootstrap/access_descriptor.h  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,86 @@
++/*
++ * ESG parser
++ *
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _ESG_BOOTSTRAP_ACCESS_DESCRIPTOR_H
++#define _ESG_BOOTSTRAP_ACCESS_DESCRIPTOR_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libesg/types.h>
++
++/**
++ * esg_entry structure.
++ */
++struct esg_entry {
++      uint8_t version;
++      uint8_t multiple_stream_transport;
++      uint8_t ip_version_6;
++      uint16_t provider_id;
++      union esg_ip_address source_ip;
++      union esg_ip_address destination_ip;
++      uint16_t port;
++      uint16_t tsi;
++
++      struct esg_entry *_next;
++};
++
++/**
++ * esg_access_descriptor structure.
++ */
++struct esg_access_descriptor {
++      uint16_t n_o_entries;
++      struct esg_entry *entry_list;
++};
++
++/**
++ * Process an esg_access_descriptor.
++ *
++ * @param buffer Binary buffer to decode.
++ * @param size Binary buffer size.
++ * @return Pointer to an esg_access_descriptor structure, or NULL on error.
++ */
++extern struct esg_access_descriptor *esg_access_descriptor_decode(uint8_t *buffer, uint32_t size);
++
++/**
++ * Free an esg_access_descriptor.
++ *
++ * @param esg Pointer to an esg_access_descriptor structure.
++ */
++extern void esg_access_descriptor_free(struct esg_access_descriptor *access_descriptor);
++
++/**
++ * Convenience iterator for esg_entry_list field of an esg_access_descriptor.
++ *
++ * @param access_descriptor The esg_access_descriptor pointer.
++ * @param entry Variable holding a pointer to the current esg_entry.
++ */
++#define esg_access_descriptor_entry_list_for_each(access_descriptor, entry) \
++      for ((entry) = (access_descriptor)->entry_list; \
++           (entry); \
++           (entry) = (entry)->_next)
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libesg/bootstrap/Makefile dvb-apps/lib/libesg/bootstrap/Makefile
+--- linuxtv-dvb-apps-1.1.1/lib/libesg/bootstrap/Makefile       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libesg/bootstrap/Makefile     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,24 @@
++# Makefile for linuxtv.org dvb-apps/lib/libesg/bootstrap
++
++.PHONY: sub-error-bootstrap
++
++sub-error-bootstrap:
++      $(error You can't use this makefile directly.)
++
++ifneq ($(lib_name),)
++
++objects += bootstrap/access_descriptor.o \
++           bootstrap/provider_discovery_descriptor.o
++
++sub-install += bootstrap
++
++else
++
++includes = access_descriptor.h \
++           provider_discovery_descriptor.h
++
++include ../../../Make.rules
++
++lib_name = libesg/bootstrap
++
++endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libesg/bootstrap/provider_discovery_descriptor.c dvb-apps/lib/libesg/bootstrap/provider_discovery_descriptor.c
+--- linuxtv-dvb-apps-1.1.1/lib/libesg/bootstrap/provider_discovery_descriptor.c        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libesg/bootstrap/provider_discovery_descriptor.c      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,50 @@
++/*
++ * ESG parser
++ *
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <stdlib.h>
++#include <string.h>
++
++#include <libesg/bootstrap/provider_discovery_descriptor.h>
++
++struct esg_provider_discovery_descriptor *esg_esg_provider_discovery_descriptor_decode(uint8_t *buffer, uint32_t size) {
++      struct esg_provider_discovery_descriptor *provider;
++
++      provider = (struct esg_provider_discovery_descriptor *) malloc(sizeof(struct esg_provider_discovery_descriptor));
++      memset(provider, 0, sizeof(struct esg_provider_discovery_descriptor));
++
++      provider->xml = (uint8_t *) malloc(size);
++      memcpy(provider->xml, buffer, size);
++
++      provider->size = size;
++
++      return provider;
++}
++
++void esg_provider_discovery_descriptor_free(struct esg_provider_discovery_descriptor *provider) {
++      if (provider == NULL) {
++              return;
++      }
++
++      if (provider->xml) {
++              free(provider->xml);
++      }
++
++      free(provider);
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libesg/bootstrap/provider_discovery_descriptor.h dvb-apps/lib/libesg/bootstrap/provider_discovery_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libesg/bootstrap/provider_discovery_descriptor.h        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libesg/bootstrap/provider_discovery_descriptor.h      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,59 @@
++/*
++ * ESG parser
++ *
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _ESG_BOOTSTRAP_PROVIDER_DISCOVERY_DESCRIPTOR_H
++#define _ESG_BOOTSTRAP_PROVIDER_DISCOVERY_DESCRIPTOR_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <stdint.h>
++
++/**
++ * esg_provider_discovery_descriptor structure.
++ */
++struct esg_provider_discovery_descriptor {
++      uint8_t *xml;
++      uint32_t size;
++};
++
++/**
++ * Process an esg_provider_discovery_descriptor.
++ *
++ * @param buffer Binary buffer to decode.
++ * @param size Binary buffer size.
++ * @return Pointer to an esg_provider_discovery_descriptor structure, or NULL on error.
++ */
++extern struct esg_provider_discovery_descriptor *esg_esg_provider_discovery_descriptor_decode(uint8_t *buffer, uint32_t size);
++
++/**
++ * Free an esg_provider_discovery_descriptor.
++ *
++ * @param esg Pointer to an esg_provider_discovery_descriptor structure.
++ */
++extern void esg_provider_discovery_descriptor_free(struct esg_provider_discovery_descriptor *provider);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libesg/encapsulation/auxiliary_data.h dvb-apps/lib/libesg/encapsulation/auxiliary_data.h
+--- linuxtv-dvb-apps-1.1.1/lib/libesg/encapsulation/auxiliary_data.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libesg/encapsulation/auxiliary_data.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,62 @@
++/*
++ * ESG parser
++ *
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _ESG_ENCAPSULATION_AUXILIARY_DATA_H
++#define _ESG_ENCAPSULATION_AUXILIARY_DATA_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <stdint.h>
++
++/**
++ * esg_any_attribute structure.
++ */
++struct esg_any_attribute {
++      uint8_t version_id;
++      uint8_t *extension;
++
++      struct esg_any_attribure *_next;
++};
++
++/**
++ * esg_binary_header structure.
++ */
++struct esg_binary_header {
++      uint16_t encoding_metadatauri_mimetype;
++      struct esg_any_attribute *any_attribute_list;
++};
++
++/**
++ * esg_encapsulated_aux_data struct.
++ */
++struct esg_encapsulated_aux_data {
++      struct esg_binary_header *binary_header;
++      uint32_t aux_data_length;
++      uint8_t aux_data;
++};
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libesg/encapsulation/container.c dvb-apps/lib/libesg/encapsulation/container.c
+--- linuxtv-dvb-apps-1.1.1/lib/libesg/encapsulation/container.c        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libesg/encapsulation/container.c      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,206 @@
++/*
++ * ESG parser
++ *
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <stdlib.h>
++#include <string.h>
++
++#include <libesg/encapsulation/container.h>
++#include <libesg/encapsulation/fragment_management_information.h>
++#include <libesg/encapsulation/data_repository.h>
++#include <libesg/encapsulation/string_repository.h>
++#include <libesg/representation/init_message.h>
++#include <libesg/transport/session_partition_declaration.h>
++
++struct esg_container *esg_container_decode(uint8_t *buffer, uint32_t size) {
++      uint32_t pos;
++      struct esg_container *container;
++      struct esg_container_structure *structure;
++      struct esg_container_structure *last_structure;
++      uint8_t structure_index;
++
++      if ((buffer == NULL) || (size <= 1)) {
++              return NULL;
++      }
++
++      pos = 0;
++
++      container = (struct esg_container *) malloc(sizeof(struct esg_container));
++      memset(container, 0, sizeof(struct esg_container));
++
++      // Container header
++      container->header = (struct esg_container_header *) malloc(sizeof(struct esg_container_header));
++      memset(container->header, 0, sizeof(struct esg_container_header));
++
++      container->header->num_structures = buffer[pos];
++      pos += 1;
++
++      if (size < pos + (container->header->num_structures * 8)) {
++              esg_container_free(container);
++              return NULL;
++      }
++
++      last_structure = NULL;
++      for (structure_index = 0; structure_index < container->header->num_structures; structure_index++) {
++              structure = (struct esg_container_structure *) malloc(sizeof(struct esg_container_structure));
++              memset(structure, 0, sizeof(struct esg_container_structure));
++              structure->_next = NULL;
++
++              if (last_structure == NULL) {
++                      container->header->structure_list = structure;
++              } else {
++                      last_structure->_next = structure;
++              }
++              last_structure = structure;
++
++              structure->type = buffer[pos];
++              pos += 1;
++
++              structure->id = buffer[pos];
++              pos += 1;
++
++              structure->ptr = (buffer[pos] << 16) | (buffer[pos+1] << 8) | buffer[pos+2];
++              pos += 3;
++
++              structure->length = (buffer[pos] << 16) | (buffer[pos+1] << 8) | buffer[pos+2];
++              pos += 3;
++
++              if (size < (structure->ptr + structure->length)) {
++                      esg_container_free(container);
++                      return NULL;
++              }
++
++              // Decode structure
++              switch (structure->type) {
++                      case 0x01: {
++                              switch (structure->id) {
++                                      case 0x00: {
++                                              structure->data = (void *) esg_encapsulation_structure_decode(buffer + structure->ptr, structure->length);
++                                              break;
++                                      }
++                                      default: {
++                                              esg_container_free(container);
++                                              return NULL;
++                                      }
++                              }
++                              break;
++                      }
++                      case 0x02: {
++                              switch (structure->id) {
++                                      case 0x00: {
++                                              structure->data = (void *) esg_string_repository_decode(buffer + structure->ptr, structure->length);
++                                              break;
++                                      }
++                                      default: {
++                                              esg_container_free(container);
++                                              return NULL;
++                                      }
++                              }
++                              break;
++                      }
++                      case 0x03: {
++                              //TODO
++                              break;
++                      }
++                      case 0x04: {
++                              //TODO
++                              break;
++                      }
++                      case 0x05: {
++                              //TODO
++                              break;
++                      }
++                      case 0xE0: {
++                              switch (structure->id) {
++                                      case 0x00: {
++                                              structure->data = (void *) esg_data_repository_decode(buffer + structure->ptr, structure->length);
++                                              break;
++                                      }
++                                      default: {
++                                              esg_container_free(container);
++                                              return NULL;
++                                      }
++                              }
++                              break;
++                      }
++                      case 0xE1: {
++                              switch (structure->id) {
++                                      case 0xFF: {
++                                              structure->data = (void *) esg_session_partition_declaration_decode(buffer + structure->ptr, structure->length);
++                                              break;
++                                      }
++                                      default: {
++                                              esg_container_free(container);
++                                              return NULL;
++                                      }
++                              }
++                              break;
++                      }
++                      case 0xE2: {
++                              switch (structure->id) {
++                                      case 0x00: {
++                                              structure->data = (void *) esg_init_message_decode(buffer + structure->ptr, structure->length);
++                                              break;
++                                      }
++                                      default: {
++                                              esg_container_free(container);
++                                              return NULL;
++                                      }
++                              }
++                              break;
++                      }
++                      default: {
++                              esg_container_free(container);
++                              return NULL;
++                      }
++              }
++      }
++
++      // Container structure body
++      container->structure_body_ptr = pos;
++      container->structure_body_length = size - pos;
++      container->structure_body = (uint8_t *) malloc(size - pos);
++      memcpy(container->structure_body, buffer + pos, size - pos);
++
++      return container;
++}
++
++void esg_container_free(struct esg_container *container) {
++      struct esg_container_structure *structure;
++      struct esg_container_structure *next_structure;
++
++      if (container == NULL) {
++              return;
++    }
++
++      if (container->header) {
++              for(structure = container->header->structure_list; structure; structure = next_structure) {
++                      next_structure = structure->_next;
++                      free(structure);
++              }
++
++              free(container->header);
++      }
++
++      if (container->structure_body) {
++              free(container->structure_body);
++      }
++
++      free(container);
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libesg/encapsulation/container.h dvb-apps/lib/libesg/encapsulation/container.h
+--- linuxtv-dvb-apps-1.1.1/lib/libesg/encapsulation/container.h        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libesg/encapsulation/container.h      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,94 @@
++/*
++ * ESG parser
++ *
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _ESG_ENCAPSULATION_CONTAINER_H
++#define _ESG_ENCAPSULATION_CONTAINER_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <stdint.h>
++
++/**
++ * esg_container_structure structure.
++ */
++struct esg_container_structure {
++      uint8_t type;
++      uint8_t id;
++      uint32_t ptr;
++      uint32_t length;
++
++      void *data;
++
++      struct esg_container_structure *_next;
++};
++
++/**
++ * esg_container_header structure.
++ */
++struct esg_container_header {
++      uint8_t num_structures;
++      struct esg_container_structure *structure_list;
++};
++
++/**
++ * esg_container structure
++ */
++struct esg_container {
++      struct esg_container_header *header;
++      uint32_t structure_body_ptr;
++      uint32_t structure_body_length;
++      uint8_t *structure_body;
++};
++
++/**
++ * Process an esg_container.
++ *
++ * @param buffer Binary buffer to decode.
++ * @param size Binary buffer size.
++ * @return Pointer to an esg_container structure, or NULL on error.
++ */
++extern struct esg_container *esg_container_decode(uint8_t *buffer, uint32_t size);
++
++/**
++ * Free an esg_container.
++ *
++ * @param container Pointer to an esg_container structure.
++ */
++extern void esg_container_free(struct esg_container *container);
++
++/**
++ * Convenience iterator for structure_list field of an esg_container_header.
++ *
++ * @param container The esg_container_header pointer.
++ * @param structure Variable holding a pointer to the current esg_container_structure.
++ */
++#define esg_container_header_structure_list_for_each(header, structure) \
++      for ((structure) = (header)->structure_list; \
++           (structure); \
++           (structure) = (structure)->_next)
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libesg/encapsulation/data_repository.c dvb-apps/lib/libesg/encapsulation/data_repository.c
+--- linuxtv-dvb-apps-1.1.1/lib/libesg/encapsulation/data_repository.c  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libesg/encapsulation/data_repository.c        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,53 @@
++/*
++ * ESG parser
++ *
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <stdlib.h>
++#include <string.h>
++
++#include <libesg/encapsulation/data_repository.h>
++
++struct esg_data_repository *esg_data_repository_decode(uint8_t *buffer, uint32_t size) {
++      struct esg_data_repository *data_repository;
++
++      if ((buffer == NULL) || (size <= 0)) {
++              return NULL;
++      }
++
++      data_repository = (struct esg_data_repository *) malloc(sizeof(struct esg_data_repository));
++      memset(data_repository, 0, sizeof(struct esg_data_repository));
++
++      data_repository->length = size;
++      data_repository->data = (uint8_t *) malloc(size);
++      memcpy(data_repository->data, buffer, size);
++
++      return data_repository;
++}
++
++void esg_data_repository_free(struct esg_data_repository *data_repository) {
++      if (data_repository == NULL) {
++              return;
++      }
++
++      if (data_repository->data) {
++              free(data_repository->data);
++      }
++
++      free(data_repository);
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libesg/encapsulation/data_repository.h dvb-apps/lib/libesg/encapsulation/data_repository.h
+--- linuxtv-dvb-apps-1.1.1/lib/libesg/encapsulation/data_repository.h  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libesg/encapsulation/data_repository.h        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,59 @@
++/*
++ * ESG parser
++ *
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _ESG_ENCAPSULATION_DATA_REPOSITORY_H
++#define _ESG_ENCAPSULATION_DATA_REPOSITORY_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <stdint.h>
++
++/**
++ * esg_data_repository structure.
++ */
++struct esg_data_repository {
++      uint32_t length;
++      uint8_t *data;
++};
++
++/**
++ * Process an esg_data_repository.
++ *
++ * @param buffer Binary buffer to decode.
++ * @param size Binary buffer size.
++ * @return Pointer to an esg_data_repository structure, or NULL on error.
++ */
++extern struct esg_data_repository *esg_data_repository_decode(uint8_t *buffer, uint32_t size);
++
++/**
++ * Free an esg_data_repository.
++ *
++ * @param data_repository Pointer to an esg_data_repository structure.
++ */
++extern void esg_data_repository_free(struct esg_data_repository *data_repository);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libesg/encapsulation/fragment_management_information.c dvb-apps/lib/libesg/encapsulation/fragment_management_information.c
+--- linuxtv-dvb-apps-1.1.1/lib/libesg/encapsulation/fragment_management_information.c  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libesg/encapsulation/fragment_management_information.c        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,118 @@
++/*
++ * ESG parser
++ *
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <stdlib.h>
++#include <string.h>
++
++#include <libesg/encapsulation/fragment_management_information.h>
++
++struct esg_encapsulation_structure *esg_encapsulation_structure_decode(uint8_t *buffer, uint32_t size) {
++      uint32_t pos;
++      struct esg_encapsulation_structure *structure;
++      struct esg_encapsulation_entry *entry;
++      struct esg_encapsulation_entry *last_entry;
++
++      if ((buffer == NULL) || (size <= 2)) {
++              return NULL;
++      }
++
++      pos = 0;
++
++      structure = (struct esg_encapsulation_structure *) malloc(sizeof(struct esg_encapsulation_structure));
++      memset(structure, 0, sizeof(struct esg_encapsulation_structure));
++      structure->entry_list = NULL;
++
++      // Encapsulation header
++      structure->header = (struct esg_encapsulation_header *) malloc(sizeof(struct esg_encapsulation_header));
++      // buffer[pos] reserved
++      structure->header->fragment_reference_format = buffer[pos+1];
++      pos += 2;
++
++      // Encapsulation entry list
++      last_entry = NULL;
++      while (size > pos) {
++              entry = (struct esg_encapsulation_entry *) malloc(sizeof(struct esg_encapsulation_entry));
++              memset(entry, 0, sizeof(struct esg_encapsulation_entry));
++              entry->_next = NULL;
++
++              if (last_entry == NULL) {
++                      structure->entry_list = entry;
++              } else {
++                      last_entry->_next = entry;
++              }
++              last_entry = entry;
++
++              // Fragment reference
++              switch (structure->header->fragment_reference_format) {
++                      case 0x21: {
++                              entry->fragment_reference = (struct esg_fragment_reference *) malloc(sizeof(struct esg_fragment_reference));
++                              memset(entry->fragment_reference, 0, sizeof(struct esg_fragment_reference));
++
++                              entry->fragment_reference->fragment_type = buffer[pos];
++                              pos += 1;
++
++                              entry->fragment_reference->data_repository_offset = (buffer[pos] << 16) | (buffer[pos+1] << 8) | buffer[pos+2];
++                              pos += 3;
++
++                              break;
++                      }
++                      default: {
++                              esg_encapsulation_structure_free(structure);
++                              return NULL;
++                      }
++              }
++
++              // Fragment version & id
++              entry->fragment_version = buffer[pos];
++              pos += 1;
++
++              entry->fragment_id = (buffer[pos] << 16) | (buffer[pos+1] << 8) | buffer[pos+2];
++              pos += 3;
++      }
++
++      return structure;
++}
++
++void esg_encapsulation_structure_free(struct esg_encapsulation_structure *structure) {
++      struct esg_encapsulation_entry *entry;
++      struct esg_encapsulation_entry *next_entry;
++
++      if (structure == NULL) {
++              return;
++    }
++
++      if (structure->header) {
++              free(structure->header);
++      }
++
++      if (structure->entry_list) {
++              for(entry = structure->entry_list; entry; entry = next_entry) {
++                      next_entry = entry->_next;
++                      if (entry->fragment_reference) {
++                              free(entry->fragment_reference);
++                      }
++                      free(entry);
++              }
++
++              free(structure->entry_list);
++      }
++
++      free(structure);
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libesg/encapsulation/fragment_management_information.h dvb-apps/lib/libesg/encapsulation/fragment_management_information.h
+--- linuxtv-dvb-apps-1.1.1/lib/libesg/encapsulation/fragment_management_information.h  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libesg/encapsulation/fragment_management_information.h        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,96 @@
++/*
++ * ESG parser
++ *
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _ESG_ENCAPSULATION_FRAGMENT_MANAGEMENT_INFORMATION_H
++#define _ESG_ENCAPSULATION_FRAGMENT_MANAGEMENT_INFORMATION_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <stdint.h>
++
++/**
++ * esg_encapsulation_header structure.
++ */
++struct esg_encapsulation_header {
++      uint8_t fragment_reference_format;
++};
++
++/**
++ * esg_fragment_reference structure.
++ */
++struct esg_fragment_reference {
++      uint8_t fragment_type;
++      uint32_t data_repository_offset;
++};
++
++/**
++ * esg_encapsulation_entry structure.
++ */
++struct esg_encapsulation_entry {
++      struct esg_fragment_reference *fragment_reference;
++      uint8_t fragment_version;
++      uint32_t fragment_id;
++
++      struct esg_encapsulation_entry *_next;
++};
++
++/**
++ * esg_encapsulation_structure structure.
++ */
++struct esg_encapsulation_structure {
++      struct esg_encapsulation_header *header;
++      struct esg_encapsulation_entry *entry_list;
++};
++
++/**
++ * Process an esg_encapsulation_structure.
++ *
++ * @param buffer Binary buffer to decode.
++ * @param size Binary buffer size.
++ * @return Pointer to an esg_encapsulation_structure structure, or NULL on error.
++ */
++extern struct esg_encapsulation_structure *esg_encapsulation_structure_decode(uint8_t *buffer, uint32_t size);
++
++/**
++ * Free an esg_encapsulation_structure.
++ *
++ * @param container Pointer to an esg_container structure.
++ */
++extern void esg_encapsulation_structure_free(struct esg_encapsulation_structure *structure);
++
++/**
++ * Convenience iterator for entry_list field of an esg_encapsulation_structure.
++ *
++ * @param structure The esg_encapsulation_structure pointer.
++ * @param entry Variable holding a pointer to the current esg_encapsulation_entry.
++ */
++#define esg_encapsulation_structure_entry_list_for_each(structure, entry) \
++      for ((entry) = (structure)->entry_list; \
++           (entry); \
++           (entry) = (entry)->_next)
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libesg/encapsulation/Makefile dvb-apps/lib/libesg/encapsulation/Makefile
+--- linuxtv-dvb-apps-1.1.1/lib/libesg/encapsulation/Makefile   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libesg/encapsulation/Makefile 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,28 @@
++# Makefile for linuxtv.org dvb-apps/lib/libesg/encapsulation
++
++.PHONY: sub-error-encapsulation
++
++sub-error-encapsulation:
++      $(error You can't use this makefile directly.)
++
++ifneq ($(lib_name),)
++
++objects += encapsulation/container.o \
++           encapsulation/fragment_management_information.o \
++           encapsulation/data_repository.o \
++           encapsulation/string_repository.o
++
++sub-install += encapsulation
++
++else
++
++includes = container.h \
++           fragment_management_information.h \
++           data_repository.h \
++           string_repository.h
++
++include ../../../Make.rules
++
++lib_name = libesg/encapsulation
++
++endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libesg/encapsulation/string_repository.c dvb-apps/lib/libesg/encapsulation/string_repository.c
+--- linuxtv-dvb-apps-1.1.1/lib/libesg/encapsulation/string_repository.c        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libesg/encapsulation/string_repository.c      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,54 @@
++/*
++ * ESG parser
++ *
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <stdlib.h>
++#include <string.h>
++
++#include <libesg/encapsulation/string_repository.h>
++
++struct esg_string_repository *esg_string_repository_decode(uint8_t *buffer, uint32_t size) {
++      struct esg_string_repository *string_repository;
++
++      if ((buffer == NULL) || (size <= 1)) {
++              return NULL;
++      }
++
++      string_repository = (struct esg_string_repository *) malloc(sizeof(struct esg_string_repository));
++      memset(string_repository, 0, sizeof(struct esg_string_repository));
++
++      string_repository->encoding_type = buffer[0];
++      string_repository->length = size-1;
++      string_repository->data = (uint8_t *) malloc(size-1);
++      memcpy(string_repository->data, buffer+1, size-1);
++
++      return string_repository;
++}
++
++void esg_string_repository_free(struct esg_string_repository *string_repository) {
++      if (string_repository == NULL) {
++              return;
++      }
++
++      if (string_repository->data) {
++              free(string_repository->data);
++      }
++
++      free(string_repository);
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libesg/encapsulation/string_repository.h dvb-apps/lib/libesg/encapsulation/string_repository.h
+--- linuxtv-dvb-apps-1.1.1/lib/libesg/encapsulation/string_repository.h        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libesg/encapsulation/string_repository.h      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,60 @@
++/*
++ * ESG parser
++ *
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _ESG_ENCAPSULATION_STRING_REPOSITORY_H
++#define _ESG_ENCAPSULATION_STRING_REPOSITORY_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <stdint.h>
++
++/**
++ * esg_string_repository structure.
++ */
++struct esg_string_repository {
++      uint8_t encoding_type;
++      uint32_t length;
++      uint8_t *data;
++};
++
++/**
++ * Process an esg_string_repository.
++ *
++ * @param buffer Binary buffer to decode.
++ * @param size Binary buffer size.
++ * @return Pointer to an esg_string_repository structure, or NULL on error.
++ */
++extern struct esg_string_repository *esg_string_repository_decode(uint8_t *buffer, uint32_t size);
++
++/**
++ * Free an esg_string_repository.
++ *
++ * @param data_repository Pointer to an esg_string_repository structure.
++ */
++extern void esg_string_repository_free(struct esg_string_repository *string_repository);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libesg/Makefile dvb-apps/lib/libesg/Makefile
+--- linuxtv-dvb-apps-1.1.1/lib/libesg/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libesg/Makefile       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,27 @@
++# Makefile for linuxtv.org dvb-apps/lib/libesg
++
++includes = types.h
++
++objects  = types.o
++
++lib_name = libesg
++
++CPPFLAGS += -I../../lib
++
++.PHONY: all
++
++all: library
++
++include bootstrap/Makefile
++include encapsulation/Makefile
++include representation/Makefile
++include transport/Makefile
++
++.PHONY: $(sub-install)
++
++install:: $(sub-install)
++
++$(sub-install):
++      $(MAKE) -C $@ install
++
++include ../../Make.rules
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libesg/representation/bim_decoder_init.h dvb-apps/lib/libesg/representation/bim_decoder_init.h
+--- linuxtv-dvb-apps-1.1.1/lib/libesg/representation/bim_decoder_init.h        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libesg/representation/bim_decoder_init.h      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,40 @@
++/*
++ * ESG parser
++ *
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _ESG_REPRESENTATION_BIM_DECODER_INIT_H
++#define _ESG_REPRESENTATION_BIM_DECODER_INIT_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++/**
++ * esg_bim_decoder_init structure.
++ */
++struct esg_bim_decoder_init {
++// TODO
++};
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libesg/representation/encapsulated_bim_esg_xml_fragment.h dvb-apps/lib/libesg/representation/encapsulated_bim_esg_xml_fragment.h
+--- linuxtv-dvb-apps-1.1.1/lib/libesg/representation/encapsulated_bim_esg_xml_fragment.h       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libesg/representation/encapsulated_bim_esg_xml_fragment.h     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,40 @@
++/*
++ * ESG parser
++ *
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _ESG_REPRESENTATION_ENCAPSULATED_BIM_ESG_XML_FRAGMENT_H
++#define _ESG_REPRESENTATION_ENCAPSULATED_BIM_ESG_XML_FRAGMENT_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++/**
++ * esg_encapsulated_bim_esg_xml_fragment structure.
++ */
++struct esg_encapsulated_bim_esg_xml_fragment {
++      //TODO
++};
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libesg/representation/encapsulated_textual_esg_xml_fragment.c dvb-apps/lib/libesg/representation/encapsulated_textual_esg_xml_fragment.c
+--- linuxtv-dvb-apps-1.1.1/lib/libesg/representation/encapsulated_textual_esg_xml_fragment.c   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libesg/representation/encapsulated_textual_esg_xml_fragment.c 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,70 @@
++/*
++ * ESG parser
++ *
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <stdlib.h>
++#include <string.h>
++
++#include <libesg/types.h>
++#include <libesg/representation/encapsulated_textual_esg_xml_fragment.h>
++
++struct esg_encapsulated_textual_esg_xml_fragment *esg_encapsulated_textual_esg_xml_fragment_decode(uint8_t *buffer, uint32_t size) {
++      struct esg_encapsulated_textual_esg_xml_fragment *esg_xml_fragment;
++      uint32_t pos;
++      uint32_t length;
++      uint8_t offset_pos;
++
++      if ((buffer == NULL) || (size <= 0)) {
++              return NULL;
++      }
++
++      pos = 0;
++
++      esg_xml_fragment = (struct esg_encapsulated_textual_esg_xml_fragment *) malloc(sizeof(struct esg_encapsulated_textual_esg_xml_fragment));
++      memset(esg_xml_fragment, 0, sizeof(struct esg_encapsulated_textual_esg_xml_fragment));
++
++      offset_pos = vluimsbf8(buffer+pos+2, size-pos-2, &length);
++
++      if (size-pos-2 < offset_pos+length) {
++              esg_encapsulated_textual_esg_xml_fragment_free(esg_xml_fragment);
++              return NULL;
++      }
++
++      esg_xml_fragment->esg_xml_fragment_type = (buffer[pos] << 8) | buffer[pos+1];
++      pos += 2+offset_pos;
++
++      esg_xml_fragment->data_length = length;
++      esg_xml_fragment->data = (uint8_t *) malloc(length);
++      memcpy(esg_xml_fragment->data, buffer+pos, length);
++      pos += length;
++
++      return esg_xml_fragment;
++}
++
++void esg_encapsulated_textual_esg_xml_fragment_free(struct esg_encapsulated_textual_esg_xml_fragment *esg_xml_fragment) {
++      if (esg_xml_fragment == NULL) {
++              return;
++      }
++
++      if (esg_xml_fragment->data) {
++              free(esg_xml_fragment->data);
++      }
++
++      free(esg_xml_fragment);
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libesg/representation/encapsulated_textual_esg_xml_fragment.h dvb-apps/lib/libesg/representation/encapsulated_textual_esg_xml_fragment.h
+--- linuxtv-dvb-apps-1.1.1/lib/libesg/representation/encapsulated_textual_esg_xml_fragment.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libesg/representation/encapsulated_textual_esg_xml_fragment.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,60 @@
++/*
++ * ESG parser
++ *
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _ESG_REPRESENTATION_ENCAPSULATED_TEXTUAL_ESG_XML_FRAGMENT_H
++#define _ESG_REPRESENTATION_ENCAPSULATED_TEXTUAL_ESG_XML_FRAGMENT_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <stdint.h>
++
++/**
++ * esg_encapsulated_textual_esg_xml_fragment structure.
++ */
++struct esg_encapsulated_textual_esg_xml_fragment {
++      uint16_t esg_xml_fragment_type;
++      uint32_t data_length;
++      uint8_t *data;
++};
++
++/**
++ * Process an esg_encapsulated_textual_esg_xml_fragment.
++ *
++ * @param buffer Binary buffer to decode.
++ * @param size Binary buffer size.
++ * @return Pointer to an esg_encapsulated_textual_esg_xml_fragment structure, or NULL on error.
++ */
++extern struct esg_encapsulated_textual_esg_xml_fragment *esg_encapsulated_textual_esg_xml_fragment_decode(uint8_t *buffer, uint32_t size);
++
++/**
++ * Free an esg_encapsulated_textual_esg_xml_fragment.
++ *
++ * @param data_repository Pointer to an esg_encapsulated_textual_esg_xml_fragment structure.
++ */
++extern void esg_encapsulated_textual_esg_xml_fragment_free(struct esg_encapsulated_textual_esg_xml_fragment *esg_xml_fragment);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libesg/representation/init_message.c dvb-apps/lib/libesg/representation/init_message.c
+--- linuxtv-dvb-apps-1.1.1/lib/libesg/representation/init_message.c    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libesg/representation/init_message.c  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,112 @@
++/*
++ * ESG parser
++ *
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <stdlib.h>
++#include <string.h>
++
++#include <libesg/representation/init_message.h>
++#include <libesg/representation/textual_decoder_init.h>
++#include <libesg/representation/bim_decoder_init.h>
++
++struct esg_init_message *esg_init_message_decode(uint8_t *buffer, uint32_t size) {
++      uint32_t pos;
++      struct esg_init_message *init_message;
++
++      if ((buffer == NULL) || (size <= 3)) {
++              return NULL;
++      }
++
++      pos = 0;
++
++      init_message = (struct esg_init_message *) malloc(sizeof(struct esg_init_message));
++      memset(init_message, 0, sizeof(struct esg_init_message));
++
++      init_message->encoding_version = buffer[pos];
++      pos += 1;
++
++      init_message->indexing_flag = (buffer[pos] & 0x80) >> 7;
++      pos += 1;
++
++      init_message->decoder_init_ptr = buffer[pos];
++      pos += 1;
++
++      if (init_message->indexing_flag) {
++              init_message->indexing_version = buffer[pos];
++              pos += 1;
++      }
++
++      switch (init_message->encoding_version) {
++              case 0xF1: {
++                      struct esg_bim_encoding_parameters *encoding_parameters = (struct esg_bim_encoding_parameters *) malloc(sizeof(struct esg_bim_encoding_parameters));
++                      memset(encoding_parameters, 0, sizeof(struct esg_bim_encoding_parameters));
++                      init_message->encoding_parameters = (void *) encoding_parameters;
++
++                      encoding_parameters->buffer_size_flag = (buffer[pos] & 0x80) >> 7;
++                      encoding_parameters->position_code_flag = (buffer[pos] & 0x40) >> 6;
++                      pos += 1;
++
++                      encoding_parameters->character_encoding = buffer[pos];
++                      pos += 1;
++
++                      if (encoding_parameters->buffer_size_flag) {
++                              encoding_parameters->buffer_size = (buffer[pos] << 16) | (buffer[pos+1] << 8) | buffer[pos+2];
++                              pos += 3;
++                      }
++
++// TODO
++//                    init_message->decoder_init = (void *) esg_bim_decoder_init_decode(buffer + init_message->decoder_init_ptr, size - init_message->decoder_init_ptr);
++                      break;
++              }
++              case 0xF2:
++              case 0xF3: {
++                      struct esg_textual_encoding_parameters *encoding_parameters = (struct esg_textual_encoding_parameters *) malloc(sizeof(struct esg_textual_encoding_parameters));
++                      memset(encoding_parameters, 0, sizeof(struct esg_textual_encoding_parameters));
++                      init_message->encoding_parameters = (void *) encoding_parameters;
++
++                      encoding_parameters->character_encoding = buffer[pos];
++                      pos += 1;
++
++                      init_message->decoder_init = (void *) esg_textual_decoder_init_decode(buffer + init_message->decoder_init_ptr, size - init_message->decoder_init_ptr);
++                      break;
++              }
++              default: {
++                      esg_init_message_free(init_message);
++                      return NULL;
++              }
++      }
++
++      return init_message;
++}
++
++void esg_init_message_free(struct esg_init_message *init_message) {
++      if (init_message == NULL) {
++              return;
++      }
++
++      if (init_message->encoding_parameters) {
++              free(init_message->encoding_parameters);
++      }
++
++      if (init_message->decoder_init) {
++              free(init_message->decoder_init);
++      }
++
++      free(init_message);
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libesg/representation/init_message.h dvb-apps/lib/libesg/representation/init_message.h
+--- linuxtv-dvb-apps-1.1.1/lib/libesg/representation/init_message.h    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libesg/representation/init_message.h  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,80 @@
++/*
++ * ESG parser
++ *
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _ESG_REPRESENTATION_INIT_MESSAGE_H
++#define _ESG_REPRESENTATION_INIT_MESSAGE_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <stdint.h>
++
++/**
++ * esg_textual_encoding_parameters structure.
++ */
++struct esg_textual_encoding_parameters {
++      uint8_t character_encoding;
++};
++
++/**
++ * esg_bim_encoding_parameters structure.
++ */
++struct esg_bim_encoding_parameters {
++      uint8_t buffer_size_flag;
++      uint8_t position_code_flag;
++      uint8_t character_encoding;
++      uint32_t buffer_size; // if buffer_size_flag
++};
++
++/**
++ * esg_init_message structure.
++ */
++struct esg_init_message {
++      uint8_t encoding_version;
++      uint8_t indexing_flag;
++      uint8_t decoder_init_ptr;
++      uint8_t indexing_version; // if indexing_flag
++      void *encoding_parameters;
++      void *decoder_init;
++};
++
++/**
++ * Process an esg_init_message.
++ *
++ * @param buffer Binary buffer to decode.
++ * @param size Binary buffer size.
++ * @return Pointer to an esg_string_repository structure, or NULL on error.
++ */
++extern struct esg_init_message *esg_init_message_decode(uint8_t *buffer, uint32_t size);
++
++/**
++ * Free an esg_init_message.
++ *
++ * @param init_message Pointer to an esg_init_message structure.
++ */
++extern void esg_init_message_free(struct esg_init_message *init_message);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libesg/representation/Makefile dvb-apps/lib/libesg/representation/Makefile
+--- linuxtv-dvb-apps-1.1.1/lib/libesg/representation/Makefile  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libesg/representation/Makefile        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,26 @@
++# Makefile for linuxtv.org dvb-apps/lib/libesg/representation
++
++.PHONY: sub-error-representation
++
++sub-error-representation:
++      $(error You can't use this makefile directly.)
++
++ifneq ($(lib_name),)
++
++objects += representation/encapsulated_textual_esg_xml_fragment.o \
++           representation/init_message.o \
++           representation/textual_decoder_init.o
++
++sub-install += representation
++
++else
++
++includes = encapsulated_textual_esg_xml_fragment.h \
++           init_message.h \
++           textual_decoder_init.h
++
++include ../../../Make.rules
++
++lib_name = libesg/representation
++
++endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libesg/representation/textual_decoder_init.c dvb-apps/lib/libesg/representation/textual_decoder_init.c
+--- linuxtv-dvb-apps-1.1.1/lib/libesg/representation/textual_decoder_init.c    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libesg/representation/textual_decoder_init.c  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,128 @@
++/*
++ * ESG parser
++ *
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <stdlib.h>
++#include <string.h>
++
++#include <libesg/types.h>
++#include <libesg/representation/textual_decoder_init.h>
++
++struct esg_textual_decoder_init *esg_textual_decoder_init_decode(uint8_t *buffer, uint32_t size) {
++      uint32_t pos;
++      struct esg_textual_decoder_init *decoder_init;
++      struct esg_namespace_prefix *namespace_prefix;
++      struct esg_namespace_prefix *last_namespace_prefix;
++      struct esg_xml_fragment_type *xml_fragment_type;
++      struct esg_xml_fragment_type *last_xml_fragment_type;
++      uint32_t decoder_init_length;
++      uint8_t num_index;
++
++      if ((buffer == NULL) || (size <= 1)) {
++              return NULL;
++      }
++
++      pos = 0;
++
++      decoder_init = (struct esg_textual_decoder_init *) malloc(sizeof(struct esg_textual_decoder_init));
++      memset(decoder_init, 0, sizeof(struct esg_textual_decoder_init));
++      decoder_init->namespace_prefix_list = NULL;
++      decoder_init->xml_fragment_type_list = NULL;
++
++      decoder_init->version = buffer[pos];
++      pos += 1;
++
++      pos += vluimsbf8(buffer+pos, size-pos, &decoder_init_length);
++
++      if (size < pos + decoder_init_length) {
++              esg_textual_decoder_init_free(decoder_init);
++              return NULL;
++      }
++
++      decoder_init->num_namespace_prefixes = buffer[pos];
++      pos += 1;
++
++      last_namespace_prefix = NULL;
++      for (num_index = 0; num_index < decoder_init->num_namespace_prefixes; num_index++) {
++              namespace_prefix = (struct esg_namespace_prefix *) malloc(sizeof(struct esg_namespace_prefix));
++              memset(namespace_prefix, 0, sizeof(struct esg_namespace_prefix));
++              namespace_prefix->_next = NULL;
++
++              if (last_namespace_prefix == NULL) {
++                      decoder_init->namespace_prefix_list = namespace_prefix;
++              } else {
++                      last_namespace_prefix->_next = namespace_prefix;
++              }
++              last_namespace_prefix = namespace_prefix;
++
++              namespace_prefix->prefix_string_ptr = (buffer[pos] << 8) | buffer[pos+1];
++              pos += 2;
++
++              namespace_prefix->namespace_uri_ptr = (buffer[pos] << 8) | buffer[pos+1];
++              pos += 2;
++      }
++
++      decoder_init->num_fragment_types = buffer[pos];
++      pos += 1;
++
++      last_xml_fragment_type = NULL;
++      for (num_index = 0; num_index < decoder_init->num_fragment_types; num_index++) {
++              xml_fragment_type = (struct esg_xml_fragment_type *) malloc(sizeof(struct esg_xml_fragment_type));
++              memset(xml_fragment_type, 0, sizeof(struct esg_xml_fragment_type));
++              xml_fragment_type->_next = NULL;
++
++              if (last_xml_fragment_type == NULL) {
++                      decoder_init->xml_fragment_type_list = xml_fragment_type;
++              } else {
++                      last_xml_fragment_type->_next = xml_fragment_type;
++              }
++              last_xml_fragment_type = xml_fragment_type;
++
++              xml_fragment_type->xpath_ptr = (buffer[pos] << 8) | buffer[pos+1];
++              pos += 2;
++
++              xml_fragment_type->xml_fragment_type = (buffer[pos] << 8) | buffer[pos+1];
++              pos += 2;
++      }
++
++      return decoder_init;
++}
++
++void esg_textual_decoder_init_free(struct esg_textual_decoder_init *decoder_init) {
++      struct esg_namespace_prefix *namespace_prefix;
++      struct esg_namespace_prefix *next_namespace_prefix;
++      struct esg_xml_fragment_type *xml_fragment_type;
++      struct esg_xml_fragment_type *next_xml_fragment_type;
++
++      if (decoder_init == NULL) {
++              return;
++    }
++
++      for(namespace_prefix = decoder_init->namespace_prefix_list; namespace_prefix; namespace_prefix = next_namespace_prefix) {
++              next_namespace_prefix = namespace_prefix->_next;
++              free(namespace_prefix);
++      }
++
++      for(xml_fragment_type = decoder_init->xml_fragment_type_list; xml_fragment_type; xml_fragment_type = next_xml_fragment_type) {
++              next_xml_fragment_type = xml_fragment_type->_next;
++              free(xml_fragment_type);
++      }
++
++      free(decoder_init);
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libesg/representation/textual_decoder_init.h dvb-apps/lib/libesg/representation/textual_decoder_init.h
+--- linuxtv-dvb-apps-1.1.1/lib/libesg/representation/textual_decoder_init.h    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libesg/representation/textual_decoder_init.h  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,104 @@
++/*
++ * ESG parser
++ *
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _ESG_REPRESENTATION_TEXTUAL_DECODER_INIT_H
++#define _ESG_REPRESENTATION_TEXTUAL_DECODER_INIT_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <stdint.h>
++
++/**
++ * esg_namespace_prefix structure.
++ */
++struct esg_namespace_prefix {
++      uint16_t prefix_string_ptr;
++      uint16_t namespace_uri_ptr;
++
++      struct esg_namespace_prefix *_next;
++};
++
++/**
++ * esg_fragment_type structure.
++ */
++struct esg_xml_fragment_type {
++      uint16_t xpath_ptr;
++      uint16_t xml_fragment_type;
++
++      struct esg_xml_fragment_type *_next;
++};
++
++/**
++ * esg_textual_decoder_init structure.
++ */
++struct esg_textual_decoder_init {
++      uint8_t version;
++      uint8_t num_namespace_prefixes;
++      struct esg_namespace_prefix *namespace_prefix_list;
++      uint8_t num_fragment_types;
++      struct esg_xml_fragment_type *xml_fragment_type_list;
++};
++
++/**
++ * Process an esg_textual_decoder_init.
++ *
++ * @param buffer Binary buffer to decode.
++ * @param size Binary buffer size.
++ * @return Pointer to an esg_textual_decoder_init structure, or NULL on error.
++ */
++extern struct esg_textual_decoder_init *esg_textual_decoder_init_decode(uint8_t *buffer, uint32_t size);
++
++/**
++ * Free an esg_textual_decoder_init.
++ *
++ * @param decoder_init Pointer to an esg_textual_decoder_init structure.
++ */
++extern void esg_textual_decoder_init_free(struct esg_textual_decoder_init *decoder_init);
++
++/**
++ * Convenience iterator for namespace_prefix_list field of an esg_textual_decoder_init.
++ *
++ * @param decoder_init The esg_textual_decoder_init pointer.
++ * @param namespace_prefix Variable holding a pointer to the current esg_namespace_prefix.
++ */
++#define esg_textual_decoder_namespace_prefix_list_for_each(decoder_init, namespace_prefix) \
++      for ((namespace_prefix) = (decoder_init)->namespace_prefix_list; \
++           (namespace_prefix); \
++           (namespace_prefix) = (namespace_prefix)->_next)
++
++/**
++ * Convenience iterator for xml_fragment_type_list field of an esg_textual_decoder_init.
++ *
++ * @param decoder_init The esg_textual_decoder_init pointer.
++ * @param xml_fragment_type Variable holding a pointer to the current esg_xml_fragment_type.
++ */
++#define esg_textual_decoder_xml_fragment_type_list_for_each(decoder_init, xml_fragment_type) \
++      for ((xml_fragment_type) = (decoder_init)->xml_fragment_type_list; \
++           (xml_fragment_type); \
++           (xml_fragment_type) = (xml_fragment_type)->_next)
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libesg/TODO dvb-apps/lib/libesg/TODO
+--- linuxtv-dvb-apps-1.1.1/lib/libesg/TODO     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libesg/TODO   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,18 @@
++*** General
++- Add enums for constants
++
++*** EncodingVersion
++- GZIP : use zlib
++- BiM : ???
++
++*** BOOTSTRAP
++- ESGProviderDiscoveryDescriptor : XML parsing with libexpat ?
++
++*** TRANSPORT
++- Indexation
++
++*** ENCAPSULATION
++- Auxiliary Data
++
++*** REPRESENTATION
++- BiM Decoder Init
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libesg/transport/Makefile dvb-apps/lib/libesg/transport/Makefile
+--- linuxtv-dvb-apps-1.1.1/lib/libesg/transport/Makefile       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libesg/transport/Makefile     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,22 @@
++# Makefile for linuxtv.org dvb-apps/lib/libesg/transport
++
++.PHONY: sub-error-transport
++
++sub-error-transport:
++      $(error You can't use this makefile directly.)
++
++ifneq ($(lib_name),)
++
++objects += transport/session_partition_declaration.o
++
++sub-install += transport
++
++else
++
++includes = session_partition_declaration.h
++
++include ../../../Make.rules
++
++lib_name = libesg/transport
++
++endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libesg/transport/session_partition_declaration.c dvb-apps/lib/libesg/transport/session_partition_declaration.c
+--- linuxtv-dvb-apps-1.1.1/lib/libesg/transport/session_partition_declaration.c        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libesg/transport/session_partition_declaration.c      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,253 @@
++/*
++ * ESG parser
++ *
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <stdlib.h>
++#include <string.h>
++
++#include <libesg/transport/session_partition_declaration.h>
++
++struct esg_session_partition_declaration *esg_session_partition_declaration_decode(uint8_t *buffer, uint32_t size) {
++      uint32_t pos;
++      struct esg_session_partition_declaration *partition;
++      struct esg_session_field *field;
++      struct esg_session_field *last_field;
++      uint8_t field_index;
++      struct esg_session_ip_stream *ip_stream;
++      struct esg_session_ip_stream *last_ip_stream;
++      uint8_t ip_stream_index;
++      uint8_t ip_index;
++      struct esg_session_ip_stream_field *ip_stream_field;
++      struct esg_session_ip_stream_field *last_ip_stream_field;
++      uint8_t *field_buffer;
++      uint32_t field_length;
++      union esg_session_ip_stream_field_value *field_value;
++
++      if ((buffer == NULL) || (size <= 2)) {
++              return NULL;
++      }
++
++      pos = 0;
++
++      partition = (struct esg_session_partition_declaration *) malloc(sizeof(struct esg_session_partition_declaration));
++      memset(partition, 0, sizeof(struct esg_session_partition_declaration));
++      partition->field_list = NULL;
++      partition->ip_stream_list = NULL;
++
++      partition->num_fields = buffer[pos];
++      pos += 1;
++
++      partition->overlapping = (buffer[pos] & 0x80) ? 1 : 0;
++      pos += 1;
++
++      if (size < (pos + 5*(partition->num_fields))) {
++              esg_session_partition_declaration_free(partition);
++              return NULL;
++      }
++
++      last_field = NULL;
++      for (field_index = 0; field_index < partition->num_fields; field_index++) {
++              field = (struct esg_session_field *) malloc(sizeof(struct esg_session_field));
++              memset(field, 0, sizeof(struct esg_session_field));
++              field->_next = NULL;
++
++              if (last_field == NULL) {
++                      partition->field_list = field;
++              } else {
++                      last_field->_next = field;
++              }
++              last_field = field;
++
++              field->identifier = (buffer[pos] << 8) | buffer[pos+1];
++              pos += 2;
++
++              field->encoding = (buffer[pos] << 8) | buffer[pos+1];
++              pos += 2;
++
++              field->length = buffer[pos];
++              pos += 1;
++      }
++
++      partition->n_o_ip_streams = buffer[pos];
++      pos += 1;
++
++      partition->ip_version_6 = (buffer[pos] & 0x80) ? 1 : 0;
++      pos += 1;
++
++      last_ip_stream = NULL;
++      for (ip_stream_index = 0; ip_stream_index < partition->n_o_ip_streams; ip_stream_index++) {
++              ip_stream = (struct esg_session_ip_stream *) malloc(sizeof(struct esg_session_ip_stream));
++              memset(ip_stream, 0, sizeof(struct esg_session_ip_stream));
++              ip_stream->_next = NULL;
++
++              if (last_ip_stream == NULL) {
++                      partition->ip_stream_list = ip_stream;
++              } else {
++                      last_ip_stream->_next = ip_stream;
++              }
++              last_ip_stream = ip_stream;
++
++              ip_stream->id = buffer[pos];
++              pos += 1;
++
++              if (partition->ip_version_6) {
++                      for (ip_index = 0; ip_index < 16; ip_index++) {
++                              ip_stream->source_ip.ipv6[ip_index] = buffer[pos+ip_index];
++                              ip_stream->destination_ip.ipv6[ip_index] = buffer[pos+16+ip_index];
++                      }
++                      pos += 32;
++              } else {
++                      for (ip_index = 0; ip_index < 4; ip_index++) {
++                              ip_stream->source_ip.ipv4[ip_index] = buffer[pos+ip_index];
++                              ip_stream->destination_ip.ipv4[ip_index] = buffer[pos+4+ip_index];
++                      }
++                      pos += 8;
++              }
++              ip_stream->port = (buffer[pos] << 8) | buffer[pos+1];
++              pos += 2;
++
++              ip_stream->session_id = (buffer[pos] << 8) | buffer[pos+1];
++              pos += 2;
++
++              last_ip_stream_field = NULL;
++              esg_session_partition_declaration_field_list_for_each(partition, field) {
++                      ip_stream_field = (struct esg_session_ip_stream_field *) malloc(sizeof(struct esg_session_ip_stream_field));
++                      memset(ip_stream_field, 0, sizeof(struct esg_session_ip_stream_field));
++                      ip_stream_field->_next = NULL;
++                      ip_stream_field->start_field_value = NULL;
++                      ip_stream_field->end_field_value = NULL;
++
++                      if (last_ip_stream_field == NULL) {
++                              ip_stream->field_list = ip_stream_field;
++                      } else {
++                              last_ip_stream_field->_next = ip_stream_field;
++                      }
++                      last_ip_stream_field = ip_stream_field;
++
++                      field_length = field->length;
++                      if (field->length != 0) {
++                              field_length = field->length;
++                      } else {
++                              pos += vluimsbf8(buffer + pos, size - pos, &field_length);
++                      }
++
++                      switch (field->encoding) {
++                              case 0x0000: {
++                                      if (partition->overlapping == 1) {
++                                              field_value = (union esg_session_ip_stream_field_value *) malloc(sizeof(union esg_session_ip_stream_field_value));
++                                              memset(field_value, 0, sizeof(union esg_session_ip_stream_field_value));
++                                              ip_stream_field->start_field_value = field_value;
++
++                                              field_buffer = (uint8_t *) malloc(field_length);
++                                              memset(field_buffer, 0, field_length);
++                                              memcpy(field_buffer, buffer + pos, field_length);
++
++                                              ip_stream_field->start_field_value->string = field_buffer;
++                                              pos += field_length;
++                                      }
++                                      field_value = (union esg_session_ip_stream_field_value *) malloc(sizeof(union esg_session_ip_stream_field_value));
++                                      memset(field_value, 0, sizeof(union esg_session_ip_stream_field_value));
++                                      ip_stream_field->end_field_value = field_value;
++
++                                      field_buffer = (uint8_t *) malloc(field_length);
++                                      memset(field_buffer, 0, field_length);
++                                      memcpy(field_buffer, buffer + pos, field_length);
++
++                                      ip_stream_field->end_field_value->string = field_buffer;
++                                      pos += field_length;
++
++                                      break;
++                              }
++                              case 0x0101: {
++                                      if (partition->overlapping == 1) {
++                                              field_value = (union esg_session_ip_stream_field_value *) malloc(sizeof(union esg_session_ip_stream_field_value));
++                                              memset(field_value, 0, sizeof(union esg_session_ip_stream_field_value));
++                                              ip_stream_field->start_field_value = field_value;
++
++                                              ip_stream_field->start_field_value->unsigned_short = (buffer[pos] << 8) | buffer[pos+1];
++                                              pos += field_length;
++                                      }
++                                      field_value = (union esg_session_ip_stream_field_value *) malloc(sizeof(union esg_session_ip_stream_field_value));
++                                      memset(field_value, 0, sizeof(union esg_session_ip_stream_field_value));
++                                      ip_stream_field->end_field_value = field_value;
++
++                                      ip_stream_field->end_field_value->unsigned_short = (buffer[pos] << 8) | buffer[pos+1];
++                                      pos += field_length;
++
++                                      break;
++                              }
++                              default: {
++                                      esg_session_partition_declaration_free(partition);
++                                      return NULL;
++                              }
++                      }
++              }
++      }
++
++      return partition;
++}
++
++void esg_session_partition_declaration_free(struct esg_session_partition_declaration *partition) {
++      struct esg_session_field *field;
++      struct esg_session_field *next_field;
++      struct esg_session_ip_stream *ip_stream;
++      struct esg_session_ip_stream *next_ip_stream;
++      struct esg_session_ip_stream_field *ip_stream_field;
++      struct esg_session_ip_stream_field *next_ip_stream_field;
++
++      if (partition == NULL) {
++              return;
++    }
++
++      for(ip_stream = partition->ip_stream_list; ip_stream; ip_stream = next_ip_stream) {
++              next_ip_stream = ip_stream->_next;
++
++              field = partition->field_list;
++              for(ip_stream_field = next_ip_stream->field_list; ip_stream_field; ip_stream_field = next_ip_stream_field) {
++                      next_ip_stream_field = ip_stream_field->_next;
++
++                      switch (field->encoding) {
++                              case 0x0000: {
++                                      if (ip_stream_field->start_field_value != NULL) {
++                                              free(ip_stream_field->start_field_value->string);
++                                      }
++                                      free(ip_stream_field->end_field_value->string);
++                                      break;
++                              }
++                              case 0x0101: {
++                                      // Nothing to free
++                                      break;
++                              }
++                      }
++
++                      free(ip_stream_field);
++
++                      field = field->_next;
++              }
++
++              free(ip_stream);
++      }
++
++      for(field = partition->field_list; field; field = next_field) {
++              next_field = field->_next;
++              free(field);
++      }
++
++      free(partition);
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libesg/transport/session_partition_declaration.h dvb-apps/lib/libesg/transport/session_partition_declaration.h
+--- linuxtv-dvb-apps-1.1.1/lib/libesg/transport/session_partition_declaration.h        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libesg/transport/session_partition_declaration.h      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,139 @@
++/*
++ * ESG parser
++ *
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _ESG_TRANSPORT_SESSION_PARTITION_DECLARATION_H
++#define _ESG_TRANSPORT_SESSION_PARTITION_DECLARATION_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libesg/types.h>
++
++/**
++ * esg_session_field structure.
++ */
++struct esg_session_field {
++      uint16_t identifier;
++      uint16_t encoding;
++      uint8_t length;
++
++      struct esg_session_field *_next;
++};
++
++/**
++ * esg_session_ip_stream_field_value union.
++ */
++union esg_session_ip_stream_field_value {
++      uint8_t *string;
++      uint16_t unsigned_short;
++};
++
++/**
++ * esg_session_ip_stream_field structure.
++ */
++struct esg_session_ip_stream_field {
++      union esg_session_ip_stream_field_value *start_field_value;
++      union esg_session_ip_stream_field_value *end_field_value;
++
++      struct esg_session_ip_stream_field *_next;
++};
++
++/**
++ * esg_session_ip_stream structure.
++ */
++struct esg_session_ip_stream {
++      uint8_t id;
++      union esg_ip_address source_ip;
++      union esg_ip_address destination_ip;
++      uint16_t port;
++      uint16_t session_id;
++      struct esg_session_ip_stream_field *field_list;
++
++      struct esg_session_ip_stream *_next;
++};
++
++/**
++ * esg_session_partition_declaration structure.
++ */
++struct esg_session_partition_declaration {
++      uint8_t num_fields;
++      uint8_t overlapping;
++      struct esg_session_field *field_list;
++      uint8_t n_o_ip_streams;
++      uint8_t ip_version_6;
++      struct esg_session_ip_stream *ip_stream_list;
++};
++
++/**
++ * Process an esg_session_partition_declaration.
++ *
++ * @param buffer Binary buffer to decode.
++ * @param size Binary buffer size.
++ * @return Pointer to an esg_session_partition_declaration structure, or NULL on error.
++ */
++extern struct esg_session_partition_declaration *esg_session_partition_declaration_decode(uint8_t *buffer, uint32_t size);
++
++/**
++ * Free an esg_session_partition_declaration.
++ *
++ * @param esg Pointer to an esg_session_partition_declaration structure.
++ */
++extern void esg_session_partition_declaration_free(struct esg_session_partition_declaration *partition);
++
++/**
++ * Convenience iterator for field_list field of an esg_session_partition_declaration.
++ *
++ * @param partition The esg_session_partition_declaration pointer.
++ * @param field Variable holding a pointer to the current esg_session_field.
++ */
++#define esg_session_partition_declaration_field_list_for_each(partition, field) \
++      for ((field) = (partition)->field_list; \
++           (field); \
++           (field) = (field)->_next)
++
++/**
++ * Convenience iterator for ip_stream_list field of an esg_session_partition_declaration.
++ *
++ * @param partition The esg_session_partition_declaration pointer.
++ * @param ip_stream Variable holding a pointer to the current esg_session_ip_stream.
++ */
++#define esg_session_partition_declaration_ip_stream_list_for_each(partition, ip_stream) \
++      for ((ip_stream) = (partition)->ip_stream_list; \
++           (ip_stream); \
++           (ip_stream) = (ip_stream)->_next)
++
++/**
++ * Convenience iterator for field_list field of an esg_session_ip_stream.
++ *
++ * @param ip_stream The esg_session_ip_stream pointer.
++ * @param field Variable holding a pointer to the current esg_session_ip_stream.
++ */
++#define esg_session_ip_stream_field_list_for_each(ip_stream, field) \
++      for ((field) = (ip_stream)->field_list; \
++           (field); \
++           (field) = (field)->_next)
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libesg/types.c dvb-apps/lib/libesg/types.c
+--- linuxtv-dvb-apps-1.1.1/lib/libesg/types.c  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libesg/types.c        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,37 @@
++/*
++ * ESG parser
++ *
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <libesg/types.h>
++
++uint8_t vluimsbf8(uint8_t *buffer, uint32_t size, uint32_t *length) {
++      uint8_t offset = 0;
++      *length = 0;
++
++      do {
++              if (size < offset) {
++                      offset = 0;
++                      *length = 0;
++                      break;
++              }
++              *length = (*length << 7) + (buffer[offset] & 0x7F);
++      } while (buffer[offset++] & 0x80);
++
++      return offset;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libesg/types.h dvb-apps/lib/libesg/types.h
+--- linuxtv-dvb-apps-1.1.1/lib/libesg/types.h  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libesg/types.h        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,53 @@
++/*
++ * ESG parser
++ *
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _ESG_TYPES_H
++#define _ESG_TYPES_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <stdint.h>
++
++/**
++ * esg_ip_address
++ */
++union esg_ip_address {
++      uint8_t ipv4[4];
++      uint8_t ipv6[16];
++};
++
++/**
++ * Process a vluimsbf8 length.
++ *
++ * @param buffer Binary buffer to decode.
++ * @param size Binary buffer size.
++ * @param length Read length value
++ * @return vluimsbf8 size
++ */
++extern uint8_t vluimsbf8(uint8_t *buffer, uint32_t size, uint32_t *length);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libesg/xml/provider_discovery_descriptor.xsd dvb-apps/lib/libesg/xml/provider_discovery_descriptor.xsd
+--- linuxtv-dvb-apps-1.1.1/lib/libesg/xml/provider_discovery_descriptor.xsd    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libesg/xml/provider_discovery_descriptor.xsd  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,22 @@
++<schema targetNamespace="urn:dvb:ipdc:esgbs:2005" xmlns:bs="urn:dvb:ipdc:esgbs:2005"
++      xmlns:mpeg7="urn:mpeg:mpeg7:schema:2001" xmlns="http://www.w3.org/2001/XMLSchema"
++      elementFormDefault="qualified" attributeFormDefault="unqualified">
++      <import namespace="urn:mpeg:mpeg7:schema:2001" />
++      <complexType name="ESGProviderType">
++              <sequence>
++                      <element name="ProviderURI" type="anyURI"/>
++                      <element name="ProviderName" type="mpeg7:TextualType"/>
++                      <element name="ProviderLogo" type="mpeg7:TitleMediaType" minOccurs="0"/>
++                      <element name="ProviderID" type="positiveInteger"/>
++                      <element name="ProviderInformationURL" type="anyURI" minOccurs="0"/>
++                      <element name="PrivateAuxiliaryData" type="anyType" minOccurs="0"/>
++              </sequence>
++      </complexType>
++      <element name="ESGProviderDiscovery">
++              <complexType>
++                      <sequence>
++                              <element name="ServiceProvider" type="bs:ESGProviderType" maxOccurs="unbounded"/>
++                      </sequence>
++              </complexType>
++      </element>
++</schema>
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/ac3_descriptor.h dvb-apps/lib/libucsi/atsc/ac3_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/ac3_descriptor.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/ac3_descriptor.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,112 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_atsc@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_ATSC_AC3_DESCRIPTOR
++#define _UCSI_ATSC_AC3_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++enum atsc_ac3_channels {
++      ATSC_AC3_CHANNELS_1_PLUS_1      = 0x0,
++      ATSC_AC3_CHANNELS_1_0           = 0x1,
++      ATSC_AC3_CHANNELS_2_0           = 0x2,
++      ATSC_AC3_CHANNELS_3_0           = 0x3,
++      ATSC_AC3_CHANNELS_2_1           = 0x4,
++      ATSC_AC3_CHANNELS_3_1           = 0x5,
++      ATSC_AC3_CHANNELS_2_2           = 0x6,
++      ATSC_AC3_CHANNELS_3_2           = 0x7,
++      ATSC_AC3_CHANNELS_1             = 0x8,
++      ATSC_AC3_CHANNELS_LTEQ_2        = 0x9,
++      ATSC_AC3_CHANNELS_LTEQ_3        = 0xa,
++      ATSC_AC3_CHANNELS_LTEQ_4        = 0xb,
++      ATSC_AC3_CHANNELS_LTEQ_5        = 0xc,
++      ATSC_AC3_CHANNELS_LTEQ_6        = 0xd,
++};
++
++/**
++ * atsc_ac3_descriptor structure.
++ */
++struct atsc_ac3_descriptor {
++      struct descriptor d;
++
++  EBIT2(uint8_t sample_rate_code        : 3; ,
++      uint8_t bsid                    : 5; );
++  EBIT2(uint8_t bit_rate_code         : 6; ,
++      uint8_t surround_mode           : 2; );
++  EBIT3(uint8_t bsmod                 : 3; ,
++      uint8_t num_channels            : 4; ,
++      uint8_t full_svc                : 1; );
++      /* uint8_t additional_info[] */
++} __ucsi_packed;
++
++/**
++ * Process an atsc_ac3_descriptor.
++ *
++ * @param d Generic descriptor structure.
++ * @return atsc_ac3_descriptor pointer, or NULL on error.
++ */
++static inline struct atsc_ac3_descriptor*
++      atsc_ac3_descriptor_codec(struct descriptor* d)
++{
++      int pos = 0;
++
++      if (d->len < (pos+4))
++              return NULL;
++      pos += 4;
++
++      return (struct atsc_ac3_descriptor*) d;
++}
++
++/**
++ * Retrieve pointer to additional_info field of a atsc_ac3_descriptor.
++ *
++ * @param d atsc_ac3_descriptor pointer.
++ * @return Pointer to additional_info field.
++ */
++static inline uint8_t *atsc_ac3_descriptor_additional_info(struct atsc_ac3_descriptor *d)
++{
++      int pos = sizeof(struct atsc_ac3_descriptor);
++
++      return ((uint8_t *) d) + pos;
++}
++
++/**
++ * Determine length of additional_info field of a atsc_ac3_descriptor.
++ *
++ * @param d atsc_ac3_descriptor pointer.
++ * @return Length of field in bytes.
++ */
++static inline int atsc_ac3_descriptor_additional_info_length(struct atsc_ac3_descriptor* d)
++{
++      return d->d.len - 3;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/atsc_text.c dvb-apps/lib/libucsi/atsc/atsc_text.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/atsc_text.c        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/atsc_text.c      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,743 @@
++/*
++* section and descriptor parser
++*
++* Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++*
++* This library is free software; you can redistribute it and/or
++* modify it under the terms of the GNU Lesser General Public
++* License as published by the Free Software Foundation; either
++* version 2.1 of the License, or (at your option) any later version.
++*
++* This library is distributed in the hope that it will be useful,
++* but WITHOUT ANY WARRANTY; without even the implied warranty of
++* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++* Lesser General Public License for more details.
++*
++* You should have received a copy of the GNU Lesser General Public
++* License along with this library; if not, write to the Free Software
++* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++*/
++
++#include <stdint.h>
++#include <stdlib.h>
++#include <string.h>
++#include <errno.h>
++#include "libucsi/endianops.h"
++#include "libucsi/atsc/types.h"
++
++#define HUFFTREE_LITERAL_MASK 0x80
++#define HUFFSTRING_END 0x00
++#define HUFFSTRING_ESCAPE 0x1b
++
++#define DEST_ALLOC_DELTA 20
++
++struct hufftree_entry {
++      uint8_t left_idx;
++      uint8_t right_idx;
++} __ucsi_packed;
++
++struct huffbuff {
++      uint8_t *buf;
++      uint32_t buf_len;
++
++      uint32_t cur_byte;
++      uint8_t cur_bit;
++};
++
++
++static struct hufftree_entry program_description_hufftree[][128] = {
++      { {0x14, 0x15}, {0x9b, 0xd6}, {0xc9, 0xcf}, {0xd7, 0xc7}, {0x01, 0xa2},
++      {0xce, 0xcb}, {0x02, 0x03}, {0xc5, 0xcc}, {0xc6, 0xc8}, {0x04, 0xc4},
++      {0x05, 0xc2}, {0x06, 0xc3}, {0xd2, 0x07}, {0xd3, 0x08}, {0xca, 0xd4},
++      {0x09, 0xcd}, {0xd0, 0x0a}, {0xc1, 0x0b}, {0x0c, 0x0d}, {0x0e, 0x0f},
++      {0x10, 0x11}, {0x12, 0x13}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x38, 0x39}, {0xad, 0xaf}, {0xb7, 0xda}, {0xa8, 0xb3}, {0xb5, 0x01},
++      {0x02, 0x9b}, {0xb4, 0xf1}, {0xa2, 0xd5}, {0xd6, 0xd9}, {0x03, 0x04},
++      {0x05, 0xcf}, {0x06, 0xc9}, {0xf9, 0xea}, {0xeb, 0xf5}, {0xf6, 0x07},
++      {0x08, 0x09}, {0xb2, 0xc5}, {0xc6, 0xb1}, {0x0a, 0xee}, {0xcb, 0x0b},
++      {0xd4, 0x0c}, {0xc4, 0xc8}, {0xd2, 0x0d}, {0x0e, 0x0f}, {0xc7, 0xca},
++      {0xce, 0xd0}, {0xd7, 0x10}, {0xc2, 0x11}, {0xcc, 0xec}, {0xe5, 0xe7},
++      {0x12, 0xcd}, {0x13, 0x14}, {0xc3, 0x15}, {0x16, 0x17}, {0xed, 0x18},
++      {0x19, 0xf2}, {0x1a, 0xd3}, {0x1b, 0x1c}, {0xe4, 0x1d}, {0xc1, 0xe3},
++      {0x1e, 0xe9}, {0xf0, 0xe2}, {0xf7, 0x1f}, {0xf3, 0xe6}, {0x20, 0x21},
++      {0x22, 0xe8}, {0xef, 0x23}, {0x24, 0x25}, {0x26, 0x27}, {0x28, 0x29},
++      {0x2a, 0xf4}, {0x2b, 0x2c}, {0x2d, 0x2e}, {0x2f, 0xe1}, {0x30, 0x31},
++      {0x32, 0x33}, {0x34, 0x35}, {0x36, 0x37}, },
++      { {0x9b, 0x9b}, },
++      { {0x03, 0x04}, {0x80, 0xae}, {0xc8, 0xd4}, {0x01, 0x02}, {0x9b, 0xa0}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x02, 0xf3}, {0xa0, 0xf4}, {0x9b, 0x01}, },
++      { {0x9b, 0x9b}, },
++      { {0xac, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x01, 0xa0}, {0x9b, 0xa2}, },
++      { {0x07, 0x08}, {0xe2, 0xe4}, {0xe5, 0xe6}, {0xa0, 0xf2}, {0xe1, 0x01},
++      {0x02, 0xf3}, {0xe3, 0x03}, {0x04, 0x05}, {0x9b, 0x06}, },
++      { {0x04, 0x80}, {0xca, 0xd3}, {0xa2, 0x01}, {0x9b, 0x02}, {0x03, 0xa0}, },
++      { {0x9b, 0xa0}, },
++      { {0x03, 0x04}, {0x9b, 0xb7}, {0xf4, 0xa0}, {0xb0, 0xf3}, {0x01, 0x02}, },
++      { {0xb9, 0x02}, {0xb8, 0x9b}, {0xa0, 0x01}, },
++      { {0xae, 0x02}, {0xb6, 0x9b}, {0x01, 0xa0}, },
++      { {0xa0, 0x01}, {0x9b, 0xb0}, },
++      { {0xae, 0x01}, {0x9b, 0xa0}, },
++      { {0xae, 0x01}, {0xa0, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x01}, {0xac, 0xae}, },
++      { {0x9b, 0x9b}, },
++      { {0x02, 0x03}, {0x9b, 0xa0}, {0xb5, 0xb6}, {0xb8, 0x01}, },
++      { {0x9b, 0xa0}, },
++      { {0x9b, 0xa0}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0xa0}, },
++      { {0x9b, 0x9b}, },
++      { {0x08, 0x09}, {0xe6, 0xf5}, {0xf3, 0xf4}, {0x9b, 0xe4}, {0x01, 0xed},
++      {0x02, 0x03}, {0x04, 0xf2}, {0x05, 0x06}, {0xec, 0xee}, {0x07, 0xa0}, },
++      { {0x05, 0x06}, {0x9b, 0xec}, {0xf5, 0x01}, {0x02, 0xe1}, {0xef, 0xe5},
++      {0xe9, 0xf2}, {0x03, 0x04}, },
++      { {0x06, 0x07}, {0x9b, 0xe9}, {0xf9, 0xf2}, {0xf5, 0x01}, {0x02, 0x03},
++      {0xec, 0xef}, {0xe1, 0x04}, {0xe8, 0x05}, },
++      { {0x05, 0x06}, {0xf9, 0xf2}, {0xf5, 0x9b}, {0xe5, 0xef}, {0x01, 0x02},
++      {0xe9, 0xe1}, {0x03, 0x04}, },
++      { {0x06, 0x07}, {0xe1, 0xe9}, {0xee, 0xf6}, {0xe4, 0xec}, {0xf3, 0x01},
++      {0x02, 0xf2}, {0x03, 0x04}, {0x9b, 0x05}, },
++      { {0x02, 0x03}, {0xe5, 0xec}, {0x9b, 0xef}, {0x01, 0xf2}, },
++      { {0x05, 0x06}, {0xf5, 0xef}, {0x9b, 0xec}, {0xe9, 0x01}, {0xe1, 0xf2},
++      {0x02, 0xe5}, {0x03, 0x04}, },
++      { {0x03, 0x04}, {0x9b, 0xe5}, {0xe9, 0xf5}, {0xe1, 0x01}, {0xef, 0x02}, },
++      { {0x04, 0x05}, {0xa0, 0xc9}, {0xf3, 0x9b}, {0xae, 0xf2}, {0x01, 0x02},
++      {0x03, 0xee}, },
++      { {0xef, 0x05}, {0x9b, 0xae}, {0xe9, 0xe5}, {0x01, 0xf5}, {0x02, 0xe1},
++      {0x03, 0x04}, },
++      { {0xe5, 0x03}, {0xe1, 0xe9}, {0xf2, 0x9b}, {0x01, 0x02}, },
++      { {0x03, 0x04}, {0x9b, 0xe9}, {0xf5, 0x01}, {0xe5, 0x02}, {0xef, 0xe1}, },
++      { {0xe1, 0x05}, {0x9b, 0xe3}, {0xef, 0x01}, {0xf5, 0xe5}, {0x02, 0x03},
++      {0xe9, 0x04}, },
++      { {0xe5, 0x03}, {0x9b, 0xe9}, {0x01, 0xe1}, {0xef, 0x02}, },
++      { {0x03, 0x04}, {0xa7, 0xee}, {0xec, 0xf2}, {0xf3, 0x01}, {0x9b, 0x02}, },
++      { {0xe1, 0x06}, {0x9b, 0xe8}, {0xe9, 0x01}, {0xf2, 0xec}, {0x02, 0xef},
++      {0x03, 0xe5}, {0x04, 0x05}, },
++      { {0x9b, 0x9b}, },
++      { {0x03, 0x04}, {0x9b, 0xae}, {0x01, 0xe9}, {0x02, 0xe1}, {0xe5, 0xef}, },
++      { {0x09, 0x0a}, {0xf6, 0xf9}, {0x01, 0xae}, {0xe3, 0xe9}, {0xf5, 0x9b},
++      {0xe5, 0xef}, {0x02, 0x03}, {0xe1, 0x04}, {0xe8, 0x05}, {0x06, 0xf4},
++      {0x07, 0x08}, },
++      { {0xe8, 0x07}, {0xe5, 0xf7}, {0xd6, 0xe1}, {0x9b, 0xe9}, {0xf2, 0x01},
++      {0x02, 0x03}, {0x04, 0xef}, {0x05, 0x06}, },
++      { {0xae, 0x01}, {0x9b, 0xee}, },
++      { {0xe9, 0x02}, {0xe5, 0x9b}, {0xa0, 0x01}, },
++      { {0x03, 0x04}, {0x9b, 0xe8}, {0xe5, 0xe1}, {0xef, 0x01}, {0xe9, 0x02}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0xef}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x18, 0x19}, {0xe8, 0xef}, {0xf8, 0x9b}, {0xa7, 0xf7}, {0xfa, 0x01},
++      {0x02, 0x03}, {0x04, 0xe5}, {0xae, 0x05}, {0xe6, 0xe2}, {0x06, 0xf6},
++      {0xeb, 0xf5}, {0xe9, 0x07}, {0xf0, 0xf9}, {0xe7, 0x08}, {0x09, 0xe4},
++      {0x0a, 0xe3}, {0x0b, 0xed}, {0x0c, 0xf3}, {0x0d, 0x0e}, {0x0f, 0xec},
++      {0x10, 0xf4}, {0x11, 0x12}, {0xf2, 0xa0}, {0x13, 0x14}, {0x15, 0xee},
++      {0x16, 0x17}, },
++      { {0x0b, 0x0c}, {0xe4, 0xf3}, {0x9b, 0xae}, {0xe2, 0x01}, {0x02, 0x03},
++      {0xec, 0xa0}, {0x04, 0xe9}, {0xf2, 0xf5}, {0x05, 0xf9}, {0xe1, 0x06},
++      {0xef, 0x07}, {0xe5, 0x08}, {0x09, 0x0a}, },
++      { {0x0f, 0x10}, {0xf1, 0xae}, {0xc4, 0xf9}, {0xac, 0x01}, {0xe3, 0x02},
++      {0x9b, 0xf2}, {0x03, 0x04}, {0xa0, 0xec}, {0xf5, 0x05}, {0x06, 0xe9},
++      {0x07, 0xeb}, {0x08, 0xf4}, {0x09, 0xe5}, {0x0a, 0xef}, {0xe1, 0xe8},
++      {0x0b, 0x0c}, {0x0d, 0x0e}, },
++      { {0x13, 0x14}, {0xa7, 0xbb}, {0xe6, 0xed}, {0xf7, 0xe7}, {0xf6, 0x01},
++      {0x02, 0x9b}, {0xee, 0x03}, {0x04, 0xec}, {0x05, 0xf5}, {0x06, 0xac},
++      {0xe4, 0xf9}, {0xf2, 0x07}, {0x08, 0x09}, {0xae, 0x0a}, {0xef, 0x0b},
++      {0xe1, 0xf3}, {0x0c, 0xe9}, {0x0d, 0x0e}, {0x0f, 0x10}, {0xe5, 0x11},
++      {0x12, 0xa0}, },
++      { {0x1d, 0x1e}, {0xa9, 0xe8}, {0xf5, 0x9b}, {0x01, 0xad}, {0xbb, 0xeb},
++      {0xfa, 0x02}, {0xa7, 0xe6}, {0xe2, 0xe7}, {0x03, 0x04}, {0x05, 0x06},
++      {0xe9, 0xf8}, {0x07, 0xac}, {0xef, 0xf0}, {0x08, 0xed}, {0xf6, 0xf9},
++      {0x09, 0xf7}, {0x0a, 0x0b}, {0xae, 0x0c}, {0xe3, 0x0d}, {0xe5, 0xf4},
++      {0x0e, 0x0f}, {0xe4, 0x10}, {0xec, 0x11}, {0xe1, 0x12}, {0x13, 0x14},
++      {0x15, 0x16}, {0xee, 0xf3}, {0x17, 0x18}, {0xf2, 0xa0}, {0x19, 0x1a},
++      {0x1b, 0x1c}, },
++      { {0x09, 0x0a}, {0xae, 0x9b}, {0xec, 0x01}, {0xf5, 0x02}, {0xf4, 0xe6},
++      {0x03, 0xe1}, {0xe5, 0xe9}, {0x04, 0xf2}, {0xef, 0x05}, {0x06, 0x07},
++      {0xa0, 0x08}, },
++      { {0x0e, 0x0f}, {0xad, 0xe7}, {0x9b, 0xa7}, {0xf9, 0x01}, {0xec, 0x02},
++      {0xac, 0xf2}, {0x03, 0xae}, {0xf3, 0xf5}, {0x04, 0x05}, {0xef, 0x06},
++      {0x07, 0xe9}, {0xe1, 0x08}, {0x09, 0xe8}, {0x0a, 0x0b}, {0xe5, 0x0c},
++      {0xa0, 0x0d}, },
++      { {0x0d, 0x0e}, {0xa7, 0xac}, {0xf3, 0xad}, {0x01, 0x02}, {0x9b, 0xf9},
++      {0xf5, 0xae}, {0x03, 0xee}, {0x04, 0xf2}, {0x05, 0x06}, {0xf4, 0x07},
++      {0x08, 0x09}, {0xef, 0xe1}, {0xa0, 0x0a}, {0xe9, 0x0b}, {0x0c, 0xe5}, },
++      { {0x14, 0x15}, {0xac, 0xe2}, {0xf8, 0x9b}, {0xae, 0xfa}, {0x01, 0xeb},
++      {0x02, 0xa0}, {0x03, 0x04}, {0xf0, 0x05}, {0x06, 0xe6}, {0xf6, 0x07},
++      {0xe4, 0xed}, {0xe7, 0x08}, {0xe1, 0xef}, {0xf2, 0x09}, {0x0a, 0x0b},
++      {0xec, 0x0c}, {0xe5, 0xe3}, {0x0d, 0xf4}, {0x0e, 0xf3}, {0x0f, 0x10},
++      {0x11, 0xee}, {0x12, 0x13}, },
++      { {0x03, 0xef}, {0x9b, 0xe1}, {0xe5, 0xf5}, {0x01, 0x02}, },
++      { {0x08, 0x09}, {0xec, 0xf9}, {0xa7, 0xee}, {0x01, 0xac}, {0x9b, 0xae},
++      {0x02, 0x03}, {0x04, 0xf3}, {0x05, 0xe9}, {0x06, 0xa0}, {0x07, 0xe5}, },
++      { {0x16, 0x17}, {0xa7, 0xad}, {0xee, 0xe3}, {0xeb, 0xf2}, {0x9b, 0xe2},
++      {0x01, 0x02}, {0xf5, 0x03}, {0xf4, 0xac}, {0x04, 0x05}, {0xe6, 0xed},
++      {0xf6, 0x06}, {0xae, 0xf0}, {0x07, 0x08}, {0xf3, 0x09}, {0x0a, 0xe4},
++      {0x0b, 0x0c}, {0xf9, 0x0d}, {0xef, 0x0e}, {0xe1, 0x0f}, {0x10, 0xe9},
++      {0xec, 0x11}, {0xa0, 0xe5}, {0x12, 0x13}, {0x14, 0x15}, },
++      { {0x0c, 0x0d}, {0xa7, 0xbb}, {0x9b, 0x01}, {0xf9, 0xae}, {0xe2, 0x02},
++      {0xed, 0xf3}, {0x03, 0xf5}, {0xef, 0xf0}, {0x04, 0x05}, {0xe9, 0x06},
++      {0x07, 0x08}, {0x09, 0xa0}, {0xe1, 0xe5}, {0x0a, 0x0b}, },
++      { {0x19, 0x1a}, {0xad, 0xbb}, {0xe2, 0xea}, {0xed, 0xf2}, {0xfa, 0xe6},
++      {0xec, 0x01}, {0x02, 0x03}, {0x9b, 0xf5}, {0x04, 0xa7}, {0xf6, 0xf9},
++      {0x05, 0x06}, {0xeb, 0xef}, {0x07, 0x08}, {0x09, 0x0a}, {0xac, 0x0b},
++      {0x0c, 0xe3}, {0xae, 0x0d}, {0xee, 0xe9}, {0x0e, 0xe1}, {0x0f, 0xf3},
++      {0x10, 0x11}, {0xf4, 0x12}, {0xe7, 0xe5}, {0x13, 0x14}, {0xe4, 0x15},
++      {0x16, 0x17}, {0xa0, 0x18}, },
++      { {0x1a, 0x1b}, {0xc2, 0x9b}, {0xad, 0xac}, {0xf8, 0x01}, {0xae, 0x02},
++      {0x03, 0xe5}, {0xe7, 0xe8}, {0xf9, 0xe9}, {0xeb, 0x04}, {0xe3, 0xe1},
++      {0x05, 0xf6}, {0x06, 0xe4}, {0x07, 0xe2}, {0xf0, 0x08}, {0x09, 0xf3},
++      {0xf4, 0xf7}, {0xef, 0x0a}, {0x0b, 0x0c}, {0x0d, 0xec}, {0x0e, 0x0f},
++      {0x10, 0xf5}, {0xed, 0x11}, {0xe6, 0xa0}, {0x12, 0xf2}, {0x13, 0x14},
++      {0x15, 0xee}, {0x16, 0x17}, {0x18, 0x19}, },
++      { {0x0e, 0x0f}, {0xad, 0xed}, {0xf9, 0x9b}, {0xae, 0x01}, {0xf3, 0x02},
++      {0x03, 0xf5}, {0xf4, 0xf0}, {0x04, 0xef}, {0x05, 0xe9}, {0x06, 0xe8},
++      {0xa0, 0xe1}, {0xec, 0x07}, {0xf2, 0x08}, {0xe5, 0x09}, {0x0a, 0x0b},
++      {0x0c, 0x0d}, },
++      { {0x9b, 0xf5}, },
++      { {0x19, 0x1a}, {0xa9, 0xbb}, {0xf6, 0xe6}, {0x01, 0x9b}, {0xad, 0xe2},
++      {0xf0, 0x02}, {0xa7, 0x03}, {0x04, 0x05}, {0xf5, 0xe3}, {0xac, 0xe7},
++      {0xf2, 0x06}, {0xeb, 0x07}, {0xec, 0xed}, {0xee, 0xf9}, {0x08, 0xae},
++      {0x09, 0x0a}, {0xe4, 0x0b}, {0x0c, 0xf4}, {0x0d, 0xf3}, {0x0e, 0x0f},
++      {0x10, 0xe1}, {0xef, 0x11}, {0xe9, 0x12}, {0x13, 0xe5}, {0x14, 0xa0},
++      {0x15, 0x16}, {0x17, 0x18}, },
++      { {0xa0, 0x16}, {0xa2, 0xa7}, {0xe2, 0xeb}, {0xed, 0xee}, {0x9b, 0xf7},
++      {0x01, 0x02}, {0x03, 0xbb}, {0xf9, 0xf0}, {0x04, 0x05}, {0xec, 0x06},
++      {0x07, 0x08}, {0xf5, 0xe1}, {0x09, 0xac}, {0xe3, 0x0a}, {0xe8, 0x0b},
++      {0xe9, 0x0c}, {0xef, 0xf3}, {0xae, 0x0d}, {0x0e, 0xe5}, {0x0f, 0x10},
++      {0x11, 0xf4}, {0x12, 0x13}, {0x14, 0x15}, },
++      { {0x14, 0x15}, {0xbb, 0xe2}, {0xad, 0xed}, {0x01, 0x9b}, {0xa7, 0xe3},
++      {0xac, 0xec}, {0xee, 0x02}, {0xf7, 0x03}, {0x04, 0xf9}, {0x05, 0x06},
++      {0x07, 0x08}, {0xf4, 0xae}, {0xf5, 0x09}, {0x0a, 0xf2}, {0xe1, 0xf3},
++      {0x0b, 0x0c}, {0x0d, 0xe9}, {0x0e, 0x0f}, {0xef, 0xe5}, {0x10, 0xa0},
++      {0xe8, 0x11}, {0x12, 0x13}, },
++      { {0x11, 0x12}, {0xef, 0xf6}, {0x9b, 0xeb}, {0xf9, 0x01}, {0xa0, 0xe2},
++      {0x02, 0xe1}, {0x03, 0xed}, {0x04, 0xe3}, {0xe9, 0x05}, {0xe4, 0xe5},
++      {0xe7, 0x06}, {0xec, 0xf0}, {0x07, 0x08}, {0x09, 0x0a}, {0x0b, 0xf3},
++      {0x0c, 0xf4}, {0xee, 0x0d}, {0xf2, 0x0e}, {0x0f, 0x10}, },
++      { {0x05, 0xe5}, {0xf3, 0xf9}, {0x9b, 0x01}, {0xef, 0x02}, {0x03, 0xe1},
++      {0x04, 0xe9}, },
++      { {0x0a, 0x0b}, {0xae, 0x9b}, {0xec, 0xed}, {0x01, 0x02}, {0xf3, 0xee},
++      {0xf2, 0x03}, {0xe5, 0x04}, {0xe8, 0xa0}, {0xe1, 0x05}, {0xef, 0x06},
++      {0x07, 0x08}, {0xe9, 0x09}, },
++      { {0x05, 0x06}, {0xa0, 0xac}, {0xad, 0xf4}, {0xe9, 0x01}, {0x02, 0xe1},
++      {0xe5, 0x03}, {0x9b, 0x04}, },
++      { {0x11, 0xa0}, {0xbf, 0xe1}, {0xe2, 0xe6}, {0xed, 0xe4}, {0xe9, 0xf7},
++      {0xa7, 0x01}, {0x02, 0xbb}, {0x03, 0x04}, {0xec, 0x05}, {0x9b, 0xee},
++      {0x06, 0xef}, {0x07, 0xac}, {0xe5, 0xf3}, {0x08, 0x09}, {0x0a, 0xae},
++      {0x0b, 0x0c}, {0x0d, 0x0e}, {0x0f, 0x10}, },
++      { {0x06, 0x07}, {0xa0, 0xae}, {0xe1, 0xe5}, {0xec, 0xfa}, {0x9b, 0xef},
++      {0xe9, 0x01}, {0x02, 0x03}, {0x04, 0x05}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++};
++
++static struct hufftree_entry program_title_hufftree[][128] = {
++      { {0x1b, 0x1c}, {0xb4, 0xa4}, {0xb2, 0xb7}, {0xda, 0x01}, {0xd1, 0x02},
++      {0x03, 0x9b}, {0x04, 0xd5}, {0xd9, 0x05}, {0xcb, 0xd6}, {0x06, 0xcf},
++      {0x07, 0x08}, {0xca, 0x09}, {0xc9, 0xc5}, {0xc6, 0x0a}, {0xd2, 0xc4},
++      {0xc7, 0xcc}, {0xd0, 0xc8}, {0xd7, 0xce}, {0x0b, 0xc1}, {0x0c, 0xc2},
++      {0xcd, 0xc3}, {0x0d, 0x0e}, {0x0f, 0x10}, {0xd3, 0x11}, {0xd4, 0x12},
++      {0x13, 0x14}, {0x15, 0x16}, {0x17, 0x18}, {0x19, 0x1a}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x29, 0x2a}, {0xd8, 0xe5}, {0xb9, 0x01}, {0xa7, 0xb1}, {0xec, 0xd1},
++      {0x02, 0xad}, {0xb2, 0xda}, {0xe3, 0xb3}, {0x03, 0xe4}, {0xe6, 0x04},
++      {0x9b, 0xe2}, {0x05, 0x06}, {0x07, 0x08}, {0x09, 0xd5}, {0x0a, 0xd6},
++      {0x0b, 0xd9}, {0x0c, 0xa6}, {0xe9, 0xcb}, {0xc5, 0xcf}, {0x0d, 0x0e},
++      {0xca, 0xc9}, {0x0f, 0xc7}, {0x10, 0x11}, {0xe1, 0x12}, {0x13, 0xc6},
++      {0xd2, 0xc8}, {0xce, 0xc1}, {0xc4, 0xd0}, {0xcc, 0x14}, {0x15, 0xef},
++      {0xc2, 0xd7}, {0x16, 0xcd}, {0x17, 0xf4}, {0xd4, 0x18}, {0x19, 0x1a},
++      {0xc3, 0xd3}, {0x1b, 0x1c}, {0x1d, 0x1e}, {0x1f, 0x20}, {0x21, 0x22},
++      {0x23, 0x24}, {0x25, 0x26}, {0x27, 0x28}, },
++      { {0x01, 0x80}, {0xa0, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0xb1, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0xa0}, },
++      { {0x04, 0xf3}, {0xe4, 0xb9}, {0x01, 0xf4}, {0xa0, 0x9b}, {0x02, 0x03}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x01, 0x02}, {0x9b, 0xc1}, {0xc8, 0xd3}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0xa0}, },
++      { {0x07, 0x08}, {0xb1, 0xd2}, {0xd3, 0xd4}, {0xd5, 0xad}, {0xcd, 0xc1},
++      {0x01, 0x02}, {0x03, 0xa0}, {0x04, 0x9b}, {0x05, 0x06}, },
++      { {0xa0, 0x05}, {0xc9, 0xd7}, {0xd3, 0x01}, {0x02, 0x9b}, {0xae, 0x80},
++      {0x03, 0x04}, },
++      { {0x9b, 0x9b}, },
++      { {0x02, 0x03}, {0xad, 0x9b}, {0x01, 0x80}, {0xa0, 0xb0}, },
++      { {0x04, 0x05}, {0x80, 0x9b}, {0xb1, 0xb2}, {0xa0, 0xb0}, {0xb9, 0x01},
++      {0x02, 0x03}, },
++      { {0x02, 0x03}, {0xb1, 0xba}, {0x01, 0xb0}, {0x9b, 0x80}, },
++      { {0x80, 0x01}, {0xb0, 0x9b}, },
++      { {0x9b, 0xb8}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0xb0}, },
++      { {0x9b, 0xa0}, },
++      { {0x02, 0x03}, {0xb1, 0xb3}, {0xb9, 0xb0}, {0x01, 0x9b}, },
++      { {0x9b, 0xa0}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x80}, },
++      { {0x9b, 0x9b}, },
++      { {0x13, 0x14}, {0xaa, 0xad}, {0xae, 0xf6}, {0xe7, 0xf4}, {0xe2, 0xe9},
++      {0x01, 0x02}, {0xc2, 0xf0}, {0x9b, 0xf3}, {0xe3, 0xe6}, {0xf7, 0x03},
++      {0xf5, 0x04}, {0x05, 0x06}, {0xf2, 0x07}, {0x08, 0x09}, {0x0a, 0x0b},
++      {0x0c, 0xe4}, {0xa0, 0x0d}, {0xec, 0xee}, {0x0e, 0xed}, {0x0f, 0x10},
++      {0x11, 0x12}, },
++      { {0x08, 0x09}, {0xc1, 0xd3}, {0x9b, 0x01}, {0xc3, 0x02}, {0xe9, 0xec},
++      {0x03, 0xf2}, {0xf5, 0x04}, {0xef, 0xe1}, {0x05, 0xe5}, {0x06, 0x07}, },
++      { {0x0b, 0x0c}, {0xc1, 0xf9}, {0x01, 0xc2}, {0xcf, 0xe5}, {0xf5, 0x9b},
++      {0xe9, 0x02}, {0xa0, 0x03}, {0x04, 0x05}, {0xf2, 0x06}, {0xec, 0x07},
++      {0xe1, 0x08}, {0x09, 0xe8}, {0x0a, 0xef}, },
++      { {0x05, 0x06}, {0xf9, 0x9b}, {0x01, 0xf5}, {0x02, 0xf2}, {0xe9, 0xe5},
++      {0xef, 0x03}, {0xe1, 0x04}, },
++      { {0x0a, 0x0b}, {0xf1, 0xf5}, {0xf3, 0x01}, {0xed, 0xf9}, {0xc3, 0x02},
++      {0xec, 0xee}, {0xe4, 0xf8}, {0x03, 0x9b}, {0xf6, 0x04}, {0x05, 0xe1},
++      {0x06, 0x07}, {0x08, 0x09}, },
++      { {0x07, 0x08}, {0xa0, 0x9b}, {0xcc, 0x01}, {0xe5, 0x02}, {0xec, 0xf5},
++      {0xef, 0x03}, {0xe9, 0xf2}, {0x04, 0x05}, {0xe1, 0x06}, },
++      { {0x09, 0x0a}, {0xae, 0xec}, {0xf9, 0xc1}, {0xe8, 0x01}, {0x9b, 0x02},
++      {0x03, 0x04}, {0xe1, 0xf5}, {0xe9, 0x05}, {0xe5, 0x06}, {0xf2, 0xef},
++      {0x07, 0x08}, },
++      { {0xef, 0x05}, {0x80, 0x9b}, {0xf5, 0x01}, {0x02, 0xe9}, {0xe1, 0x03},
++      {0xe5, 0x04}, },
++      { {0xee, 0x0b}, {0xba, 0xd4}, {0xae, 0xf2}, {0xe3, 0x01}, {0xa0, 0x02},
++      {0x80, 0x9b}, {0xed, 0x03}, {0xc9, 0xf3}, {0xf4, 0x04}, {0x05, 0x06},
++      {0x07, 0x08}, {0x09, 0x0a}, },
++      { {0x02, 0x03}, {0x9b, 0xf5}, {0x01, 0xe1}, {0xef, 0xe5}, },
++      { {0x05, 0xe9}, {0xe1, 0xef}, {0xf5, 0xee}, {0x9b, 0xe5}, {0x01, 0x02},
++      {0x03, 0x04}, },
++      { {0x04, 0x05}, {0xa0, 0x9b}, {0x01, 0xf5}, {0x02, 0xe5}, {0xef, 0x03},
++      {0xe1, 0xe9}, },
++      { {0x08, 0x09}, {0xaa, 0xd4}, {0x01, 0x9b}, {0xe3, 0x02}, {0xf2, 0x03},
++      {0xe5, 0x04}, {0xf5, 0xf9}, {0xe9, 0x05}, {0xef, 0x06}, {0x07, 0xe1}, },
++      { {0xe5, 0x08}, {0xce, 0xa0}, {0xc6, 0xf5}, {0x01, 0x02}, {0x9b, 0xc2},
++      {0x03, 0xe1}, {0x04, 0xef}, {0x05, 0xe9}, {0x06, 0x07}, },
++      { {0x09, 0x0a}, {0xe4, 0xf3}, {0xe6, 0xf6}, {0xf7, 0xf0}, {0xf2, 0x01},
++      {0xec, 0x02}, {0x03, 0xa0}, {0x9b, 0x04}, {0x05, 0xf5}, {0x06, 0x07},
++      {0xee, 0x08}, },
++      { {0x0b, 0x0c}, {0xa0, 0xf3}, {0xf9, 0xae}, {0xd2, 0xc7}, {0x01, 0x9b},
++      {0x02, 0xf5}, {0x03, 0x04}, {0x05, 0xe9}, {0xec, 0x06}, {0xe5, 0x07},
++      {0xef, 0x08}, {0xe1, 0x09}, {0xf2, 0x0a}, },
++      { {0x01, 0xf5}, {0x9b, 0xd6}, },
++      { {0x04, 0x05}, {0xe8, 0x9b}, {0x01, 0xf5}, {0x02, 0xe1}, {0xe9, 0xef},
++      {0x03, 0xe5}, },
++      { {0x10, 0x11}, {0xaa, 0xec}, {0xf1, 0xae}, {0xa0, 0xf7}, {0xed, 0xee},
++      {0x01, 0x02}, {0x9b, 0xeb}, {0x03, 0x04}, {0x05, 0x06}, {0xe3, 0x07},
++      {0xef, 0x08}, {0xe9, 0xf5}, {0x09, 0xe1}, {0xe5, 0xf0}, {0xe8, 0x0a},
++      {0x0b, 0x0c}, {0x0d, 0xf4}, {0x0e, 0x0f}, },
++      { {0xe8, 0x0a}, {0xad, 0xce}, {0x9b, 0x01}, {0xd6, 0x02}, {0xf5, 0xf7},
++      {0x03, 0x04}, {0xe1, 0xe5}, {0xe9, 0x05}, {0xf2, 0x06}, {0xef, 0x07},
++      {0x08, 0x09}, },
++      { {0xee, 0x03}, {0xec, 0xae}, {0x01, 0x9b}, {0x02, 0xf0}, },
++      { {0x06, 0xe9}, {0xa0, 0xc3}, {0xef, 0x9b}, {0xe5, 0x01}, {0x80, 0x02},
++      {0x03, 0xe1}, {0x04, 0x05}, },
++      { {0x06, 0x07}, {0xc6, 0xd7}, {0x01, 0x9b}, {0xf2, 0x02}, {0x03, 0xe8},
++      {0xe5, 0xe1}, {0x04, 0xe9}, {0xef, 0x05}, },
++      { {0x9b, 0x9b}, },
++      { {0x02, 0xef}, {0xe1, 0x9b}, {0x01, 0xe5}, },
++      { {0x01, 0xef}, {0x9b, 0xe1}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x19, 0x1a}, {0x9b, 0xba}, {0xe5, 0xea}, {0xf8, 0x01}, {0x02, 0xe6},
++      {0xa7, 0x03}, {0xfa, 0xe8}, {0x04, 0xf7}, {0x05, 0xf5}, {0xe2, 0x06},
++      {0xeb, 0x07}, {0xf0, 0x08}, {0x80, 0xf6}, {0xe7, 0x09}, {0xe4, 0x0a},
++      {0xa0, 0xe9}, {0x0b, 0xe3}, {0xf9, 0x0c}, {0x0d, 0xed}, {0x0e, 0x0f},
++      {0xf3, 0x10}, {0x11, 0xec}, {0x12, 0xf4}, {0xf2, 0x13}, {0xee, 0x14},
++      {0x15, 0x16}, {0x17, 0x18}, },
++      { {0x0a, 0x0b}, {0xf3, 0x9b}, {0xf5, 0xe2}, {0x01, 0x80}, {0xa0, 0x02},
++      {0xe5, 0xf2}, {0xe9, 0x03}, {0xec, 0x04}, {0xf9, 0x05}, {0xef, 0x06},
++      {0xe1, 0x07}, {0x08, 0x09}, },
++      { {0x10, 0x11}, {0xc3, 0xcc}, {0xc7, 0x9b}, {0xe3, 0x01}, {0x80, 0xec},
++      {0xf9, 0x02}, {0xf3, 0x03}, {0xf5, 0x04}, {0x05, 0xf2}, {0x06, 0xe9},
++      {0xa0, 0x07}, {0x08, 0xef}, {0xf4, 0x09}, {0x0a, 0xe1}, {0x0b, 0xe8},
++      {0xeb, 0xe5}, {0x0c, 0x0d}, {0x0e, 0x0f}, },
++      { {0x0e, 0x0f}, {0xae, 0xf5}, {0xf7, 0x01}, {0xec, 0x02}, {0xe4, 0xe7},
++      {0xf2, 0x03}, {0x9b, 0xef}, {0x04, 0xf6}, {0x05, 0x06}, {0xf9, 0xf3},
++      {0x07, 0xe9}, {0xe1, 0x08}, {0x09, 0x80}, {0x0a, 0x0b}, {0xe5, 0x0c},
++      {0x0d, 0xa0}, },
++      { {0x1e, 0x1f}, {0x9b, 0xa1}, {0xad, 0xe8}, {0xea, 0xf1}, {0xf5, 0xfa},
++      {0x01, 0x02}, {0x03, 0x04}, {0xba, 0xf8}, {0xa7, 0xe2}, {0xe9, 0x05},
++      {0x06, 0x07}, {0xe6, 0xed}, {0xe7, 0xeb}, {0x08, 0x09}, {0xf6, 0xf0},
++      {0x0a, 0xef}, {0x0b, 0xe3}, {0x0c, 0x0d}, {0x0e, 0xf9}, {0x0f, 0xe4},
++      {0xec, 0x10}, {0xe5, 0x11}, {0xf4, 0xf7}, {0x12, 0x13}, {0xe1, 0x14},
++      {0x15, 0x16}, {0xee, 0xf3}, {0x17, 0x80}, {0x18, 0x19}, {0xf2, 0x1a},
++      {0x1b, 0xa0}, {0x1c, 0x1d}, },
++      { {0xa0, 0x0b}, {0xf5, 0x9b}, {0x01, 0xec}, {0xf3, 0xf2}, {0x80, 0xe1},
++      {0x02, 0x03}, {0xf4, 0xe9}, {0xef, 0xe6}, {0x04, 0x05}, {0x06, 0x07},
++      {0xe5, 0x08}, {0x09, 0x0a}, },
++      { {0x0f, 0x10}, {0xba, 0xf9}, {0xa7, 0xf4}, {0x9b, 0x01}, {0xe7, 0xec},
++      {0x02, 0xee}, {0x03, 0xef}, {0xf5, 0x04}, {0xf2, 0x05}, {0x06, 0xe9},
++      {0x07, 0xf3}, {0xe1, 0x08}, {0x09, 0x0a}, {0x0b, 0xe5}, {0x80, 0x0c},
++      {0xe8, 0xa0}, {0x0d, 0x0e}, },
++      { {0xe5, 0x0d}, {0xe2, 0xf5}, {0xf7, 0x9b}, {0xec, 0x01}, {0xf9, 0xee},
++      {0x02, 0x03}, {0x04, 0xf2}, {0x05, 0x80}, {0x06, 0xa0}, {0xe1, 0xef},
++      {0x07, 0xf4}, {0xe9, 0x08}, {0x09, 0x0a}, {0x0b, 0x0c}, },
++      { {0x15, 0x16}, {0xa1, 0xf8}, {0xe9, 0xeb}, {0x01, 0x80}, {0x9b, 0xfa},
++      {0xe2, 0x02}, {0x03, 0x04}, {0xa0, 0xf0}, {0x05, 0x06}, {0x07, 0xe1},
++      {0x08, 0xe6}, {0xf2, 0xed}, {0xf6, 0x09}, {0xe4, 0x0a}, {0xef, 0xf4},
++      {0xec, 0xf3}, {0xe7, 0xe5}, {0x0b, 0xe3}, {0x0c, 0x0d}, {0x0e, 0x0f},
++      {0x10, 0x11}, {0x12, 0x13}, {0xee, 0x14}, },
++      { {0xef, 0x01}, {0x9b, 0xe1}, },
++      { {0x0b, 0x0c}, {0xd4, 0xef}, {0xe6, 0xec}, {0xf7, 0xe1}, {0x01, 0xba},
++      {0x02, 0x9b}, {0xf9, 0x03}, {0x04, 0x05}, {0xf3, 0x06}, {0x07, 0x08},
++      {0xe9, 0xa0}, {0x09, 0x80}, {0xe5, 0x0a}, },
++      { {0x15, 0x16}, {0xa7, 0xba}, {0xe3, 0xf7}, {0xf2, 0xad}, {0xe2, 0x01},
++      {0x02, 0x9b}, {0xe6, 0x03}, {0xed, 0xf6}, {0x04, 0xeb}, {0x05, 0xf4},
++      {0x06, 0x07}, {0x08, 0xf3}, {0x09, 0xf5}, {0x0a, 0xef}, {0x0b, 0x0c},
++      {0x80, 0xf9}, {0xe1, 0x0d}, {0xe4, 0xe9}, {0xa0, 0x0e}, {0x0f, 0xec},
++      {0xe5, 0x10}, {0x11, 0x12}, {0x13, 0x14}, },
++      { {0x0a, 0x0b}, {0xf9, 0x9b}, {0xf5, 0xf3}, {0x01, 0x02}, {0xe2, 0xed},
++      {0x80, 0x03}, {0xf0, 0xef}, {0x04, 0xa0}, {0x05, 0xe9}, {0x06, 0xe1},
++      {0x07, 0x08}, {0x09, 0xe5}, },
++      { {0x18, 0x19}, {0xe2, 0xea}, {0xf2, 0xe8}, {0xec, 0xed}, {0xfa, 0x9b},
++      {0x01, 0xf5}, {0x02, 0x03}, {0xf6, 0x04}, {0xba, 0xe6}, {0x05, 0x06},
++      {0xeb, 0xef}, {0x07, 0xa7}, {0xf9, 0x08}, {0x09, 0x0a}, {0x0b, 0xe3},
++      {0x0c, 0xee}, {0xe1, 0x0d}, {0xf3, 0x0e}, {0xe9, 0x0f}, {0x10, 0xf4},
++      {0x80, 0xe4}, {0xe5, 0x11}, {0x12, 0xe7}, {0xa0, 0x13}, {0x14, 0x15},
++      {0x16, 0x17}, },
++      { {0x1b, 0x1c}, {0xae, 0xfa}, {0xbf, 0x01}, {0xa7, 0x9b}, {0x02, 0xe9},
++      {0xf8, 0xf9}, {0x03, 0xe5}, {0xe8, 0x04}, {0xe1, 0xeb}, {0x05, 0xe2},
++      {0x06, 0x07}, {0xe3, 0x08}, {0xe7, 0xf4}, {0x09, 0x80}, {0xf6, 0xf0},
++      {0x0a, 0xe4}, {0x0b, 0xf3}, {0xf7, 0x0c}, {0x0d, 0xef}, {0xec, 0xa0},
++      {0x0e, 0x0f}, {0xed, 0xe6}, {0x10, 0xf5}, {0x11, 0x12}, {0x13, 0x14},
++      {0x15, 0xf2}, {0x16, 0xee}, {0x17, 0x18}, {0x19, 0x1a}, },
++      { {0x0e, 0x0f}, {0xed, 0xa7}, {0x9b, 0xe4}, {0x01, 0xf9}, {0xf3, 0xf2},
++      {0xf4, 0x02}, {0xe8, 0x03}, {0xec, 0xf0}, {0x04, 0xe1}, {0xe9, 0x05},
++      {0x06, 0x80}, {0xa0, 0x07}, {0x08, 0x09}, {0x0a, 0xe5}, {0xef, 0x0b},
++      {0x0c, 0x0d}, },
++      { {0x9b, 0xf5}, },
++      { {0x18, 0x19}, {0xba, 0xac}, {0xf6, 0x9b}, {0xf0, 0xe2}, {0x01, 0xe6},
++      {0x02, 0xa7}, {0xae, 0xe7}, {0x03, 0xe3}, {0xf5, 0x04}, {0xed, 0x05},
++      {0x06, 0x07}, {0xeb, 0x08}, {0x09, 0xee}, {0xf2, 0x0a}, {0xe4, 0x0b},
++      {0xf9, 0xec}, {0x0c, 0x0d}, {0xf4, 0x80}, {0x0e, 0xef}, {0xf3, 0xa0},
++      {0xe1, 0x0f}, {0xe9, 0x10}, {0x11, 0xe5}, {0x12, 0x13}, {0x14, 0x15},
++      {0x16, 0x17}, },
++      { {0x19, 0x1a}, {0xa7, 0xac}, {0xbf, 0xc3}, {0xc8, 0xe4}, {0xe6, 0xed},
++      {0xf2, 0xae}, {0xec, 0xee}, {0xf9, 0x01}, {0x02, 0x03}, {0x04, 0xba},
++      {0x05, 0x9b}, {0xf5, 0x06}, {0x07, 0x08}, {0x09, 0xeb}, {0xf0, 0x0a},
++      {0x0b, 0x0c}, {0xe1, 0xe3}, {0x0d, 0xe8}, {0x0e, 0x0f}, {0xef, 0x10},
++      {0x11, 0xf3}, {0x12, 0xe9}, {0x13, 0xe5}, {0x14, 0x15}, {0xf4, 0x16},
++      {0x17, 0xa0}, {0x18, 0x80}, },
++      { {0x14, 0x15}, {0xba, 0xbf}, {0xe4, 0xf7}, {0x9b, 0xa7}, {0x01, 0xee},
++      {0x02, 0x03}, {0x04, 0xe3}, {0xe2, 0xed}, {0x05, 0xf9}, {0x06, 0xf4},
++      {0x07, 0xec}, {0x08, 0xf5}, {0xf2, 0x09}, {0xe1, 0xf3}, {0x0a, 0xef},
++      {0x0b, 0x0c}, {0x0d, 0xe9}, {0x80, 0xe5}, {0x0e, 0xa0}, {0x0f, 0xe8},
++      {0x10, 0x11}, {0x12, 0x13}, },
++      { {0x11, 0x12}, {0xeb, 0xfa}, {0x80, 0xe6}, {0x9b, 0x01}, {0xa0, 0x02},
++      {0x03, 0xe9}, {0xe1, 0x04}, {0xe4, 0xf0}, {0xed, 0xe2}, {0xe3, 0xe7},
++      {0xec, 0x05}, {0xe5, 0x06}, {0x07, 0x08}, {0x09, 0xf4}, {0x0a, 0x0b},
++      {0x0c, 0xf3}, {0xee, 0x0d}, {0x0e, 0xf2}, {0x0f, 0x10}, },
++      { {0x04, 0xe5}, {0xf3, 0xef}, {0x9b, 0x01}, {0xe1, 0x02}, {0x03, 0xe9}, },
++      { {0x0b, 0x0c}, {0xa7, 0xe2}, {0xec, 0xe3}, {0xf2, 0x01}, {0x9b, 0x02},
++      {0x03, 0x04}, {0xe9, 0xef}, {0xee, 0xe5}, {0xe1, 0x80}, {0x05, 0xa0},
++      {0x06, 0x07}, {0x08, 0x09}, {0xf3, 0x0a}, },
++      { {0x05, 0x06}, {0x9b, 0xa0}, {0xe1, 0xe5}, {0xe9, 0x01}, {0x80, 0xf0},
++      {0x02, 0xf4}, {0x03, 0x04}, },
++      { {0xa0, 0x13}, {0xe3, 0xad}, {0xe4, 0xe9}, {0xee, 0xef}, {0xf0, 0xf4},
++      {0xf6, 0xa1}, {0xe1, 0xed}, {0x01, 0xe2}, {0x02, 0x03}, {0x04, 0xa7},
++      {0x05, 0x06}, {0xf7, 0x07}, {0x9b, 0xec}, {0x08, 0xe5}, {0x09, 0x0a},
++      {0x0b, 0x0c}, {0x0d, 0x0e}, {0xf3, 0x0f}, {0x10, 0x11}, {0x80, 0x12}, },
++      { {0x05, 0x06}, {0xe5, 0xfa}, {0xa0, 0xf9}, {0x9b, 0x01}, {0x80, 0xe9},
++      {0x02, 0xe1}, {0x03, 0x04}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++      { {0x9b, 0x9b}, },
++};
++
++
++
++static inline void huffbuff_init(struct huffbuff *hbuf, uint8_t *buf, uint32_t buf_len)
++{
++      memset(hbuf, 0, sizeof(struct huffbuff));
++      hbuf->buf = buf;
++      hbuf->buf_len = buf_len;
++}
++
++static inline int huffbuff_bits(struct huffbuff *hbuf, uint8_t nbits)
++{
++      uint8_t result = 0;
++
++      if (nbits > 8)
++              return -1;
++
++      while(nbits--) {
++              if (hbuf->cur_byte >= hbuf->buf_len) {
++                      return -1;
++              }
++
++              result <<= 1;
++              if (hbuf->buf[hbuf->cur_byte] & (0x80 >> hbuf->cur_bit))
++                      result |= 1;
++
++              if (++hbuf->cur_bit > 7) {
++                      hbuf->cur_byte++;
++                      hbuf->cur_bit = 0;
++              }
++      }
++
++      return result;
++}
++
++static inline int append_unicode_char(uint8_t **destbuf, size_t *destbuflen, size_t *destbufpos,
++                                    uint32_t c)
++{
++      uint8_t tmp[3];
++      int tmplen = 0;
++
++      // encode the unicode character first of all
++      if (c < 0x80) {
++              tmp[0] = c;
++              tmplen = 1;
++      } else if (c < 0x800) {
++              tmp[0] = 0xc0 | ((c >> 6) & 0x1f);
++              tmp[1] = 0x80 | (c & 0x3f);
++              tmplen = 2;
++      } else if (c < 0x10000) {
++              tmp[0] = 0xe0 | ((c >> 12) & 0x0f);
++              tmp[1] = 0x80 | ((c >> 6) & 0x3f);
++              tmp[2] = 0x80 | (c & 0x3f);
++              tmplen = 3;
++      } else {
++              return -1;
++      }
++
++      // do we have enough buffer space?
++      if ((*destbufpos + tmplen) >= *destbuflen) {
++              uint8_t *new_dest = realloc(*destbuf, *destbuflen + DEST_ALLOC_DELTA);
++              if (new_dest == NULL)
++                      return -ENOMEM;
++              *destbuf = new_dest;
++              *destbuflen += DEST_ALLOC_DELTA;
++      }
++
++      // copy it into position
++      memcpy(*destbuf + *destbufpos, tmp, tmplen);
++      *destbufpos += tmplen;
++
++      return 0;
++}
++
++static inline int unicode_decode(uint8_t *srcbuf, size_t srcbuflen, int mode,
++                               uint8_t **destbuf, size_t *destbuflen, size_t *destbufpos)
++{
++      size_t i;
++      uint32_t msb = mode << 8;
++
++      for(i=0; i< srcbuflen; i++) {
++              if (append_unicode_char(destbuf, destbuflen, destbufpos, msb + srcbuf[i]))
++                      return -1;
++      }
++
++      return *destbufpos;
++}
++
++static int huffman_decode_uncompressed(struct huffbuff *hbuf,
++                                     uint8_t **destbuf, size_t *destbuflen, size_t *destbufpos)
++{
++      int c;
++
++      while(hbuf->cur_byte < hbuf->buf_len) {
++              // get next byte
++              if ((c = huffbuff_bits(hbuf, 8)) < 0)
++                      return -1;
++
++              switch(c) {
++              case HUFFSTRING_END:
++                      return 0;
++
++              case HUFFSTRING_ESCAPE:
++                      return HUFFSTRING_ESCAPE;
++
++              default:
++                      if (append_unicode_char(destbuf, destbuflen, destbufpos, c))
++                              return -1;
++
++                      // if it is 7 bit, we swap back to the compressed context
++                      if ((c & 0x80) == 0)
++                              return c;
++
++                      // characters following an 8 bit uncompressed char are uncompressed as well
++                      break;
++              }
++      }
++
++      // ran out of string; pretend we saw an end of string char
++      return HUFFSTRING_END;
++}
++
++static int huffman_decode(uint8_t *src, size_t srclen,
++                        uint8_t **destbuf, size_t *destbuflen, size_t *destbufpos,
++                        struct hufftree_entry hufftree[][128])
++{
++      struct huffbuff hbuf;
++      int bit;
++      struct hufftree_entry *tree = hufftree[0];
++      uint8_t treeidx = 0;
++      uint8_t treeval;
++      int tmp;
++
++      huffbuff_init(&hbuf, src, srclen);
++
++      while(hbuf.cur_byte < hbuf.buf_len) {
++              // get the next bit
++              if ((bit = huffbuff_bits(&hbuf, 1)) < 0)
++                      return *destbufpos;
++
++              if (!bit) {
++                      treeval = tree[treeidx].left_idx;
++              } else {
++                      treeval = tree[treeidx].right_idx;
++              }
++
++              if (treeval & HUFFTREE_LITERAL_MASK) {
++                      switch(treeval & ~HUFFTREE_LITERAL_MASK) {
++                      case HUFFSTRING_END:
++                              return 0;
++
++                      case HUFFSTRING_ESCAPE:
++                              if ((tmp =
++                                      huffman_decode_uncompressed(&hbuf,
++                                                      destbuf, destbuflen, destbufpos)) < 0)
++                                      return tmp;
++                              if (tmp == 0)
++                                      return *destbufpos;
++
++                              tree = hufftree[tmp];
++                              treeidx = 0;
++                              break;
++
++                      default:
++                              // stash it
++                              if (append_unicode_char(destbuf, destbuflen, destbufpos,
++                                                      treeval & ~HUFFTREE_LITERAL_MASK))
++                                      return -1;
++                              tree = hufftree[treeval & ~HUFFTREE_LITERAL_MASK];
++                              treeidx = 0;
++                              break;
++                      }
++              } else {
++                      treeidx = treeval;
++              }
++      }
++
++      return *destbufpos;
++}
++
++int atsc_text_segment_decode(struct atsc_text_string_segment *segment,
++                           uint8_t **destbuf, size_t *destbufsize, size_t *destbufpos)
++{
++      if (segment->mode > ATSC_TEXT_SEGMENT_MODE_UNICODE_RANGE_MAX)
++              return -1;
++
++      // mode==0 MUST be used for compressed text
++      if ((segment->mode) && (segment->compression_type))
++              return -1;
++
++      uint8_t *buf = atsc_text_string_segment_bytes(segment);
++
++      switch(segment->compression_type) {
++      case ATSC_TEXT_COMPRESS_NONE:
++              return unicode_decode(buf, segment->number_bytes, segment->mode,
++                                    destbuf, destbufsize, destbufpos);
++
++      case ATSC_TEXT_COMPRESS_PROGRAM_TITLE:
++              return huffman_decode(buf, segment->number_bytes,
++                                    destbuf, destbufsize, destbufpos,
++                                    program_title_hufftree);
++
++      case ATSC_TEXT_COMPRESS_PROGRAM_DESCRIPTION:
++              return huffman_decode(buf, segment->number_bytes,
++                                    destbuf, destbufsize, destbufpos,
++                                    program_description_hufftree);
++      }
++
++      return -1;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/caption_service_descriptor.h dvb-apps/lib/libucsi/atsc/caption_service_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/caption_service_descriptor.h       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/caption_service_descriptor.h     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,137 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_ATSC_CAPTION_SERVICE_DESCRIPTOR
++#define _UCSI_ATSC_CAPTION_SERVICE_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++#include <libucsi/types.h>
++
++/**
++ * atsc_caption_service_descriptor structure.
++ */
++struct atsc_caption_service_descriptor {
++      struct descriptor d;
++
++  EBIT2(uint8_t reserved              : 3; ,
++      uint8_t number_of_services      : 5; );
++      /* struct atsc_caption_service_entry entries[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the entries field of a atsc_caption_service_descriptor.
++ */
++struct atsc_caption_service_entry {
++      iso639lang_t language_code;
++  EBIT3(uint8_t digital_cc            : 1; ,
++      uint8_t reserved                : 1; ,
++      uint8_t value                   : 6; );
++  EBIT3(uint16_t easy_reader          : 1; ,
++      uint16_t wide_aspect_ratio      : 1; ,
++      uint16_t reserved1              :14; );
++} __ucsi_packed;
++
++/**
++ * Process an atsc_caption_service_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return atsc_caption_service_descriptor pointer, or NULL on error.
++ */
++static inline struct atsc_caption_service_descriptor*
++      atsc_caption_service_descriptor_codec(struct descriptor* d)
++{
++      struct atsc_caption_service_descriptor *ret =
++              (struct atsc_caption_service_descriptor *) d;
++      uint8_t *buf = (uint8_t*) d + 2;
++      int pos = 0;
++      int idx;
++
++      if (d->len < 1)
++              return NULL;
++      pos++;
++
++      for(idx = 0; idx < ret->number_of_services; idx++) {
++              if (d->len < (pos + sizeof(struct atsc_caption_service_entry)))
++                      return NULL;
++
++              bswap16(buf+pos+4);
++
++              pos += sizeof(struct atsc_caption_service_entry);
++      }
++
++      return (struct atsc_caption_service_descriptor*) d;
++}
++
++/**
++ * Iterator for entries field of a atsc_caption_service_descriptor.
++ *
++ * @param d atsc_caption_service_descriptor pointer.
++ * @param pos Variable holding a pointer to the current atsc_caption_service_entry.
++ * @param idx Field iterator integer.
++ */
++#define atsc_caption_service_descriptor_entries_for_each(d, pos, idx) \
++      for ((pos) = atsc_caption_service_descriptor_entries_first(d), idx=0; \
++           (pos); \
++           (pos) = atsc_caption_service_descriptor_entries_next(d, pos, ++idx))
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct atsc_caption_service_entry*
++      atsc_caption_service_descriptor_entries_first(struct atsc_caption_service_descriptor *d)
++{
++      if (d->number_of_services == 0)
++              return NULL;
++
++      return (struct atsc_caption_service_entry *)
++              ((uint8_t*) d + sizeof(struct atsc_caption_service_descriptor));
++}
++
++static inline struct atsc_caption_service_entry*
++      atsc_caption_service_descriptor_entries_next(struct atsc_caption_service_descriptor *d,
++                                                   struct atsc_caption_service_entry *pos,
++                                                   int idx)
++{
++      if (idx >= d->number_of_services)
++              return NULL;
++
++      return (struct atsc_caption_service_entry *)
++              ((uint8_t *) pos + sizeof(struct atsc_caption_service_entry));
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/component_name_descriptor.h dvb-apps/lib/libucsi/atsc/component_name_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/component_name_descriptor.h        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/component_name_descriptor.h      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,92 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_ATSC_COMPONENT_NAME_DESCRIPTOR
++#define _UCSI_ATSC_COMPONENT_NAME_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++#include <libucsi/types.h>
++#include <libucsi/atsc/types.h>
++
++/**
++ * atsc_component_name_descriptor structure.
++ */
++struct atsc_component_name_descriptor {
++      struct descriptor d;
++
++      /* struct atsc_text text[] */
++} __ucsi_packed;
++
++/**
++ * Process an atsc_component_name_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return atsc_component_name_descriptor pointer, or NULL on error.
++ */
++static inline struct atsc_component_name_descriptor*
++      atsc_component_name_descriptor_codec(struct descriptor* d)
++{
++      uint8_t *txt = ((uint8_t*) d) + sizeof(struct atsc_component_name_descriptor);
++
++      if (atsc_text_validate(txt, d->len))
++              return NULL;
++
++      return (struct atsc_component_name_descriptor*) d;
++}
++
++/**
++ * Accessor for the text field of an atsc_component_name_descriptor.
++ *
++ * @param d atsc_component_name_descriptor pointer.
++ * @return Pointer to the atsc_text data, or NULL on error.
++ */
++static inline struct atsc_text*
++      atsc_component_name_descriptor_text(struct atsc_component_name_descriptor *d)
++{
++      uint8_t *txt = ((uint8_t*) d) + sizeof(struct atsc_component_name_descriptor);
++
++      return (struct atsc_text*) txt;
++}
++
++/**
++ * Accessor for the length of the text field of an atsc_component_name_descriptor_text.
++ *
++ * @param d atsc_component_name_descriptor pointer.
++ * @return The length in bytes.
++ */
++static inline int
++      atsc_component_name_descriptor_text_length(struct atsc_component_name_descriptor *d)
++{
++      return d->d.len;
++}
++
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/content_advisory_descriptor.h dvb-apps/lib/libucsi/atsc/content_advisory_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/content_advisory_descriptor.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/content_advisory_descriptor.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,235 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_ATSC_CONTENT_ADVISORY_DESCRIPTOR
++#define _UCSI_ATSC_CONTENT_ADVISORY_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++#include <libucsi/types.h>
++
++/**
++ * atsc_content_advisory_descriptor structure.
++ */
++struct atsc_content_advisory_descriptor {
++      struct descriptor d;
++
++  EBIT2(uint8_t reserved              : 2; ,
++      uint8_t rating_region_count     : 6; );
++      /* struct atsc_content_advisory_entry entries[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the entries field of a atsc_content_advisory_descriptor.
++ */
++struct atsc_content_advisory_entry {
++      uint8_t rating_region;
++      uint8_t rated_dimensions;
++      /* struct atsc_content_advisory_entry_dimension dimensions[] */
++      /* struct atsc_content_advisory_entry_part2 part2 */
++} __ucsi_packed;
++
++/**
++ * An entry in the entries field of a atsc_content_advisory_descriptor.
++ */
++struct atsc_content_advisory_entry_dimension {
++      uint8_t rating_dimension_j;
++  EBIT2(uint8_t reserved              : 4; ,
++      uint8_t rating_value            : 4; );
++} __ucsi_packed;
++
++/**
++ * Part2 of an atsc_content_advisory_entry.
++ */
++struct atsc_content_advisory_entry_part2 {
++      uint8_t rating_description_length;
++      /* struct atsc_text description */
++} __ucsi_packed;
++
++/**
++ * Process an atsc_content_advisory_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return atsc_content_advisory_descriptor pointer, or NULL on error.
++ */
++static inline struct atsc_content_advisory_descriptor*
++      atsc_content_advisory_descriptor_codec(struct descriptor* d)
++{
++      struct atsc_content_advisory_descriptor *ret =
++              (struct atsc_content_advisory_descriptor *) d;
++      uint8_t *buf = (uint8_t*) d + 2;
++      int pos = 0;
++      int idx;
++
++      if (d->len < 1)
++              return NULL;
++      pos++;
++
++      for(idx = 0; idx < ret->rating_region_count; idx++) {
++              if (d->len < (pos + sizeof(struct atsc_content_advisory_entry)))
++                      return NULL;
++              struct atsc_content_advisory_entry *entry =
++                      (struct atsc_content_advisory_entry *) (buf + pos);
++              pos += sizeof(struct atsc_content_advisory_entry);
++
++              if (d->len < (pos + (sizeof(struct atsc_content_advisory_entry_dimension) *
++                                entry->rated_dimensions)))
++                      return NULL;
++              pos += sizeof(struct atsc_content_advisory_entry_dimension) * entry->rated_dimensions;
++
++              if (d->len < (pos + sizeof(struct atsc_content_advisory_entry_part2)))
++                      return NULL;
++              struct atsc_content_advisory_entry_part2 *part2 =
++                              (struct atsc_content_advisory_entry_part2 *) (buf + pos);
++              pos += sizeof(struct atsc_content_advisory_entry_part2);
++
++              if (d->len < (pos + part2->rating_description_length))
++                      return NULL;
++
++              if (atsc_text_validate(buf+pos, part2->rating_description_length))
++                      return NULL;
++
++              pos += part2->rating_description_length;
++      }
++
++      return (struct atsc_content_advisory_descriptor*) d;
++}
++
++/**
++ * Iterator for entries field of a atsc_content_advisory_descriptor.
++ *
++ * @param d atsc_content_advisory_descriptor pointer.
++ * @param pos Variable holding a pointer to the current atsc_content_advisory_entry.
++ * @param idx Integer used to count which entry we are in.
++ */
++#define atsc_content_advisory_descriptor_entries_for_each(d, pos, idx) \
++      for ((pos) = atsc_content_advisory_descriptor_entries_first(d), idx=0; \
++           (pos); \
++           (pos) = atsc_content_advisory_descriptor_entries_next(d, pos, ++idx))
++
++/**
++ * Iterator for dimensions field of a atsc_content_advisory_entry.
++ *
++ * @param d atsc_content_advisory_entry pointer.
++ * @param pos Variable holding a pointer to the current atsc_content_advisory_entry_dimension.
++ * @param idx Integer used to count which dimension we are in.
++ */
++#define atsc_content_advisory_entry_dimensions_for_each(d, pos, idx) \
++      for ((pos) = atsc_content_advisory_entry_dimensions_first(d), idx=0; \
++           (pos); \
++           (pos) = atsc_content_advisory_entry_dimensions_next(d, pos, ++idx))
++
++/**
++ * Accessor for the part2 field of an atsc_content_advisory_entry.
++ *
++ * @param entry atsc_content_advisory_entry pointer.
++ * @return struct atsc_content_advisory_entry_part2 pointer.
++ */
++static inline struct atsc_content_advisory_entry_part2 *
++      atsc_content_advisory_entry_part2(struct atsc_content_advisory_entry *entry)
++{
++      int pos = sizeof(struct atsc_content_advisory_entry);
++      pos += entry->rated_dimensions * sizeof(struct atsc_content_advisory_entry_dimension);
++
++      return (struct atsc_content_advisory_entry_part2 *) (((uint8_t*) entry) + pos);
++}
++
++
++/**
++ * Accessor for the description field of an atsc_content_advisory_entry_part2.
++ *
++ * @param part2 atsc_content_advisory_entry_part2 pointer.
++ * @return Pointer to the atsc_text data, or NULL on error.
++ */
++static inline struct atsc_text*
++      atsc_content_advisory_entry_part2_description(struct atsc_content_advisory_entry_part2 *part2)
++{
++      uint8_t *txt = ((uint8_t*) part2) + sizeof(struct atsc_content_advisory_entry_part2);
++
++      return (struct atsc_text *) txt;
++}
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct atsc_content_advisory_entry*
++      atsc_content_advisory_descriptor_entries_first(struct atsc_content_advisory_descriptor *d)
++{
++      if (d->rating_region_count == 0)
++              return NULL;
++
++      return (struct atsc_content_advisory_entry *)
++              ((uint8_t*) d + sizeof(struct atsc_content_advisory_descriptor));
++}
++
++static inline struct atsc_content_advisory_entry*
++      atsc_content_advisory_descriptor_entries_next(struct atsc_content_advisory_descriptor *d,
++                                                    struct atsc_content_advisory_entry *pos,
++                                                    int idx)
++{
++      if (idx >= d->rating_region_count)
++              return NULL;
++      struct atsc_content_advisory_entry_part2 *part2 =
++              atsc_content_advisory_entry_part2(pos);
++
++      return (struct atsc_content_advisory_entry *)
++              ((uint8_t *) part2 +
++               sizeof(struct atsc_content_advisory_entry_part2) +
++               part2->rating_description_length);
++}
++
++static inline struct atsc_content_advisory_entry_dimension*
++      atsc_content_advisory_entry_dimensions_first(struct atsc_content_advisory_entry *e)
++{
++      if (e->rated_dimensions == 0)
++              return NULL;
++
++      return (struct atsc_content_advisory_entry_dimension *)
++              ((uint8_t*) e + sizeof(struct atsc_content_advisory_entry));
++}
++
++static inline struct atsc_content_advisory_entry_dimension*
++      atsc_content_advisory_entry_dimensions_next(struct atsc_content_advisory_entry *e,
++                                                  struct atsc_content_advisory_entry_dimension *pos,
++                                                  int idx)
++{
++      uint8_t *next = (uint8_t *) pos + sizeof(struct atsc_content_advisory_entry_dimension);
++
++      if (idx >= e->rated_dimensions)
++              return NULL;
++      return (struct atsc_content_advisory_entry_dimension *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/cvct_section.c dvb-apps/lib/libucsi/atsc/cvct_section.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/cvct_section.c     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/cvct_section.c   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,77 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <libucsi/atsc/cvct_section.h>
++
++struct atsc_cvct_section *atsc_cvct_section_codec(struct atsc_section_psip *psip)
++{
++      uint8_t * buf = (uint8_t *) psip;
++      size_t pos = sizeof(struct atsc_section_psip);
++      size_t len = section_ext_length(&(psip->ext_head));
++      int idx;
++
++      if (len < sizeof(struct atsc_cvct_section))
++              return NULL;
++      struct atsc_cvct_section *cvct = (struct atsc_cvct_section *) psip;
++
++      pos++;
++      for(idx =0; idx < cvct->num_channels_in_section; idx++) {
++              if ((pos + sizeof(struct atsc_cvct_channel)) > len)
++                      return NULL;
++              struct atsc_cvct_channel *channel = (struct atsc_cvct_channel *) (buf+pos);
++
++              pos += 7*2;
++
++              bswap32(buf+pos);
++              bswap32(buf+pos+4);
++              bswap16(buf+pos+8);
++              bswap16(buf+pos+10);
++              bswap16(buf+pos+12);
++              bswap16(buf+pos+14);
++              bswap16(buf+pos+16);
++              pos+=18;
++
++              if ((pos + channel->descriptors_length) > len)
++                      return NULL;
++              if (verify_descriptors(buf + pos, channel->descriptors_length))
++                      return NULL;
++
++              pos += channel->descriptors_length;
++      }
++
++      if ((pos + sizeof(struct atsc_cvct_section_part2)) > len)
++              return NULL;
++      struct atsc_cvct_section_part2 *part2 = (struct atsc_cvct_section_part2 *) (buf+pos);
++
++      bswap16(buf+pos);
++      pos+=2;
++
++      if ((pos + part2->descriptors_length) > len)
++              return NULL;
++      if (verify_descriptors(buf + pos, part2->descriptors_length))
++              return NULL;
++
++      pos += part2->descriptors_length;
++      if (pos != len)
++              return NULL;
++
++      return (struct atsc_cvct_section *) psip;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/cvct_section.h dvb-apps/lib/libucsi/atsc/cvct_section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/cvct_section.h     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/cvct_section.h   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,228 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_ATSC_CVCT_SECTION_H
++#define _UCSI_ATSC_CVCT_SECTION_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/atsc/section.h>
++
++/**
++ * atsc_cvct_section structure.
++ */
++struct atsc_cvct_section {
++      struct atsc_section_psip head;
++
++      uint8_t num_channels_in_section;
++      /* struct atsc_cvct_channel channels[] */
++      /* struct atsc_cvct_channel_part2 part2 */
++} __ucsi_packed;
++
++struct atsc_cvct_channel {
++      uint16_t short_name[7]; // UTF-16 network ordered
++  EBIT4(uint32_t reserved                     : 4; ,
++      uint32_t major_channel_number           :10; ,
++      uint32_t minor_channel_number           :10; ,
++      uint32_t modulation_mode                : 8; );
++      uint32_t carrier_frequency;
++      uint16_t channel_TSID;
++      uint16_t program_number;
++  EBIT8(uint16_t ETM_location                 : 2; ,
++      uint16_t access_controlled              : 1; ,
++      uint16_t hidden                         : 1; ,
++      uint16_t path_select                    : 1; ,
++      uint16_t out_of_band                    : 1; ,
++      uint16_t hide_guide                     : 1; ,
++      uint16_t reserved2                      : 3; ,
++      uint16_t service_type                   : 6; );
++      uint16_t source_id;
++  EBIT2(uint16_t reserved3                    : 6; ,
++      uint16_t descriptors_length             :10; );
++      /* struct descriptor descriptors[] */
++} __ucsi_packed;
++
++struct atsc_cvct_section_part2 {
++  EBIT2(uint16_t reserved                     : 6; ,
++      uint16_t descriptors_length             :10; );
++      /* struct descriptor descriptors[] */
++} __ucsi_packed;
++
++static inline struct atsc_cvct_channel *atsc_cvct_section_channels_first(struct atsc_cvct_section *cvct);
++static inline struct atsc_cvct_channel *
++      atsc_cvct_section_channels_next(struct atsc_cvct_section *cvct, struct atsc_cvct_channel *pos, int idx);
++
++/**
++ * Process a atsc_cvct_section.
++ *
++ * @param section Pointer to anj atsc_section_psip structure.
++ * @return atsc_cvct_section pointer, or NULL on error.
++ */
++struct atsc_cvct_section *atsc_cvct_section_codec(struct atsc_section_psip *section);
++
++/**
++ * Accessor for the transport_stream_id field of a CVCT.
++ *
++ * @param cvdt CVDT pointer.
++ * @return The transport_stream_id.
++ */
++static inline uint16_t atsc_cvct_section_transport_stream_id(struct atsc_cvct_section *cvct)
++{
++      return cvct->head.ext_head.table_id_ext;
++}
++
++/**
++ * Iterator for the tables field in an atsc_cvct_section.
++ *
++ * @param mgt atsc_cvct_section pointer.
++ * @param pos Variable containing a pointer to the current atsc_cvct_channel.
++ * @param idx Integer used to count which table we in.
++ */
++#define atsc_cvct_section_channels_for_each(mgt, pos, idx) \
++      for ((pos) = atsc_cvct_section_channels_first(mgt), idx=0; \
++           (pos); \
++           (pos) = atsc_cvct_section_channels_next(mgt, pos, ++idx))
++
++/**
++ * Iterator for the descriptors field in a atsc_cvct_channel structure.
++ *
++ * @param table atsc_cvct_channel pointer.
++ * @param pos Variable containing a pointer to the current descriptor.
++ */
++#define atsc_cvct_channel_descriptors_for_each(table, pos) \
++      for ((pos) = atsc_cvct_channel_descriptors_first(table); \
++           (pos); \
++           (pos) = atsc_cvct_channel_descriptors_next(table, pos))
++
++/**
++ * Accessor for the second part of an atsc_cvct_section.
++ *
++ * @param mgt atsc_cvct_section pointer.
++ * @return atsc_cvct_section_part2 pointer.
++ */
++static inline struct atsc_cvct_section_part2 *
++      atsc_cvct_section_part2(struct atsc_cvct_section *mgt)
++{
++      int pos = sizeof(struct atsc_cvct_section);
++
++      struct atsc_cvct_channel *cur_table;
++      int idx;
++      atsc_cvct_section_channels_for_each(mgt, cur_table, idx) {
++              pos += sizeof(struct atsc_cvct_channel);
++              pos += cur_table->descriptors_length;
++      }
++
++      return (struct atsc_cvct_section_part2 *) (((uint8_t*) mgt) + pos);
++}
++
++/**
++ * Iterator for the descriptors field in a atsc_cvct_section structure.
++ *
++ * @param part2 atsc_cvct_section_part2 pointer.
++ * @param pos Variable containing a pointer to the current descriptor.
++ */
++#define atsc_cvct_section_part2_descriptors_for_each(part2, pos) \
++      for ((pos) = atsc_cvct_section_part2_descriptors_first(part2); \
++           (pos); \
++           (pos) = atsc_cvct_section_part2_descriptors_next(part2, pos))
++
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct atsc_cvct_channel *
++      atsc_cvct_section_channels_first(struct atsc_cvct_section *cvct)
++{
++      size_t pos = sizeof(struct atsc_cvct_section);
++
++      if (cvct->num_channels_in_section == 0)
++              return NULL;
++
++      return (struct atsc_cvct_channel*) (((uint8_t *) cvct) + pos);
++}
++
++static inline struct atsc_cvct_channel *
++      atsc_cvct_section_channels_next(struct atsc_cvct_section *cvct,
++                                   struct atsc_cvct_channel *pos,
++                                   int idx)
++{
++      if (idx >= cvct->num_channels_in_section)
++              return NULL;
++
++      return (struct atsc_cvct_channel *)
++              (((uint8_t*) pos) + sizeof(struct atsc_cvct_channel) + pos->descriptors_length);
++}
++
++static inline struct descriptor *
++      atsc_cvct_channel_descriptors_first(struct atsc_cvct_channel *table)
++{
++      size_t pos = sizeof(struct atsc_cvct_channel);
++
++      if (table->descriptors_length == 0)
++              return NULL;
++
++      return (struct descriptor*) (((uint8_t *) table) + pos);
++}
++
++static inline struct descriptor *
++      atsc_cvct_channel_descriptors_next(struct atsc_cvct_channel *table,
++                                      struct descriptor *pos)
++{
++      return next_descriptor((uint8_t*) table + sizeof(struct atsc_cvct_channel),
++                              table->descriptors_length,
++                              pos);
++}
++
++static inline struct descriptor *
++      atsc_cvct_section_part2_descriptors_first(struct atsc_cvct_section_part2 *part2)
++{
++      size_t pos = sizeof(struct atsc_cvct_section_part2);
++
++      if (part2->descriptors_length == 0)
++              return NULL;
++
++      return (struct descriptor*) (((uint8_t *) part2) + pos);
++}
++
++static inline struct descriptor *
++      atsc_cvct_section_part2_descriptors_next(struct atsc_cvct_section_part2 *part2,
++                                               struct descriptor *pos)
++{
++      return next_descriptor((uint8_t*) part2 + sizeof(struct atsc_cvct_section_part2),
++                              part2->descriptors_length,
++                              pos);
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/dcc_arriving_request_descriptor.h dvb-apps/lib/libucsi/atsc/dcc_arriving_request_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/dcc_arriving_request_descriptor.h  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/dcc_arriving_request_descriptor.h        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,107 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_ATSC_DCC_ARRIVING_REQUEST_DESCRIPTOR
++#define _UCSI_ATSC_DCC_ARRIVING_REQUEST_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++#include <libucsi/types.h>
++
++enum atsc_dcc_arriving_request_type {
++      DCC_ARRIVAL_TYPE_DEFER_10SEC    = 0x01,
++      DCC_ARRIVAL_TYPE_DEFER          = 0x02,
++};
++
++/**
++ * atsc_dcc_arriving_request_descriptor structure.
++ */
++struct atsc_dcc_arriving_request_descriptor {
++      struct descriptor d;
++
++      uint8_t dcc_arriving_request_type;
++      uint8_t dcc_arriving_request_text_length;
++      /* struct atsc_text text[] */
++} __ucsi_packed;
++
++/**
++ * Process an atsc_dcc_arriving_request_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return atsc_dcc_arriving_request_descriptor pointer, or NULL on error.
++ */
++static inline struct atsc_dcc_arriving_request_descriptor*
++      atsc_dcc_arriving_request_descriptor_codec(struct descriptor* d)
++{
++      struct atsc_dcc_arriving_request_descriptor *ret =
++              (struct atsc_dcc_arriving_request_descriptor *) d;
++
++      if (d->len < 2)
++              return NULL;
++
++      if (d->len != 2 + ret->dcc_arriving_request_text_length)
++              return NULL;
++
++      if (atsc_text_validate((uint8_t*) d + sizeof(struct atsc_dcc_arriving_request_descriptor),
++                             ret->dcc_arriving_request_text_length))
++              return NULL;
++
++      return (struct atsc_dcc_arriving_request_descriptor*) d;
++}
++
++/**
++ * Accessor for the text field of an atsc_dcc_arriving_request_descriptor.
++ *
++ * @param d atsc_dcc_arriving_request_descriptor pointer.
++ * @return Pointer to the atsc_text data, or NULL on error.
++ */
++static inline struct atsc_text*
++      atsc_dcc_arriving_request_descriptor_text(struct atsc_dcc_arriving_request_descriptor *d)
++{
++      uint8_t *txt = ((uint8_t*) d) + sizeof(struct atsc_dcc_arriving_request_descriptor);
++
++      return (struct atsc_text*) txt;
++}
++
++/**
++ * Accessor for the length of the text field of an atsc_dcc_arriving_request_descriptor.
++ *
++ * @param d atsc_dcc_arriving_request_descriptor pointer.
++ * @return The length in bytes.
++ */
++static inline int
++      atsc_dcc_arriving_request_descriptor_text_length(struct
++              atsc_dcc_arriving_request_descriptor *d)
++{
++      return d->d.len - 2;
++}
++
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/dcc_departing_request_descriptor.h dvb-apps/lib/libucsi/atsc/dcc_departing_request_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/dcc_departing_request_descriptor.h 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/dcc_departing_request_descriptor.h       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,108 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_ATSC_DCC_DEPARTING_REQUEST_DESCRIPTOR
++#define _UCSI_ATSC_DCC_DEPARTING_REQUEST_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++#include <libucsi/types.h>
++
++enum atsc_dcc_departing_request_type {
++      DCC_DEPART_TYPE_IMMEDIATE       = 0x01,
++      DCC_DEPART_TYPE_DEFER_10SEC     = 0x02,
++      DCC_DEPART_TYPE_DEFER           = 0x03,
++};
++
++/**
++ * atsc_dcc_departing_request_descriptor structure.
++ */
++struct atsc_dcc_departing_request_descriptor {
++      struct descriptor d;
++
++      uint8_t dcc_departing_request_type;
++      uint8_t dcc_departing_request_text_length;
++      /* struct atsc_text text[] */
++} __ucsi_packed;
++
++/**
++ * Process an atsc_dcc_departing_request_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return atsc_dcc_departing_request_descriptor pointer, or NULL on error.
++ */
++static inline struct atsc_dcc_departing_request_descriptor*
++      atsc_dcc_departing_request_descriptor_codec(struct descriptor* d)
++{
++      struct atsc_dcc_departing_request_descriptor *ret =
++              (struct atsc_dcc_departing_request_descriptor *) d;
++
++      if (d->len < 2)
++              return NULL;
++
++      if (d->len != 2 + ret->dcc_departing_request_text_length)
++              return NULL;
++
++      if (atsc_text_validate(((uint8_t*) d) + sizeof(struct atsc_dcc_departing_request_descriptor),
++                             ret->dcc_departing_request_text_length))
++              return NULL;
++
++      return (struct atsc_dcc_departing_request_descriptor*) d;
++}
++
++/**
++ * Accessor for the text field of an atsc_dcc_departing_request_descriptor.
++ *
++ * @param d atsc_dcc_departing_request_descriptor pointer.
++ * @return Pointer to the atsc_text data, or NULL on error.
++ */
++static inline struct atsc_text*
++      atsc_dcc_departing_request_descriptor_text(struct atsc_dcc_departing_request_descriptor *d)
++{
++      uint8_t *txt = ((uint8_t*) d) + sizeof(struct atsc_dcc_departing_request_descriptor);
++
++      return (struct atsc_text*) txt;
++}
++
++/**
++ * Accessor for the length of the text field of an atsc_dcc_departing_request_descriptor.
++ *
++ * @param d atsc_dcc_departing_request_descriptor pointer.
++ * @return The length in bytes.
++ */
++static inline int
++      atsc_dcc_departing_request_descriptor_text_length(struct
++              atsc_dcc_departing_request_descriptor *d)
++{
++      return d->d.len - 2;
++}
++
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/dccsct_section.c dvb-apps/lib/libucsi/atsc/dccsct_section.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/dccsct_section.c   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/dccsct_section.c 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,109 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <libucsi/atsc/dccsct_section.h>
++
++struct atsc_dccsct_section *atsc_dccsct_section_codec(struct atsc_section_psip *psip)
++{
++      uint8_t * buf = (uint8_t *) psip;
++      size_t pos = 0;
++      size_t len = section_ext_length(&(psip->ext_head));
++      int idx;
++
++      if (len < sizeof(struct atsc_dccsct_section))
++              return NULL;
++      struct atsc_dccsct_section *dccsct = (struct atsc_dccsct_section *) psip;
++
++      pos += sizeof(struct atsc_dccsct_section);
++      for(idx =0; idx < dccsct->updates_defined; idx++) {
++              if (len < (pos + sizeof(struct atsc_dccsct_update)))
++                      return NULL;
++              struct atsc_dccsct_update *update = (struct atsc_dccsct_update *) (buf+pos);
++
++              pos += sizeof(struct atsc_dccsct_update);
++              if (len < (pos + update->update_data_length))
++                      return NULL;
++
++              switch(update->update_type) {
++              case ATSC_DCCST_UPDATE_NEW_GENRE: {
++                      int sublen = sizeof(struct atsc_dccsct_update_new_genre);
++                      if (update->update_data_length < sublen)
++                              return NULL;
++
++                      if (atsc_text_validate(buf+pos+sublen, update->update_data_length - sublen))
++                              return NULL;
++                      break;
++              }
++              case ATSC_DCCST_UPDATE_NEW_STATE: {
++                      int sublen = sizeof(struct atsc_dccsct_update_new_state);
++                      if (update->update_data_length < sublen)
++                              return NULL;
++
++                      if (atsc_text_validate(buf+pos+sublen, update->update_data_length - sublen))
++                              return NULL;
++                      break;
++              }
++              case ATSC_DCCST_UPDATE_NEW_COUNTY: {
++                      int sublen = sizeof(struct atsc_dccsct_update_new_county);
++                      if (update->update_data_length < sublen)
++                              return NULL;
++                      bswap16(buf+pos+1);
++
++                      if (atsc_text_validate(buf+pos+sublen, update->update_data_length - sublen))
++                              return NULL;
++                      break;
++              }
++              }
++
++              pos += update->update_data_length;
++              if (len < (pos + sizeof(struct atsc_dccsct_update_part2)))
++                      return NULL;
++              struct atsc_dccsct_update_part2 *part2 = (struct atsc_dccsct_update_part2 *) buf + pos;
++
++              bswap16(buf+pos);
++
++              pos += sizeof(struct atsc_dccsct_update_part2);
++              if (len < (pos + part2->descriptors_length))
++                      return NULL;
++              if (verify_descriptors(buf + pos, part2->descriptors_length))
++                      return NULL;
++
++              pos += part2->descriptors_length;
++      }
++
++      if (len < (pos + sizeof(struct atsc_dccsct_section_part2)))
++              return NULL;
++      struct atsc_dccsct_section_part2 *part2 = (struct atsc_dccsct_section_part2 *) (buf+pos);
++
++      bswap16(buf+pos);
++
++      pos += sizeof(struct atsc_dccsct_section_part2);
++      if (len < (pos + part2->descriptors_length))
++              return NULL;
++      if (verify_descriptors(buf + pos, part2->descriptors_length))
++              return NULL;
++
++      pos += part2->descriptors_length;
++      if (pos != len)
++              return NULL;
++
++      return (struct atsc_dccsct_section *) psip;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/dccsct_section.h dvb-apps/lib/libucsi/atsc/dccsct_section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/dccsct_section.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/dccsct_section.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,327 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_ATSC_DCCSCT_SECTION_H
++#define _UCSI_ATSC_DCCSCT_SECTION_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/atsc/section.h>
++#include <libucsi/atsc/types.h>
++
++enum atsc_dccst_update_types {
++      ATSC_DCCST_UPDATE_NEW_GENRE     = 0x01,
++      ATSC_DCCST_UPDATE_NEW_STATE     = 0x02,
++      ATSC_DCCST_UPDATE_NEW_COUNTY    = 0x03,
++};
++
++/**
++ * atsc_dccsct_section structure.
++ */
++struct atsc_dccsct_section {
++      struct atsc_section_psip head;
++
++      uint8_t updates_defined;
++      /* struct atsc_dccsct_update updates */
++      /* struct atsc_dccsct_section_part2 part2 */
++} __ucsi_packed;
++
++struct atsc_dccsct_update {
++      uint8_t update_type;
++      uint8_t update_data_length;
++      /* struct atsc_dccsct_update_XXX data -- depends on update_type */
++      /* struct atsc_dccsct_update_part2 part2 */
++} __ucsi_packed;
++
++struct atsc_dccsct_update_new_genre {
++      uint8_t genre_category_code;
++      /* atsc_text name */
++} __ucsi_packed;
++
++struct atsc_dccsct_update_new_state {
++      uint8_t dcc_state_location_code;
++      /* atsc_text name */
++} __ucsi_packed;
++
++struct atsc_dccsct_update_new_county {
++      uint8_t state_code;
++  EBIT2(uint16_t reserved                     : 6; ,
++      uint16_t dcc_county_location_code       :10; );
++      /* atsc_text name */
++} __ucsi_packed;
++
++struct atsc_dccsct_update_part2 {
++  EBIT2(uint16_t reserved                     : 6; ,
++      uint16_t descriptors_length             :10; );
++      /* struct descriptor descriptors[] */
++} __ucsi_packed;
++
++struct atsc_dccsct_section_part2 {
++  EBIT2(uint16_t reserved                     : 6; ,
++      uint16_t descriptors_length             :10; );
++      /* struct descriptor descriptors[] */
++} __ucsi_packed;
++
++/**
++ * Process an atsc_dccsct_section.
++ *
++ * @param section Pointer to an atsc_section_psip structure.
++ * @return atsc_dccsct_section pointer, or NULL on error.
++ */
++struct atsc_dccsct_section *atsc_dccsct_section_codec(struct atsc_section_psip *section);
++
++/**
++ * Accessor for the dccsct_type field of a dccsct.
++ *
++ * @param dccsct dccsct pointer.
++ * @return The dccsct_type.
++ */
++static inline uint16_t atsc_dccsct_section_dccsct_type(struct atsc_dccsct_section *dccsct)
++{
++      return dccsct->head.ext_head.table_id_ext;
++}
++
++/**
++ * Iterator for the updates field in an atsc_dccsct_section.
++ *
++ * @param dccsct atsc_dccsct_section pointer.
++ * @param pos Variable containing a pointer to the current atsc_dccsct_update.
++ * @param idx Integer used to count which test we are in.
++ */
++#define atsc_dccsct_section_updates_for_each(dccsct, pos, idx) \
++      for ((pos) = atsc_dccsct_section_updates_first(dccsct), idx=0; \
++           (pos); \
++           (pos) = atsc_dccsct_section_updates_next(dccsct, pos, ++idx))
++
++/**
++ * Accessor for the data field of a new genre atsc_dccsct_update.
++ *
++ * @param update atsc_dccsct_update pointer.
++ * @return struct atsc_dccsct_update_new_genre pointer.
++ */
++static inline struct atsc_dccsct_update_new_genre *atsc_dccsct_update_new_genre(struct atsc_dccsct_update *update)
++{
++      if (update->update_type != ATSC_DCCST_UPDATE_NEW_GENRE)
++              return NULL;
++
++      return (struct atsc_dccsct_update_new_genre *)
++              (((uint8_t*) update) + sizeof(struct atsc_dccsct_update));
++}
++
++/**
++ * Accessor for the name field of an atsc_dccsct_update_new_genre.
++ *
++ * @param update atsc_dccsct_update_new_genre pointer.
++ * @return text pointer.
++ */
++static inline struct atsc_text *atsc_dccsct_update_new_genre_name(struct atsc_dccsct_update *update)
++{
++      if ((update->update_data_length - 1) == 0)
++              return NULL;
++
++      return (struct atsc_text *)
++              (((uint8_t*) update) + sizeof(struct atsc_dccsct_update_new_genre));
++}
++
++/**
++ * Accessor for the data field of a new state atsc_dccsct_update.
++ *
++ * @param update atsc_dccsct_update pointer.
++ * @return struct atsc_dccsct_update_new_state pointer.
++ */
++static inline struct atsc_dccsct_update_new_state *
++      atsc_dccsct_update_new_state(struct atsc_dccsct_update *update)
++{
++      if (update->update_type != ATSC_DCCST_UPDATE_NEW_STATE)
++              return NULL;
++
++      return (struct atsc_dccsct_update_new_state *)
++              (((uint8_t*) update) + sizeof(struct atsc_dccsct_update));
++}
++
++/**
++ * Accessor for the name field of an atsc_dccsct_update_new_state.
++ *
++ * @param update atsc_dccsct_update_new_state pointer.
++ * @return text pointer.
++ */
++static inline struct atsc_text *atsc_dccsct_update_new_state_name(struct atsc_dccsct_update *update)
++{
++      if ((update->update_data_length - 1) == 0)
++              return NULL;
++
++      return (struct atsc_text *)
++              (((uint8_t*) update) + sizeof(struct atsc_dccsct_update_new_state));
++}
++
++/**
++ * Accessor for the data field of a new county atsc_dccsct_update.
++ *
++ * @param update atsc_dccsct_update pointer.
++ * @return struct atsc_dccsct_update_new_county pointer.
++ */
++static inline struct atsc_dccsct_update_new_county *
++      atsc_dccsct_update_new_county(struct atsc_dccsct_update *update)
++{
++      if (update->update_type != ATSC_DCCST_UPDATE_NEW_COUNTY)
++              return NULL;
++
++      return (struct atsc_dccsct_update_new_county *)
++              (((uint8_t*) update) + sizeof(struct atsc_dccsct_update));
++}
++
++/**
++ * Accessor for the name field of an atsc_dccsct_update_new_county.
++ *
++ * @param update atsc_dccsct_update_new_county pointer.
++ * @return text pointer.
++ */
++static inline struct atsc_text *atsc_dccsct_update_new_county_name(struct atsc_dccsct_update *update)
++{
++      if ((update->update_data_length - 3) == 0)
++              return NULL;
++
++      return (struct atsc_text*)
++              (((uint8_t*) update) + sizeof(struct atsc_dccsct_update_new_county));
++}
++
++/**
++ * Accessor for the part2 field of an atsc_dccsct_update.
++ *
++ * @param update atsc_dccsct_update pointer.
++ * @return struct atsc_dccsct_test_part2 pointer.
++ */
++static inline struct atsc_dccsct_update_part2 *atsc_dccsct_update_part2(struct atsc_dccsct_update *update)
++{
++      int pos = sizeof(struct atsc_dccsct_update);
++      pos += update->update_data_length;
++
++      return (struct atsc_dccsct_update_part2 *) (((uint8_t*) update) + pos);
++}
++
++/**
++ * Iterator for the descriptors field in an atsc_dccsct_update_part2 structure.
++ *
++ * @param part2 atsc_dccsct_update_part2 pointer.
++ * @param pos Variable containing a pointer to the current descriptor.
++ */
++#define atsc_dccsct_update_part2_descriptors_for_each(part2, pos) \
++      for ((pos) = atsc_dccsct_update_part2_descriptors_first(part2); \
++           (pos); \
++           (pos) = atsc_dccsct_update_part2_descriptors_next(part2, pos))
++
++/**
++ * Iterator for the descriptors field in a atsc_dccsct_section_part2 structure.
++ *
++ * @param part2 atsc_dccsct_section_part2 pointer.
++ * @param pos Variable containing a pointer to the current descriptor.
++ */
++#define atsc_dccsct_section_part2_descriptors_for_each(part2, pos) \
++      for ((pos) = atsc_dccsct_section_part2_descriptors_first(part2); \
++           (pos); \
++           (pos) = atsc_dccsct_section_part2_descriptors_next(part2, pos))
++
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct atsc_dccsct_update *
++      atsc_dccsct_section_updates_first(struct atsc_dccsct_section *dccsct)
++{
++      size_t pos = sizeof(struct atsc_dccsct_section);
++
++      if (dccsct->updates_defined == 0)
++              return NULL;
++
++      return (struct atsc_dccsct_update*) (((uint8_t *) dccsct) + pos);
++}
++
++static inline struct atsc_dccsct_update*
++      atsc_dccsct_section_updates_next(struct atsc_dccsct_section *dccsct,
++                                       struct atsc_dccsct_update *pos,
++                                       int idx)
++{
++      if (idx >= dccsct->updates_defined)
++              return NULL;
++
++      struct atsc_dccsct_update_part2 *part2 = atsc_dccsct_update_part2(pos);
++      int len = sizeof(struct atsc_dccsct_update_part2);
++      len += part2->descriptors_length;
++
++      return (struct atsc_dccsct_update *) (((uint8_t*) part2) + len);
++}
++
++static inline struct descriptor *
++      atsc_dccsct_update_part2_descriptors_first(struct atsc_dccsct_update_part2 *part2)
++{
++      size_t pos = sizeof(struct atsc_dccsct_update_part2);
++
++      if (part2->descriptors_length == 0)
++              return NULL;
++
++      return (struct descriptor*) (((uint8_t *) part2) + pos);
++}
++
++static inline struct descriptor *
++      atsc_dccsct_update_part2_descriptors_next(struct atsc_dccsct_update_part2 *part2,
++                                                struct descriptor *pos)
++{
++      return next_descriptor((uint8_t*) part2 + sizeof(struct atsc_dccsct_update_part2),
++                              part2->descriptors_length,
++                              pos);
++}
++
++static inline struct descriptor *
++      atsc_dccsct_section_part2_descriptors_first(struct atsc_dccsct_section_part2 *part2)
++{
++      size_t pos = sizeof(struct atsc_dccsct_section_part2);
++
++      if (part2->descriptors_length == 0)
++              return NULL;
++
++      return (struct descriptor*) (((uint8_t *) part2) + pos);
++}
++
++static inline struct descriptor *
++      atsc_dccsct_section_part2_descriptors_next(struct atsc_dccsct_section_part2 *part2,
++                                               struct descriptor *pos)
++{
++      return next_descriptor((uint8_t*) part2 + sizeof(struct atsc_dccsct_section_part2),
++                              part2->descriptors_length,
++                              pos);
++}
++
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/dcct_section.c dvb-apps/lib/libucsi/atsc/dcct_section.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/dcct_section.c     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/dcct_section.c   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,96 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <libucsi/atsc/dcct_section.h>
++
++struct atsc_dcct_section *atsc_dcct_section_codec(struct atsc_section_psip *psip)
++{
++      uint8_t * buf = (uint8_t *) psip;
++      size_t pos = 0;
++      size_t len = section_ext_length(&(psip->ext_head));
++      int testidx;
++      int termidx;
++
++      if (len < sizeof(struct atsc_dcct_section))
++              return NULL;
++      struct atsc_dcct_section *dcct = (struct atsc_dcct_section *) psip;
++
++      pos += sizeof(struct atsc_dcct_section);
++      for(testidx =0; testidx < dcct->dcc_test_count; testidx++) {
++              if (len < (pos + sizeof(struct atsc_dcct_test)))
++                      return NULL;
++              struct atsc_dcct_test *test = (struct atsc_dcct_test *) (buf+pos);
++
++              bswap24(buf+pos);
++              bswap24(buf+pos+3);
++              bswap32(buf+pos+6);
++              bswap32(buf+pos+10);
++
++              pos += sizeof(struct atsc_dcct_test);
++              for(termidx =0; termidx < test->dcc_term_count; termidx++) {
++                      if (len < (pos + sizeof(struct atsc_dcct_term)))
++                              return NULL;
++                      struct atsc_dcct_term *term = (struct atsc_dcct_term *) (buf+pos);
++
++                      bswap64(buf+pos+1);
++                      bswap16(buf+pos+9);
++
++                      pos += sizeof(struct atsc_dcct_term);
++                      if (len < (pos + term->descriptors_length))
++                              return NULL;
++                      if (verify_descriptors(buf + pos, term->descriptors_length))
++                              return NULL;
++
++                      pos += term->descriptors_length;
++              }
++
++              if (len < (pos + sizeof(struct atsc_dcct_test_part2)))
++                      return NULL;
++              struct atsc_dcct_test_part2 *part2 = (struct atsc_dcct_test_part2 *) (buf+pos);
++
++              bswap16(buf+pos);
++
++              pos += sizeof(struct atsc_dcct_test_part2);
++              if (len < (pos + part2->descriptors_length))
++                      return NULL;
++              if (verify_descriptors(buf + pos, part2->descriptors_length))
++                      return NULL;
++              pos += part2->descriptors_length;
++      }
++
++      if (len < (pos + sizeof(struct atsc_dcct_section_part2)))
++              return NULL;
++      struct atsc_dcct_section_part2 *part2 = (struct atsc_dcct_section_part2 *) (buf+pos);
++
++      bswap16(buf+pos);
++
++      pos += sizeof(struct atsc_dcct_section_part2);
++      if (len < (pos + part2->descriptors_length))
++              return NULL;
++      if (verify_descriptors(buf + pos, part2->descriptors_length))
++              return NULL;
++
++      pos += part2->descriptors_length;
++      if (pos != len)
++              return NULL;
++
++      return (struct atsc_dcct_section *) psip;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/dcct_section.h dvb-apps/lib/libucsi/atsc/dcct_section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/dcct_section.h     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/dcct_section.h   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,380 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_ATSC_DCCT_SECTION_H
++#define _UCSI_ATSC_DCCT_SECTION_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/atsc/section.h>
++#include <libucsi/atsc/types.h>
++
++enum atsc_dcc_context {
++      ATSC_DCC_CONTEXT_TEMPORARY_RETUNE = 0,
++      ATSC_DCC_CONTEXT_CHANNEL_REDIRECT = 1,
++};
++
++enum atsc_dcc_selection_type {
++      ATSC_DCC_SELECTION_UNCONDITIONAL_CHANNEL_CHANGE = 0x00,
++      ATSC_DCC_SELECTION_NUMERIC_POSTAL_CODE_INCLUSION = 0x01,
++      ATSC_DCC_SELECTION_ALPHANUMERIC_POSTAL_CODE_INCLUSION = 0x02,
++      ATSC_DCC_SELECTION_DEMOGRAPHIC_CATEGORY_ONE_OR_MORE = 0x05,
++      ATSC_DCC_SELECTION_DEMOGRAPHIC_CATEGORY_ALL = 0x06,
++      ATSC_DCC_SELECTION_GENRE_CATEGORY_ONE_OR_MORE = 0x07,
++      ATSC_DCC_SELECTION_GENRE_CATEGORY_ALL = 0x08,
++      ATSC_DCC_SELECTION_CANNOT_BE_AUTHORIZED = 0x09,
++      ATSC_DCC_SELECTION_GEOGRAPHIC_LOCATION_INCLUSION = 0x0c,
++      ATSC_DCC_SELECTION_RATING_BLOCKED = 0x0d,
++      ATSC_DCC_SELECTION_RETURN_TO_ORIGINAL_CHANNEL = 0x0f,
++      ATSC_DCC_SELECTION_NUMERIC_POSTAL_CODE_EXCLUSION = 0x11,
++      ATSC_DCC_SELECTION_ALPHANUMERIC_POSTAL_CODE_EXCLUSION = 0x12,
++      ATSC_DCC_SELECTION_DEMOGRAPHIC_CATEGORY_NOT_ONE_OR_MORE = 0x15,
++      ATSC_DCC_SELECTION_DEMOGRAPHIC_CATEGORY_NOT_ALL = 0x16,
++      ATSC_DCC_SELECTION_GENRE_CATEGORY_NOT_ONE_OR_MORE = 0x17,
++      ATSC_DCC_SELECTION_GENRE_CATEGORY_NOT_ALL = 0x18,
++      ATSC_DCC_SELECTION_GEOGRAPHIC_LOCATION_EXCLUSION = 0x1c,
++      ATSC_DCC_SELECTION_VIEWER_DIRECT_SELECT_A = 0x20,
++      ATSC_DCC_SELECTION_VIEWER_DIRECT_SELECT_B = 0x21,
++      ATSC_DCC_SELECTION_VIEWER_DIRECT_SELECT_C = 0x22,
++      ATSC_DCC_SELECTION_VIEWER_DIRECT_SELECT_D = 0x23,
++};
++
++/**
++ * atsc_dcct_section structure.
++ */
++struct atsc_dcct_section {
++      struct atsc_section_psip head;
++
++      uint8_t dcc_test_count;
++      /* struct atsc_dcct_test tests */
++      /* struct atsc_dcct_section_part2 part2 */
++} __ucsi_packed;
++
++struct atsc_dcct_test {
++  EBIT4(uint32_t dcc_context                  : 1; ,
++      uint32_t reserved                       : 3; ,
++      uint32_t dcc_from_major_channel_number  :10; ,
++      uint32_t dcc_from_minor_channel_number  :10; );
++  EBIT3(uint32_t reserved1                    : 4; ,
++      uint32_t dcc_to_major_channel_number    :10; ,
++      uint32_t dcc_to_minor_channel_number    :10; );
++      atsctime_t start_time;
++      atsctime_t end_time;
++      uint8_t dcc_term_count;
++      /* struct atsc_dcct_term terms */
++      /* struct atsc_dcct_test_part2 part2 */
++} __ucsi_packed;
++
++struct atsc_dcct_term {
++      uint8_t dcc_selection_type;
++      uint64_t dcc_selection_id;
++  EBIT2(uint16_t reserved                     : 6; ,
++      uint16_t descriptors_length             :10; );
++      /* struct descriptor descriptors[] */
++} __ucsi_packed;
++
++struct atsc_dcct_test_part2 {
++  EBIT2(uint16_t reserved                     : 6; ,
++      uint16_t descriptors_length             :10; );
++      /* struct descriptor descriptors[] */
++} __ucsi_packed;
++
++struct atsc_dcct_section_part2 {
++  EBIT2(uint16_t reserved                     : 6; ,
++      uint16_t descriptors_length             :10; );
++      /* struct descriptor descriptors[] */
++} __ucsi_packed;
++
++static inline struct atsc_dcct_test *
++      atsc_dcct_section_tests_first(struct atsc_dcct_section *dcct);
++static inline struct atsc_dcct_test *
++      atsc_dcct_section_tests_next(struct atsc_dcct_section *dcct,
++                                   struct atsc_dcct_test *pos,
++                                   int idx);
++static inline struct atsc_dcct_term *
++      atsc_dcct_test_terms_first(struct atsc_dcct_test *test);
++static inline struct atsc_dcct_term *
++      atsc_dcct_test_terms_next(struct atsc_dcct_test *test,
++                                struct atsc_dcct_term *pos,
++                                int idx);
++
++
++/**
++ * Process an atsc_dcct_section.
++ *
++ * @param section Pointer to an atsc_section_psip structure.
++ * @return atsc_dcct_section pointer, or NULL on error.
++ */
++struct atsc_dcct_section *atsc_dcct_section_codec(struct atsc_section_psip *section);
++
++/**
++ * Accessor for the dcc_subtype field of a dcct.
++ *
++ * @param dcct dcct pointer.
++ * @return The dcc_subtype.
++ */
++static inline uint8_t atsc_dcct_section_dcc_subtype(struct atsc_dcct_section *dcct)
++{
++      return dcct->head.ext_head.table_id_ext >> 8;
++}
++
++/**
++ * Accessor for the dcc_id field of a dcct.
++ *
++ * @param dcct dcct pointer.
++ * @return The dcc_id.
++ */
++static inline uint8_t atsc_dcct_section_dcc_id(struct atsc_dcct_section *dcct)
++{
++      return dcct->head.ext_head.table_id_ext & 0xff;
++}
++
++/**
++ * Iterator for the tests field in an atsc_dcct_section.
++ *
++ * @param dcct atsc_dcct_section pointer.
++ * @param pos Variable containing a pointer to the current atsc_dcct_test.
++ * @param idx Integer used to count which test we are in.
++ */
++#define atsc_dcct_section_tests_for_each(dcct, pos, idx) \
++      for ((pos) = atsc_dcct_section_tests_first(dcct), idx=0; \
++           (pos); \
++           (pos) = atsc_dcct_section_tests_next(dcct, pos, ++idx))
++
++/**
++ * Iterator for the terms field in an atsc_dcct_test.
++ *
++ * @param test atsc_dcct_test pointer.
++ * @param pos Variable containing a pointer to the current atsc_dcct_term.
++ * @param idx Integer used to count which test we are in.
++ */
++#define atsc_dcct_test_terms_for_each(test, pos, idx) \
++      for ((pos) = atsc_dcct_test_terms_first(test), idx=0; \
++           (pos); \
++           (pos) = atsc_dcct_test_terms_next(test, pos, ++idx))
++
++/**
++ * Iterator for the descriptors field in a atsc_dcct_term structure.
++ *
++ * @param term atsc_dcct_term pointer.
++ * @param pos Variable containing a pointer to the current descriptor.
++ */
++#define atsc_dcct_term_descriptors_for_each(term, pos) \
++      for ((pos) = atsc_dcct_term_descriptors_first(term); \
++           (pos); \
++           (pos) = atsc_dcct_term_descriptors_next(term, pos))
++
++/**
++ * Accessor for the part2 field of an atsc_dcct_test.
++ *
++ * @param test atsc_dcct_test pointer.
++ * @return struct atsc_dcct_test_part2 pointer.
++ */
++static inline struct atsc_dcct_test_part2 *atsc_dcct_test_part2(struct atsc_dcct_test *test)
++{
++      int pos = sizeof(struct atsc_dcct_test);
++
++      struct atsc_dcct_term *cur_term;
++      int idx;
++      atsc_dcct_test_terms_for_each(test, cur_term, idx) {
++              pos += sizeof(struct atsc_dcct_term);
++              pos += cur_term->descriptors_length;
++      }
++
++      return (struct atsc_dcct_test_part2 *) (((uint8_t*) test) + pos);
++}
++
++/**
++ * Iterator for the descriptors field in a atsc_dcct_test_part2 structure.
++ *
++ * @param term atsc_dcct_test_part2 pointer.
++ * @param pos Variable containing a pointer to the current descriptor.
++ */
++#define atsc_dcct_test_part2_descriptors_for_each(part2, pos) \
++      for ((pos) = atsc_dcct_test_part2_descriptors_first(part2); \
++           (pos); \
++           (pos) = atsc_dcct_test_part2_descriptors_next(part2, pos))
++
++/**
++ * Accessor for the part2 field of an atsc_dcct_section.
++ *
++ * @param dcct atsc_dcct_section pointer.
++ * @return struct atsc_dcct_section_part2 pointer.
++ */
++static inline struct atsc_dcct_section_part2 *atsc_dcct_section_part2(struct atsc_dcct_section *dcct)
++{
++      int pos = sizeof(struct atsc_dcct_section);
++
++      struct atsc_dcct_test *cur_test;
++      int testidx;
++      atsc_dcct_section_tests_for_each(dcct, cur_test, testidx) {
++              struct atsc_dcct_test_part2 *part2 = atsc_dcct_test_part2(cur_test);
++              pos += ((uint8_t*) part2 - (uint8_t*) cur_test);
++
++              pos += sizeof(struct atsc_dcct_test_part2);
++              pos += part2->descriptors_length;
++      }
++
++      return (struct atsc_dcct_section_part2 *) (((uint8_t*) dcct) + pos);
++}
++
++/**
++ * Iterator for the descriptors field in a atsc_dcct_section_part2 structure.
++ *
++ * @param part2 atsc_dcct_section_part2 pointer.
++ * @param pos Variable containing a pointer to the current descriptor.
++ */
++#define atsc_dcct_section_part2_descriptors_for_each(part2, pos) \
++      for ((pos) = atsc_dcct_section_part2_descriptors_first(part2); \
++           (pos); \
++           (pos) = atsc_dcct_section_part2_descriptors_next(part2, pos))
++
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct atsc_dcct_test *
++      atsc_dcct_section_tests_first(struct atsc_dcct_section *dcct)
++{
++      size_t pos = sizeof(struct atsc_dcct_section);
++
++      if (dcct->dcc_test_count == 0)
++              return NULL;
++
++      return (struct atsc_dcct_test*) (((uint8_t *) dcct) + pos);
++}
++
++static inline struct atsc_dcct_test *
++      atsc_dcct_section_tests_next(struct atsc_dcct_section *dcct,
++                                   struct atsc_dcct_test *pos,
++                                   int idx)
++{
++      if (idx >= dcct->dcc_test_count)
++              return NULL;
++
++      struct atsc_dcct_test_part2 *part2 = atsc_dcct_test_part2(pos);
++      int len = sizeof(struct atsc_dcct_test_part2);
++      len += part2->descriptors_length;
++
++      return (struct atsc_dcct_test *) (((uint8_t*) part2) + len);
++}
++
++static inline struct atsc_dcct_term *
++      atsc_dcct_test_terms_first(struct atsc_dcct_test *test)
++{
++      size_t pos = sizeof(struct atsc_dcct_test);
++
++      if (test->dcc_term_count == 0)
++              return NULL;
++
++      return (struct atsc_dcct_term*) (((uint8_t *) test) + pos);
++}
++
++static inline struct atsc_dcct_term *
++      atsc_dcct_test_terms_next(struct atsc_dcct_test *test,
++                                struct atsc_dcct_term *pos,
++                                int idx)
++{
++      if (idx >= test->dcc_term_count)
++              return NULL;
++
++      int len = sizeof(struct atsc_dcct_term);
++      len += pos->descriptors_length;
++
++      return (struct atsc_dcct_term *) (((uint8_t*) pos) + len);
++}
++
++static inline struct descriptor *
++      atsc_dcct_term_descriptors_first(struct atsc_dcct_term *term)
++{
++      size_t pos = sizeof(struct atsc_dcct_term);
++
++      if (term->descriptors_length == 0)
++              return NULL;
++
++      return (struct descriptor*) (((uint8_t *) term) + pos);
++}
++
++static inline struct descriptor *
++      atsc_dcct_term_descriptors_next(struct atsc_dcct_term *term,
++                                      struct descriptor *pos)
++{
++      return next_descriptor((uint8_t*) term + sizeof(struct atsc_dcct_term),
++                              term->descriptors_length,
++                              pos);
++}
++
++static inline struct descriptor *
++      atsc_dcct_test_part2_descriptors_first(struct atsc_dcct_test_part2 *part2)
++{
++      size_t pos = sizeof(struct atsc_dcct_test_part2);
++
++      if (part2->descriptors_length == 0)
++              return NULL;
++
++      return (struct descriptor*) (((uint8_t *) part2) + pos);
++}
++
++static inline struct descriptor *
++      atsc_dcct_test_part2_descriptors_next(struct atsc_dcct_test_part2 *part2,
++                                            struct descriptor *pos)
++{
++      return next_descriptor((uint8_t*) part2 + sizeof(struct atsc_dcct_test_part2),
++                              part2->descriptors_length,
++                              pos);
++}
++
++static inline struct descriptor *
++      atsc_dcct_section_part2_descriptors_first(struct atsc_dcct_section_part2 *part2)
++{
++      size_t pos = sizeof(struct atsc_dcct_section_part2);
++
++      if (part2->descriptors_length == 0)
++              return NULL;
++
++      return (struct descriptor*) (((uint8_t *) part2) + pos);
++}
++
++static inline struct descriptor *
++      atsc_dcct_section_part2_descriptors_next(struct atsc_dcct_section_part2 *part2,
++                                               struct descriptor *pos)
++{
++      return next_descriptor((uint8_t*) part2 + sizeof(struct atsc_dcct_section_part2),
++                              part2->descriptors_length,
++                              pos);
++}
++
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/descriptor.h dvb-apps/lib/libucsi/atsc/descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/descriptor.h       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/descriptor.h     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,68 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_ATSC_DESCRIPTOR_H
++#define _UCSI_ATSC_DESCRIPTOR_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/endianops.h>
++#include <libucsi/atsc/stuffing_descriptor.h>
++#include <libucsi/atsc/ac3_descriptor.h>
++#include <libucsi/atsc/caption_service_descriptor.h>
++#include <libucsi/atsc/component_name_descriptor.h>
++#include <libucsi/atsc/content_advisory_descriptor.h>
++#include <libucsi/atsc/dcc_arriving_request_descriptor.h>
++#include <libucsi/atsc/dcc_departing_request_descriptor.h>
++#include <libucsi/atsc/extended_channel_name_descriptor.h>
++#include <libucsi/atsc/genre_descriptor.h>
++#include <libucsi/atsc/rc_descriptor.h>
++#include <libucsi/atsc/service_location_descriptor.h>
++#include <libucsi/atsc/time_shifted_service_descriptor.h>
++
++/**
++ * Enumeration of ATSC descriptor tags.
++ */
++enum atsc_descriptor_tag {
++      dtag_atsc_stuffing                      = 0x80,
++      dtag_atsc_ac3_audio                     = 0x81,
++      dtag_atsc_caption_service               = 0x86,
++      dtag_atsc_content_advisory              = 0x87,
++      dtag_atsc_extended_channel_name         = 0xa0,
++      dtag_atsc_service_location              = 0xa1,
++      dtag_atsc_time_shifted_service          = 0xa2,
++      dtag_atsc_component_name                = 0xa3,
++      dtag_atsc_dcc_departing_request         = 0xa8,
++      dtag_atsc_dcc_arriving_request          = 0xa9,
++      dtag_atsc_redistribution_control        = 0xaa,
++      dtag_atsc_private_information           = 0xad,
++      dtag_atsc_content_identifier            = 0xb6,
++      dtag_atsc_genre                         = 0xab,
++};
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/eit_section.c dvb-apps/lib/libucsi/atsc/eit_section.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/eit_section.c      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/eit_section.c    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,71 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <libucsi/atsc/eit_section.h>
++
++struct atsc_eit_section *atsc_eit_section_codec(struct atsc_section_psip *psip)
++{
++      uint8_t * buf = (uint8_t *) psip;
++      size_t pos = 0;
++      size_t len = section_ext_length(&(psip->ext_head));
++      int idx;
++
++      if (len < sizeof(struct atsc_eit_section))
++              return NULL;
++      struct atsc_eit_section *eit = (struct atsc_eit_section *) psip;
++
++      pos += sizeof(struct atsc_eit_section);
++      for(idx =0; idx < eit->num_events_in_section; idx++) {
++              if (len < (pos + sizeof(struct atsc_eit_event)))
++                      return NULL;
++              struct atsc_eit_event *event = (struct atsc_eit_event *) (buf+pos);
++
++              bswap16(buf+pos);
++              bswap32(buf+pos+2);
++              bswap32(buf+pos+6);
++
++              pos += sizeof(struct atsc_eit_event);
++              if (len < (pos + event->title_length))
++                      return NULL;
++              if (atsc_text_validate(buf+pos, event->title_length))
++                      return NULL;
++
++              pos += event->title_length;
++              if (len < (pos + sizeof(struct atsc_eit_event_part2)))
++                      return NULL;
++              struct atsc_eit_event_part2 *part2 = (struct atsc_eit_event_part2 *) (buf+pos);
++
++              bswap16(buf+pos);
++
++              pos += sizeof(struct atsc_eit_event_part2);
++              if (len < (pos + part2->descriptors_length))
++                      return NULL;
++
++              if (verify_descriptors(buf + pos, part2->descriptors_length))
++                      return NULL;
++              pos += part2->descriptors_length;
++      }
++
++      if (pos != len)
++              return NULL;
++
++      return (struct atsc_eit_section *) psip;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/eit_section.h dvb-apps/lib/libucsi/atsc/eit_section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/eit_section.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/eit_section.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,191 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_ATSC_EIT_SECTION_H
++#define _UCSI_ATSC_EIT_SECTION_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/atsc/section.h>
++#include <libucsi/atsc/types.h>
++
++/**
++ * atsc_eit_section structure.
++ */
++struct atsc_eit_section {
++      struct atsc_section_psip head;
++
++      uint8_t num_events_in_section;
++      /* struct atsc_eit_event events[] */
++} __ucsi_packed;
++
++struct atsc_eit_event {
++  EBIT2(uint16_t reserved                     : 2; ,
++      uint16_t event_id                       :14; );
++      atsctime_t start_time;
++  EBIT4(uint32_t reserved1                    : 2; ,
++      uint32_t ETM_location                   : 2; ,
++      uint32_t length_in_seconds              :20; ,
++      uint32_t title_length                   : 8; );
++      /* struct atsc_text title_text */
++      /* struct atsc_eit_event_part2 part2 */
++} __ucsi_packed;
++
++struct atsc_eit_event_part2 {
++  EBIT2(uint16_t reserved                     : 4; ,
++      uint16_t descriptors_length             :12; );
++      /* struct descriptor descriptors[] */
++} __ucsi_packed;
++
++
++/**
++ * Process a atsc_eit_section.
++ *
++ * @param section Pointer to an atsc_section_psip structure.
++ * @return atsc_eit_section pointer, or NULL on error.
++ */
++struct atsc_eit_section *atsc_eit_section_codec(struct atsc_section_psip *section);
++
++/**
++ * Accessor for the source_id field of an EIT.
++ *
++ * @param eit EIT pointer.
++ * @return The source_id .
++ */
++static inline uint16_t atsc_eit_section_source_id(struct atsc_eit_section *eit)
++{
++      return eit->head.ext_head.table_id_ext;
++}
++
++/**
++ * Iterator for the events field in an atsc_eit_section.
++ *
++ * @param eit atsc_eit_section pointer.
++ * @param pos Variable containing a pointer to the current atsc_eit_event.
++ * @param idx Integer used to count which event we are in.
++ */
++#define atsc_eit_section_events_for_each(eit, pos, idx) \
++      for ((pos) = atsc_eit_section_events_first(eit), idx=0; \
++           (pos); \
++           (pos) = atsc_eit_section_events_next(eit, pos, ++idx))
++
++/**
++ * Accessor for the title_text field of an atsc_eit_event.
++ *
++ * @param event atsc_eit_event pointer.
++ * @return struct atsc_text pointer, or NULL on error.
++ */
++static inline struct atsc_text *atsc_eit_event_name_title_text(struct atsc_eit_event *event)
++{
++      if (event->title_length == 0)
++              return NULL;
++
++      return (struct atsc_text*)(((uint8_t*) event) + sizeof(struct atsc_eit_event));
++}
++
++/**
++ * Accessor for the part2 field of an atsc_eit_event.
++ *
++ * @param event atsc_eit_event pointer.
++ * @return struct atsc_eit_event_part2 pointer.
++ */
++static inline struct atsc_eit_event_part2 *atsc_eit_event_part2(struct atsc_eit_event *event)
++{
++      return (struct atsc_eit_event_part2 *)
++              (((uint8_t*) event) + sizeof(struct atsc_eit_event) + event->title_length);
++}
++
++/**
++ * Iterator for the descriptors field in a atsc_eit_section structure.
++ *
++ * @param part2 atsc_eit_event_part2 pointer.
++ * @param pos Variable containing a pointer to the current descriptor.
++ */
++#define atsc_eit_event_part2_descriptors_for_each(part2, pos) \
++      for ((pos) = atsc_eit_event_part2_descriptors_first(part2); \
++           (pos); \
++           (pos) = atsc_eit_event_part2_descriptors_next(part2, pos))
++
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct atsc_eit_event *
++      atsc_eit_section_events_first(struct atsc_eit_section *eit)
++{
++      size_t pos = sizeof(struct atsc_eit_section);
++
++      if (eit->num_events_in_section == 0)
++              return NULL;
++
++      return (struct atsc_eit_event*) (((uint8_t *) eit) + pos);
++}
++
++static inline struct atsc_eit_event *
++      atsc_eit_section_events_next(struct atsc_eit_section *eit,
++                                   struct atsc_eit_event *pos,
++                                   int idx)
++{
++      if (idx >= eit->num_events_in_section)
++              return NULL;
++
++      struct atsc_eit_event_part2 *part2 = atsc_eit_event_part2(pos);
++      int len = sizeof(struct atsc_eit_event_part2);
++      len += part2->descriptors_length;
++
++      return (struct atsc_eit_event *) (((uint8_t*) part2) + len);
++}
++
++static inline struct descriptor *
++      atsc_eit_event_part2_descriptors_first(struct atsc_eit_event_part2 *part2)
++{
++      size_t pos = sizeof(struct atsc_eit_event_part2);
++
++      if (part2->descriptors_length == 0)
++              return NULL;
++
++      return (struct descriptor*) (((uint8_t *) part2) + pos);
++}
++
++static inline struct descriptor *
++      atsc_eit_event_part2_descriptors_next(struct atsc_eit_event_part2 *part2,
++                                            struct descriptor *pos)
++{
++      return next_descriptor((uint8_t*) part2 + sizeof(struct atsc_eit_event_part2),
++                              part2->descriptors_length,
++                              pos);
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/ett_section.c dvb-apps/lib/libucsi/atsc/ett_section.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/ett_section.c      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/ett_section.c    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,42 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <libucsi/atsc/ett_section.h>
++#include <libucsi/atsc/types.h>
++
++struct atsc_ett_section *atsc_ett_section_codec(struct atsc_section_psip *psip)
++{
++      uint8_t * buf = (uint8_t *) psip;
++      size_t pos = sizeof(struct atsc_section_psip);
++      size_t len = section_ext_length(&(psip->ext_head));
++
++      if (len < sizeof(struct atsc_ett_section))
++              return NULL;
++
++      bswap32(buf + pos);
++      pos += 4;
++
++      if (atsc_text_validate(buf + pos,
++                             section_ext_length(&psip->ext_head) - sizeof(struct atsc_ett_section)))
++              return NULL;
++
++      return (struct atsc_ett_section *) psip;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/ett_section.h dvb-apps/lib/libucsi/atsc/ett_section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/ett_section.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/ett_section.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,91 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_ATSC_ETT_SECTION_H
++#define _UCSI_ATSC_ETT_SECTION_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/atsc/section.h>
++
++enum atsc_etm_type {
++      ATSC_ETM_CHANNEL        = 0x00,
++      ATSC_ETM_EVENT          = 0x02,
++};
++
++/**
++ * atsc_ett_section structure.
++ */
++struct atsc_ett_section {
++      struct atsc_section_psip head;
++
++  EBIT3(uint32_t ETM_source_id                        :16; ,
++      uint32_t ETM_sub_id                     :14; ,
++      uint32_t ETM_type                       : 2; );
++      /* struct atsc_text extended_text_message */
++} __ucsi_packed;
++
++/**
++ * Process a atsc_ett_section.
++ *
++ * @param section Pointer to an atsc_section_psip structure.
++ * @return atsc_ett_section pointer, or NULL on error.
++ */
++struct atsc_ett_section *atsc_ett_section_codec(struct atsc_section_psip *section);
++
++/**
++ * Accessor for the extended_text_message part of an atsc_ett_section.
++ *
++ * @param ett atsc_ett_section pointer.
++ * @return atsc_text pointer, or NULL on error.
++ */
++static inline struct atsc_text*
++      atsc_ett_section_extended_text_message(struct atsc_ett_section *ett)
++{
++      int pos = sizeof(struct atsc_ett_section);
++      int len = section_ext_length(&ett->head.ext_head) - sizeof(struct atsc_ett_section);
++
++      if (len == 0)
++              return NULL;
++
++      return (struct atsc_text*)(((uint8_t*) ett) + pos);
++}
++
++/**
++ * Accessor for the extended_text_message part of an atsc_ett_section.
++ *
++ * @param ett atsc_ett_section pointer.
++ * @return The length.
++ */
++static inline int
++      atsc_ett_section_extended_text_message_length(struct atsc_ett_section *ett)
++{
++      return section_ext_length(&ett->head.ext_head) - sizeof(struct atsc_ett_section);
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/extended_channel_name_descriptor.h dvb-apps/lib/libucsi/atsc/extended_channel_name_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/extended_channel_name_descriptor.h 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/extended_channel_name_descriptor.h       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,92 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_ATSC_EXTENDED_CHANNEL_NAME_DESCRIPTOR
++#define _UCSI_ATSC_EXTENDED_CHANNEL_NAME_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++#include <libucsi/types.h>
++#include <libucsi/atsc/types.h>
++
++/**
++ * atsc_extended_channel_name_descriptor structure.
++ */
++struct atsc_extended_channel_name_descriptor {
++      struct descriptor d;
++
++      /* struct atsc_text text[] */
++} __ucsi_packed;
++
++/**
++ * Process an atsc_extended_channel_name_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return atsc_extended_channel_name_descriptor pointer, or NULL on error.
++ */
++static inline struct atsc_extended_channel_name_descriptor*
++      atsc_extended_channel_name_descriptor_codec(struct descriptor* d)
++{
++      if (atsc_text_validate(((uint8_t*) d) + sizeof(struct atsc_extended_channel_name_descriptor),
++                             d->len))
++              return NULL;
++
++      return (struct atsc_extended_channel_name_descriptor*) d;
++}
++
++/**
++ * Accessor for the text field of an atsc_extended_channel_name_descriptor.
++ *
++ * @param d atsc_extended_channel_name_descriptor pointer.
++ * @return Pointer to the atsc_text data, or NULL on error.
++ */
++static inline struct atsc_text*
++      atsc_extended_channel_name_descriptor_text(struct atsc_extended_channel_name_descriptor *d)
++{
++      uint8_t *txt = ((uint8_t*) d) + sizeof(struct atsc_extended_channel_name_descriptor);
++
++      return (struct atsc_text*) txt;
++}
++
++/**
++ * Accessor for the length of the text field of an atsc_extended_channel_name_descriptor.
++ *
++ * @param d atsc_extended_channel_name_descriptor pointer.
++ * @return The length in bytes.
++ */
++static inline int
++      atsc_extended_channel_name_descriptor_text_length(struct
++                                                      atsc_extended_channel_name_descriptor *d)
++{
++      return d->d.len;
++}
++
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/genre_descriptor.h dvb-apps/lib/libucsi/atsc/genre_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/genre_descriptor.h 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/genre_descriptor.h       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,82 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_ATSC_GENRE_DESCRIPTOR
++#define _UCSI_ATSC_GENRE_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++#include <libucsi/types.h>
++
++/**
++ * atsc_genre_descriptor structure.
++ */
++struct atsc_genre_descriptor {
++      struct descriptor d;
++
++  EBIT2(uint8_t reserved              : 3; ,
++      uint8_t attribute_count         : 5; );
++      /* uint8_t attributes[] */
++} __ucsi_packed;
++
++/**
++ * Process an atsc_genre_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return atsc_genre_descriptor pointer, or NULL on error.
++ */
++static inline struct atsc_genre_descriptor*
++      atsc_genre_descriptor_codec(struct descriptor* d)
++{
++      struct atsc_genre_descriptor *ret =
++              (struct atsc_genre_descriptor *) d;
++
++      if (d->len < 1)
++              return NULL;
++
++      if (d->len != (1 + ret->attribute_count))
++              return NULL;
++
++      return (struct atsc_genre_descriptor*) d;
++}
++
++/**
++ * Accessor for the attributes field of an atsc_genre_descriptor.
++ *
++ * @param d atsc_genre_descriptor pointer.
++ * @return Pointer to the attributes.
++ */
++static inline uint8_t*
++      atsc_genre_descriptor_attributes(struct atsc_genre_descriptor *d)
++{
++      return ((uint8_t*) d) + sizeof(struct atsc_genre_descriptor);
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/Makefile dvb-apps/lib/libucsi/atsc/Makefile
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/Makefile   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/Makefile 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,55 @@
++# Makefile for linuxtv.org dvb-apps/lib/libucsi/atsc
++
++.PHONY: sub-error-atsc
++
++sub-error-atsc:
++      $(error You can't use this makefile directly.)
++
++ifneq ($(lib_name),)
++
++objects += atsc/atsc_text.o      \
++           atsc/cvct_section.o   \
++           atsc/dccsct_section.o \
++           atsc/dcct_section.o   \
++           atsc/eit_section.o    \
++           atsc/ett_section.o    \
++           atsc/mgt_section.o    \
++           atsc/rrt_section.o    \
++           atsc/stt_section.o    \
++           atsc/tvct_section.o   \
++           atsc/types.o
++
++sub-install += atsc
++
++else
++
++includes = ac3_descriptor.h                   \
++           caption_service_descriptor.h       \
++           component_name_descriptor.h        \
++           content_advisory_descriptor.h      \
++           cvct_section.h                     \
++           dcc_arriving_request_descriptor.h  \
++           dcc_departing_request_descriptor.h \
++           dccsct_section.h                   \
++           dcct_section.h                     \
++           descriptor.h                       \
++           eit_section.h                      \
++           ett_section.h                      \
++           extended_channel_name_descriptor.h \
++           genre_descriptor.h                 \
++           mgt_section.h                      \
++           rc_descriptor.h                    \
++           rrt_section.h                      \
++           section.h                          \
++           service_location_descriptor.h      \
++           stt_section.h                      \
++           stuffing_descriptor.h              \
++           time_shifted_service_descriptor.h  \
++           tvct_section.h                     \
++           types.h
++
++include ../../../Make.rules
++
++lib_name = libucsi/atsc
++
++endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/mgt_section.c dvb-apps/lib/libucsi/atsc/mgt_section.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/mgt_section.c      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/mgt_section.c    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,76 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <libucsi/atsc/mgt_section.h>
++
++struct atsc_mgt_section *atsc_mgt_section_codec(struct atsc_section_psip *psip)
++{
++      uint8_t * buf = (uint8_t *) psip;
++      size_t pos = sizeof(struct atsc_section_psip);
++      size_t len = section_ext_length(&(psip->ext_head));
++      struct atsc_mgt_section *mgt = (struct atsc_mgt_section *) psip;
++      int i;
++
++      if (len < sizeof(struct atsc_mgt_section))
++              return NULL;
++
++      bswap16(buf + pos);
++      pos += 2;
++
++      // we cannot use the tables_defined value here because of the braindead ATSC spec!
++      for(i=0; i < mgt->tables_defined; i++) {
++              // we think we're still in the tables - process as normal
++              if ((pos + sizeof(struct atsc_mgt_table)) > len)
++                      return NULL;
++              struct atsc_mgt_table *table = (struct atsc_mgt_table *) (buf+pos);
++
++              bswap16(buf+pos);
++              bswap16(buf+pos+2);
++              bswap32(buf+pos+5);
++              bswap16(buf+pos+9);
++
++              pos += sizeof(struct atsc_mgt_table);
++              if ((pos + table->table_type_descriptors_length) > len)
++                      return NULL;
++              if (verify_descriptors(buf + pos, table->table_type_descriptors_length))
++                      return NULL;
++
++              pos += table->table_type_descriptors_length;
++      }
++
++      if ((pos + sizeof(struct atsc_mgt_section_part2)) > len)
++              return NULL;
++      struct atsc_mgt_section_part2 *part2 = (struct atsc_mgt_section_part2 *) (buf+pos);
++
++      bswap16(buf+pos);
++
++      pos += sizeof(struct atsc_mgt_section_part2);
++      if ((pos + part2->descriptors_length) > len)
++              return NULL;
++      if (verify_descriptors(buf + pos, part2->descriptors_length))
++              return NULL;
++      pos += part2->descriptors_length;
++
++      if (pos != len)
++              return NULL;
++
++      return (struct atsc_mgt_section *) psip;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/mgt_section.h dvb-apps/lib/libucsi/atsc/mgt_section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/mgt_section.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/mgt_section.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,215 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_ATSC_MGT_SECTION_H
++#define _UCSI_ATSC_MGT_SECTION_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/atsc/section.h>
++
++enum atsc_mgt_section_table_type {
++      ATSC_MGT_TABLE_TYPE_TVCT_CURRENT = 0,
++      ATSC_MGT_TABLE_TYPE_TVCT_NEXT = 1,
++      ATSC_MGT_TABLE_TYPE_CVCT_CURRENT = 2,
++      ATSC_MGT_TABLE_TYPE_CVCT_NEXT = 3,
++      ATSC_MGT_TABLE_TYPE_CHANNEL_ETT = 4,
++      ATSC_MGT_TABLE_TYPE_DCCSCT = 5,
++};
++
++/**
++ * atsc_mgt_section structure.
++ */
++struct atsc_mgt_section {
++      struct atsc_section_psip head;
++
++      uint16_t tables_defined;
++      /* struct atsc_mgt_table tables[] */
++      /* struct atsc_mgt_section_part2 part2 */
++} __ucsi_packed;
++
++struct atsc_mgt_table {
++      uint16_t table_type;
++  EBIT2(uint16_t reserved                     : 3; ,
++      uint16_t table_type_PID                 :13; );
++  EBIT2(uint8_t reserved1                     : 3; ,
++      uint8_t table_type_version_number       : 5; );
++      uint32_t number_bytes;
++  EBIT2(uint16_t reserved2                    : 4; ,
++      uint16_t table_type_descriptors_length  :12; );
++      /* struct descriptor descriptors[] */
++} __ucsi_packed;
++
++struct atsc_mgt_section_part2 {
++  EBIT2(uint16_t reserved                     : 4; ,
++      uint16_t descriptors_length             :12; );
++      /* struct descriptor descriptors[] */
++} __ucsi_packed;
++
++static inline struct atsc_mgt_table * atsc_mgt_section_tables_first(struct atsc_mgt_section *mgt);
++static inline struct atsc_mgt_table *
++      atsc_mgt_section_tables_next(struct atsc_mgt_section *mgt, struct atsc_mgt_table *pos, int idx);
++
++/**
++ * Process a atsc_mgt_section.
++ *
++ * @param section Pointer to an atsc_section_psip structure.
++ * @return atsc_mgt_section pointer, or NULL on error.
++ */
++struct atsc_mgt_section *atsc_mgt_section_codec(struct atsc_section_psip *section);
++
++/**
++ * Iterator for the tables field in an atsc_mgt_section.
++ *
++ * @param mgt atsc_mgt_section pointer.
++ * @param pos Variable containing a pointer to the current atsc_mgt_table.
++ * @param idx Integer used to count which table we in.
++ */
++#define atsc_mgt_section_tables_for_each(mgt, pos, idx) \
++      for ((pos) = atsc_mgt_section_tables_first(mgt), idx=0; \
++           (pos); \
++           (pos) = atsc_mgt_section_tables_next(mgt, pos, ++idx))
++
++/**
++ * Iterator for the descriptors field in a atsc_mgt_table structure.
++ *
++ * @param table atsc_mgt_table pointer.
++ * @param pos Variable containing a pointer to the current descriptor.
++ */
++#define atsc_mgt_table_descriptors_for_each(table, pos) \
++      for ((pos) = atsc_mgt_table_descriptors_first(table); \
++           (pos); \
++           (pos) = atsc_mgt_table_descriptors_next(table, pos))
++
++/**
++ * Accessor for the second part of an atsc_mgt_section.
++ *
++ * @param mgt atsc_mgt_section pointer.
++ * @return atsc_mgt_section_part2 pointer.
++ */
++static inline struct atsc_mgt_section_part2 *
++      atsc_mgt_section_part2(struct atsc_mgt_section *mgt)
++{
++      int pos = sizeof(struct atsc_mgt_section);
++
++      struct atsc_mgt_table *cur_table;
++      int idx;
++      atsc_mgt_section_tables_for_each(mgt, cur_table, idx) {
++              pos += sizeof(struct atsc_mgt_table);
++              pos += cur_table->table_type_descriptors_length;
++      }
++
++      return (struct atsc_mgt_section_part2 *) (((uint8_t*) mgt) + pos);
++}
++
++/**
++ * Iterator for the descriptors field in a atsc_mgt_section structure.
++ *
++ * @param part2 atsc_mgt_section_part2 pointer.
++ * @param pos Variable containing a pointer to the current descriptor.
++ */
++#define atsc_mgt_section_part2_descriptors_for_each(part2, pos) \
++      for ((pos) = atsc_mgt_section_part2_descriptors_first(part2); \
++           (pos); \
++           (pos) = atsc_mgt_section_part2_descriptors_next(part2, pos))
++
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct atsc_mgt_table *
++      atsc_mgt_section_tables_first(struct atsc_mgt_section *mgt)
++{
++      size_t pos = sizeof(struct atsc_mgt_section);
++
++      if (mgt->tables_defined == 0)
++              return NULL;
++
++      return (struct atsc_mgt_table*) (((uint8_t *) mgt) + pos);
++}
++
++static inline struct atsc_mgt_table *
++      atsc_mgt_section_tables_next(struct atsc_mgt_section *mgt,
++                                   struct atsc_mgt_table *pos,
++                                   int idx)
++{
++      if (idx >= mgt->tables_defined)
++              return NULL;
++
++      return (struct atsc_mgt_table *)
++              (((uint8_t*) pos) + sizeof(struct atsc_mgt_table) + pos->table_type_descriptors_length);
++}
++
++static inline struct descriptor *
++      atsc_mgt_table_descriptors_first(struct atsc_mgt_table *table)
++{
++      size_t pos = sizeof(struct atsc_mgt_table);
++
++      if (table->table_type_descriptors_length == 0)
++              return NULL;
++
++      return (struct descriptor*) (((uint8_t *) table) + pos);
++}
++
++static inline struct descriptor *
++      atsc_mgt_table_descriptors_next(struct atsc_mgt_table *table,
++                                      struct descriptor *pos)
++{
++      return next_descriptor((uint8_t*) table + sizeof(struct atsc_mgt_table),
++                              table->table_type_descriptors_length,
++                              pos);
++}
++
++static inline struct descriptor *
++      atsc_mgt_section_part2_descriptors_first(struct atsc_mgt_section_part2 *part2)
++{
++      size_t pos = sizeof(struct atsc_mgt_section_part2);
++
++      if (part2->descriptors_length == 0)
++              return NULL;
++
++      return (struct descriptor*) (((uint8_t *) part2) + pos);
++}
++
++static inline struct descriptor *
++      atsc_mgt_section_part2_descriptors_next(struct atsc_mgt_section_part2 *part2,
++                                              struct descriptor *pos)
++{
++      return next_descriptor((uint8_t*) part2 + sizeof(struct atsc_mgt_section_part2),
++                              part2->descriptors_length,
++                              pos);
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/rc_descriptor.h dvb-apps/lib/libucsi/atsc/rc_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/rc_descriptor.h    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/rc_descriptor.h  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,83 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_ATSC_RC_DESCRIPTOR
++#define _UCSI_ATSC_RC_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++#include <libucsi/types.h>
++
++/**
++ * atsc_rc_descriptor structure.
++ */
++struct atsc_rc_descriptor {
++      struct descriptor d;
++
++      /* uint8_t info[] */
++} __ucsi_packed;
++
++/**
++ * Process an atsc_rc_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return atsc_rc_descriptor pointer, or NULL on error.
++ */
++static inline struct atsc_rc_descriptor*
++      atsc_rc_descriptor_codec(struct descriptor* d)
++{
++      return (struct atsc_rc_descriptor*) d;
++}
++
++/**
++ * Accessor for the info field of an atsc_rc_descriptor.
++ *
++ * @param d atsc_rc_descriptor pointer.
++ * @return Pointer to the atsc_text data.
++ */
++static inline uint8_t*
++      atsc_rc_descriptor_info(struct atsc_rc_descriptor *d)
++{
++      return ((uint8_t*) d) + sizeof(struct atsc_rc_descriptor);
++}
++
++/**
++ * Accessor for the length of the info field of an atsc_rc_descriptor.
++ *
++ * @param d atsc_rc_descriptor pointer.
++ * @return The length
++ */
++static inline int
++      atsc_rc_descriptor_info_length(struct atsc_rc_descriptor *d)
++{
++      return d->d.len;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/rrt_section.c dvb-apps/lib/libucsi/atsc/rrt_section.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/rrt_section.c      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/rrt_section.c    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,108 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <libucsi/atsc/rrt_section.h>
++
++struct atsc_rrt_section *atsc_rrt_section_codec(struct atsc_section_psip *psip)
++{
++      uint8_t * buf = (uint8_t *) psip;
++      size_t pos = 0;
++      size_t len = section_ext_length(&(psip->ext_head));
++      int idx;
++      int vidx;
++      struct atsc_rrt_section *rrt = (struct atsc_rrt_section *) psip;
++
++      if (len < sizeof(struct atsc_rrt_section))
++              return NULL;
++      pos += sizeof(struct atsc_rrt_section);
++
++      if (len < (pos + rrt->rating_region_name_length))
++              return NULL;
++      if (atsc_text_validate(buf+pos, rrt->rating_region_name_length))
++              return NULL;
++
++      pos += rrt->rating_region_name_length;
++      if (len < (pos + sizeof(struct atsc_rrt_section_part2)))
++              return NULL;
++      struct atsc_rrt_section_part2 *rrtpart2 = (struct atsc_rrt_section_part2 *) (buf+pos);
++
++      pos += sizeof(struct atsc_rrt_section_part2);
++      for(idx =0; idx < rrtpart2->dimensions_defined; idx++) {
++              if (len < (pos + sizeof(struct atsc_rrt_dimension)))
++                      return NULL;
++              struct atsc_rrt_dimension *dimension = (struct atsc_rrt_dimension *) (buf+pos);
++
++              pos += sizeof(struct atsc_rrt_dimension);
++              if (len < (pos + dimension->dimension_name_length))
++                      return NULL;
++              if (atsc_text_validate(buf+pos, dimension->dimension_name_length))
++                      return NULL;
++
++              pos += dimension->dimension_name_length;
++              if (len < (pos + sizeof(struct atsc_rrt_dimension_part2)))
++                      return NULL;
++              struct atsc_rrt_dimension_part2 *dpart2 = (struct atsc_rrt_dimension_part2 *) (buf+pos);
++
++              pos += sizeof(struct atsc_rrt_dimension_part2);
++              for(vidx =0; vidx < dpart2->values_defined; vidx++) {
++                      if (len < (pos + sizeof(struct atsc_rrt_dimension_value)))
++                              return NULL;
++                      struct atsc_rrt_dimension_value *value = (struct atsc_rrt_dimension_value *) (buf+pos);
++
++                      pos += sizeof(struct atsc_rrt_dimension_value);
++                      if (len < (pos + value->abbrev_rating_value_length))
++                              return NULL;
++                      if (atsc_text_validate(buf+pos, value->abbrev_rating_value_length))
++                              return NULL;
++
++                      pos += value->abbrev_rating_value_length;
++                      if (len < (pos + sizeof(struct atsc_rrt_dimension_value_part2)))
++                              return NULL;
++                      struct atsc_rrt_dimension_value_part2 *vpart2 =
++                              (struct atsc_rrt_dimension_value_part2 *) (buf+pos);
++
++                      pos += sizeof(struct atsc_rrt_dimension_value_part2);
++                      if (len < (pos + vpart2->rating_value_length))
++                              return NULL;
++                      if (atsc_text_validate(buf+pos, vpart2->rating_value_length))
++                              return NULL;
++
++                      pos+= vpart2->rating_value_length;
++              }
++      }
++
++      if (len < (pos + sizeof(struct atsc_rrt_section_part3)))
++              return NULL;
++      struct atsc_rrt_section_part3 *part3 = (struct atsc_rrt_section_part3 *) (buf+pos);
++
++      pos += sizeof(struct atsc_rrt_section_part3);
++      if (len < (pos + part3->descriptors_length))
++              return NULL;
++
++      if (verify_descriptors(buf + pos, part3->descriptors_length))
++              return NULL;
++
++      pos += part3->descriptors_length;
++      if (pos != len)
++              return NULL;
++
++      return (struct atsc_rrt_section *) psip;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/rrt_section.h dvb-apps/lib/libucsi/atsc/rrt_section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/rrt_section.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/rrt_section.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,379 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_ATSC_RRT_SECTION_H
++#define _UCSI_ATSC_RRT_SECTION_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/atsc/section.h>
++#include <libucsi/atsc/types.h>
++
++/**
++ * atsc_rrt_section structure.
++ */
++struct atsc_rrt_section {
++      struct atsc_section_psip head;
++
++      uint8_t rating_region_name_length;
++      /* struct atsc_text rating_region_name_text */
++      /* struct atsc_rrt_section_part2 part2 */
++} __ucsi_packed;
++
++struct atsc_rrt_section_part2 {
++      uint8_t dimensions_defined;
++      /* struct atsc_rrt_dimension dimensions[] */
++      /* struct atsc_rrt_section_part3 part3 */
++} __ucsi_packed;
++
++struct atsc_rrt_dimension {
++      uint8_t dimension_name_length;
++      /* struct atsc_text dimension_name_text */
++      /* struct atsc_rrt_dimension_part2 part2 */
++} __ucsi_packed;
++
++struct atsc_rrt_dimension_part2 {
++  EBIT3(uint8_t reserved                      : 3; ,
++      uint8_t graduated_scale                 : 1; ,
++      uint8_t values_defined                  : 4; );
++      /* struct atsc_rrt_dimension_value values[] */
++} __ucsi_packed;
++
++struct atsc_rrt_dimension_value {
++      uint8_t abbrev_rating_value_length;
++      /* struct atsc_text abbrev_rating_value_text */
++      /* struct atsc_rrt_dimension_value_part2 */
++} __ucsi_packed;
++
++struct atsc_rrt_dimension_value_part2 {
++      uint8_t rating_value_length;
++      /* struct atsc_text rating_value_text */
++} __ucsi_packed;
++
++struct atsc_rrt_section_part3 {
++  EBIT2(uint16_t reserved                     : 6; ,
++      uint16_t descriptors_length             :10; );
++      /* struct descriptor descriptors[] */
++} __ucsi_packed;
++
++
++static inline struct atsc_rrt_dimension *
++              atsc_rrt_section_dimensions_first(struct atsc_rrt_section_part2 *part2);
++static inline struct atsc_rrt_dimension *
++              atsc_rrt_section_dimensions_next(struct atsc_rrt_section_part2 *part2,
++              struct atsc_rrt_dimension *pos,
++              int idx);
++static inline struct atsc_rrt_dimension_value *
++              atsc_rrt_dimension_part2_values_first(struct atsc_rrt_dimension_part2 *part2);
++static inline struct atsc_rrt_dimension_value *
++              atsc_rrt_dimension_part2_values_next(struct atsc_rrt_dimension_part2 *part2,
++              struct atsc_rrt_dimension_value *pos,
++              int idx);
++
++/**
++ * Process a atsc_rrt_section.
++ *
++ * @param section Pointer to anj atsc_section_psip structure.
++ * @return atsc_rrt_section pointer, or NULL on error.
++ */
++struct atsc_rrt_section *atsc_rrt_section_codec(struct atsc_section_psip *section);
++
++/**
++ * Accessor for the rating_region field of an RRT.
++ *
++ * @param rrt RRT pointer.
++ * @return The transport_stream_id.
++ */
++static inline uint8_t atsc_rrt_section_rating_region(struct atsc_rrt_section *rrt)
++{
++      return rrt->head.ext_head.table_id_ext & 0xff;
++}
++
++/**
++ * Accessor for the rating_region_name_text field of an RRT.
++ *
++ * @param rrt RRT pointer.
++ * @return struct atsc_text pointer, or NULL.
++ */
++static inline struct atsc_text *atsc_rrt_section_rating_region_name_text(struct atsc_rrt_section *rrt)
++{
++      if (rrt->rating_region_name_length == 0)
++              return NULL;
++
++      return (struct atsc_text*)(((uint8_t*) rrt) + sizeof(struct atsc_rrt_section));
++}
++
++/**
++ * Accessor for the part2 field of an RRT.
++ *
++ * @param rrt RRT pointer.
++ * @return struct atsc_rrt_section_part2 pointer.
++ */
++static inline struct atsc_rrt_section_part2 *atsc_rrt_section_part2(struct atsc_rrt_section *rrt)
++{
++      return (struct atsc_rrt_section_part2 *)
++              (((uint8_t*) rrt) + sizeof(struct atsc_rrt_section) +
++                      rrt->rating_region_name_length);
++}
++
++/**
++ * Iterator for the dimensions field in an atsc_rrt_section_part2.
++ *
++ * @param rrt atsc_rrt_section pointer.
++ * @param pos Variable containing a pointer to the current atsc_rrt_dimension.
++ * @param idx Integer used to count which dimension we are in.
++ */
++#define atsc_rrt_section_dimensions_for_each(rrt, pos, idx) \
++      for ((pos) = atsc_rrt_section_dimensions_first(rrt), idx=0; \
++           (pos); \
++           (pos) = atsc_rrt_section_dimensions_next(rrt, pos, ++idx))
++
++/**
++ * Accessor for the dimension_name_text field of an atsc_rrt_dimension.
++ *
++ * @param dimension atsc_rrt_dimension pointer.
++ * @return struct atsc_text pointer, or NULL on error.
++ */
++static inline struct atsc_text *atsc_rrt_dimension_name_text(struct atsc_rrt_dimension *dimension)
++{
++      if (dimension->dimension_name_length == 0)
++              return NULL;
++
++      return (struct atsc_text*)(((uint8_t*) dimension) + sizeof(struct atsc_rrt_dimension));
++}
++
++/**
++ * Accessor for the part2 field of an atsc_rrt_dimension.
++ *
++ * @param dimension atsc_rrt_dimension pointer.
++ * @return struct atsc_rrt_dimension_part2 pointer.
++ */
++static inline struct atsc_rrt_dimension_part2 *atsc_rrt_dimension_part2(struct atsc_rrt_dimension *dimension)
++{
++      return (struct atsc_rrt_dimension_part2 *)
++                      (((uint8_t*) dimension) +
++                      sizeof(struct atsc_rrt_dimension) +
++                      dimension->dimension_name_length);
++}
++
++/**
++ * Iterator for the values field in a atsc_rrt_dimension_part2 structure.
++ *
++ * @param part2 atsc_rrt_dimension_part2 pointer.
++ * @param pos Variable containing a pointer to the current value.
++ * @param idx Integer used to count which value we are in
++ */
++#define atsc_rrt_dimension_part2_values_for_each(part2, pos, idx) \
++      for ((pos) = atsc_rrt_dimension_part2_values_first(part2), idx=0; \
++           (pos); \
++           (pos) = atsc_rrt_dimension_part2_values_next(part2, pos, ++idx))
++
++/**
++ * Accessor for the dimension_name_text field of an atsc_rrt_dimension.
++ *
++ * @param dimension atsc_rrt_dimension pointer.
++ * @return struct atsc_text pointer.
++ */
++static inline struct atsc_text *
++      atsc_rrt_dimension_value_abbrev_rating_value_text(struct atsc_rrt_dimension_value *value)
++{
++      if (value->abbrev_rating_value_length == 0)
++              return NULL;
++
++      return (struct atsc_text*)(((uint8_t*) value) + sizeof(struct atsc_rrt_dimension_value));
++}
++
++/**
++ * Accessor for the part2 field of an atsc_rrt_dimension_value.
++ *
++ * @param value atsc_rrt_dimension_value pointer.
++ * @return struct atsc_rrt_dimension_value_part2 pointer.
++ */
++static inline struct atsc_rrt_dimension_value_part2 *atsc_rrt_dimension_value_part2(struct atsc_rrt_dimension_value *value)
++{
++      return (struct atsc_rrt_dimension_value_part2 *)
++              (((uint8_t*) value) +
++              sizeof(struct atsc_rrt_dimension_value) +
++              value->abbrev_rating_value_length);
++}
++
++/**
++ * Accessor for the rating_value_text field of an atsc_rrt_dimension_value_part2.
++ *
++ * @param part2 atsc_rrt_dimension_value_part2 pointer.
++ * @return struct atsc_text pointer.
++ */
++static inline struct atsc_text *atsc_rrt_dimension_value_part2_rating_value_text(struct atsc_rrt_dimension_value_part2 *part2)
++{
++      if (part2->rating_value_length == 0)
++              return NULL;
++
++      return (struct atsc_text*)(((uint8_t*) part2) + sizeof(struct atsc_rrt_dimension_value_part2));
++}
++
++/**
++ * Accessor for the third part of an atsc_rrt_section.
++ *
++ * @param part2 atsc_rrt_section_part2 pointer.
++ * @return atsc_rrt_section_part3 pointer.
++ */
++static inline struct atsc_rrt_section_part3 *
++      atsc_rrt_section_part3(struct atsc_rrt_section_part2 *part2)
++{
++      int pos = sizeof(struct atsc_rrt_section_part2);
++
++      struct atsc_rrt_dimension *cur_dimension;
++      int idx;
++      atsc_rrt_section_dimensions_for_each(part2, cur_dimension, idx) {
++              pos += sizeof(struct atsc_rrt_dimension);
++              pos += cur_dimension->dimension_name_length;
++              pos += sizeof(struct atsc_rrt_dimension_part2);
++
++              // now we need to iterate over the values. yuck
++              struct atsc_rrt_dimension_part2 *dpart2 = atsc_rrt_dimension_part2(cur_dimension);
++              struct atsc_rrt_dimension_value *cur_value;
++              int vidx;
++              atsc_rrt_dimension_part2_values_for_each(dpart2, cur_value, vidx) {
++                      pos += sizeof(struct atsc_rrt_dimension_value);
++                      pos += cur_value->abbrev_rating_value_length;
++
++                      struct atsc_rrt_dimension_value_part2 *vpart2 = atsc_rrt_dimension_value_part2(cur_value);
++                      pos += sizeof(struct atsc_rrt_dimension_value_part2);
++                      pos += vpart2->rating_value_length;
++              }
++      }
++
++      return (struct atsc_rrt_section_part3 *) (((uint8_t*) part2) + pos);
++}
++
++/**
++ * Iterator for the descriptors field in a atsc_rrt_section structure.
++ *
++ * @param part3 atsc_rrt_section_part3 pointer.
++ * @param pos Variable containing a pointer to the current descriptor.
++ */
++#define atsc_rrt_section_part3_descriptors_for_each(part3, pos) \
++      for ((pos) = atsc_rrt_section_part3_descriptors_first(part3); \
++           (pos); \
++           (pos) = atsc_rrt_section_part3_descriptors_next(part3, pos))
++
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct atsc_rrt_dimension *
++      atsc_rrt_section_dimensions_first(struct atsc_rrt_section_part2 *part2)
++{
++      size_t pos = sizeof(struct atsc_rrt_section_part2);
++
++      if (part2->dimensions_defined == 0)
++              return NULL;
++
++      return (struct atsc_rrt_dimension*) (((uint8_t *) part2) + pos);
++}
++
++static inline struct atsc_rrt_dimension *
++      atsc_rrt_section_dimensions_next(struct atsc_rrt_section_part2 *part2,
++                                       struct atsc_rrt_dimension *pos,
++                                       int idx)
++{
++      if (idx >= part2->dimensions_defined)
++              return NULL;
++
++      struct atsc_rrt_dimension_part2 *dpart2 = atsc_rrt_dimension_part2(pos);
++      int len = sizeof(struct atsc_rrt_dimension_part2);
++
++      // now we need to iterate over the values. yuck
++      struct atsc_rrt_dimension_value *cur_value;
++      int vidx;
++      atsc_rrt_dimension_part2_values_for_each(dpart2, cur_value, vidx) {
++              len += sizeof(struct atsc_rrt_dimension_value);
++              len += cur_value->abbrev_rating_value_length;
++
++              struct atsc_rrt_dimension_value_part2 *vpart2 = atsc_rrt_dimension_value_part2(cur_value);
++              len += sizeof(struct atsc_rrt_dimension_value_part2);
++              len += vpart2->rating_value_length;
++      }
++
++      return (struct atsc_rrt_dimension *) (((uint8_t*) dpart2) + len);
++}
++
++static inline struct atsc_rrt_dimension_value *
++      atsc_rrt_dimension_part2_values_first(struct atsc_rrt_dimension_part2 *part2)
++{
++      size_t pos = sizeof(struct atsc_rrt_dimension_part2);
++
++      if (part2->values_defined == 0)
++              return NULL;
++
++      return (struct atsc_rrt_dimension_value*) (((uint8_t *) part2) + pos);
++}
++
++static inline struct atsc_rrt_dimension_value *
++      atsc_rrt_dimension_part2_values_next(struct atsc_rrt_dimension_part2 *part2,
++                                           struct atsc_rrt_dimension_value *pos,
++                                           int idx)
++{
++      if (idx >= part2->values_defined)
++              return NULL;
++
++      struct atsc_rrt_dimension_value_part2 *vpart2 = atsc_rrt_dimension_value_part2(pos);
++      int len = sizeof(struct atsc_rrt_dimension_value_part2);
++      len += vpart2->rating_value_length;
++
++      return (struct atsc_rrt_dimension_value *) (((uint8_t*) vpart2) + len);
++}
++
++static inline struct descriptor *
++      atsc_rrt_section_part3_descriptors_first(struct atsc_rrt_section_part3 *part3)
++{
++      size_t pos = sizeof(struct atsc_rrt_section_part3);
++
++      if (part3->descriptors_length == 0)
++              return NULL;
++
++      return (struct descriptor*) (((uint8_t *) part3) + pos);
++}
++
++static inline struct descriptor *
++      atsc_rrt_section_part3_descriptors_next(struct atsc_rrt_section_part3 *part3,
++                                              struct descriptor *pos)
++{
++      return next_descriptor((uint8_t*) part3 + sizeof(struct atsc_rrt_section_part3),
++                              part3->descriptors_length,
++                              pos);
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/section.h dvb-apps/lib/libucsi/atsc/section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/section.h  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/section.h        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,84 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <libucsi/section.h>
++#include <libucsi/atsc/mgt_section.h>
++#include <libucsi/atsc/tvct_section.h>
++#include <libucsi/atsc/cvct_section.h>
++#include <libucsi/atsc/rrt_section.h>
++#include <libucsi/atsc/eit_section.h>
++#include <libucsi/atsc/ett_section.h>
++#include <libucsi/atsc/stt_section.h>
++#include <libucsi/atsc/dcct_section.h>
++#include <libucsi/atsc/dccsct_section.h>
++
++#ifndef _UCSI_ATSC_SECTION_H
++#define _UCSI_ATSC_SECTION_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#define ATSC_BASE_PID 0x1ffb
++
++/**
++ * Enumeration of ATSC section tags.
++ */
++enum atsc_section_tag {
++      stag_atsc_master_guide                                  = 0xc7,
++      stag_atsc_terrestrial_virtual_channel                   = 0xc8,
++      stag_atsc_cable_virtual_channel                         = 0xc9,
++      stag_atsc_rating_region                                 = 0xca,
++      stag_atsc_event_information                             = 0xcb,
++      stag_atsc_extended_text                                 = 0xcc,
++      stag_atsc_system_time                                   = 0xcd,
++};
++
++/**
++ * ATSC specific PSIP section structure.
++ */
++struct atsc_section_psip {
++      struct section_ext              ext_head;
++      uint8_t                         protocol_version;
++} __ucsi_packed;
++
++/**
++ * Decode a PSIP section structure.
++ *
++ * @param section_ext Pointer to the processed section_ext structure.
++ * @return Pointer to the parsed section_psip structure, or NULL if invalid.
++ */
++static inline struct atsc_section_psip *atsc_section_psip_decode(struct section_ext *section_ext)
++{
++      size_t len = section_ext_length(section_ext);
++      if (len < sizeof(struct atsc_section_psip)) {
++              return NULL;
++      }
++
++      return (struct atsc_section_psip *) section_ext;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/service_location_descriptor.h dvb-apps/lib/libucsi/atsc/service_location_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/service_location_descriptor.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/service_location_descriptor.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,141 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_ATSC_SERVICE_LOCATION_DESCRIPTOR
++#define _UCSI_ATSC_SERVICE_LOCATION_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++#include <libucsi/types.h>
++
++enum atsc_stream_types {
++      ATSC_STREAM_TYPE_VIDEO                  = 0x02,
++      ATSC_STREAM_TYPE_AUDIO                  = 0x81,
++};
++
++/**
++ * atsc_service_location_descriptor structure.
++ */
++struct atsc_service_location_descriptor {
++      struct descriptor d;
++
++  EBIT2(uint16_t reserved             : 3; ,
++      uint16_t PCR_PID                :13; );
++      uint8_t number_elements;
++      /* struct atsc_service_location_element elements[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the elements field of an atsc_service_location_descriptor.
++ */
++struct atsc_caption_service_location_element {
++      uint8_t stream_type;
++  EBIT2(uint16_t reserved             : 3; ,
++      uint16_t elementary_PID         :13; );
++      iso639lang_t language_code;
++} __ucsi_packed;
++
++/**
++ * Process an atsc_service_location_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return atsc_service_location_descriptor pointer, or NULL on error.
++ */
++static inline struct atsc_service_location_descriptor*
++      atsc_service_location_descriptor_codec(struct descriptor* d)
++{
++      struct atsc_service_location_descriptor *ret =
++              (struct atsc_service_location_descriptor *) d;
++      uint8_t *buf = (uint8_t*) d + 2;
++      int pos = 0;
++      int idx;
++
++      if (d->len < 3)
++              return NULL;
++      bswap16(buf + pos);
++      pos+=3;
++
++      for(idx = 0; idx < ret->number_elements; idx++) {
++              if (d->len < (pos + sizeof(struct atsc_caption_service_entry)))
++                      return NULL;
++
++              bswap16(buf+pos+1);
++
++              pos += sizeof(struct atsc_caption_service_entry);
++      }
++
++      return (struct atsc_service_location_descriptor*) d;
++}
++
++/**
++ * Iterator for elements field of a atsc_service_location_descriptor.
++ *
++ * @param d atsc_service_location_descriptor pointer.
++ * @param pos Variable holding a pointer to the current atsc_service_location_element.
++ * @param idx Integer used to count which dimension we are in.
++ */
++#define atsc_service_location_descriptor_elements_for_each(d, pos, idx) \
++      for ((pos) = atsc_service_location_descriptor_elements_first(d), idx=0; \
++           (pos); \
++           (pos) = atsc_service_location_descriptor_elements_next(d, pos, ++idx))
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct atsc_caption_service_location_element*
++      atsc_service_location_descriptor_elements_first(struct atsc_service_location_descriptor *d)
++{
++      if (d->number_elements == 0)
++              return NULL;
++
++      return (struct atsc_caption_service_location_element *)
++              ((uint8_t*) d + sizeof(struct atsc_service_location_descriptor));
++}
++
++static inline struct atsc_caption_service_location_element*
++      atsc_service_location_descriptor_elements_next(struct atsc_service_location_descriptor *d,
++                                                     struct atsc_caption_service_location_element *pos,
++                                                     int idx)
++{
++      uint8_t *next = (uint8_t *) pos + sizeof(struct atsc_caption_service_location_element);
++
++      if (idx >= d->number_elements)
++              return NULL;
++      return (struct atsc_caption_service_location_element *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/stt_section.c dvb-apps/lib/libucsi/atsc/stt_section.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/stt_section.c      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/stt_section.c    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,42 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <libucsi/atsc/stt_section.h>
++
++struct atsc_stt_section *atsc_stt_section_codec(struct atsc_section_psip *psip)
++{
++      uint8_t *buf = (uint8_t *) psip;
++      size_t pos = sizeof(struct atsc_section_psip);
++      size_t len = section_ext_length(&(psip->ext_head));
++
++      if (len < sizeof(struct atsc_stt_section))
++              return NULL;
++
++      bswap32(buf + pos);
++      pos += 5;
++      bswap16(buf + pos);
++      pos += 2;
++
++      if (verify_descriptors(buf + pos, len - sizeof(struct atsc_stt_section)))
++              return NULL;
++
++      return (struct atsc_stt_section *) psip;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/stt_section.h dvb-apps/lib/libucsi/atsc/stt_section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/stt_section.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/stt_section.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,105 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_ATSC_STT_SECTION_H
++#define _UCSI_ATSC_STT_SECTION_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/atsc/section.h>
++#include <libucsi/atsc/types.h>
++
++/**
++ * atsc_stt_section structure.
++ */
++struct atsc_stt_section {
++      struct atsc_section_psip head;
++
++      atsctime_t system_time;
++      uint8_t gps_utc_offset;
++  EBIT4(uint16_t DS_status                    : 1; ,
++      uint16_t reserved                       : 2; ,
++      uint16_t DS_day_of_month                : 5; ,
++      uint16_t DS_hour                        : 8; );
++      /* struct descriptor descriptors[] */
++} __ucsi_packed;
++
++/**
++ * Process a atsc_stt_section.
++ *
++ * @param section Pointer to an atsc_section_psip structure.
++ * @return atsc_stt_section pointer, or NULL on error.
++ */
++struct atsc_stt_section *atsc_stt_section_codec(struct atsc_section_psip *section);
++
++/**
++ * Iterator for the services field in a atsc_stt_section.
++ *
++ * @param stt atsc_stt_section pointer.
++ * @param pos Variable containing a pointer to the current descriptor.
++ */
++#define atsc_stt_section_descriptors_for_each(stt, pos) \
++      for ((pos) = atsc_stt_section_descriptors_first(stt); \
++           (pos); \
++           (pos) = atsc_stt_section_descriptors_next(stt, pos))
++
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct descriptor *
++      atsc_stt_section_descriptors_first(struct atsc_stt_section *stt)
++{
++      size_t pos = sizeof(struct atsc_stt_section);
++
++      if (pos >= section_ext_length(&stt->head.ext_head))
++              return NULL;
++
++      return (struct descriptor*) ((uint8_t *) stt + pos);
++}
++
++static inline struct descriptor *
++      atsc_stt_section_descriptors_next(struct atsc_stt_section *stt,
++                                        struct descriptor *pos)
++{
++      int len = section_ext_length(&stt->head.ext_head);
++      len -= sizeof(struct atsc_stt_section);
++
++      return next_descriptor((uint8_t*) stt + sizeof(struct atsc_stt_section),
++                              len,
++                              pos);
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/stuffing_descriptor.h dvb-apps/lib/libucsi/atsc/stuffing_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/stuffing_descriptor.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/stuffing_descriptor.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,82 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_atsc@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_ATSC_STUFFING_DESCRIPTOR
++#define _UCSI_ATSC_STUFFING_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * atsc_stuffing_descriptor.
++ */
++struct atsc_stuffing_descriptor {
++      struct descriptor d;
++
++      /* uint8_t data[] */
++} __ucsi_packed;
++
++/**
++ * Process a atsc_stuffing_descriptor.
++ *
++ * @param d Generic descriptor structure.
++ * @return atsc_stuffing_descriptor pointer, or NULL on error.
++ */
++static inline struct atsc_stuffing_descriptor*
++      atsc_stuffing_descriptor_codec(struct descriptor* d)
++{
++      return (struct atsc_stuffing_descriptor*) d;
++}
++
++/**
++ * Retrieve a pointer to the data field of a atsc_stuffing_descriptor.
++ *
++ * @param d atsc_stuffing_descriptor pointer.
++ * @return Pointer to the field.
++ */
++static inline uint8_t *
++      atsc_stuffing_descriptor_data(struct atsc_stuffing_descriptor *d)
++{
++      return (uint8_t *) d + sizeof(struct atsc_stuffing_descriptor);
++}
++
++/**
++ * Calculate length of the data field of a atsc_stuffing_descriptor.
++ *
++ * @param d atsc_stuffing_descriptor pointer.
++ * @return The length in bytes.
++ */
++static inline int
++      atsc_stuffing_descriptor_data_length(struct atsc_stuffing_descriptor *d)
++{
++      return d->d.len;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/time_shifted_service_descriptor.h dvb-apps/lib/libucsi/atsc/time_shifted_service_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/time_shifted_service_descriptor.h  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/time_shifted_service_descriptor.h        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,136 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_ATSC_TIME_SHIFTED_SERVICE_DESCRIPTOR
++#define _UCSI_ATSC_TIME_SHIFTED_SERVICE_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++#include <libucsi/types.h>
++
++/**
++ * atsc_time_shifted_service_descriptor structure.
++ */
++struct atsc_time_shifted_service_descriptor {
++      struct descriptor d;
++
++  EBIT2(uint8_t reserved              : 3; ,
++      uint8_t number_of_services      : 5; );
++      /* struct atsc_time_shifted_service services[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the services field of an atsc_time_shifted_service_descriptor.
++ */
++struct atsc_time_shifted_service {
++  EBIT2(uint16_t reserved             : 6; ,
++      uint16_t time_shift             :10; );
++  EBIT3(uint32_t reserved2            : 4; ,
++      uint32_t major_channel_number   :10; ,
++      uint32_t minor_channel_number   :10; );
++} __ucsi_packed;
++
++/**
++ * Process an atsc_time_shifted_service_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return atsc_time_shifted_service_descriptor pointer, or NULL on error.
++ */
++static inline struct atsc_time_shifted_service_descriptor*
++      atsc_time_shifted_service_descriptor_codec(struct descriptor* d)
++{
++      struct atsc_time_shifted_service_descriptor *ret =
++              (struct atsc_time_shifted_service_descriptor *) d;
++      uint8_t *buf = (uint8_t*) d + 2;
++      int pos = 0;
++      int idx;
++
++      if (d->len < 1)
++              return NULL;
++      pos++;
++
++      for(idx = 0; idx < ret->number_of_services; idx++) {
++              if (d->len < (pos + sizeof(struct atsc_time_shifted_service)))
++                      return NULL;
++
++              bswap16(buf+pos);
++              bswap24(buf+pos+2);
++
++              pos += sizeof(struct atsc_time_shifted_service);
++      }
++
++      return (struct atsc_time_shifted_service_descriptor*) d;
++}
++
++/**
++ * Iterator for services field of a atsc_time_shifted_service_descriptor.
++ *
++ * @param d atsc_time_shifted_service_descriptor pointer.
++ * @param pos Variable holding a pointer to the current atsc_service_location_element.
++ * @param idx Integer used to count which service we are in.
++ */
++#define atsc_time_shifted_service_descriptor_services_for_each(d, pos, idx) \
++      for ((pos) = atsc_time_shifted_service_descriptor_services_first(d), idx=0; \
++           (pos); \
++           (pos) = atsc_time_shifted_service_descriptor_services_next(d, pos, ++idx))
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct atsc_time_shifted_service*
++      atsc_time_shifted_service_descriptor_services_first(struct atsc_time_shifted_service_descriptor *d)
++{
++      if (d->number_of_services == 0)
++              return NULL;
++
++      return (struct atsc_time_shifted_service *)
++              ((uint8_t*) d + sizeof(struct atsc_time_shifted_service_descriptor));
++}
++
++static inline struct atsc_time_shifted_service*
++      atsc_time_shifted_service_descriptor_services_next(struct atsc_time_shifted_service_descriptor *d,
++                                                         struct atsc_time_shifted_service *pos,
++                                                         int idx)
++{
++      uint8_t *next = (uint8_t *) pos + sizeof(struct atsc_time_shifted_service);
++
++      if (idx >= d->number_of_services)
++              return NULL;
++      return (struct atsc_time_shifted_service *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/tvct_section.c dvb-apps/lib/libucsi/atsc/tvct_section.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/tvct_section.c     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/tvct_section.c   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,81 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <libucsi/atsc/tvct_section.h>
++
++struct atsc_tvct_section *atsc_tvct_section_codec(struct atsc_section_psip *psip)
++{
++      uint8_t * buf = (uint8_t *) psip;
++      size_t pos = sizeof(struct atsc_section_psip);
++      size_t len = section_ext_length(&(psip->ext_head));
++      int idx;
++      struct atsc_tvct_section *tvct = (struct atsc_tvct_section *) psip;
++
++      if (len < sizeof(struct atsc_tvct_section))
++              return NULL;
++
++      pos++;
++
++      for(idx =0; idx < tvct->num_channels_in_section; idx++) {
++
++              if ((pos + sizeof(struct atsc_tvct_channel)) > len)
++                      return NULL;
++              struct atsc_tvct_channel *channel = (struct atsc_tvct_channel *) (buf+pos);
++
++              pos += 7*2;
++
++              bswap32(buf+pos);
++              bswap32(buf+pos+4);
++              bswap16(buf+pos+8);
++              bswap16(buf+pos+10);
++              bswap16(buf+pos+12);
++              bswap16(buf+pos+14);
++              bswap16(buf+pos+16);
++              pos+=18;
++
++              if ((pos + channel->descriptors_length) > len)
++                      return NULL;
++              if (verify_descriptors(buf + pos, channel->descriptors_length))
++                      return NULL;
++
++              pos += channel->descriptors_length;
++      }
++
++      if ((pos + sizeof(struct atsc_tvct_section_part2)) > len)
++              return NULL;
++      struct atsc_tvct_section_part2 *part2 = (struct atsc_tvct_section_part2 *) (buf+pos);
++
++      bswap16(buf+pos);
++      pos+=2;
++
++      if ((pos + part2->descriptors_length) > len)
++              return NULL;
++
++      if (verify_descriptors(buf + pos, part2->descriptors_length))
++              return NULL;
++
++      pos += part2->descriptors_length;
++
++      if (pos != len)
++              return NULL;
++
++      return (struct atsc_tvct_section *) psip;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/tvct_section.h dvb-apps/lib/libucsi/atsc/tvct_section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/tvct_section.h     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/tvct_section.h   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,227 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_ATSC_TVCT_SECTION_H
++#define _UCSI_ATSC_TVCT_SECTION_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/atsc/section.h>
++
++/**
++ * atsc_tvct_section structure.
++ */
++struct atsc_tvct_section {
++      struct atsc_section_psip head;
++
++      uint8_t num_channels_in_section;
++      /* struct atsc_tvct_channel channels[] */
++      /* struct atsc_tvct_channel_part2 part2 */
++} __ucsi_packed;
++
++struct atsc_tvct_channel {
++      uint16_t short_name[7]; // UTF-16 network ordered
++  EBIT4(uint32_t reserved                     : 4; ,
++      uint32_t major_channel_number           :10; ,
++      uint32_t minor_channel_number           :10; ,
++      uint32_t modulation_mode                : 8; );
++      uint32_t carrier_frequency;
++      uint16_t channel_TSID;
++      uint16_t program_number;
++  EBIT7(uint16_t ETM_location                 : 2; ,
++      uint16_t access_controlled              : 1; ,
++      uint16_t hidden                         : 1; ,
++      uint16_t reserved1                      : 2; ,
++      uint16_t hide_guide                     : 1; ,
++      uint16_t reserved2                      : 3; ,
++      uint16_t service_type                   : 6; );
++      uint16_t source_id;
++  EBIT2(uint16_t reserved3                    : 6; ,
++      uint16_t descriptors_length             :10; );
++      /* struct descriptor descriptors[] */
++} __ucsi_packed;
++
++struct atsc_tvct_section_part2 {
++  EBIT2(uint16_t reserved                     : 6; ,
++      uint16_t descriptors_length             :10; );
++      /* struct descriptor descriptors[] */
++} __ucsi_packed;
++
++static inline struct atsc_tvct_channel *atsc_tvct_section_channels_first(struct atsc_tvct_section *tvct);
++static inline struct atsc_tvct_channel *
++      atsc_tvct_section_channels_next(struct atsc_tvct_section *tvct, struct atsc_tvct_channel *pos, int idx);
++
++/**
++ * Process a atsc_tvct_section.
++ *
++ * @param section Pointer to an atsc_section_psip structure.
++ * @return atsc_tvct_section pointer, or NULL on error.
++ */
++struct atsc_tvct_section *atsc_tvct_section_codec(struct atsc_section_psip *section);
++
++/**
++ * Accessor for the transport_stream_id field of a TVCT.
++ *
++ * @param tvct TVCT pointer.
++ * @return The transport_stream_id.
++ */
++static inline uint16_t atsc_tvct_section_transport_stream_id(struct atsc_tvct_section *tvct)
++{
++      return tvct->head.ext_head.table_id_ext;
++}
++
++/**
++ * Iterator for the channels field in an atsc_tvct_section.
++ *
++ * @param mgt atsc_tvct_section pointer.
++ * @param pos Variable containing a pointer to the current atsc_tvct_channel.
++ * @param idx Integer used to count which channel we in.
++ */
++#define atsc_tvct_section_channels_for_each(mgt, pos, idx) \
++      for ((pos) = atsc_tvct_section_channels_first(mgt), idx=0; \
++           (pos); \
++           (pos) = atsc_tvct_section_channels_next(mgt, pos, ++idx))
++
++/**
++ * Iterator for the descriptors field in a atsc_tvct_channel structure.
++ *
++ * @param channel atsc_tvct_channel pointer.
++ * @param pos Variable containing a pointer to the current descriptor.
++ */
++#define atsc_tvct_channel_descriptors_for_each(channel, pos) \
++      for ((pos) = atsc_tvct_channel_descriptors_first(channel); \
++           (pos); \
++           (pos) = atsc_tvct_channel_descriptors_next(channel, pos))
++
++/**
++ * Accessor for the second part of an atsc_tvct_section.
++ *
++ * @param mgt atsc_tvct_section pointer.
++ * @return atsc_tvct_section_part2 pointer.
++ */
++static inline struct atsc_tvct_section_part2 *
++      atsc_tvct_section_part2(struct atsc_tvct_section *mgt)
++{
++      int pos = sizeof(struct atsc_tvct_section);
++
++      struct atsc_tvct_channel *cur_channel;
++      int idx;
++      atsc_tvct_section_channels_for_each(mgt, cur_channel, idx) {
++              pos += sizeof(struct atsc_tvct_channel);
++              pos += cur_channel->descriptors_length;
++      }
++
++      return (struct atsc_tvct_section_part2 *) (((uint8_t*) mgt) + pos);
++}
++
++/**
++ * Iterator for the descriptors field in a atsc_tvct_section structure.
++ *
++ * @param part2 atsc_tvct_section_part2 pointer.
++ * @param pos Variable containing a pointer to the current descriptor.
++ */
++#define atsc_tvct_section_part2_descriptors_for_each(part2, pos) \
++      for ((pos) = atsc_tvct_section_part2_descriptors_first(part2); \
++           (pos); \
++           (pos) = atsc_tvct_section_part2_descriptors_next(part2, pos))
++
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct atsc_tvct_channel *
++      atsc_tvct_section_channels_first(struct atsc_tvct_section *tvct)
++{
++      size_t pos = sizeof(struct atsc_tvct_section);
++
++      if (tvct->num_channels_in_section == 0)
++              return NULL;
++
++      return (struct atsc_tvct_channel*) (((uint8_t *) tvct) + pos);
++}
++
++static inline struct atsc_tvct_channel *
++      atsc_tvct_section_channels_next(struct atsc_tvct_section *tvct,
++                                   struct atsc_tvct_channel *pos,
++                                   int idx)
++{
++      if (idx >= tvct->num_channels_in_section)
++              return NULL;
++
++      return (struct atsc_tvct_channel *)
++              (((uint8_t*) pos) + sizeof(struct atsc_tvct_channel) + pos->descriptors_length);
++}
++
++static inline struct descriptor *
++      atsc_tvct_channel_descriptors_first(struct atsc_tvct_channel *channel)
++{
++      size_t pos = sizeof(struct atsc_tvct_channel);
++
++      if (channel->descriptors_length == 0)
++              return NULL;
++
++      return (struct descriptor*) (((uint8_t *) channel) + pos);
++}
++
++static inline struct descriptor *
++      atsc_tvct_channel_descriptors_next(struct atsc_tvct_channel *channel,
++                                      struct descriptor *pos)
++{
++      return next_descriptor((uint8_t*) channel + sizeof(struct atsc_tvct_channel),
++                              channel->descriptors_length,
++                              pos);
++}
++
++static inline struct descriptor *
++      atsc_tvct_section_part2_descriptors_first(struct atsc_tvct_section_part2 *part2)
++{
++      size_t pos = sizeof(struct atsc_tvct_section_part2);
++
++      if (part2->descriptors_length == 0)
++              return NULL;
++
++      return (struct descriptor*) (((uint8_t *) part2) + pos);
++}
++
++static inline struct descriptor *
++      atsc_tvct_section_part2_descriptors_next(struct atsc_tvct_section_part2 *part2,
++                                               struct descriptor *pos)
++{
++      return next_descriptor((uint8_t*) part2 + sizeof(struct atsc_tvct_section_part2),
++                              part2->descriptors_length,
++                              pos);
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/types.c dvb-apps/lib/libucsi/atsc/types.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/types.c    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/types.c  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,71 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <string.h>
++#include "libucsi/atsc/types.h"
++
++/* GPS epoch == unix time_t at 06/Jan/1980 */
++#define GPS_EPOCH 315964800
++
++
++int atsc_text_validate(uint8_t *buf, int len)
++{
++      int i;
++      int j;
++      int number_strings;
++      int number_segments;
++      int number_bytes;
++      int pos = 0;
++
++      if (len == 0)
++              return 0;
++      number_strings = buf[pos];
++      pos++;
++
++      for(i=0; i< number_strings; i++) {
++              if (len < (pos+4))
++                      return -1;
++              number_segments = buf[pos+3];
++              pos+=4;
++
++              for(j=0; j < number_segments; j++) {
++                      if (len < (pos+3))
++                              return -1;
++                      number_bytes = buf[pos+2];
++                      pos+=3;
++
++                      if (len < (pos + number_bytes))
++                              return -1;
++                      pos += number_bytes;
++              }
++      }
++
++      return 0;
++}
++
++time_t atsctime_to_unixtime(atsctime_t atsc)
++{
++      return atsc + GPS_EPOCH;
++}
++
++atsctime_t unixtime_to_atsctime(time_t t)
++{
++      return t - GPS_EPOCH;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/types.h dvb-apps/lib/libucsi/atsc/types.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/atsc/types.h    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/atsc/types.h  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,227 @@
++      /*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_ATSC_TYPES_H
++#define _UCSI_ATSC_TYPES_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <stdint.h>
++#include <time.h>
++#include <libucsi/types.h>
++
++enum atsc_vct_modulation {
++      ATSC_VCT_MODULATION_ANALOG      = 0x01,
++      ATSC_VCT_MODULATION_SCTE_MODE1  = 0x02,
++      ATSC_VCT_MODULATION_SCTE_MODE2  = 0x03,
++      ATSC_VCT_MODULATION_8VSB        = 0x04,
++      ATSC_VCT_MODULATION_16VSB       = 0x05,
++};
++
++enum atsc_vct_service_type {
++      ATSC_VCT_SERVICE_TYPE_ANALOG    = 0x01,
++      ATSC_VCT_SERVICE_TYPE_TV        = 0x02,
++      ATSC_VCT_SERVICE_TYPE_AUDIO     = 0x03,
++      ATSC_VCT_SERVICE_TYPE_DATA      = 0x04,
++};
++
++enum atsc_etm_location {
++      ATSC_VCT_ETM_NONE                       = 0x00,
++      ATSC_VCT_ETM_IN_THIS_PTC                = 0x01,
++      ATSC_VCT_ETM_IN_CHANNEL_TSID            = 0x02,
++};
++
++enum atsc_text_compress_type {
++      ATSC_TEXT_COMPRESS_NONE                 = 0x00,
++      ATSC_TEXT_COMPRESS_PROGRAM_TITLE        = 0x01,
++      ATSC_TEXT_COMPRESS_PROGRAM_DESCRIPTION  = 0x02,
++};
++
++enum atsc_text_segment_mode {
++      ATSC_TEXT_SEGMENT_MODE_UNICODE_RANGE_MIN        = 0x00,
++      ATSC_TEXT_SEGMENT_MODE_UNICODE_RANGE_MAX        = 0x33,
++      ATSC_TEXT_SEGMENT_MODE_SCSU                     = 0x3e,
++      ATSC_TEXT_SEGMENT_MODE_UTF16                    = 0x3f,
++      ATSC_TEXT_SEGMENT_MODE_TAIWAN_BITMAP            = 0x40,
++      ATSC_TEXT_SEGMENT_MODE_TAIWAN_CODEWORD_BITMAP   = 0x41,
++};
++
++typedef uint32_t atsctime_t;
++
++struct atsc_text {
++      uint8_t number_strings;
++      /* struct atsc_text_string strings[] */
++};
++
++struct atsc_text_string {
++      iso639lang_t language_code;
++      uint8_t number_segments;
++      /* struct atsc_text_string_segment segments[] */
++};
++
++struct atsc_text_string_segment {
++      uint8_t compression_type;
++      uint8_t mode;
++      uint8_t number_bytes;
++      /* uint8_t bytes[] */
++};
++
++/**
++ * Iterator for strings field of an atsc_text structure.
++ *
++ * @param txt atsc_text pointer.
++ * @param pos Variable holding a pointer to the current atsc_text_string.
++ * @param idx Iterator variable.
++ */
++#define atsc_text_strings_for_each(txt, pos, idx) \
++      for ((pos) = atsc_text_strings_first(txt), idx=0; \
++           (pos); \
++           (pos) = atsc_text_strings_next(txt, pos, ++idx))
++
++/**
++ * Iterator for segments field of an atsc_text_string structure.
++ *
++ * @param str atsc_text_string pointer.
++ * @param pos Variable holding a pointer to the current atsc_text_string_segment.
++ * @param idx Iterator variable.
++ */
++#define atsc_text_string_segments_for_each(str, pos, idx) \
++      for ((pos) = atsc_text_string_segments_first(str), idx=0; \
++           (pos); \
++           (pos) = atsc_text_string_segments_next(str, pos, ++idx))
++
++/**
++ * Accessor for the bytes field of an atsc_text_string_segment.
++ *
++ * @param seg atsc_text_string_segment pointer.
++ * @return Pointer to the bytes.
++ */
++static inline uint8_t*
++      atsc_text_string_segment_bytes(struct atsc_text_string_segment *d)
++{
++      return ((uint8_t*) d) + sizeof(struct atsc_text_string_segment);
++}
++
++/**
++ * Validate a buffer containing an atsc_text structure.
++ *
++ * @param buf Start of the atsc_text structure.
++ * @param len Length in bytes of the buffer.
++ * @return 0 if valid, nonzero if not.
++ */
++extern int atsc_text_validate(uint8_t *buf, int len);
++
++/**
++ * Decodes an atsc_text_segment with mode < 0x3e. Decompression of the ATSC text encoding IS
++ * supported. The output text will be in the UTF-8 encoding.
++ *
++ * @param segment Pointer to the segment to decode.
++ * @param destbuf Pointer to the malloc()ed buffer to append text to (pass NULL if none).
++ * @param destbufsize Size of destbuf in bytes.
++ * @param destbufpos Position within destbuf. This will be updated to point after the end of the
++ * string on exit.
++ * @return New value of destbufpos, or < 0 on error.
++ */
++extern int atsc_text_segment_decode(struct atsc_text_string_segment *segment,
++                                  uint8_t **destbuf, size_t *destbufsize, size_t *destbufpos);
++
++/**
++ * Convert from ATSC time to unix time_t.
++ *
++ * @param atsc ATSC time.
++ * @return The time value.
++ */
++extern time_t atsctime_to_unixtime(atsctime_t atsc);
++
++/**
++ * Convert from unix time_t to atsc time.
++ *
++ * @param t unix time_t.
++ * @return The atsc time value.
++ */
++extern atsctime_t unixtime_to_atsctime(time_t t);
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct atsc_text_string*
++      atsc_text_strings_first(struct atsc_text *txt)
++{
++      if (txt->number_strings == 0)
++              return NULL;
++
++      return (struct atsc_text_string *)
++              ((uint8_t*) txt + sizeof(struct atsc_text));
++}
++
++static inline struct atsc_text_string*
++      atsc_text_strings_next(struct atsc_text *txt, struct atsc_text_string *pos, int idx)
++{
++      int i;
++      uint8_t *buf;
++
++      if (idx >= txt->number_strings)
++              return NULL;
++
++      buf = ((uint8_t*) pos) + sizeof(struct atsc_text_string);
++      for(i=0; i < pos->number_segments; i++) {
++              struct atsc_text_string_segment *seg =
++                      (struct atsc_text_string_segment *) buf;
++
++              buf += sizeof(struct atsc_text_string_segment);
++              buf += seg->number_bytes;
++      }
++
++      return (struct atsc_text_string *) buf;
++}
++
++static inline struct atsc_text_string_segment*
++      atsc_text_string_segments_first(struct atsc_text_string *str)
++{
++      if (str->number_segments == 0)
++              return NULL;
++
++      return (struct atsc_text_string_segment *)
++              ((uint8_t*) str + sizeof(struct atsc_text_string));
++}
++
++static inline struct atsc_text_string_segment*
++      atsc_text_string_segments_next(struct atsc_text_string *str,
++                                     struct atsc_text_string_segment *pos, int idx)
++{
++      if (idx >= str->number_segments)
++              return NULL;
++
++      return (struct atsc_text_string_segment *)
++              (((uint8_t*) pos) + sizeof(struct atsc_text_string_segment) + pos->number_bytes);
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/crc32.c dvb-apps/lib/libucsi/crc32.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/crc32.c 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/crc32.c       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,89 @@
++/**
++ * crc32 calculation routines.
++ *
++ * Copyright (c) 2005 by Andrew de Quincey <adq_dvb@lidskialf.net>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <stdint.h>
++
++uint32_t crc32tbl[] =
++{
++      0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
++      0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
++      0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
++      0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
++      0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
++      0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
++      0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
++      0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
++      0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
++      0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
++      0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
++      0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
++      0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
++      0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
++      0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
++      0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
++      0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
++      0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
++      0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
++      0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
++      0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
++      0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
++      0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
++      0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
++      0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
++      0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
++      0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
++      0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
++      0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
++      0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
++      0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
++      0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
++      0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
++      0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
++      0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
++      0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
++      0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
++      0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
++      0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
++      0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
++      0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
++      0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
++      0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
++      0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
++      0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
++      0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
++      0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
++      0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
++      0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
++      0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
++      0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
++      0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
++      0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
++      0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
++      0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
++      0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
++      0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
++      0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
++      0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
++      0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
++      0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
++      0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
++      0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
++      0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
++};
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/crc32.h dvb-apps/lib/libucsi/crc32.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/crc32.h 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/crc32.h       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,58 @@
++/**
++ * crc32 calculation routines.
++ *
++ * Copyright (c) 2005 by Andrew de Quincey <adq_dvb@lidskialf.net>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_CRC32_H
++#define _UCSI_CRC32_H 1
++
++#include <stdint.h>
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#define CRC32_INIT (~0)
++
++extern uint32_t crc32tbl[];
++
++/**
++ * Calculate a CRC32 over a piece of data.
++ *
++ * @param crc Current CRC value (use CRC32_INIT for first call).
++ * @param buf Buffer to calculate over.
++ * @param len Number of bytes.
++ * @return Calculated CRC.
++ */
++static inline uint32_t crc32(uint32_t crc, uint8_t* buf, size_t len)
++{
++      size_t i;
++
++      for (i=0; i< len; i++) {
++              crc = (crc << 8) ^ crc32tbl[((crc >> 24) ^ buf[i]) & 0xff];
++      }
++
++      return crc;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/descriptor.h dvb-apps/lib/libucsi/descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/descriptor.h    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/descriptor.h  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,129 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DESCRIPTOR_H
++#define _UCSI_DESCRIPTOR_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/endianops.h>
++#include <stdint.h>
++#include <stdlib.h>
++
++/**
++ * Generic descriptor header.
++ */
++struct descriptor {
++      uint8_t tag;
++      uint8_t len;
++} __ucsi_packed;
++
++/**
++ * Retreive pointer to the next descriptor structure.
++ *
++ * @param buf The buffer of descriptors.
++ * @param len Size of the buffer.
++ * @param pos Current descriptor.
++ * @return Pointer to next descriptor, or NULL if there are none.
++ */
++static inline struct descriptor *
++      next_descriptor(uint8_t * buf, size_t len, struct descriptor * pos)
++{
++      uint8_t* next;
++
++      if (pos == NULL)
++              return NULL;
++
++      next = (uint8_t*) pos + 2 + pos->len;
++      if (next >= buf + len)
++              return NULL;
++
++      return (struct descriptor *) next;
++}
++
++
++/**
++ * The unknown descriptor.
++ */
++struct unknown_descriptor {
++      struct descriptor d;
++
++      /* uint8_t data [] */
++} __ucsi_packed;
++
++/**
++ * Retrieve pointer to the unknown descriptor's data field.
++ *
++ * @param d The descriptor.
++ * @return Pointer to the data field.
++ */
++static inline uint8_t *
++      unknown_descriptor_data(struct unknown_descriptor *d)
++{
++      return (uint8_t *) d + sizeof(struct unknown_descriptor);
++}
++
++/**
++ * Retrieve size of unknown descriptor's data field.
++ *
++ * @param d The descriptor.
++ * @return Size of data field in bytes.
++ */
++static inline int
++      unknown_descriptor_data_size(struct unknown_descriptor *d)
++{
++      return d->d.len;
++}
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline int verify_descriptors(uint8_t * buf, size_t len)
++{
++      size_t pos = 0;
++
++      while (pos < len) {
++              if ((pos + 2) > len)
++                      return -1;
++
++              pos += 2 + buf[pos+1];
++      }
++
++      if (pos != len)
++              return -1;
++
++      return 0;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/ac3_descriptor.h dvb-apps/lib/libucsi/dvb/ac3_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/ac3_descriptor.h    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/ac3_descriptor.h  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,88 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_AC3_DESCRIPTOR
++#define _UCSI_DVB_AC3_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_ac3_descriptor structure.
++ */
++struct dvb_ac3_descriptor {
++      struct descriptor d;
++
++  EBIT5(uint8_t ac3_type_flag         : 1; ,
++      uint8_t bsid_flag               : 1; ,
++      uint8_t mainid_flag             : 1; ,
++      uint8_t asvc_flag               : 1; ,
++      uint8_t reserved                : 4; );
++      /* uint8_t additional_info[] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_ac3_descriptor.
++ *
++ * @param d Generic descriptor structure.
++ * @return dvb_ac3_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_ac3_descriptor*
++      dvb_ac3_descriptor_codec(struct descriptor* d)
++{
++      if (d->len < (sizeof(struct dvb_ac3_descriptor) - 2))
++              return NULL;
++
++      return (struct dvb_ac3_descriptor*) d;
++}
++
++/**
++ * Retrieve pointer to additional_info field of a dvb_ac3_descriptor.
++ *
++ * @param d dvb_ac3_descriptor pointer.
++ * @return Pointer to additional_info field.
++ */
++static inline uint8_t *dvb_ac3_descriptor_additional_info(struct dvb_ac3_descriptor *d)
++{
++      return (uint8_t *) d + sizeof(struct dvb_ac3_descriptor);
++}
++
++/**
++ * Determine length of additional_info field of a dvb_ac3_descriptor.
++ *
++ * @param d dvb_ac3_descriptor pointer.
++ * @return Length of field in bytes.
++ */
++static inline int dvb_ac3_descriptor_additional_info_length(struct dvb_ac3_descriptor *d)
++{
++      return d->d.len - 1;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/adaptation_field_data_descriptor.h dvb-apps/lib/libucsi/dvb/adaptation_field_data_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/adaptation_field_data_descriptor.h  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/adaptation_field_data_descriptor.h        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,62 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_ADAPTATION_FIELD_DATA_DESCRIPTOR
++#define _UCSI_DVB_ADAPTATION_FIELD_DATA_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_adaptation_field_data_descriptor structure.
++ */
++struct dvb_adaptation_field_data_descriptor {
++      struct descriptor d;
++
++  EBIT2(uint8_t reserved                      : 7; ,
++      uint8_t announcement_switching_data     : 1; );
++} __ucsi_packed;
++
++/**
++ * Process a dvb_adaptation_field_data_descriptor.
++ *
++ * @param d Generic descriptor structure.
++ * @return Pointer to dvb_adaptation_field_data_descriptor, or NULL on error.
++ */
++static inline struct dvb_adaptation_field_data_descriptor*
++      dvb_adaptation_field_data_descriptor_codec(struct descriptor* d)
++{
++      if (d->len != (sizeof(struct dvb_adaptation_field_data_descriptor) - 2))
++              return NULL;
++
++      return (struct dvb_adaptation_field_data_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/ait_application_descriptor.h dvb-apps/lib/libucsi/dvb/ait_application_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/ait_application_descriptor.h        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/ait_application_descriptor.h      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,204 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_AIT_APPLICATION_DESCRIPTOR
++#define _UCSI_DVB_AIT_APPLICATION_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * Possible values for the visibility field.
++ */
++enum {
++      AVB_AIT_APPLICATION_VISIBILITY_HIDDEN           = 0x00,
++      AVB_AIT_APPLICATION_VISIBILITY_APPSONLY         = 0x01,
++      AVB_AIT_APPLICATION_VISIBILITY_VISIBLE          = 0x03,
++};
++
++/**
++ * dvb_ait_application_descriptor structure.
++ */
++struct dvb_ait_application_descriptor {
++      struct descriptor d;
++
++      uint8_t application_profiles_length;
++      /* struct dvb_ait_application_profile profiles [] */
++      /* struct dvb_ait_application_descriptor_part2 part2 */
++} __ucsi_packed;
++
++/**
++ * An entry in the profiles field of a dvb_ait_application_descriptor.
++ */
++struct dvb_ait_application_profile {
++      uint16_t application_profile;
++      uint8_t version_major;
++      uint8_t version_minor;
++      uint8_t version_micro;
++} __ucsi_packed;
++
++/**
++ * Second part of a dvb_ait_application_descriptor structure.
++ */
++struct dvb_ait_application_descriptor_part2 {
++  EBIT3(uint8_t service_bound_flag            : 1; ,
++      uint8_t visibility                      : 2; ,
++      uint8_t reserved                        : 5; );
++      uint8_t application_priority;
++      /* uint8_t transport_protocol_label[] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_ait_application_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return dvb_ait_application_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_ait_application_descriptor*
++      dvb_ait_application_descriptor_codec(struct descriptor* d)
++{
++      uint32_t pos = 0;
++      uint32_t pos2 = 0;
++      uint32_t len = d->len + 2;
++      uint8_t* buf = (uint8_t*) d;
++      struct dvb_ait_application_descriptor *ret =
++              (struct dvb_ait_application_descriptor*) d;
++
++      if (len < sizeof(struct dvb_ait_application_descriptor))
++              return NULL;
++
++      if (len < (sizeof(struct dvb_ait_application_descriptor) + ret->application_profiles_length))
++              return NULL;
++
++      if (ret->application_profiles_length % sizeof(struct dvb_ait_application_profile))
++              return NULL;
++
++      pos += sizeof(struct dvb_ait_application_descriptor);
++      pos2 = 0;
++      while(pos2 < ret->application_profiles_length) {
++              bswap16(buf + pos + pos2);
++              pos2 += sizeof(struct dvb_ait_application_descriptor);
++      }
++      pos += pos2;
++
++      if (len < (pos + sizeof(struct dvb_ait_application_descriptor_part2)))
++              return NULL;
++
++      return ret;
++}
++
++/**
++ * Iterator for the profiles field of a dvb_ait_application_descriptor.
++ *
++ * @param d dvb_ait_application_descriptor pointer.
++ * @param pos Variable containing a pointer to the current dvb_ait_application_profile.
++ */
++#define dvb_ait_application_descriptor_profiles_for_each(d, pos) \
++      for ((pos) = dvb_ait_application_descriptor_profiles_first(d); \
++           (pos); \
++           (pos) = dvb_ait_application_descriptor_profiles_next(d, pos))
++
++/**
++ * Accessor for the part2 field of a dvb_ait_application_descriptor.
++ *
++ * @param d dvb_ait_application_descriptor pointer.
++ * @return dvb_ait_application_descriptor_part2 pointer.
++ */
++static inline struct dvb_ait_application_descriptor_part2*
++      dvb_ait_application_descriptor_part2(struct dvb_ait_application_descriptor* d)
++{
++      return (struct dvb_ait_application_descriptor_part2*)
++              ((uint8_t*) d +
++               sizeof(struct dvb_ait_application_descriptor) +
++               d->application_profiles_length);
++}
++
++/**
++ * Accessor for the transport_protocol_label field of a dvb_ait_application_descriptor_part2.
++ *
++ * @param d dvb_ait_application_descriptor_part2 pointer.
++ * @return Pointer to the field.
++ */
++static inline uint8_t*
++      dvb_ait_application_descriptor_part2_transport_protocol_label(struct dvb_ait_application_descriptor_part2* d)
++{
++      return (uint8_t*) d +
++                      sizeof(struct dvb_ait_application_descriptor_part2);
++}
++
++/**
++ * Calculate the number of bytes in the transport_protocol_label field of a dvb_ait_application_descriptor_part2.
++ *
++ * @param d dvb_ait_application_descriptor pointer.
++ * @param part2 dvb_ait_application_descriptor_part2 pointer.
++ * @return Number of bytes.
++ */
++static inline int
++      dvb_ait_application_descriptor_part2_transport_protocol_label_length(struct dvb_ait_application_descriptor *d,
++                                                                           struct dvb_ait_application_descriptor_part2* part2)
++{
++      uint8_t *ptr = (uint8_t*) part2 + sizeof(struct dvb_ait_application_descriptor_part2);
++      uint8_t *end = (uint8_t*) d + d->d.len + 2;
++
++      return (int) (end - ptr);
++}
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_ait_application_profile*
++      dvb_ait_application_descriptor_profiles_first(struct dvb_ait_application_descriptor *d)
++{
++      if (d->application_profiles_length == 0)
++              return NULL;
++
++      return (struct dvb_ait_application_profile *)
++              ((uint8_t*) d + sizeof(struct dvb_ait_application_descriptor));
++}
++
++static inline struct dvb_ait_application_profile*
++      dvb_ait_application_descriptor_profiles_next(struct dvb_ait_application_descriptor *d,
++                                                   struct dvb_ait_application_profile *pos)
++{
++      uint8_t *end = (uint8_t*) d +
++                      sizeof(struct dvb_ait_application_descriptor) +
++                      d->application_profiles_length;
++      uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_ait_application_profile);
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_ait_application_profile *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/ait_application_icons_descriptor.h dvb-apps/lib/libucsi/dvb/ait_application_icons_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/ait_application_icons_descriptor.h  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/ait_application_icons_descriptor.h        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,157 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_AIT_APPLICATION_ICONS_DESCRIPTOR
++#define _UCSI_DVB_AIT_APPLICATION_ICONS_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++#include <libucsi/types.h>
++
++/**
++ * Possible values for the icon_flags field.
++ */
++enum {
++      AIT_APPLICATION_ICON_FLAG_32_32         = 0x001,
++      AIT_APPLICATION_ICON_FLAG_32_32_43      = 0x002,
++      AIT_APPLICATION_ICON_FLAG_24_32_169     = 0x004,
++
++      AIT_APPLICATION_ICON_FLAG_64_64         = 0x008,
++      AIT_APPLICATION_ICON_FLAG_64_64_43      = 0x010,
++      AIT_APPLICATION_ICON_FLAG_48_64_169     = 0x020,
++
++      AIT_APPLICATION_ICON_FLAG_128_128       = 0x040,
++      AIT_APPLICATION_ICON_FLAG_128_128_43    = 0x080,
++      AIT_APPLICATION_ICON_FLAG_96_128_169    = 0x100,
++};
++
++/**
++ * dvb_ait_application_icons_descriptor structure.
++ */
++struct dvb_ait_application_icons_descriptor {
++      struct descriptor d;
++
++      uint8_t icon_locator_length;
++      /* uint8_t icon_locator[] */
++      /* struct dvb_ait_application_icons_descriptor_part2 */
++} __ucsi_packed;
++
++/**
++ * Second part of a dvb_ait_application_icons_descriptor.
++ */
++struct dvb_ait_application_icons_descriptor_part2 {
++      uint16_t icon_flags;
++      /* uint8_t reserved[] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_ait_application_icons_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return dvb_ait_application_icons_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_ait_application_icons_descriptor*
++      dvb_ait_application_icons_descriptor_codec(struct descriptor* d)
++{
++      uint8_t* buf = (uint8_t*) d;
++      uint32_t pos = 0;
++      uint32_t len = d->len + 2;
++      struct dvb_ait_application_icons_descriptor *ret =
++              (struct dvb_ait_application_icons_descriptor *) d;
++
++      if (len < sizeof(struct dvb_ait_application_icons_descriptor))
++              return NULL;
++      if (len < (sizeof(struct dvb_ait_application_icons_descriptor) + ret->icon_locator_length))
++              return NULL;
++
++      pos += sizeof(struct dvb_ait_application_icons_descriptor) + ret->icon_locator_length;
++
++      if ((len - pos) < sizeof(struct dvb_ait_application_icons_descriptor_part2))
++              return NULL;
++      bswap16(buf + pos);
++
++      return ret;
++}
++/**
++ * Accessor for the icon_locator field of a dvb_ait_application_icons_descriptor.
++ *
++ * @param e dvb_ait_application_icons_descriptor pointer.
++ * @return Pointer to the field.
++ */
++static inline uint8_t *
++      dvb_ait_application_icons_descriptor_icon_locator(struct dvb_ait_application_icons_descriptor *e)
++{
++      return (uint8_t *) e + sizeof(struct dvb_ait_application_icons_descriptor);
++}
++
++/**
++ * Accessor for the part2 field of a dvb_ait_application_icons_descriptor.
++ *
++ * @param e dvb_ait_application_icons_descriptor Pointer.
++ * @return dvb_ait_application_icons_descriptor_part2 pointer.
++ */
++static inline struct dvb_ait_application_icons_descriptor_part2 *
++      dvb_ait_application_icons_descriptor_part2(struct dvb_ait_application_icons_descriptor *e)
++{
++      return (struct dvb_ait_application_icons_descriptor_part2 *)
++              ((uint8_t *) e + sizeof(struct dvb_ait_application_icons_descriptor) +
++              e->icon_locator_length);
++}
++
++/**
++ * Accessor for the reserved field of a dvb_ait_application_icons_descriptor_part2.
++ *
++ * @param e dvb_ait_application_icons_part2 pointer.
++ * @return Pointer to the field.
++ */
++static inline uint8_t *
++      dvb_ait_application_icons_descriptor_part2_reserved(struct dvb_ait_application_icons_descriptor_part2 *e)
++{
++      return (uint8_t *) e + sizeof(struct dvb_ait_application_icons_descriptor_part2);
++}
++
++/**
++ * Calculate the number of bytes in the reserved field of a dvb_ait_application_icons_descriptor_part2.
++ *
++ * @param d dvb_ait_application_icons_descriptorpointer.
++ * @param part2 dvb_ait_application_icons_descriptor_part2 pointer.
++ * @return Number of bytes.
++ */
++static inline int
++      dvb_ait_application_icons_descriptor_part2_reserved_length(struct dvb_ait_application_icons_descriptor *d,
++              struct dvb_ait_application_icons_descriptor_part2* part2)
++{
++      uint8_t *ptr = (uint8_t*) part2 + sizeof(struct dvb_ait_application_icons_descriptor_part2);
++      uint8_t *end = (uint8_t*) d + d->d.len + 2;
++
++      return (int) (end - ptr);
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/ait_application_name_descriptor.h dvb-apps/lib/libucsi/dvb/ait_application_name_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/ait_application_name_descriptor.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/ait_application_name_descriptor.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,145 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_AIT_APPLICATION_NAME_DESCRIPTOR
++#define _UCSI_DVB_AIT_APPLICATION_NAME_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++#include <libucsi/types.h>
++
++/**
++ * dvb_ait_application_name_descriptor structure.
++ */
++struct dvb_ait_application_name_descriptor {
++      struct descriptor d;
++
++      /* struct dvb_ait_application_name names[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the names field of a dvb_ait_application_name_descriptor.
++ */
++struct dvb_ait_application_name {
++      iso639lang_t language_code;
++      uint8_t application_name_length;
++      /* uint8_t name[] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_ait_application_name_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return dvb_ait_application_name_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_ait_application_name_descriptor*
++      dvb_ait_application_name_descriptor_codec(struct descriptor* d)
++{
++      uint8_t* buf = (uint8_t*) d + 2;
++      uint32_t pos = 0;
++      uint32_t len = d->len;
++
++      while(pos < len) {
++              struct dvb_ait_application_name *e =
++                      (struct dvb_ait_application_name*) (buf + pos);
++
++              pos += sizeof(struct dvb_ait_application_name);
++
++              if (pos > len)
++                      return NULL;
++
++              pos += e->application_name_length;
++
++              if (pos > len)
++                      return NULL;
++      }
++
++      return (struct dvb_ait_application_name_descriptor*) d;
++}
++
++/**
++ * Iterator for entries in the names field of a dvb_ait_application_name_descriptor.
++ *
++ * @param d dvb_ait_application_name_descriptor pointer.
++ * @param pos Variable containing a pointer to the current dvb_ait_application_name.
++ */
++#define dvb_ait_application_name_descriptor_names_for_each(d, pos) \
++      for ((pos) = dvb_ait_application_name_descriptor_names_first(d); \
++           (pos); \
++           (pos) = dvb_ait_application_name_descriptor_names_next(d, pos))
++
++/**
++ * Accessor for the name field of a dvb_ait_application_name.
++ *
++ * @param e dvb_ait_application_name pointer.
++ * @return Pointer to the name field.
++ */
++static inline uint8_t *
++      dvb_ait_application_name_name(struct dvb_ait_application_name *e)
++{
++      return (uint8_t *) e + sizeof(struct dvb_ait_application_name);
++}
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_ait_application_name*
++      dvb_ait_application_name_descriptor_names_first(struct dvb_ait_application_name_descriptor *d)
++{
++      if (d->d.len == 0)
++              return NULL;
++
++      return (struct dvb_ait_application_name *)
++              ((uint8_t*) d + sizeof(struct dvb_ait_application_name_descriptor));
++}
++
++static inline struct dvb_ait_application_name*
++      dvb_ait_application_name_descriptor_names_next(struct dvb_ait_application_name_descriptor *d,
++                                                          struct dvb_ait_application_name *pos)
++{
++      uint8_t *end = (uint8_t*) d + 2 + d->d.len;
++      uint8_t *next = (uint8_t *) pos +
++                      sizeof(struct dvb_ait_application_name) +
++                      pos->application_name_length;
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_ait_application_name *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/ait_external_application_authorisation_descriptor.h dvb-apps/lib/libucsi/dvb/ait_external_application_authorisation_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/ait_external_application_authorisation_descriptor.h 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/ait_external_application_authorisation_descriptor.h       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,125 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_AIT_EXTERNAL_APPLICATION_AUTHORISATION_DESCRIPTOR
++#define _UCSI_DVB_AIT_EXTERNAL_APPLICATION_AUTHORISATION_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++#include <libucsi/types.h>
++
++/**
++ * dvb_ait_external_application_authorisation_descriptor structure.
++ */
++struct dvb_ait_external_application_authorisation_descriptor {
++      struct descriptor d;
++
++      /* struct dvb_ait_external_application_authorisation auths[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the auths field of a dvb_ait_external_application_authorisation_descriptor.
++ */
++struct dvb_ait_external_application_authorisation {
++      uint32_t organization_id;
++      uint16_t application_id;
++      uint8_t application_priority;
++} __ucsi_packed;
++
++/**
++ * Process a dvb_ait_external_application_authorisation_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return dvb_ait_external_application_authorisation_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_ait_external_application_authorisation_descriptor*
++      dvb_ait_external_application_authorisation_descriptor_codec(struct descriptor* d)
++{
++      uint8_t* buf = (uint8_t*) d + 2;
++      uint32_t pos = 0;
++      uint32_t len = d->len;
++
++      if (len % sizeof(struct dvb_ait_external_application_authorisation))
++              return NULL;
++
++      while(pos < len) {
++              bswap32(buf + pos);
++              bswap32(buf + pos + 4);
++              pos += sizeof(struct dvb_ait_external_application_authorisation);
++      }
++
++      return (struct dvb_ait_external_application_authorisation_descriptor*) d;
++}
++
++/**
++ * Iterator for entries in the auths field of a dvb_ait_external_application_authorisation_descriptor.
++ *
++ * @param d dvb_ait_external_application_authorisation_descriptor pointer.
++ * @param pos Variable containing a pointer to the current dvb_ait_external_application_authorisation.
++ */
++#define dvb_ait_external_application_authorisation_descriptor_auths_for_each(d, pos) \
++      for ((pos) = dvb_ait_external_application_authorisation_descriptor_auths_first(d); \
++           (pos); \
++           (pos) = dvb_ait_external_application_authorisation_descriptor_auths_next(d, pos))
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_ait_external_application_authorisation*
++      dvb_ait_external_application_authorisation_descriptor_auths_first(struct dvb_ait_external_application_authorisation_descriptor *d)
++{
++      if (d->d.len == 0)
++              return NULL;
++
++      return (struct dvb_ait_external_application_authorisation *)
++              ((uint8_t*) d + sizeof(struct dvb_ait_external_application_authorisation_descriptor));
++}
++
++static inline struct dvb_ait_external_application_authorisation*
++      dvb_ait_external_application_authorisation_descriptor_auths_next(struct dvb_ait_external_application_authorisation_descriptor *d,
++                                                          struct dvb_ait_external_application_authorisation *pos)
++{
++      uint8_t *end = (uint8_t*) d + 2 + d->d.len;
++      uint8_t *next = (uint8_t *) pos +
++                      sizeof(struct dvb_ait_external_application_authorisation);
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_ait_external_application_authorisation *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/ancillary_data_descriptor.h dvb-apps/lib/libucsi/dvb/ancillary_data_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/ancillary_data_descriptor.h 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/ancillary_data_descriptor.h       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,67 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_ANCILLARY_DATA_DESCRIPTOR
++#define _UCSI_DVB_ANCILLARY_DATA_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_ancillary_data_descriptor structure.
++ */
++struct dvb_ancillary_data_descriptor {
++      struct descriptor d;
++  EBIT8(uint8_t reserved                      : 1; ,
++      uint8_t rds_via_udcp                    : 1; ,
++      uint8_t mpeg4_ancillary_data            : 1; ,
++      uint8_t scale_factor_error_check        : 1; ,
++      uint8_t dab_ancillary_data              : 1; ,
++      uint8_t announcement_switching_data     : 1; ,
++      uint8_t extended_ancillary_data         : 1; ,
++      uint8_t dvd_video_ancillary_data        : 1; );
++} __ucsi_packed;
++
++/**
++ * Process a dvb_ancillary_data_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return dvb_ancillary_data_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_ancillary_data_descriptor*
++      dvb_ancillary_data_descriptor_codec(struct descriptor* d)
++{
++      if (d->len != (sizeof(struct dvb_ancillary_data_descriptor) - 2))
++              return NULL;
++
++      return (struct dvb_ancillary_data_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/announcement_support_descriptor.h dvb-apps/lib/libucsi/dvb/announcement_support_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/announcement_support_descriptor.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/announcement_support_descriptor.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,219 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_ANNOUNCEMENT_SUPPORT_DESCRIPTOR
++#define _UCSI_DVB_ANNOUNCEMENT_SUPPORT_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * Possible values for announcement_support_indicator.
++ */
++enum {
++      DVB_ANNOUNCEMENT_SUPPORT_EMERGENCY              = 0x01,
++      DVB_ANNOUNCEMENT_SUPPORT_ROAD_TRAFFIC_FLASH     = 0x02,
++      DVB_ANNOUNCEMENT_SUPPORT_PUBLIC_TRANSPORT_FLASH = 0x04,
++      DVB_ANNOUNCEMENT_SUPPORT_WARNING_MESSAGE        = 0x08,
++      DVB_ANNOUNCEMENT_SUPPORT_NEWS_FLASH             = 0x10,
++      DVB_ANNOUNCEMENT_SUPPORT_WEATHER_FLASH          = 0x20,
++      DVB_ANNOUNCEMENT_SUPPORT_EVENT_ANNOUNCEMENT     = 0x40,
++      DVB_ANNOUNCEMENT_SUPPORT_PERSONAL_CALL          = 0x80,
++};
++
++/**
++ * Possible values for announcement_type.
++ */
++enum {
++      DVB_ANNOUNCEMENT_TYPE_EMERGENCY                 = 0x00,
++      DVB_ANNOUNCEMENT_TYPE_ROAD_TRAFFIC_FLASH        = 0x01,
++      DVB_ANNOUNCEMENT_TYPE_PUBLIC_TRANSPORT_FLASH    = 0x02,
++      DVB_ANNOUNCEMENT_TYPE_WARNING_MESSAGE           = 0x03,
++      DVB_ANNOUNCEMENT_TYPE_NEWS_FLASH                = 0x04,
++      DVB_ANNOUNCEMENT_TYPE_WEATHER_FLASH             = 0x05,
++      DVB_ANNOUNCEMENT_TYPE_EVENT_ANNOUNCEMENT        = 0x06,
++      DVB_ANNOUNCEMENT_TYPE_PERSONAL_CALL             = 0x07,
++};
++
++/**
++ * Possible values for reference_type.
++ */
++enum {
++      DVB_REFERENCE_TYPE_AUDIO                        = 0x00,
++      DVB_REFERENCE_TYPE_OTHER_AUDIO                  = 0x01,
++      DVB_REFERENCE_TYPE_OTHER_SERVICE                = 0x02,
++      DVB_REFERENCE_TYPE_OTHER_TS                     = 0x03,
++};
++
++/**
++ * dvb_announcement_support_descriptor structure.
++ */
++struct dvb_announcement_support_descriptor {
++      struct descriptor d;
++      uint16_t announcement_support_indicator;
++      /* struct dvb_announcement_support_entry entries[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the entries field of a dvb_announcement_support_descriptor.
++ */
++struct dvb_announcement_support_entry {
++  EBIT3(uint8_t announcement_type             : 4; ,
++      uint8_t reserved                        : 1; ,
++      uint8_t reference_type                  : 3; );
++      /* Only if reference_type == 1, 2 or 3:
++       * struct dvb_announcement_support_reference reference */
++} __ucsi_packed;
++
++/**
++ * The optional reference field only present in a dvb_announcement_support_descriptor if
++ * its reference_type field is 1,2 or 3.
++ */
++struct dvb_announcement_support_reference {
++      uint16_t original_network_id;
++      uint16_t transport_stream_id;
++      uint16_t service_id;
++      uint8_t component_tag;
++} __ucsi_packed;
++
++/**
++ * Process a dvb_announcement_support_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return dvb_announcement_support_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_announcement_support_descriptor*
++      dvb_announcement_support_descriptor_codec(struct descriptor* d)
++{
++      uint32_t pos = 0;
++      uint8_t* buf = (uint8_t*) d + 2;
++      uint32_t len = d->len;
++
++      if (len < (sizeof(struct dvb_announcement_support_descriptor) - 2))
++              return NULL;
++
++      bswap16(buf+pos);
++
++      pos += 2;
++
++      while(pos < len) {
++              struct dvb_announcement_support_entry *e =
++                      (struct dvb_announcement_support_entry*) (buf+pos);
++
++              pos += sizeof(struct dvb_announcement_support_entry);
++
++              if (pos > len)
++                      return NULL;
++
++              if ((e->reference_type == 1) ||
++                  (e->reference_type == 2) ||
++                  (e->reference_type == 3)) {
++                      if ((pos + sizeof(struct dvb_announcement_support_reference)) > len)
++                              return NULL;
++
++                      bswap16(buf+pos);
++                      bswap16(buf+pos+2);
++                      bswap16(buf+pos+4);
++
++                      pos += sizeof(struct dvb_announcement_support_reference);
++              }
++      }
++
++      return (struct dvb_announcement_support_descriptor*) d;
++}
++
++/**
++ * Iterator for the entries field of a dvb_announcement_support_descriptor.
++ *
++ * @param d dvb_announcement_support_descriptor pointer.
++ * @param pod Variable holding a pointer to the current dvb_announcement_support_entry.
++ */
++#define dvb_announcement_support_descriptor_entries_for_each(d, pos) \
++      for ((pos) = dvb_announcement_support_descriptor_entries_first(d); \
++           (pos); \
++           (pos) = dvb_announcement_support_descriptor_entries_next(d, pos))
++
++/**
++ * Accessor for the reference field of a dvb_announcement_support_entry if present.
++ *
++ * @param entry dvb_announcement_support_entry pointer.
++ * @return dvb_announcement_support_reference pointer, or NULL on error.
++ */
++static inline struct dvb_announcement_support_reference*
++      dvb_announcement_support_entry_reference(struct dvb_announcement_support_entry* entry)
++{
++      if ((entry->reference_type != 0x01) &&
++          (entry->reference_type != 0x02) &&
++          (entry->reference_type != 0x03))
++              return NULL;
++
++      return (struct dvb_announcement_support_reference*)
++              ((uint8_t*) entry + sizeof(struct dvb_announcement_support_entry));
++}
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_announcement_support_entry*
++      dvb_announcement_support_descriptor_entries_first(struct dvb_announcement_support_descriptor *d)
++{
++      if (d->d.len == 2)
++              return NULL;
++
++      return (struct dvb_announcement_support_entry *)
++              ((uint8_t*) d + sizeof(struct dvb_announcement_support_descriptor));
++}
++
++static inline struct dvb_announcement_support_entry*
++      dvb_announcement_support_descriptor_entries_next(struct dvb_announcement_support_descriptor *d,
++                                                       struct dvb_announcement_support_entry *pos)
++{
++      uint8_t *end = (uint8_t*) d + 2 + d->d.len;
++      uint8_t* next = (uint8_t*) pos + sizeof(struct dvb_announcement_support_entry);
++      struct dvb_announcement_support_reference* reference =
++              dvb_announcement_support_entry_reference(pos);
++
++      if (reference)
++              next += sizeof(struct dvb_announcement_support_reference);
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_announcement_support_entry *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/application_signalling_descriptor.h dvb-apps/lib/libucsi/dvb/application_signalling_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/application_signalling_descriptor.h 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/application_signalling_descriptor.h       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,124 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_APPLICATION_SIGNALLING_DESCRIPTOR
++#define _UCSI_DVB_APPLICATION_SIGNALLING_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_application_signalling_descriptor structure.
++ */
++struct dvb_application_signalling_descriptor {
++      struct descriptor d;
++
++      /* struct dvb_application_signalling_entry entries[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the entries field of a dvb_application_signalling_descriptor.
++ */
++struct dvb_application_signalling_entry {
++      uint16_t application_type;
++  EBIT2(uint8_t reserved              : 3; ,
++      uint8_t AIT_version_number      : 5; );
++} __ucsi_packed;
++
++/**
++ * Process a dvb_application_signalling_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return dvb_application_signalling_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_application_signalling_descriptor*
++      dvb_application_signalling_descriptor_codec(struct descriptor* d)
++{
++      uint32_t pos = 0;
++      uint32_t len = d->len;
++      uint8_t* buf = (uint8_t*) d + 2;
++
++      pos += sizeof(struct dvb_application_signalling_descriptor) - 2;
++      if (len % sizeof(struct dvb_application_signalling_entry))
++              return NULL;
++
++      while(pos < len) {
++              bswap16(buf+pos);
++              pos+=3;
++      }
++
++      return (struct dvb_application_signalling_descriptor*) d;
++}
++
++/**
++ * Iterator for the entries field of a dvb_application_signalling_descriptor.
++ *
++ * @param d dvb_application_signalling_descriptor pointer.
++ * @param pos Variable containing a pointer to the current dvb_application_signalling_entry.
++ */
++#define dvb_application_signalling_descriptor_entries_for_each(d, pos) \
++      for ((pos) = dvb_application_signalling_descriptor_entries_first(d); \
++           (pos); \
++           (pos) = dvb_application_signalling_descriptor_entries_next(d, pos))
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_application_signalling_entry*
++      dvb_application_signalling_descriptor_entries_first(struct dvb_application_signalling_descriptor *d)
++{
++      if (d->d.len == 0)
++              return NULL;
++
++      return (struct dvb_application_signalling_entry *)
++              ((uint8_t*) d + sizeof(struct dvb_application_signalling_descriptor));
++}
++
++static inline struct dvb_application_signalling_entry*
++      dvb_application_signalling_descriptor_entries_next(struct dvb_application_signalling_descriptor *d,
++                                                         struct dvb_application_signalling_entry *pos)
++{
++      uint8_t *end = (uint8_t*) d + 2 + d->d.len;
++      uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_application_signalling_entry);
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_application_signalling_entry *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/bat_section.c dvb-apps/lib/libucsi/dvb/bat_section.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/bat_section.c       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/bat_section.c     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,77 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <libucsi/dvb/bat_section.h>
++
++struct dvb_bat_section * dvb_bat_section_codec(struct section_ext * ext)
++{
++      uint8_t * buf = (uint8_t *) ext;
++      size_t pos = sizeof(struct section_ext);
++      size_t len = section_ext_length(ext);
++      struct dvb_bat_section * ret = (struct dvb_bat_section *) ext;
++
++      if (len < sizeof(struct dvb_bat_section))
++              return NULL;
++
++      bswap16(buf + pos);
++      pos += 2;
++
++      if ((pos + ret->bouquet_descriptors_length) > len)
++              return NULL;
++
++      if (verify_descriptors(buf + pos, ret->bouquet_descriptors_length))
++              return NULL;
++      pos += ret->bouquet_descriptors_length;
++
++      if ((pos + sizeof(struct dvb_bat_section_part2)) > len)
++              return NULL;
++
++      bswap16(buf + pos);
++      pos += sizeof(struct dvb_bat_section_part2);
++
++      while (pos < len) {
++              struct dvb_bat_transport * transport =
++                      (struct dvb_bat_transport *) (buf + pos);
++
++              if ((pos + sizeof(struct dvb_bat_transport))  > len)
++                      return NULL;
++
++              bswap16(buf + pos);
++              bswap16(buf + pos + 2);
++              bswap16(buf + pos + 4);
++
++              pos += sizeof(struct dvb_bat_transport);
++
++              if ((pos + transport->transport_descriptors_length) > len)
++                      return NULL;
++
++              if (verify_descriptors(buf + pos,
++                                      transport->transport_descriptors_length))
++                      return NULL;
++
++              pos += transport->transport_descriptors_length;
++      }
++
++      if (pos != len)
++              return NULL;
++
++      return ret;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/bat_section.h dvb-apps/lib/libucsi/dvb/bat_section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/bat_section.h       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/bat_section.h     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,211 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_BAT_SECTION_H
++#define _UCSI_DVB_BAT_SECTION_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/section.h>
++
++/**
++ * dvb_bat_section structure.
++ */
++struct dvb_bat_section {
++      struct section_ext head;
++
++  EBIT2(uint16_t reserved_1                   : 4; ,
++      uint16_t bouquet_descriptors_length     :12; );
++      /* struct descriptor descriptors[] */
++      /* struct dvb_bat_section_part2 part2 */
++};
++
++/**
++ * Second part of a dvb_bat_section, following the variable length descriptors field.
++ */
++struct dvb_bat_section_part2 {
++  EBIT2(uint16_t reserved_2                   : 4; ,
++      uint16_t transport_stream_loop_length   :12; );
++      /* struct dvb_bat_transport transports[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the transports field of a dvb_bat_section_part2.
++ */
++struct dvb_bat_transport {
++      uint16_t transport_stream_id;
++      uint16_t original_network_id;
++  EBIT2(uint16_t reserved                     : 4; ,
++      uint16_t transport_descriptors_length   :12; );
++      /* struct descriptor descriptors[] */
++};
++
++/**
++ * Process a dvb_bat_section.
++ *
++ * @param section Generic section  pointer.
++ * @return dvb_bat_section pointer, or NULL on error.
++ */
++struct dvb_bat_section *dvb_bat_section_codec(struct section_ext *section);
++
++/**
++ * Accessor for the bouquet_id field of a BAT.
++ *
++ * @param bat BAT pointer.
++ * @return The bouquet_id.
++ */
++static inline uint16_t dvb_bat_section_bouquet_id(struct dvb_bat_section *bat)
++{
++      return bat->head.table_id_ext;
++}
++
++/**
++ * Iterator for the descriptors field in a dvb_bat_section.
++ *
++ * @param bat dvb_bat_section pointer.
++ * @param pos Variable containing a pointer to the current descriptor.
++ */
++#define dvb_bat_section_descriptors_for_each(bat, pos) \
++      for ((pos) = dvb_bat_section_descriptors_first(bat); \
++           (pos); \
++           (pos) = dvb_bat_section_descriptors_next(bat, pos))
++
++/**
++ * Accessor for the second part of a dvb_bat_section.
++ *
++ * @param bat dvb_bat_section pointer.
++ * @return dvb_bat_section_part2 pointer.
++ */
++static inline struct dvb_bat_section_part2 *
++      dvb_bat_section_part2(struct dvb_bat_section *bat)
++{
++      return (struct dvb_bat_section_part2 *)
++              ((uint8_t*) bat +
++               sizeof(struct dvb_bat_section) +
++               bat->bouquet_descriptors_length);
++
++}
++
++/**
++ * Iterator for the transports field of a dvb_bat_section_part2.
++ *
++ * @param part2 dvb_bat_section_part2 pointer.
++ * @param pos Variable containing a pointer to the current dvb_bat_transport.
++ */
++#define dvb_bat_section_transports_for_each(part2, pos) \
++      for ((pos) = dvb_bat_section_transports_first(part2); \
++           (pos); \
++           (pos) = dvb_bat_section_transports_next(part2, pos))
++
++/**
++ * Iterator for the descriptors field of a dvb_bat_transport.
++ *
++ * @param transport dvb_bat_transport pointer.
++ * @param pos Variable containing a pointer to the current descriptor.
++ */
++#define dvb_bat_transport_descriptors_for_each(transport, pos) \
++      for ((pos) = dvb_bat_transport_descriptors_first(transport); \
++           (pos); \
++           (pos) = dvb_bat_transport_descriptors_next(transport, pos))
++
++
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct descriptor *
++      dvb_bat_section_descriptors_first(struct dvb_bat_section *bat)
++{
++      if (bat->bouquet_descriptors_length == 0)
++              return NULL;
++
++      return (struct descriptor *)
++              ((uint8_t *) bat + sizeof(struct dvb_bat_section));
++}
++
++static inline struct descriptor *
++      dvb_bat_section_descriptors_next(struct dvb_bat_section *bat,
++                                       struct descriptor* pos)
++{
++      return next_descriptor((uint8_t*) bat + sizeof(struct dvb_bat_section),
++                             bat->bouquet_descriptors_length,
++                             pos);
++}
++
++static inline struct dvb_bat_transport *
++      dvb_bat_section_transports_first(struct dvb_bat_section_part2 *part2)
++{
++      if (part2->transport_stream_loop_length == 0)
++              return NULL;
++
++      return (struct dvb_bat_transport *)
++              ((uint8_t *) part2 + sizeof(struct dvb_bat_section_part2));
++}
++
++static inline struct dvb_bat_transport *
++      dvb_bat_section_transports_next(struct dvb_bat_section_part2 *part2,
++                                      struct dvb_bat_transport *pos)
++{
++      uint8_t *end = (uint8_t*) part2 + sizeof(struct dvb_bat_section_part2) +
++                      part2->transport_stream_loop_length;
++      uint8_t *next = (uint8_t*) pos + sizeof(struct dvb_bat_transport) +
++                      pos->transport_descriptors_length;
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_bat_transport *) next;
++}
++
++static inline struct descriptor *
++      dvb_bat_transport_descriptors_first(struct dvb_bat_transport *t)
++{
++      if (t->transport_descriptors_length == 0)
++              return NULL;
++
++      return (struct descriptor *)
++              ((uint8_t*)t + sizeof(struct dvb_bat_transport));
++}
++
++static inline struct descriptor *
++      dvb_bat_transport_descriptors_next(struct dvb_bat_transport *t,
++                                         struct descriptor* pos)
++{
++      return next_descriptor((uint8_t*) t + sizeof(struct dvb_bat_transport),
++                             t->transport_descriptors_length,
++                             pos);
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/bouquet_name_descriptor.h dvb-apps/lib/libucsi/dvb/bouquet_name_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/bouquet_name_descriptor.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/bouquet_name_descriptor.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,82 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_BOUQUET_NAME_DESCRIPTOR
++#define _UCSI_DVB_BOUQUET_NAME_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_bouquet_name_descriptor  structure.
++ */
++struct dvb_bouquet_name_descriptor {
++      struct descriptor d;
++
++      /* uint8_t name[] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_bouquet_name_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return dvb_bouquet_name_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_bouquet_name_descriptor*
++      dvb_bouquet_name_descriptor_codec(struct descriptor* d)
++{
++      return (struct dvb_bouquet_name_descriptor*) d;
++}
++
++/**
++ * Accessor for the name field of a dvb_bouquet_name_descriptor.
++ *
++ * @param d dvb_bouquet_name_descriptor pointer.
++ * @return Pointer to the field.
++ */
++static inline uint8_t *
++      dvb_bouquet_name_descriptor_name(struct dvb_bouquet_name_descriptor *d)
++{
++      return (uint8_t *) d + sizeof(struct dvb_bouquet_name_descriptor);
++}
++
++/**
++ * Determine the length of the name field of a dvb_bouquet_name_descriptor in bytes.
++ *
++ * @param d dvb_bouquet_name_descriptor pointer.
++ * @return Length of the field in bytes.
++ */
++static inline int
++      dvb_bouquet_name_descriptor_name_length(struct dvb_bouquet_name_descriptor *d)
++{
++      return d->d.len;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/cable_delivery_descriptor.h dvb-apps/lib/libucsi/dvb/cable_delivery_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/cable_delivery_descriptor.h 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/cable_delivery_descriptor.h       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,70 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_CABLE_DELIVERY_DESCRIPTOR
++#define _UCSI_DVB_CABLE_DELIVERY_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_cable_delivery_descriptor structure.
++ */
++struct dvb_cable_delivery_descriptor {
++      struct descriptor d;
++
++      uint32_t frequency;                     // BCD, units 100Hz
++  EBIT2(uint16_t reserved     : 12; ,
++      uint16_t fec_outer      : 4;  );
++      uint8_t modulation;
++  EBIT2(uint32_t symbol_rate  : 28; ,         // BCD, units 100Hz
++      uint32_t fec_inner      : 4;  );
++} __ucsi_packed;
++
++/**
++ * Process a dvb_cable_delivery_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return dvb_cable_delivery_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_cable_delivery_descriptor*
++      dvb_cable_delivery_descriptor_codec(struct descriptor* d)
++{
++      if (d->len != (sizeof(struct dvb_cable_delivery_descriptor) - 2))
++              return NULL;
++
++      bswap32((uint8_t*) d + 2);
++      bswap16((uint8_t*) d + 6);
++      bswap32((uint8_t*) d + 9);
++
++      return (struct dvb_cable_delivery_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/ca_identifier_descriptor.h dvb-apps/lib/libucsi/dvb/ca_identifier_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/ca_identifier_descriptor.h  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/ca_identifier_descriptor.h        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,94 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_CA_IDENTIFIER_DESCRIPTOR
++#define _UCSI_DVB_CA_IDENTIFIER_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_ca_identifier_descriptor structure.
++ */
++struct dvb_ca_identifier_descriptor {
++      struct descriptor d;
++
++      /* uint16_t ca_system_ids[] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_ca_identifier_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return dvb_ca_identifier_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_ca_identifier_descriptor*
++      dvb_ca_identifier_descriptor_codec(struct descriptor* d)
++{
++      uint32_t len = d->len;
++      uint8_t *buf = (uint8_t*) d + 2;
++      uint32_t pos = 0;
++
++      if (len % 2)
++              return NULL;
++
++      while(pos < len) {
++              bswap16(buf+pos);
++              pos+=2;
++      }
++
++      return (struct dvb_ca_identifier_descriptor*) d;
++}
++
++/**
++ * Accessor for the ca_system_ids field of a dvb_ca_identifier_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return Pointer to the field.
++ */
++static inline uint16_t *
++      dvb_ca_identifier_descriptor_ca_system_ids(struct dvb_ca_identifier_descriptor *d)
++{
++      return (uint16_t *) ((uint8_t *) d + sizeof(struct dvb_ca_identifier_descriptor));
++}
++
++/**
++ * Calculate the number of entries in the ca_system_ids field of a dvb_ca_identifier_descriptor.
++ *
++ * @param d dvb_ca_identifier_descriptor pointer.
++ * @return Number of entries.
++ */
++static inline int
++      dvb_ca_identifier_descriptor_ca_system_ids_count(struct dvb_ca_identifier_descriptor *d)
++{
++      return d->d.len >> 1;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/cell_frequency_link_descriptor.h dvb-apps/lib/libucsi/dvb/cell_frequency_link_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/cell_frequency_link_descriptor.h    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/cell_frequency_link_descriptor.h  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,190 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_CELL_FREQUENCY_LINK_DESCRIPTOR
++#define _UCSI_DVB_CELL_FREQUENCY_LINK_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_cell_frequency_link_descriptor structure.
++ */
++struct dvb_cell_frequency_link_descriptor {
++      struct descriptor d;
++
++      /* struct dvb_cell_frequency_link_cell cells[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the cells field of a dvb_cell_frequency_link_descriptor.
++ */
++struct dvb_cell_frequency_link_cell {
++      uint16_t cell_id;
++      uint32_t frequency;
++      uint8_t subcell_loop_info_length;
++      /* struct dvb_cell_frequency_link_subcell subcells[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the subcells field of a dvb_cell_frequency_link_cell.
++ */
++struct dvb_cell_frequency_link_cell_subcell {
++      uint8_t cell_id_extension;
++      uint32_t transposer_frequency;
++} __ucsi_packed;
++
++/**
++ * Process a dvb_cell_frequency_link_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return dvb_cell_frequency_link_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_cell_frequency_link_descriptor*
++      dvb_cell_frequency_link_descriptor_codec(struct descriptor* d)
++{
++      uint32_t pos = 0;
++      uint32_t pos2 = 0;
++      uint8_t* buf = (uint8_t*) d + 2;
++      uint32_t len = d->len;
++
++      while(pos < len) {
++              struct dvb_cell_frequency_link_cell *e =
++                      (struct dvb_cell_frequency_link_cell*) (buf+pos);
++
++              if ((pos + sizeof(struct dvb_cell_frequency_link_cell)) > len)
++                      return NULL;
++
++              bswap16(buf+pos);
++              bswap32(buf+pos+2);
++
++              pos += sizeof(struct dvb_cell_frequency_link_cell);
++
++              if ((pos + e->subcell_loop_info_length) > len)
++                      return NULL;
++
++              if (e->subcell_loop_info_length % sizeof(struct dvb_cell_frequency_link_cell_subcell))
++                      return NULL;
++
++              pos2 = 0;
++              while(pos2 < e->subcell_loop_info_length) {
++                      bswap32(buf+pos+pos2+1);
++
++                      pos2 += sizeof(struct dvb_cell_frequency_link_cell_subcell);
++              }
++
++              pos += e->subcell_loop_info_length;
++      }
++
++      return (struct dvb_cell_frequency_link_descriptor*) d;
++}
++
++/**
++ * Iterator for the cells field of a dvb_cell_frequency_link_descriptor.
++ *
++ * @param d dvb_cell_frequency_link_descriptor pointer.
++ * @param pos Variable holding a pointer to the current dvb_cell_frequency_link_cell.
++ */
++#define dvb_cell_frequency_link_descriptor_cells_for_each(d, pos) \
++      for ((pos) = dvb_cell_frequency_link_descriptor_cells_first(d); \
++           (pos); \
++           (pos) = dvb_cell_frequency_link_descriptor_cells_next(d, pos))
++
++/**
++ * Iterator for the subcells field of a dvb_cell_frequency_link_cell.
++ *
++ * @param cell dvb_cell_frequency_link_cell pointer.
++ * @param pos Variable holding a pointer to the current dvb_cell_frequency_link_cell_subcell.
++ */
++#define dvb_cell_frequency_link_cell_subcells_for_each(cell, pos) \
++      for ((pos) = dvb_cell_frequency_link_cell_subcells_first(cell); \
++           (pos); \
++           (pos) = dvb_cell_frequency_link_cell_subcells_next(cell, pos))
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_cell_frequency_link_cell*
++      dvb_cell_frequency_link_descriptor_cells_first(struct dvb_cell_frequency_link_descriptor *d)
++{
++      if (d->d.len == 0)
++              return NULL;
++
++      return (struct dvb_cell_frequency_link_cell *)
++              ((uint8_t*) d + sizeof(struct dvb_cell_frequency_link_descriptor));
++}
++
++static inline struct dvb_cell_frequency_link_cell*
++      dvb_cell_frequency_link_descriptor_cells_next(struct dvb_cell_frequency_link_descriptor *d,
++                                                    struct dvb_cell_frequency_link_cell *pos)
++{
++      uint8_t *end = (uint8_t*) d + 2 + d->d.len;
++      uint8_t *next = (uint8_t *) pos +
++                      sizeof(struct dvb_cell_frequency_link_cell) +
++                      pos->subcell_loop_info_length;
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_cell_frequency_link_cell *) next;
++}
++
++static inline struct dvb_cell_frequency_link_cell_subcell*
++      dvb_cell_frequency_link_cell_subcells_first(struct dvb_cell_frequency_link_cell *d)
++{
++      if (d->subcell_loop_info_length == 0)
++              return NULL;
++
++      return (struct dvb_cell_frequency_link_cell_subcell*)
++              ((uint8_t*) d + sizeof(struct dvb_cell_frequency_link_cell));
++}
++
++static inline struct dvb_cell_frequency_link_cell_subcell*
++      dvb_cell_frequency_link_cell_subcells_next(struct dvb_cell_frequency_link_cell *cell,
++                                            struct dvb_cell_frequency_link_cell_subcell *pos)
++{
++      uint8_t *end = (uint8_t*) cell + cell->subcell_loop_info_length;
++      uint8_t *next = (uint8_t*) pos +
++                      sizeof(struct dvb_cell_frequency_link_cell_subcell);
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_cell_frequency_link_cell_subcell *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/cell_list_descriptor.h dvb-apps/lib/libucsi/dvb/cell_list_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/cell_list_descriptor.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/cell_list_descriptor.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,201 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_CELL_LIST_DESCRIPTOR
++#define _UCSI_DVB_CELL_LIST_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_cell_list_descriptor structure.
++ */
++struct dvb_cell_list_descriptor {
++      struct descriptor d;
++
++      /* struct dvb_cell_list_entry cells[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the cells field of a dvb_cell_list_descriptor.
++ */
++struct dvb_cell_list_entry {
++      uint16_t cell_id;
++      uint16_t cell_latitude;
++      uint16_t cell_longitude;
++  EBIT3(uint32_t cell_extend_of_latitude      :12; ,
++      uint32_t cell_extend_of_longitude       :12; ,
++      uint32_t subcell_info_loop_length       : 8; );
++      /* struct dvb_subcell_list_entry subcells[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the subcells field of a dvb_cell_list_entry.
++ */
++struct dvb_subcell_list_entry {
++      uint8_t cell_id_extension;
++      uint16_t subcell_latitude;
++      uint16_t subcell_longitude;
++  EBIT2(uint32_t subcell_extend_of_latitude   :12; ,
++      uint32_t subcell_extend_of_longitude    :12; );
++} __ucsi_packed;
++
++/**
++ * Process a dvb_cell_list_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return dvb_cell_list_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_cell_list_descriptor*
++      dvb_cell_list_descriptor_codec(struct descriptor* d)
++{
++      uint32_t pos = 0;
++      uint32_t pos2 = 0;
++      uint8_t* buf = (uint8_t*) d + 2;
++      uint32_t len = d->len;
++
++      while(pos < len) {
++              struct dvb_cell_list_entry *e =
++                      (struct dvb_cell_list_entry*) (buf+pos);
++
++              if ((pos + sizeof(struct dvb_cell_list_entry)) > len)
++                      return NULL;
++
++              bswap16(buf+pos);
++              bswap16(buf+pos+2);
++              bswap16(buf+pos+4);
++              bswap32(buf+pos+6);
++
++              pos += sizeof(struct dvb_cell_list_entry);
++
++              if ((pos + e->subcell_info_loop_length) > len)
++                      return NULL;
++
++              if (e->subcell_info_loop_length % sizeof(struct dvb_subcell_list_entry))
++                      return NULL;
++
++              pos2 = 0;
++              while(pos2 < e->subcell_info_loop_length) {
++                      bswap16(buf+pos+pos2+1);
++                      bswap16(buf+pos+pos2+3);
++                      bswap24(buf+pos+pos2+5);
++
++                      pos2 += sizeof(struct dvb_subcell_list_entry);
++              }
++
++              pos += e->subcell_info_loop_length;
++      }
++
++      return (struct dvb_cell_list_descriptor*) d;
++}
++
++/**
++ * Iterator for the cells field of a dvb_cell_list_descriptor.
++ *
++ * @param d dvb_cell_list_descriptor pointer.
++ * @param pos Variable holding a pointer to the current dvb_cell_list_entry.
++ */
++#define dvb_cell_list_descriptor_cells_for_each(d, pos) \
++      for ((pos) = dvb_cell_list_descriptor_cells_first(d); \
++           (pos); \
++           (pos) = dvb_cell_list_descriptor_cells_next(d, pos))
++
++/**
++ * Iterator for the subcells field of a dvb_cell_list_entry.
++ *
++ * @param cell dvb_cell_list_entry pointer.
++ * @param pos Variable holding a pointer to the current dvb_subcell_list_entry.
++ */
++#define dvb_cell_list_entry_subcells_for_each(cell, pos) \
++      for ((pos) = dvb_cell_list_entry_subcells_first(cell); \
++           (pos); \
++           (pos) = dvb_cell_list_entry_subcells_next(cell, pos))
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_cell_list_entry*
++      dvb_cell_list_descriptor_cells_first(struct dvb_cell_list_descriptor *d)
++{
++      if (d->d.len == 0)
++              return NULL;
++
++      return (struct dvb_cell_list_entry *)
++              ((uint8_t*) d + sizeof(struct dvb_cell_list_descriptor));
++}
++
++static inline struct dvb_cell_list_entry*
++      dvb_cell_list_descriptor_cells_next(struct dvb_cell_list_descriptor *d,
++                                          struct dvb_cell_list_entry *pos)
++{
++      uint8_t *end = (uint8_t*) d + 2 + d->d.len;
++      uint8_t *next = (uint8_t *) pos +
++                      sizeof(struct dvb_cell_list_entry) +
++                      pos->subcell_info_loop_length;
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_cell_list_entry *) next;
++}
++
++static inline struct dvb_subcell_list_entry*
++      dvb_cell_list_entry_subcells_first(struct dvb_cell_list_entry *d)
++{
++      if (d->subcell_info_loop_length == 0)
++              return NULL;
++
++      return (struct dvb_subcell_list_entry*)
++              ((uint8_t*) d + sizeof(struct dvb_cell_list_entry));
++}
++
++static inline struct dvb_subcell_list_entry*
++      dvb_cell_list_entry_subcells_next(struct dvb_cell_list_entry *d,
++                                        struct dvb_subcell_list_entry *pos)
++{
++      uint8_t *next = (uint8_t*) pos + sizeof(struct dvb_subcell_list_entry);
++      uint8_t *end = (uint8_t*) d +
++                      sizeof(struct dvb_cell_list_entry) +
++                      d->subcell_info_loop_length;
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_subcell_list_entry *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/component_descriptor.h dvb-apps/lib/libucsi/dvb/component_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/component_descriptor.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/component_descriptor.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,147 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_COMPONENT_DESCRIPTOR
++#define _UCSI_DVB_COMPONENT_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++#include <libucsi/types.h>
++
++/**
++ * Possible values for stream_content.
++ */
++enum {
++      DVB_STREAM_CONTENT_VIDEO                = 0x01,
++      DVB_STREAM_CONTENT_AUDIO                = 0x02,
++      DVB_STREAM_CONTENT_SUBTITLE             = 0x03,
++      DVB_STREAM_CONTENT_AC3                  = 0x04,
++};
++
++/**
++ * Possible values for component_type.
++ */
++enum {
++      DVB_COMPONENT_TYPE_VIDEO_43_25Hz                = 0x01,
++      DVB_COMPONENT_TYPE_VIDEO_169_PAN_25Hz           = 0x02,
++      DVB_COMPONENT_TYPE_VIDEO_169_NOPAN_25Hz         = 0x03,
++      DVB_COMPONENT_TYPE_VIDEO_GT169_25Hz             = 0x04,
++
++      DVB_COMPONENT_TYPE_VIDEO_43_30Hz                = 0x05,
++      DVB_COMPONENT_TYPE_VIDEO_169_PAN_30Hz           = 0x06,
++      DVB_COMPONENT_TYPE_VIDEO_169_NOPAN_30Hz         = 0x07,
++      DVB_COMPONENT_TYPE_VIDEO_GT169_30Hz             = 0x08,
++
++      DVB_COMPONENT_TYPE_HDVIDEO_43_25Hz              = 0x09,
++      DVB_COMPONENT_TYPE_HDVIDEO_169_PAN_25Hz         = 0x0a,
++      DVB_COMPONENT_TYPE_HDVIDEO_169_NOPAN_25Hz       = 0x0b,
++      DVB_COMPONENT_TYPE_HDVIDEO_GT169_25Hz           = 0x0c,
++
++      DVB_COMPONENT_TYPE_HDVIDEO_43_30Hz              = 0x0d,
++      DVB_COMPONENT_TYPE_HDVIDEO_169_PAN_30Hz         = 0x0e,
++      DVB_COMPONENT_TYPE_HDVIDEO_169_NOPAN_30Hz       = 0x0f,
++      DVB_COMPONENT_TYPE_HDVIDEO_GT169_30Hz           = 0x10,
++
++      DVB_COMPONENT_TYPE_AUDIO_SINGLE_MONO            = 0x01,
++      DVB_COMPONENT_TYPE_AUDIO_DUAL_MONO              = 0x02,
++      DVB_COMPONENT_TYPE_AUDIO_STEREO                 = 0x03,
++      DVB_COMPONENT_TYPE_AUDIO_MULTI_LINGUAL_MULTI_CHAN= 0x04,
++      DVB_COMPONENT_TYPE_AUDIO_SURROUND               = 0x05,
++      DVB_COMPONENT_TYPE_AUDIO_VISUAL_IMPAIRED        = 0x40,
++      DVB_COMPONENT_TYPE_AUDIO_HARDHEAR               = 0x41,
++      DVB_COMPONENT_TYPE_AUDIO_SUPPLEMENTARY          = 0x42,
++
++      DVB_COMPONENT_TYPE_SUBTITLE_TELETEXT            = 0x01,
++      DVB_COMPONENT_TYPE_SUBTITLE_ASSOC_TELETEXT      = 0x02,
++      DVB_COMPONENT_TYPE_SUBTITLE_VBI                 = 0x03,
++      DVB_COMPONENT_TYPE_SUBTITLE_DVB                 = 0x10,
++      DVB_COMPONENT_TYPE_SUBTITLE_DVB_43              = 0x11,
++      DVB_COMPONENT_TYPE_SUBTITLE_DVB_169             = 0x12,
++      DVB_COMPONENT_TYPE_SUBTITLE_DVB_2211            = 0x13,
++      DVB_COMPONENT_TYPE_SUBTITLE_DVB_HARDHEAR        = 0x20,
++      DVB_COMPONENT_TYPE_SUBTITLE_DVB_HARDHEAR_43     = 0x21,
++      DVB_COMPONENT_TYPE_SUBTITLE_DVB_HARDHEAR_169    = 0x22,
++      DVB_COMPONENT_TYPE_SUBTITLE_DVB_HARDHEAR_2211   = 0x23,
++};
++
++/**
++ * dvb_component_descriptor structure.
++ */
++struct dvb_component_descriptor {
++      struct descriptor d;
++
++  EBIT2(uint8_t reserved      : 4; ,
++      uint8_t stream_content  : 4; );
++      uint8_t component_type;
++      uint8_t component_tag;
++      iso639lang_t language_code;
++      /* uint8_t text[] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_component_descriptor.
++ *
++ * @param d Pointer to a generic descriptor.
++ * @return dvb_component_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_component_descriptor*
++      dvb_component_descriptor_codec(struct descriptor* d)
++{
++      if (d->len < (sizeof(struct dvb_component_descriptor) - 2))
++              return NULL;
++
++      return (struct dvb_component_descriptor*) d;
++}
++
++/**
++ * Accessor for the text field of a dvb_component_descriptor.
++ *
++ * @param d dvb_component_descriptor pointer.
++ * @return Pointer to the field.
++ */
++static inline uint8_t *
++      dvb_component_descriptor_text(struct dvb_component_descriptor *d)
++{
++      return (uint8_t *) d + sizeof(struct dvb_component_descriptor);
++}
++
++/**
++ * Determine the length of the text field of a dvb_component_descriptor.
++ *
++ * @param d dvb_component_descriptor pointer.
++ * @return Length of the field in bytes.
++ */
++static inline int
++      dvb_component_descriptor_text_length(struct dvb_component_descriptor *d)
++{
++      return d->d.len - 6;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/content_descriptor.h dvb-apps/lib/libucsi/dvb/content_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/content_descriptor.h        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/content_descriptor.h      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,116 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_CONTENT_DESCRIPTOR
++#define _UCSI_DVB_CONTENT_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++// FIXME: the nibbles
++
++/**
++ * dvb_content_descriptor structure.
++ */
++struct dvb_content_descriptor {
++      struct descriptor d;
++
++      /* struct dvb_content_nibble nibbles[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the nibbles field of a dvb_content_descriptor.
++ */
++struct dvb_content_nibble {
++  EBIT2(uint8_t content_nibble_level_1        : 4; ,
++      uint8_t content_nibble_level_2  : 4; );
++  EBIT2(uint8_t user_nibble_1         : 4; ,
++      uint8_t user_nibble_2           : 4; );
++} __ucsi_packed;
++
++/**
++ * Process a dvb_content_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return dvb_content_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_content_descriptor*
++      dvb_content_descriptor_codec(struct descriptor* d)
++{
++      if (d->len % sizeof(struct dvb_content_nibble))
++              return NULL;
++
++      return (struct dvb_content_descriptor*) d;
++}
++
++/**
++ * Iterator for the nibbles field of a dvb_content_descriptor.
++ *
++ * @param d dvb_content_descriptor pointer.
++ * @param pos Variable containing a pointer to the current dvb_content_nibble.
++ */
++#define dvb_content_descriptor_nibbles_for_each(d, pos) \
++      for ((pos) = dvb_content_descriptor_nibbles_first(d); \
++           (pos); \
++           (pos) = dvb_content_descriptor_nibbles_next(d, pos))
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_content_nibble*
++      dvb_content_descriptor_nibbles_first(struct dvb_content_descriptor *d)
++{
++      if (d->d.len == 0)
++              return NULL;
++
++      return (struct dvb_content_nibble *)
++              ((uint8_t*) d + sizeof(struct dvb_content_descriptor));
++}
++
++static inline struct dvb_content_nibble*
++      dvb_content_descriptor_nibbles_next(struct dvb_content_descriptor *d,
++                                          struct dvb_content_nibble *pos)
++{
++      uint8_t *end = (uint8_t*) d + 2 + d->d.len;
++      uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_content_nibble);
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_content_nibble *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/content_identifier_descriptor.h dvb-apps/lib/libucsi/dvb/content_identifier_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/content_identifier_descriptor.h     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/content_identifier_descriptor.h   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,233 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_CONTENT_IDENTIFIER_DESCRIPTOR
++#define _UCSI_DVB_CONTENT_IDENTIFIER_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++#include <libucsi/types.h>
++
++
++/**
++ * Possible values for the crid_type.
++ */
++enum {
++      DVB_CRID_TYPE_NONE              = 0x00,
++      DVB_CRID_TYPE_ITEM              = 0x01,
++      DVB_CRID_TYPE_SERIES            = 0x02,
++      DVB_CRID_TYPE_RECOMMENDATION    = 0x03,
++};
++
++/**
++ * Possible values for the crid_location.
++ */
++enum {
++      DVB_CRID_LOCATION_THIS_DESCRIPTOR       = 0x00,
++      DVB_CRID_LOCATION_CIT                   = 0x01,
++};
++
++/**
++ * dvb_content_identifier_descriptor structure.
++ */
++struct dvb_content_identifier_descriptor {
++      struct descriptor d;
++
++      /* struct dvb_content_identifier_entry entries[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the entries field of a dvb_content_identifier_descriptor.
++ */
++struct dvb_content_identifier_entry {
++  EBIT2(uint8_t crid_type             : 6; ,
++      uint8_t crid_location           : 2; );
++      /* struct dvb_content_identifier_data_00 data0 */
++      /* struct dvb_content_identifier_data_01 data1 */
++} __ucsi_packed;
++
++/**
++ * The data if crid_location == 0
++ */
++struct dvb_content_identifier_entry_data_0 {
++      uint8_t crid_length;
++      /* uint8_t data[] */
++} __ucsi_packed;
++
++/**
++ * The data if crid_location == 1
++ */
++struct dvb_content_identifier_entry_data_1 {
++      uint16_t crid_ref;
++} __ucsi_packed;
++
++
++/**
++ * Process a dvb_content_identifier_descriptor.
++ *
++ * @param d Generic descriptor.
++ * @return dvb_content_identifier_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_content_identifier_descriptor*
++      dvb_content_identifier_descriptor_codec(struct descriptor* d)
++{
++      uint32_t len = d->len + 2;
++      uint32_t pos = 2;
++      uint8_t *buf = (uint8_t*) d;
++
++      while(pos < len) {
++              struct dvb_content_identifier_entry *e =
++                      (struct dvb_content_identifier_entry*) (buf + pos);
++
++              if (len < (pos+1))
++                      return NULL;
++              pos++;
++
++              switch(e->crid_location) {
++              case 0:
++                      if (len < (pos + 1))
++                              return NULL;
++                      if (len < (pos + 1 + buf[pos]))
++                              return NULL;
++                      pos += 1 + buf[pos];
++                      break;
++
++              case 1:
++                      if (len < (pos+2))
++                              return NULL;
++                      bswap16(buf+pos);
++                      break;
++              }
++      }
++
++      if (pos != len)
++              return NULL;
++
++      return (struct dvb_content_identifier_descriptor*) d;
++}
++
++/**
++ * Iterator for entries field of a dvb_content_identifier_descriptor.
++ *
++ * @param d dvb_content_identifier_descriptor pointer.
++ * @param pos Variable holding a pointer to the current dvb_content_identifier_entry.
++ */
++#define dvb_content_identifier_descriptor_entries_for_each(d, pos) \
++      for ((pos) = dvb_content_identifier_descriptor_entries_first(d); \
++           (pos); \
++           (pos) = dvb_content_identifier_descriptor_entries_next(d, pos))
++
++/**
++ * Accessor for the data0 field of a dvb_content_identifier_entry.
++ *
++ * @param d dvb_content_identifier_entry pointer.
++ * @return Pointer, or NULL on error.
++ */
++static inline struct dvb_content_identifier_entry_data_0*
++      dvb_content_identifier_entry_data_0(struct dvb_content_identifier_entry *d)
++{
++      if (d->crid_location != 0)
++              return NULL;
++      return (struct dvb_content_identifier_entry_data_0*)
++              ((uint8_t*) d + sizeof(struct dvb_content_identifier_entry));
++}
++/**
++ * Accessor for the data field of a dvb_content_identifier_entry_data_0.
++ *
++ * @param d dvb_content_identifier_entry_data_0 pointer.
++ * @return Pointer, or NULL on error.
++ */
++static inline uint8_t*
++      dvb_content_identifier_entry_data_0_data(struct dvb_content_identifier_entry_data_0 *d)
++{
++      return ((uint8_t*) d + sizeof(struct dvb_content_identifier_entry_data_0));
++}
++
++/**
++ * Accessor for the data1 field of a dvb_content_identifier_entry.
++ *
++ * @param d dvb_content_identifier_entry pointer.
++ * @return Pointer, or NULL on error.
++ */
++static inline struct dvb_content_identifier_entry_data_1*
++      dvb_content_identifier_entry_data_1(struct dvb_content_identifier_entry *d)
++{
++      if (d->crid_location != 1)
++              return NULL;
++      return (struct dvb_content_identifier_entry_data_1*)
++              ((uint8_t*) d + sizeof(struct dvb_content_identifier_entry));
++}
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_content_identifier_entry*
++      dvb_content_identifier_descriptor_entries_first(struct dvb_content_identifier_descriptor *d)
++{
++      if (d->d.len == 0)
++              return NULL;
++
++      return (struct dvb_content_identifier_entry *)
++              ((uint8_t*) d + sizeof(struct dvb_content_identifier_descriptor));
++}
++
++static inline struct dvb_content_identifier_entry*
++      dvb_content_identifier_descriptor_entries_next(struct dvb_content_identifier_descriptor *d,
++                                           struct dvb_content_identifier_entry *pos)
++{
++      uint8_t *end = (uint8_t*) d + 2 + d->d.len;
++      uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_content_identifier_entry);
++
++      if (next >= end)
++              return NULL;
++
++      switch(pos->crid_location) {
++      case 0:
++              if ((next+2) >= end)
++                      return NULL;
++              if ((next+2+next[1]) >= end)
++                      return NULL;
++              break;
++
++      case 1:
++              if ((next+3) >= end)
++                      return NULL;
++              break;
++      }
++
++      return (struct dvb_content_identifier_entry*) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/country_availability_descriptor.h dvb-apps/lib/libucsi/dvb/country_availability_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/country_availability_descriptor.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/country_availability_descriptor.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,120 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_COUNTRY_AVAILABILITY_DESCRIPTOR
++#define _UCSI_DVB_COUNTRY_AVAILABILITY_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++#include <libucsi/types.h>
++
++/**
++ * dvb_country_availability_descriptor structure.
++ */
++struct dvb_country_availability_descriptor {
++      struct descriptor d;
++
++  EBIT2(uint8_t country_availability_flag     : 1; ,
++      uint8_t reserved                        : 7; );
++      /* struct dvb_country_availability_entry countries[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the countries field of a dvb_country_availability_descriptor.
++ */
++struct dvb_country_availability_entry {
++      iso639country_t country_code;
++} __ucsi_packed;
++
++/**
++ * Process a dvb_country_availability_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return dvb_country_availability_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_country_availability_descriptor*
++      dvb_country_availability_descriptor_codec(struct descriptor* d)
++{
++      uint32_t len = d->len;
++
++      if (len < (sizeof(struct dvb_country_availability_descriptor) - 2))
++              return NULL;
++
++      if ((len - 1) % sizeof(struct dvb_country_availability_entry))
++              return NULL;
++
++      return (struct dvb_country_availability_descriptor*) d;
++}
++
++/**
++ * Iterator for the countries field of a dvb_country_availability_descriptor.
++ *
++ * @param d dvb_country_availability_descriptor pointer.
++ * @param pos Variable containing a pointer to the current dvb_country_availability_entry.
++ */
++#define dvb_country_availability_descriptor_countries_for_each(d, pos) \
++      for ((pos) = dvb_country_availability_descriptor_countries_first(d); \
++           (pos); \
++           (pos) = dvb_country_availability_descriptor_countries_next(d, pos))
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_country_availability_entry*
++      dvb_country_availability_descriptor_countries_first(struct dvb_country_availability_descriptor *d)
++{
++      if (d->d.len == 1)
++              return NULL;
++
++      return (struct dvb_country_availability_entry *)
++              ((uint8_t*) d + sizeof(struct dvb_country_availability_descriptor));
++}
++
++static inline struct dvb_country_availability_entry*
++      dvb_country_availability_descriptor_countries_next(struct dvb_country_availability_descriptor *d,
++                                                         struct dvb_country_availability_entry *pos)
++{
++      uint8_t *end = (uint8_t*) d + 2 + d->d.len;
++      uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_country_availability_entry);
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_country_availability_entry *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/data_broadcast_descriptor.h dvb-apps/lib/libucsi/dvb/data_broadcast_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/data_broadcast_descriptor.h 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/data_broadcast_descriptor.h       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,139 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_DATA_BROADCAST_DESCRIPTOR
++#define _UCSI_DVB_DATA_BROADCAST_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++#include <libucsi/types.h>
++
++/**
++ * dvb_data_broadcast_descriptor structure.
++ */
++struct dvb_data_broadcast_descriptor {
++      struct descriptor d;
++
++      uint16_t data_broadcast_id;
++      uint8_t component_tag;
++      uint8_t selector_length;
++      /* uint8_t selector[] */
++      /* struct dvb_data_broadcast_descriptor_part2 part2 */
++} __ucsi_packed;
++
++/**
++ * Second part of a dvb_data_broadcast_descriptor following the variable length selector field.
++ */
++struct dvb_data_broadcast_descriptor_part2 {
++      iso639lang_t language_code;
++      uint8_t text_length;
++      /* uint8_t text[] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_data_broadcast_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return dvb_data_broadcast_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_data_broadcast_descriptor*
++      dvb_data_broadcast_descriptor_codec(struct descriptor* d)
++{
++      struct dvb_data_broadcast_descriptor *p =
++              (struct dvb_data_broadcast_descriptor *) d;
++      struct dvb_data_broadcast_descriptor_part2 *p2;
++      uint8_t* buf = (uint8_t*) d + 2;
++      uint32_t pos = sizeof(struct dvb_data_broadcast_descriptor) - 2;
++      uint32_t len = d->len;
++
++      if (pos > len)
++              return NULL;
++
++      bswap16(buf + 2);
++
++      pos += p->selector_length;
++
++      if (pos > len)
++              return NULL;
++
++      p2 = (struct dvb_data_broadcast_descriptor_part2*) (buf + 2 + pos);
++
++      pos += sizeof(struct dvb_data_broadcast_descriptor_part2);
++
++      if (pos > len)
++              return NULL;
++
++      pos += p2->text_length;
++
++      if (pos != len)
++              return NULL;
++
++      return p;
++}
++
++/**
++ * Accessor for the selector field of a dvb_data_broadcast_descriptor.
++ *
++ * @param d dvb_data_broadcast_descriptor pointer.
++ * @return pointer to the field.
++ */
++static inline uint8_t *
++      dvb_data_broadcast_descriptor_selector(struct dvb_data_broadcast_descriptor *d)
++{
++      return (uint8_t *) d + sizeof(struct dvb_data_broadcast_descriptor);
++}
++
++/**
++ * Accessor for the second part of a dvb_data_broadcast_descriptor.
++ *
++ * @param d dvb_data_broadcast_descriptor pointer.
++ * @return dvb_data_broadcast_descriptor_part2 pointer.
++ */
++static inline struct dvb_data_broadcast_descriptor_part2 *
++      dvb_data_broadcast_descriptor_part2(struct dvb_data_broadcast_descriptor *d)
++{
++      return (struct dvb_data_broadcast_descriptor_part2*)
++              ((uint8_t*) d + sizeof(struct dvb_data_broadcast_descriptor) +
++               d->selector_length);
++}
++
++/**
++ * Accessor for the text field in a dvb_data_broadcast_descriptor_part2.
++ *
++ * @param d dvb_data_broadcast_descriptor_part2 pointer.
++ * @return pointer to the field.
++ */
++static inline uint8_t *
++      dvb_data_broadcast_descriptor_part2_text(struct dvb_data_broadcast_descriptor_part2 *d)
++{
++      return (uint8_t *) d + sizeof(struct dvb_data_broadcast_descriptor_part2);
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/data_broadcast_id_descriptor.h dvb-apps/lib/libucsi/dvb/data_broadcast_id_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/data_broadcast_id_descriptor.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/data_broadcast_id_descriptor.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,221 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_DATA_BROADCAST_ID_DESCRIPTOR
++#define _UCSI_DVB_DATA_BROADCAST_ID_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * Possible values for data_broadcast_id.
++ */
++enum {
++      DVB_BROADCAST_ID_DATA_PIPE                      = 0X0001,
++      DVB_BROADCAST_ID_ASYNCHRONOUS_DATA_STREAM       = 0X0002,
++      DVB_BROADCAST_ID_SYNCHRONOUS_DATA_STREAM        = 0X0003,
++      DVB_BROADCAST_ID_SYNCHRONISED_DATA_STREAM       = 0X0004,
++      DVB_BROADCAST_ID_MULTI_PROTOCOL_ENCAPSULATION   = 0X0005,
++      DVB_BROADCAST_ID_DATA_CAROUSEL                  = 0X0006,
++      DVB_BROADCAST_ID_OBJECT_CAROUSEL                = 0X0007,
++      DVB_BROADCAST_ID_DVB_ATM_STREAMS                = 0X0008,
++      DVB_BROADCAST_ID_HIGHER_PROTOCOLS               = 0X0009,
++      DVB_BROADCAST_ID_SOFTWARE_UPDATE                = 0x000A,
++      DVB_BROADCAST_ID_IP_MAC_NOTIFICATION_TABLE      = 0x000B,
++};
++
++/**
++ * dvb_data_broadcast_id_descriptor structure.
++ */
++struct dvb_data_broadcast_id_descriptor {
++      struct descriptor d;
++
++      uint16_t data_broadcast_id;
++      /* uint8_t id_selector_byte[] */
++} __ucsi_packed;
++
++/**
++ * id_selector_byte for 0x000b data_broadcast_id (IP/MAC Notification Table).
++ */
++struct dvb_id_selector_byte_000b {
++      uint8_t platform_id_data_length;
++      /* struct dvb_ip_mac_notification_info infos[] */
++      /* uint8_t private_data[] */
++} __ucsi_packed;
++
++/**
++ * Entries in the infos field of a dvb_id_selector_byte_0b.
++ */
++struct dvb_ip_mac_notification_info {
++  EBIT2(uint32_t platform_id          : 24; ,
++      uint8_t action_type             : 8;  );
++  EBIT3(uint8_t reserved              : 2;  ,
++      uint8_t INT_versioning_flag     : 1;  ,
++      uint8_t INT_version             : 5;  );
++} __ucsi_packed;
++
++/**
++ * Process a dvb_data_broadcast_id_descriptor.
++ *
++ * @param d Generic descriptor structure.
++ * @return dvb_data_broadcast_id_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_data_broadcast_id_descriptor*
++      dvb_data_broadcast_id_descriptor_codec(struct descriptor* d)
++{
++      if (d->len < (sizeof(struct dvb_data_broadcast_id_descriptor) - 2))
++              return NULL;
++
++      bswap16((uint8_t*) d + 2);
++
++      return (struct dvb_data_broadcast_id_descriptor*) d;
++}
++
++/**
++ * Accessor for the selector_byte field of a dvb_data_broadcast_id_descriptor.
++ *
++ * @param d dvb_data_broadcast_id_descriptor pointer.
++ * @return Pointer to the field.
++ */
++static inline uint8_t *
++      dvb_data_broadcast_id_descriptor_id_selector_byte(struct dvb_data_broadcast_id_descriptor *d)
++{
++      return (uint8_t *) d + sizeof(struct dvb_data_broadcast_id_descriptor);
++}
++
++/**
++ * Determine the length of the selector_byte field of a dvb_data_broadcast_id_descriptor.
++ *
++ * @param d dvb_data_broadcast_id_descriptor pointer.
++ * @return Length of the field in bytes.
++ */
++static inline int
++      dvb_data_broadcast_id_descriptor_id_selector_byte_length(struct dvb_data_broadcast_id_descriptor *d)
++{
++      return d->d.len - 2;
++}
++
++/**
++ * Accessor for a dvb_id_selector_byte_000b pointer.
++ *
++ * @param d dvb_data_broadcast_id_descriptor pointer.
++ * @return Pointer to the data field.
++ */
++static inline struct dvb_id_selector_byte_000b *
++      dvb_id_selector_byte_000b(struct dvb_data_broadcast_id_descriptor *d)
++{
++      if (d->data_broadcast_id != DVB_BROADCAST_ID_IP_MAC_NOTIFICATION_TABLE)
++              return NULL;
++      return (struct dvb_id_selector_byte_000b *) dvb_data_broadcast_id_descriptor_id_selector_byte(d);
++}
++
++/**
++ * Iterator for the dvb_ip_mac_notification_info field of a dvb_id_selector_byte_000b.
++ *
++ * @param id_selector_byte dvb_id_selector_byte_000b pointer.
++ * @param pos Variable containing a pointer to the current dvb_ip_mac_notification_info.
++ */
++#define dvb_id_selector_byte_000b_ip_mac_notification_info_for_each(id_selector_byte, pos) \
++      for ((pos) = dvb_ip_mac_notification_info_first(id_selector_byte); \
++           (pos); \
++           (pos) = dvb_ip_mac_notification_info_next(id_selector_byte, pos))
++
++/**
++ * Length of the private_data field of a dvb_id_selector_byte_000b.
++ *
++ * @param d descriptor pointer.
++ * @param i dvb_id_selector_byte_000b pointer.
++ * @return Length of the field.
++ */
++static inline uint8_t
++      dvb_id_selector_byte_000b_private_data_length(struct descriptor *d,
++                          struct dvb_id_selector_byte_000b *i)
++{
++      return (uint8_t) (d->len -
++           sizeof(struct descriptor) -
++           i->platform_id_data_length -
++           sizeof(struct dvb_id_selector_byte_000b));
++}
++
++/**
++ * Accessor for the private_data field of a dvb_id_selector_byte_000b.
++ *
++ * @param d descriptor pointer.
++ * @param i dvb_id_selector_byte_000b pointer.
++ * @return Pointer to the field.
++ */
++static inline uint8_t *
++      dvb_id_selector_byte_000b_private_data(struct descriptor *d,
++                          struct dvb_id_selector_byte_000b *i)
++{
++      if (dvb_id_selector_byte_000b_private_data_length(d, i) <= 0)
++              return NULL;
++
++      return (uint8_t *) i + i->platform_id_data_length + sizeof(struct dvb_id_selector_byte_000b);
++}
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_ip_mac_notification_info *
++      dvb_ip_mac_notification_info_first(struct dvb_id_selector_byte_000b *d)
++{
++      if (d->platform_id_data_length == 0)
++              return NULL;
++
++      bswap32((uint8_t *) d + sizeof(struct dvb_id_selector_byte_000b));
++
++      return (struct dvb_ip_mac_notification_info *) ((uint8_t *) d + sizeof(struct dvb_id_selector_byte_000b));
++}
++
++static inline struct dvb_ip_mac_notification_info *
++      dvb_ip_mac_notification_info_next(struct dvb_id_selector_byte_000b *d,
++                                  struct dvb_ip_mac_notification_info *pos)
++{
++      uint8_t *end = (uint8_t *) d + d->platform_id_data_length;
++      uint8_t *next = (uint8_t *) pos +
++                      sizeof(struct dvb_id_selector_byte_000b) +
++                      sizeof(struct dvb_ip_mac_notification_info);
++
++      if (next >= end)
++              return NULL;
++
++      bswap32(next);
++
++      return (struct dvb_ip_mac_notification_info *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
++
++#include <libucsi/dvb/mhp_data_broadcast_id_descriptor.h>
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/default_authority_descriptor.h dvb-apps/lib/libucsi/dvb/default_authority_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/default_authority_descriptor.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/default_authority_descriptor.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,82 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_DEFAULT_AUTHORITY_DESCRIPTOR
++#define _UCSI_DVB_DEFAULT_AUTHORITY_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_default_authority_descriptor structure.
++ */
++struct dvb_default_authority_descriptor {
++      struct descriptor d;
++
++      /* char name[] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_default_authority_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return dvb_default_authority_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_default_authority_descriptor*
++      dvb_default_authority_descriptor_codec(struct descriptor* d)
++{
++      return (struct dvb_default_authority_descriptor*) d;
++}
++
++/**
++ * Accessor for the name field in a dvb_default_authority_descriptor.
++ *
++ * @param d dvb_default_authority_descriptor pointer.
++ * @return Pointer to the field.
++ */
++static inline uint8_t *
++      dvb_default_authority_descriptor_name(struct dvb_default_authority_descriptor *d)
++{
++      return (uint8_t *) d + sizeof(struct dvb_default_authority_descriptor);
++}
++
++/**
++ * Calculate the length of the name field in a dvb_default_authority_descriptor.
++ *
++ * @param d dvb_default_authority_descriptor pointer.
++ * @return Length of the field in bytes.
++ */
++static inline int
++      dvb_default_authority_descriptor_name_length(struct dvb_default_authority_descriptor *d)
++{
++      return d->d.len;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/descriptor.h dvb-apps/lib/libucsi/dvb/descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/descriptor.h        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/descriptor.h      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,230 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_DESCRIPTOR_H
++#define _UCSI_DVB_DESCRIPTOR_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/dvb/ac3_descriptor.h>
++#include <libucsi/dvb/adaptation_field_data_descriptor.h>
++#include <libucsi/dvb/ancillary_data_descriptor.h>
++#include <libucsi/dvb/announcement_support_descriptor.h>
++#include <libucsi/dvb/application_signalling_descriptor.h>
++#include <libucsi/dvb/bouquet_name_descriptor.h>
++#include <libucsi/dvb/ca_identifier_descriptor.h>
++#include <libucsi/dvb/cable_delivery_descriptor.h>
++#include <libucsi/dvb/cell_frequency_link_descriptor.h>
++#include <libucsi/dvb/cell_list_descriptor.h>
++#include <libucsi/dvb/component_descriptor.h>
++#include <libucsi/dvb/content_descriptor.h>
++#include <libucsi/dvb/content_identifier_descriptor.h>
++#include <libucsi/dvb/country_availability_descriptor.h>
++#include <libucsi/dvb/data_broadcast_descriptor.h>
++#include <libucsi/dvb/data_broadcast_id_descriptor.h>
++#include <libucsi/dvb/default_authority_descriptor.h>
++#include <libucsi/dvb/dsng_descriptor.h>
++#include <libucsi/dvb/extended_event_descriptor.h>
++#include <libucsi/dvb/frequency_list_descriptor.h>
++#include <libucsi/dvb/ip_mac_platform_name_descriptor.h>
++#include <libucsi/dvb/ip_mac_platform_provider_name_descriptor.h>
++#include <libucsi/dvb/ip_mac_stream_location_descriptor.h>
++#include <libucsi/dvb/linkage_descriptor.h>
++#include <libucsi/dvb/local_time_offset_descriptor.h>
++#include <libucsi/dvb/mosaic_descriptor.h>
++#include <libucsi/dvb/multilingual_bouquet_name_descriptor.h>
++#include <libucsi/dvb/multilingual_component_descriptor.h>
++#include <libucsi/dvb/multilingual_network_name_descriptor.h>
++#include <libucsi/dvb/multilingual_service_name_descriptor.h>
++#include <libucsi/dvb/network_name_descriptor.h>
++#include <libucsi/dvb/nvod_reference_descriptor.h>
++#include <libucsi/dvb/parental_rating_descriptor.h>
++#include <libucsi/dvb/partial_transport_stream_descriptor.h>
++#include <libucsi/dvb/pdc_descriptor.h>
++#include <libucsi/dvb/private_data_specifier_descriptor.h>
++#include <libucsi/dvb/related_content_descriptor.h>
++#include <libucsi/dvb/satellite_delivery_descriptor.h>
++#include <libucsi/dvb/s2_satellite_delivery_descriptor.h>
++#include <libucsi/dvb/scrambling_descriptor.h>
++#include <libucsi/dvb/service_availability_descriptor.h>
++#include <libucsi/dvb/service_descriptor.h>
++#include <libucsi/dvb/service_identifier_descriptor.h>
++#include <libucsi/dvb/service_list_descriptor.h>
++#include <libucsi/dvb/service_move_descriptor.h>
++#include <libucsi/dvb/short_event_descriptor.h>
++#include <libucsi/dvb/short_smoothing_buffer_descriptor.h>
++#include <libucsi/dvb/stream_identifier_descriptor.h>
++#include <libucsi/dvb/stuffing_descriptor.h>
++#include <libucsi/dvb/subtitling_descriptor.h>
++#include <libucsi/dvb/target_ip_address_descriptor.h>
++#include <libucsi/dvb/target_ipv6_address_descriptor.h>
++#include <libucsi/dvb/target_ip_slash_descriptor.h>
++#include <libucsi/dvb/target_ip_source_slash_descriptor.h>
++#include <libucsi/dvb/target_ipv6_slash_descriptor.h>
++#include <libucsi/dvb/target_ipv6_source_slash_descriptor.h>
++#include <libucsi/dvb/telephone_descriptor.h>
++#include <libucsi/dvb/teletext_descriptor.h>
++#include <libucsi/dvb/terrestrial_delivery_descriptor.h>
++#include <libucsi/dvb/time_shifted_event_descriptor.h>
++#include <libucsi/dvb/time_shifted_service_descriptor.h>
++#include <libucsi/dvb/time_slice_fec_identifier_descriptor.h>
++#include <libucsi/dvb/transport_stream_descriptor.h>
++#include <libucsi/dvb/tva_id_descriptor.h>
++#include <libucsi/dvb/vbi_data_descriptor.h>
++#include <libucsi/dvb/vbi_teletext_descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * The following are disabled because support is incomplete just now.
++ */
++/*
++#include <libucsi/dvb/rnt_rar_over_dvb_stream_descriptor.h>
++#include <libucsi/dvb/rnt_rar_over_ip_descriptor.h>
++#include <libucsi/dvb/rnt_rnt_scan_descriptor.h>
++#include <libucsi/dvb/ait_application_descriptor.h>
++#include <libucsi/dvb/ait_application_name_descriptor.h>
++#include <libucsi/dvb/ait_external_application_authorisation_descriptor.h>
++#include <libucsi/dvb/ait_application_icons_descriptor.h>
++*/
++
++/**
++ * The following are not implemented just now
++ */
++/*
++#include <libucsi/dvb/ait_transport_protocol_descriptor.h>
++#include <libucsi/dvb/ait_dvb_j_application_descriptor.h>
++#include <libucsi/dvb/ait_dvb_j_application_location_descriptor.h>
++#include <libucsi/dvb/ait_dvb_html_application_descriptor.h>
++#include <libucsi/dvb/ait_dvb_html_application_location_descriptor.h>
++#include <libucsi/dvb/ait_dvb_html_application_boundary_descriptor.h>
++#include <libucsi/dvb/ait_prefetch_descriptor.h>
++#include <libucsi/dvb/ait_dii_location_descriptor.h>
++#include <libucsi/dvb/ait_ip_signalling_descriptor.h>
++*/
++
++/**
++ * Enumeration of DVB descriptor tags.
++ */
++enum dvb_descriptor_tag {
++      dtag_dvb_network_name                   = 0x40,
++      dtag_dvb_service_list                   = 0x41,
++      dtag_dvb_stuffing                       = 0x42,
++      dtag_dvb_satellite_delivery_system      = 0x43,
++      dtag_dvb_cable_delivery_system          = 0x44,
++      dtag_dvb_vbi_data                       = 0x45,
++      dtag_dvb_vbi_teletext                   = 0x46,
++      dtag_dvb_bouquet_name                   = 0x47,
++      dtag_dvb_service                        = 0x48,
++      dtag_dvb_country_availability           = 0x49,
++      dtag_dvb_linkage                        = 0x4a,
++      dtag_dvb_nvod_reference                 = 0x4b,
++      dtag_dvb_time_shifted_service           = 0x4c,
++      dtag_dvb_short_event                    = 0x4d,
++      dtag_dvb_extended_event                 = 0x4e,
++      dtag_dvb_time_shifted_event             = 0x4f,
++      dtag_dvb_component                      = 0x50,
++      dtag_dvb_mosaic                         = 0x51,
++      dtag_dvb_stream_identifier              = 0x52,
++      dtag_dvb_ca_identifier                  = 0x53,
++      dtag_dvb_content                        = 0x54,
++      dtag_dvb_parental_rating                = 0x55,
++      dtag_dvb_teletext                       = 0x56,
++      dtag_dvb_telephone                      = 0x57,
++      dtag_dvb_local_time_offset              = 0x58,
++      dtag_dvb_subtitling                     = 0x59,
++      dtag_dvb_terrestial_delivery_system     = 0x5a,
++      dtag_dvb_multilingual_network_name      = 0x5b,
++      dtag_dvb_multilingual_bouquet_name      = 0x5c,
++      dtag_dvb_multilingual_service_name      = 0x5d,
++      dtag_dvb_multilingual_component         = 0x5e,
++      dtag_dvb_private_data_specifier         = 0x5f,
++      dtag_dvb_service_move                   = 0x60,
++      dtag_dvb_short_smoothing_buffer         = 0x61,
++      dtag_dvb_frequency_list                 = 0x62,
++      dtag_dvb_partial_transport_stream       = 0x63,
++      dtag_dvb_data_broadcast                 = 0x64,
++      dtag_dvb_scrambling                     = 0x65,
++      dtag_dvb_data_broadcast_id              = 0x66,
++      dtag_dvb_transport_stream               = 0x67,
++      dtag_dvb_dsng                           = 0x68,
++      dtag_dvb_pdc                            = 0x69,
++      dtag_dvb_ac3                            = 0x6a,
++      dtag_dvb_ancillary_data                 = 0x6b,
++      dtag_dvb_cell_list                      = 0x6c,
++      dtag_dvb_cell_frequency_link            = 0x6d,
++      dtag_dvb_announcement_support           = 0x6e,
++      dtag_dvb_application_signalling         = 0x6f,
++      dtag_dvb_adaptation_field_data          = 0x70,
++      dtag_dvb_service_identifier             = 0x71,
++      dtag_dvb_service_availability           = 0x72,
++      dtag_dvb_default_authority              = 0x73,
++      dtag_dvb_related_content                = 0x74,
++      dtag_dvb_tva_id                         = 0x75,
++      dtag_dvb_content_identifier             = 0x76,
++      dtag_dvb_time_slice_fec_identifier      = 0x77,
++      dtag_dvb_ecm_repetition_rate            = 0x78,
++      dtag_dvb_s2_satellite_delivery_descriptor= 0x79,
++      dtag_dvb_enhanced_ac3_descriptor        = 0x7a,
++      dtag_dvb_dts_descriptor                 = 0x7b,
++      dtag_dvb_aac_descriptor                 = 0x7c,
++      dtag_dvb_extension_descriptor           = 0x7f,
++
++      /* descriptors which may only appear in an RNT */
++      dtag_dvb_rnt_rar_over_dvb_stream        = 0x40,
++      dtag_dvb_rnt_rar_over_ip                = 0x41,
++      dtag_dvb_rnt_rnt_scan                   = 0x42,
++
++      /* descriptors which may only appear in an AIT */
++      dtag_dvb_ait_application                = 0x00,
++      dtag_dvb_ait_application_name           = 0x01,
++      dtag_dvb_ait_transport_protocol         = 0x02,
++      dtag_dvb_ait_dvb_j_application          = 0x03,
++      dtag_dvb_ait_dvb_j_application_location = 0x04,
++      dtag_dvb_ait_external_application_authorisation = 0x05,
++      dtag_dvb_ait_dvb_html_application       = 0x08,
++      dtag_dvb_ait_dvb_html_application_location = 0x09,
++      dtab_dvb_ait_dvb_html_application_boundary = 0x0a,
++      dtag_dvb_ait_application_icons          = 0x0b,
++      dtag_dvb_ait_prefetch                   = 0x0c,
++      dtag_dvb_ait_dii_location               = 0x0d,
++      dtag_dvb_ait_ip_signalling              = 0x11,
++
++      /* descriptors which may only appear in INT */
++      dtag_dvb_target_ip_address              = 0x09,
++      dtag_dvb_target_ipv6_address            = 0x0a,
++      dtag_dvb_ip_mac_platform_name           = 0x0c,
++      dtag_dvb_ip_mac_platform_provider_name  = 0x0d,
++      dtag_dvb_target_ip_slash                = 0x0f,
++      dtag_dvb_target_ip_source_slash         = 0x10,
++      dtag_dvb_target_ipv6_slash              = 0x11,
++      dtag_dvb_target_ipv6_source_slash       = 0x12,
++      dtag_dvb_ip_mac_stream_location         = 0x13,
++
++};
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/dit_section.c dvb-apps/lib/libucsi/dvb/dit_section.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/dit_section.c       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/dit_section.c     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,32 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <libucsi/dvb/dit_section.h>
++
++struct dvb_dit_section * dvb_dit_section_codec(struct section * section)
++{
++      struct dvb_dit_section * ret = (struct dvb_dit_section *)section;
++
++      if (section->length < 1)
++              return NULL;
++
++      return ret;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/dit_section.h dvb-apps/lib/libucsi/dvb/dit_section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/dit_section.h       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/dit_section.h     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,54 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_DIT_SECTION_H
++#define _UCSI_DVB_DIT_SECTION_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/section.h>
++
++/**
++ * dvb_dit_section structure.
++ */
++struct dvb_dit_section {
++      struct section head;
++
++  EBIT2(uint8_t transition_flag : 1; ,
++      uint8_t reserved        : 7; );
++};
++
++/**
++ * Process a dvb_dit_section.
++ *
++ * @param section Pointer to a generic section header.
++ * @return Pointer to a dvb_dit_section, or NULL on error.
++ */
++struct dvb_dit_section * dvb_dit_section_codec(struct section *section);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/dsng_descriptor.h dvb-apps/lib/libucsi/dvb/dsng_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/dsng_descriptor.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/dsng_descriptor.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,80 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_DSNG_DESCRIPTOR
++#define _UCSI_DVB_DSNG_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_dsng_descriptor structure.
++ */
++struct dvb_dsng_descriptor {
++      struct descriptor d;
++
++      /* uint8_t data[] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_dsng_descriptor.
++ *
++ * @param d Generic descriptor structure.
++ * @return Pointer to a dvb_dsng_descriptor, or NULL on error.
++ */
++static inline struct dvb_dsng_descriptor*
++      dvb_dsng_descriptor_codec(struct descriptor* d)
++{
++      return (struct dvb_dsng_descriptor*) d;
++}
++
++/**
++ * Accessor for the data field in a dvb_dsng_descriptor.
++ *
++ * @param d dvb_dsng_descriptor pointer.
++ * @return Pointer to the field.
++ */
++static inline uint8_t *dvb_dsng_descriptor_data(struct dvb_dsng_descriptor *d)
++{
++      return (uint8_t *) d + sizeof(struct dvb_dsng_descriptor);
++}
++
++/**
++ * Determine the length of the data field in a dvb_dsng_descriptor.
++ *
++ * @param d dvb_dsng_descriptor pointer.
++ * @return Length of the field in bytes.
++ */
++static inline int dvb_dsng_descriptor_data_length(struct dvb_dsng_descriptor *d)
++{
++      return d->d.len;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/eit_section.c dvb-apps/lib/libucsi/dvb/eit_section.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/eit_section.c       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/eit_section.c     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,63 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <libucsi/dvb/eit_section.h>
++
++struct dvb_eit_section *dvb_eit_section_codec(struct section_ext * ext)
++{
++      uint8_t * buf = (uint8_t *) ext;
++      size_t pos = sizeof(struct section_ext);
++      size_t len = section_ext_length(ext);
++
++      if (len < sizeof(struct dvb_eit_section))
++              return NULL;
++
++      bswap16(buf + pos);
++      pos += 2;
++      bswap16(buf + pos);
++      pos += 4;
++
++      while (pos < len) {
++              struct dvb_eit_event * event =
++                      (struct dvb_eit_event *) (buf + pos);
++
++              if ((pos + sizeof(struct dvb_eit_event)) > len)
++                      return NULL;
++
++              bswap16(buf + pos);
++              bswap16(buf + pos + 10);
++
++              pos += sizeof(struct dvb_eit_event);
++
++              if ((pos + event->descriptors_loop_length) > len)
++                      return NULL;
++
++              if (verify_descriptors(buf + pos, event->descriptors_loop_length))
++                      return NULL;
++
++              pos += event->descriptors_loop_length;
++      }
++
++      if (pos != len)
++              return NULL;
++
++      return (struct dvb_eit_section *) ext;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/eit_section.h dvb-apps/lib/libucsi/dvb/eit_section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/eit_section.h       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/eit_section.h     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,160 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_EIT_SECTION_H
++#define _UCSI_DVB_EIT_SECTION_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/section.h>
++#include <libucsi/dvb/types.h>
++
++
++/**
++ * dvb_eit_section structure.
++ */
++struct dvb_eit_section {
++      struct section_ext head;
++
++      uint16_t transport_stream_id;
++      uint16_t original_network_id;
++      uint8_t segment_last_section_number;
++      uint8_t last_table_id;
++      /* struct eit_event events[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the events field of a dvb_eit_section.
++ */
++struct dvb_eit_event {
++      uint16_t event_id;
++      dvbdate_t start_time;
++      dvbduration_t duration;
++  EBIT3(uint16_t running_status               : 3;  ,
++      uint16_t free_ca_mode           : 1;  ,
++      uint16_t descriptors_loop_length:12; );
++      /* struct descriptor descriptors[] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_eit_section.
++ *
++ * @param section Pointer to a generic section_ext structure.
++ * @return Pointer to a dvb_eit_section, or NULL on error.
++ */
++struct dvb_eit_section *dvb_eit_section_codec(struct section_ext *section);
++
++/**
++ * Accessor for the service_id field of an EIT.
++ *
++ * @param eit EIT pointer.
++ * @return The service_id.
++ */
++static inline uint16_t dvb_eit_section_service_id(struct dvb_eit_section *eit)
++{
++      return eit->head.table_id_ext;
++}
++
++/**
++ * Iterator for the events field of a dvb_eit_section.
++ *
++ * @param eit dvb_eit_section pointer.
++ * @param pos Variable containing a pointer to the current dvb_eit_event.
++ */
++#define dvb_eit_section_events_for_each(eit, pos) \
++      for ((pos) = dvb_eit_section_events_first(eit); \
++           (pos); \
++           (pos) = dvb_eit_section_events_next(eit, pos))
++
++/**
++ * Iterator for the descriptors field of a dvb_eit_event.
++ *
++ * @param eit dvb_eit_event pointer.
++ * @param pos Variable containing a pointer to the current descriptor.
++ */
++#define dvb_eit_event_descriptors_for_each(event, pos) \
++      for ((pos) = dvb_eit_event_descriptors_first(event); \
++           (pos); \
++           (pos) = dvb_eit_event_descriptors_next(event, pos))
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_eit_event *
++      dvb_eit_section_events_first(struct dvb_eit_section *eit)
++{
++      size_t pos = sizeof(struct dvb_eit_section);
++
++      if (pos >= section_ext_length(&eit->head))
++              return NULL;
++
++        return (struct dvb_eit_event*) ((uint8_t *) eit + pos);
++}
++
++static inline struct dvb_eit_event *
++      dvb_eit_section_events_next(struct dvb_eit_section *eit,
++                                  struct dvb_eit_event *pos)
++{
++      uint8_t *end = (uint8_t*) eit + section_ext_length(&eit->head);
++      uint8_t *next = (uint8_t *) pos +
++                      sizeof(struct dvb_eit_event) +
++                      pos->descriptors_loop_length;
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_eit_event *) next;
++}
++
++static inline struct descriptor *
++      dvb_eit_event_descriptors_first(struct dvb_eit_event * t)
++{
++      if (t->descriptors_loop_length == 0)
++              return NULL;
++
++      return (struct descriptor *)
++              ((uint8_t *) t + sizeof(struct dvb_eit_event));
++}
++
++static inline struct descriptor *
++      dvb_eit_event_descriptors_next(struct dvb_eit_event * t,
++                                     struct descriptor* pos)
++{
++      return next_descriptor((uint8_t*) t + sizeof(struct dvb_eit_event),
++                             t->descriptors_loop_length,
++                             pos);
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/extended_event_descriptor.h dvb-apps/lib/libucsi/dvb/extended_event_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/extended_event_descriptor.h 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/extended_event_descriptor.h       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,232 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_EXTENDED_EVENT_DESCRIPTOR
++#define _UCSI_DVB_EXTENDED_EVENT_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++#include <libucsi/types.h>
++
++/**
++ * dvb_extended_event_descriptor structure.
++ */
++struct dvb_extended_event_descriptor {
++      struct descriptor d;
++
++  EBIT2(uint8_t descriptor_number     : 4; ,
++      uint8_t last_descriptor_number  : 4; );
++      iso639lang_t language_code;
++      uint8_t length_of_items;
++      /* struct dvb_extended_event_item items[] */
++      /* struct dvb_extended_event_descriptor_part2 part2 */
++} __ucsi_packed;
++
++/**
++ * An entry in the items field of a dvb_extended_event_descriptor.
++ */
++struct dvb_extended_event_item {
++      uint8_t item_description_length;
++      /* uint8_t item_description[] */
++      /* struct dvb_extended_event_item_part2 part2 */
++} __ucsi_packed;
++
++/**
++ * The second part of a dvb_extended_event_item, following the variable length
++ * description field.
++ */
++struct dvb_extended_event_item_part2 {
++      uint8_t item_length;
++      /* uint8_t item[] */
++} __ucsi_packed;
++
++/**
++ * The second part of a dvb_extended_event_descriptor, following the variable
++ * length items field.
++ */
++struct dvb_extended_event_descriptor_part2 {
++      uint8_t text_length;
++      /* uint8_t text[] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_extended_event_descriptor.
++ *
++ * @param d Generic descriptor structure.
++ * @return dvb_extended_event_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_extended_event_descriptor*
++      dvb_extended_event_descriptor_codec(struct descriptor* d)
++{
++      uint8_t* buf = (uint8_t*) d + 2;
++      uint32_t pos = 0;
++      uint32_t len = d->len;
++      struct dvb_extended_event_descriptor * p =
++              (struct dvb_extended_event_descriptor *) d;
++      struct dvb_extended_event_descriptor_part2 *p2;
++
++      pos += sizeof(struct dvb_extended_event_descriptor) - 2;
++
++      if (pos > len)
++              return NULL;
++
++      pos += p->length_of_items;
++
++      if (pos > len)
++              return NULL;
++
++      p2 = (struct dvb_extended_event_descriptor_part2*) (buf+pos);
++
++      pos += sizeof(struct dvb_extended_event_descriptor_part2);
++
++      if (pos > len)
++              return NULL;
++
++      pos += p2->text_length;
++
++      if (pos != len)
++              return NULL;
++
++      return p;
++}
++
++/**
++ * Iterator for the items field of a dvb_extended_event_descriptor.
++ *
++ * @param d dvb_extended_event_descriptor pointer.
++ * @param pos Variable containing a pointer to the current dvb_extended_event_item.
++ */
++#define dvb_extended_event_descriptor_items_for_each(d, pos) \
++      for ((pos) = dvb_extended_event_descriptor_items_first(d); \
++           (pos); \
++           (pos) = dvb_extended_event_descriptor_items_next(d, pos))
++
++/**
++ * Accessor for the description field of a dvb_extended_event_item.
++ *
++ * @param d dvb_extended_event_item pointer.
++ * @return Pointer to the field.
++ */
++static inline uint8_t*
++      dvb_extended_event_item_description(struct dvb_extended_event_item *d)
++{
++      return (uint8_t*) d + sizeof(struct dvb_extended_event_item);
++}
++
++/**
++ * Accessor for the second part of a dvb_extended_event_item.
++ *
++ * @param dvb_extended_event_item pointer.
++ * @return dvb_extended_event_item_part2 pointer.
++ */
++static inline struct dvb_extended_event_item_part2*
++      dvb_extended_event_item_part2(struct dvb_extended_event_item *d)
++{
++      return (struct dvb_extended_event_item_part2*)
++              ((uint8_t*) d + sizeof(struct dvb_extended_event_item) +
++               d->item_description_length);
++}
++
++/**
++ * Accessor for the item field of a dvb_extended_event_item_part2.
++ *
++ * @param d dvb_extended_event_item_part2 pointer.
++ * @return Pointer to the item field.
++ */
++static inline uint8_t*
++      dvb_extended_event_item_part2_item(struct dvb_extended_event_item_part2 *d)
++{
++      return (uint8_t*) d + sizeof(struct dvb_extended_event_item_part2);
++}
++
++/**
++ * Accessor for the second part of a dvb_extended_event_descriptor.
++ *
++ * @param d dvb_extended_event_descriptor pointer.
++ * @return dvb_extended_event_descriptor_part2 pointer.
++ */
++static inline struct dvb_extended_event_descriptor_part2*
++      dvb_extended_event_descriptor_part2(struct dvb_extended_event_descriptor *d)
++{
++      return (struct dvb_extended_event_descriptor_part2*)
++              ((uint8_t*) d + sizeof(struct dvb_extended_event_descriptor) +
++               d->length_of_items);
++}
++
++/**
++ * Accessor for the text field of an dvb_extended_event_descriptor_part2.
++ *
++ * @param d dvb_extended_event_descriptor_part2 pointer.
++ * @return Pointer to the text field.
++ */
++static inline uint8_t*
++      dvb_extended_event_descriptor_part2_text(struct dvb_extended_event_descriptor_part2 *d)
++{
++      return (uint8_t*)
++              ((uint8_t*) d + sizeof(struct dvb_extended_event_descriptor_part2));
++}
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_extended_event_item*
++      dvb_extended_event_descriptor_items_first(struct dvb_extended_event_descriptor *d)
++{
++      if (d->length_of_items == 0)
++              return NULL;
++
++      return (struct dvb_extended_event_item *)
++              ((uint8_t*) d + sizeof(struct dvb_extended_event_descriptor));
++}
++
++static inline struct dvb_extended_event_item*
++      dvb_extended_event_descriptor_items_next(struct dvb_extended_event_descriptor *d,
++                                               struct dvb_extended_event_item *pos)
++{
++      struct dvb_extended_event_item_part2* part2 =
++              dvb_extended_event_item_part2(pos);
++      uint8_t *end = (uint8_t*) d + sizeof(struct dvb_extended_event_descriptor) + d->length_of_items;
++      uint8_t *next = (uint8_t *) part2 +
++                      sizeof(struct dvb_extended_event_item_part2) +
++                      part2->item_length;
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_extended_event_item *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/frequency_list_descriptor.h dvb-apps/lib/libucsi/dvb/frequency_list_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/frequency_list_descriptor.h 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/frequency_list_descriptor.h       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,107 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_FREQUENCY_LIST_DESCRIPTOR
++#define _UCSI_DVB_FREQUENCY_LIST_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * Possible values for coding_type.
++ */
++enum {
++      DVB_CODING_TYPE_SATELLITE               = 0x01,
++      DVB_CODING_TYPE_CABLE                   = 0x02,
++      DVB_CODING_TYPE_TERRESTRIAL             = 0x03,
++};
++
++/**
++ * dvb_frequency_list_descriptor structure.
++ */
++struct dvb_frequency_list_descriptor {
++      struct descriptor d;
++
++  EBIT2(uint8_t reserved      : 6; ,
++      uint8_t coding_type     : 2; );
++      /* uint32_t centre_frequencies [] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_frequency_list_descriptor.
++ *
++ * @param d Pointer to a generic descriptor structure.
++ * @return dvb_frequency_list_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_frequency_list_descriptor*
++      dvb_frequency_list_descriptor_codec(struct descriptor* d)
++{
++      uint32_t pos = 0;
++      uint8_t* buf = (uint8_t*) d + 2;
++      uint32_t len = d->len;
++
++      pos += sizeof(struct dvb_frequency_list_descriptor) - 2;
++
++      if ((len - pos) % 4)
++              return NULL;
++
++      while(pos < len) {
++              bswap32(buf+pos);
++              pos += 4;
++      }
++
++      return (struct dvb_frequency_list_descriptor*) d;
++}
++
++/**
++ * Accessor for the centre_frequencies field of a dvb_frequency_list_descriptor.
++ *
++ * @param d dvb_frequency_list_descriptor pointer.
++ * @return Pointer to the field.
++ */
++static inline uint32_t *
++      dvb_frequency_list_descriptor_centre_frequencies(struct dvb_frequency_list_descriptor *d)
++{
++      return (uint32_t *) ((uint8_t *) d + sizeof(struct dvb_frequency_list_descriptor));
++}
++
++/**
++ * Determine the number of entries in the centre_frequencies field of a dvb_frequency_list_descriptor.
++ *
++ * @param d dvb_frequency_list_descriptor pointer.
++ * @return The number of entries.
++ */
++static inline int
++      dvb_frequency_list_descriptor_centre_frequencies_count(struct dvb_frequency_list_descriptor *d)
++{
++      return (d->d.len - 1) >> 2;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/int_section.c dvb-apps/lib/libucsi/dvb/int_section.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/int_section.c       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/int_section.c     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,79 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ * Copyright (C) 2005 Patrick Boettcher (pb@linuxtv.org)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <libucsi/dvb/int_section.h>
++
++struct dvb_int_section * dvb_int_section_codec(struct section_ext *ext)
++{
++      uint8_t *buf = (uint8_t *) ext;
++      struct dvb_int_section *in = (struct dvb_int_section *) ext;
++      size_t pos = sizeof(struct section_ext);
++      size_t len = section_ext_length(ext);
++
++      if (len < sizeof(struct dvb_int_section))
++              return NULL;
++
++      bswap32(buf+8);
++      bswap16(buf+12);
++      pos += 6;
++
++      if (len - pos < in->platform_descriptors_length)
++              return NULL;
++
++      if (verify_descriptors(buf + pos, in->platform_descriptors_length))
++              return NULL;
++
++      pos += in->platform_descriptors_length;
++
++      while (pos < len) {
++              struct dvb_int_target *s2 = (struct dvb_int_target *) (buf + pos);
++              struct dvb_int_operational_loop *s3;
++
++              bswap16(buf + pos); /* target_descriptor_loop_length swap */
++
++              if (len - pos < s2->target_descriptors_length)
++                      return NULL;
++
++              pos += sizeof(struct dvb_int_target);
++
++              if (verify_descriptors(buf + pos, s2->target_descriptors_length))
++                      return NULL;
++
++              pos += s2->target_descriptors_length;
++
++              s3 = (struct dvb_int_operational_loop *) (buf + pos);
++
++              bswap16(buf + pos); /* operational_descriptor_loop_length swap */
++
++              if (len - pos < s3->operational_descriptors_length)
++                      return NULL;
++
++              pos += sizeof(struct dvb_int_operational_loop);
++
++              if (verify_descriptors(buf + pos, s3->operational_descriptors_length))
++                      return NULL;
++
++              pos += s3->operational_descriptors_length;
++      }
++
++      return (struct dvb_int_section *) ext;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/int_section.h dvb-apps/lib/libucsi/dvb/int_section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/int_section.h       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/int_section.h     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,245 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ * Copyright (C) 2005 Patrick Boettcher (pb@linuxtv.org)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++#ifndef _UCSI_DVB_INT_SECTION_H
++#define _UCSI_DVB_INT_SECTION_H
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/section.h>
++
++/**
++ * dvb_int_section structure - IP/MAC notification section.
++ */
++struct dvb_int_section {
++      struct section_ext head;
++
++  EBIT2(uint32_t platform_id                          :24;  ,
++      uint32_t processing_order                       : 8;  );
++  EBIT2(uint16_t reserved2                            : 4;  ,
++      uint16_t platform_descriptors_length            :12;  );
++      /* struct descriptor platform_descriptors[] */
++      /* struct dvb_int_target target_loop[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the target_loop field of a dvb_int_section.
++ */
++struct dvb_int_target {
++  EBIT2(uint16_t reserved3                    : 4;  ,
++      uint16_t target_descriptors_length      :12;  );
++      /* struct descriptor target_descriptors[] */
++      /* struct dvb_int_operational_loop operational_loop */
++} __ucsi_packed;
++
++/**
++ * The operational_loop field in a dvb_int_target.
++ */
++struct dvb_int_operational_loop {
++  EBIT2(uint16_t reserved4                            : 4;  ,
++      uint16_t operational_descriptors_length         :12;  );
++      /* struct descriptor operational_descriptors[] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_int_section.
++ *
++ * @param section Generic section_ext pointer.
++ * @return dvb_int_section pointer, or NULL on error.
++ */
++extern struct dvb_int_section * dvb_int_section_codec(struct section_ext *section);
++
++/**
++ * Accessor for the action_type field of an INT.
++ *
++ * @param intp INT pointer.
++ * @return The action_type.
++ */
++static inline uint8_t dvb_int_section_action_type(struct dvb_int_section *intp)
++{
++      return intp->head.table_id_ext >> 8;
++}
++
++/**
++ * Accessor for the platform_id_hash field of an INT.
++ *
++ * @param intp INT pointer.
++ * @return The platform_id_hash.
++ */
++static inline uint8_t dvb_int_section_platform_id_hash(struct dvb_int_section *intp)
++{
++      return intp->head.table_id_ext & 0xff;
++}
++
++/**
++ * Iterator for platform_descriptors field in a dvb_int_section.
++ *
++ * @param intp dvb_int_section pointer.
++ * @param pos Variable holding a pointer to the current descriptor.
++ */
++#define dvb_int_section_platform_descriptors_for_each(intp, pos) \
++      for ((pos) = dvb_int_section_platform_descriptors_first(intp); \
++           (pos); \
++           (pos) = dvb_int_section_platform_descriptors_next(intp, pos))
++
++/**
++ * Iterator for the target_loop field in a dvb_int_section.
++ *
++ * @param intp dvb_int_section pointer.
++ * @param pos Variable holding a pointer to the current dvb_int_target.
++ */
++#define dvb_int_section_target_loop_for_each(intp,pos) \
++      for ((pos) = dvb_int_section_target_loop_first(intp); \
++           (pos); \
++           (pos) = dvb_int_section_target_loop_next(intp, pos))
++
++/**
++ * Iterator for the target_descriptors field in a dvb_int_target.
++ *
++ * @param target dvb_int_target pointer.
++ * @param pos Variable holding a pointer to the current descriptor.
++ */
++#define dvb_int_target_target_descriptors_for_each(target, pos) \
++      for ((pos) = dvb_int_target_target_descriptors_first(target); \
++           (pos); \
++           (pos) = dvb_int_target_target_descriptors_next(target, pos))
++
++/**
++ * Accessor for the operational_loop field of a dvb_int_target.
++ *
++ * @param target dvb_int_target pointer.
++ * @return Pointer to a dvb_int_operational_loop.
++ */
++static inline struct dvb_int_operational_loop *
++      dvb_int_target_operational_loop(struct dvb_int_target *target)
++{
++      return (struct dvb_int_operational_loop *)
++              ((uint8_t *) target + sizeof(struct dvb_int_target) + target->target_descriptors_length);
++}
++
++/**
++ * Iterator for the operational_descriptors field in a dvb_int_operational_loop.
++ *
++ * @param oploop dvb_int_operational_loop pointer.
++ * @param pos Variable holding a pointer to the current descriptor.
++ */
++#define dvb_int_operational_loop_operational_descriptors_for_each(oploop, pos) \
++      for ((pos) = dvb_int_operational_loop_operational_descriptors_first(oploop); \
++           (pos); \
++           (pos) = dvb_int_operational_loop_operational_descriptors_next(oploop, pos))
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct descriptor *
++      dvb_int_section_platform_descriptors_first(struct dvb_int_section *in)
++{
++      if (in->platform_descriptors_length == 0)
++              return NULL;
++
++      return (struct descriptor *)
++              ((uint8_t *) in + sizeof(struct dvb_int_section));
++}
++
++static inline struct descriptor *
++      dvb_int_section_platform_descriptors_next(struct dvb_int_section *in,
++              struct descriptor* pos)
++{
++      return next_descriptor((uint8_t*) in + sizeof(struct dvb_int_section),
++              in->platform_descriptors_length,
++              pos);
++}
++
++static inline struct dvb_int_target *
++      dvb_int_section_target_loop_first(struct dvb_int_section *in)
++{
++      if (sizeof(struct dvb_int_section) + in->platform_descriptors_length >= (uint32_t) section_ext_length((struct section_ext *) in))
++              return NULL;
++
++      return (struct dvb_int_target *)
++              ((uint8_t *) in + sizeof(struct dvb_int_section) + in->platform_descriptors_length);
++}
++
++static inline struct dvb_int_target *
++      dvb_int_section_target_loop_next(struct dvb_int_section *in,
++                      struct dvb_int_target *pos)
++{
++      struct dvb_int_operational_loop *ol = dvb_int_target_operational_loop(pos);
++      struct dvb_int_target *next =
++              (struct dvb_int_target *) ( (uint8_t *) pos +
++                      sizeof(struct dvb_int_target) + pos->target_descriptors_length +
++                      sizeof(struct dvb_int_operational_loop) + ol->operational_descriptors_length);
++      struct dvb_int_target *end =
++              (struct dvb_int_target *) ((uint8_t *) in + section_ext_length((struct section_ext *) in) );
++
++      if (next >= end)
++              return 0;
++      return next;
++}
++
++static inline struct descriptor *
++      dvb_int_target_target_descriptors_first(struct dvb_int_target *tl)
++{
++      if (tl->target_descriptors_length == 0)
++              return NULL;
++
++      return (struct descriptor *)
++              ((uint8_t *) tl + sizeof(struct dvb_int_target));
++}
++
++static inline struct descriptor *
++      dvb_int_target_target_descriptors_next(struct dvb_int_target *tl,
++              struct descriptor* pos)
++{
++      return next_descriptor((uint8_t*) tl + sizeof(struct dvb_int_target),
++              tl->target_descriptors_length,
++              pos);
++}
++
++static inline struct descriptor *
++      dvb_int_operational_loop_operational_descriptors_first(struct dvb_int_operational_loop *ol)
++{
++      if (ol->operational_descriptors_length == 0)
++              return NULL;
++
++      return (struct descriptor *)
++              ((uint8_t *) ol + sizeof(struct dvb_int_operational_loop));
++}
++
++static inline struct descriptor *
++      dvb_int_operational_loop_operational_descriptors_next(struct dvb_int_operational_loop *ol,
++              struct descriptor* pos)
++{
++      return next_descriptor((uint8_t*) ol + sizeof(struct dvb_int_operational_loop),
++              ol->operational_descriptors_length,
++              pos);
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/ip_mac_platform_name_descriptor.h dvb-apps/lib/libucsi/dvb/ip_mac_platform_name_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/ip_mac_platform_name_descriptor.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/ip_mac_platform_name_descriptor.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,87 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_IP_MAC_PLATFORM_NAME_DESCRIPTOR
++#define _UCSI_DVB_IP_MAC_PLATFORM_NAME_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/types.h>
++
++/**
++ * dvb_ip_platform_name_descriptor structure.
++ */
++struct dvb_ip_platform_name_descriptor {
++      struct descriptor d;
++
++      iso639lang_t language_code;
++      /* uint8_t text[] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_ip_platform_name_descriptor.
++ *
++ * @param d Pointer to a generic descriptor.
++ * @return dvb_ip_platform_name_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_ip_platform_name_descriptor*
++      dvb_ip_platform_name_descriptor_codec(struct descriptor* d)
++{
++      if (d->len < (sizeof(struct dvb_ip_platform_name_descriptor) - 2))
++              return NULL;
++
++      return (struct dvb_ip_platform_name_descriptor*) d;
++}
++
++/**
++ * Accessor for the text field of a dvb_ip_platform_name_descriptor.
++ *
++ * @param d dvb_ip_platform_name_descriptor pointer.
++ * @return Pointer to the field.
++ */
++static inline uint8_t *
++      dvb_ip_platform_name_descriptor_text(struct dvb_ip_platform_name_descriptor *d)
++{
++      return (uint8_t *) d + sizeof(struct dvb_ip_platform_name_descriptor);
++}
++
++/**
++ * Determine the length of the text field of a dvb_ip_platform_name_descriptor.
++ *
++ * @param d dvb_ip_platform_name_descriptor pointer.
++ * @return Length of the field in bytes.
++ */
++static inline int
++      dvb_ip_platform_name_descriptor_text_length(struct dvb_ip_platform_name_descriptor *d)
++{
++      return d->d.len - 3;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/ip_mac_platform_provider_name_descriptor.h dvb-apps/lib/libucsi/dvb/ip_mac_platform_provider_name_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/ip_mac_platform_provider_name_descriptor.h  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/ip_mac_platform_provider_name_descriptor.h        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,87 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_IP_MAC_PLATFORM_PROVIDER_NAME_DESCRIPTOR
++#define _UCSI_DVB_IP_MAC_PLATFORM_PROVIDER_NAME_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/types.h>
++
++/**
++ * dvb_ip_platform_provider_name_descriptor structure.
++ */
++struct dvb_ip_platform_provider_name_descriptor {
++      struct descriptor d;
++
++      iso639lang_t language_code;
++      /* uint8_t text[] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_ip_platform_provider_name_descriptor.
++ *
++ * @param d Pointer to a generic descriptor.
++ * @return dvb_ip_platform_provider_name_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_ip_platform_provider_name_descriptor*
++      dvb_ip_platform_provider_name_descriptor_codec(struct descriptor* d)
++{
++      if (d->len < (sizeof(struct dvb_ip_platform_provider_name_descriptor) - 2))
++              return NULL;
++
++      return (struct dvb_ip_platform_provider_name_descriptor*) d;
++}
++
++/**
++ * Accessor for the text field of a dvb_ip_platform_provider_name_descriptor.
++ *
++ * @param d dvb_ip_platform_provider_name_descriptor pointer.
++ * @return Pointer to the field.
++ */
++static inline uint8_t *
++      dvb_ip_platform_provider_name_descriptor_text(struct dvb_ip_platform_provider_name_descriptor *d)
++{
++      return (uint8_t *) d + sizeof(struct dvb_ip_platform_provider_name_descriptor);
++}
++
++/**
++ * Determine the length of the text field of a dvb_ip_platform_provider_name_descriptor.
++ *
++ * @param d dvb_ip_platform_provider_name_descriptor pointer.
++ * @return Length of the field in bytes.
++ */
++static inline int
++      dvb_ip_platform_provider_name_descriptor_text_length(struct dvb_ip_platform_provider_name_descriptor *d)
++{
++      return d->d.len - 3;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/ip_mac_stream_location_descriptor.h dvb-apps/lib/libucsi/dvb/ip_mac_stream_location_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/ip_mac_stream_location_descriptor.h 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/ip_mac_stream_location_descriptor.h       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,73 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_IP_MAC_STREAM_LOCATION_DESCRIPTOR
++#define _UCSI_DVB_IP_MAC_PLATFORM_PROVIDER_NAME_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/types.h>
++
++/**
++ * dvb_ip_mac_stream_location_descriptor structure.
++ */
++struct dvb_ip_mac_stream_location_descriptor {
++      struct descriptor d;
++
++      uint16_t network_id;
++      uint16_t original_network_id;
++      uint16_t transport_stream_id;
++      uint16_t service_id;
++      uint8_t component_tag;
++} __ucsi_packed;
++
++/**
++ * Process a dvb_ip_mac_stream_location_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return dvb_ip_mac_stream_location_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_ip_mac_stream_location_descriptor*
++      dvb_ip_mac_stream_location_descriptor_codec(struct descriptor* d)
++{
++      uint8_t* buf = (uint8_t*) d + 2;
++
++      if (d->len != (sizeof(struct dvb_ip_mac_stream_location_descriptor) - 2))
++              return NULL;
++
++      bswap16(buf);
++      bswap16(buf+2);
++      bswap16(buf+4);
++      bswap16(buf+6);
++
++      return (struct dvb_ip_mac_stream_location_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/linkage_descriptor.h dvb-apps/lib/libucsi/dvb/linkage_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/linkage_descriptor.h        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/linkage_descriptor.h      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,480 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_LINKAGE_DESCRIPTOR
++#define _UCSI_DVB_LINKAGE_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++#include <libucsi/types.h>
++
++/**
++ * Possible values for linkage_type.
++ */
++enum {
++      DVB_LINKAGE_TYPE_INFORMATION                    = 0x01,
++      DVB_LINKAGE_TYPE_EPG                            = 0x02,
++      DVB_LINKAGE_TYPE_CA_REPLACEMENT                 = 0x03,
++      DVB_LINKAGE_TYPE_TS_WITH_BAT_NIT                = 0x04,
++      DVB_LINKAGE_TYPE_SERVICE_REPLACMENT             = 0x05,
++      DVB_LINKAGE_TYPE_DATA_BCAST                     = 0x06,
++      DVB_LINKAGE_TYPE_RCS_MAP                        = 0x07,
++      DVB_LINKAGE_TYPE_MOBILE_HANDOVER                = 0x08,
++      DVB_LINKAGE_TYPE_SOFTWARE_UPDATE                = 0x09,
++      DVB_LINKAGE_TYPE_TS_WITH_SSU_BAT_NIT            = 0x0a,
++      DVB_LINKAGE_TYPE_IP_MAC_NOTIFICATION            = 0x0b,
++      DVB_LINKAGE_TYPE_TS_WITH_INT_BAT_NIT            = 0x0c,
++};
++
++/**
++ * Possible values for hand_over_type.
++ */
++enum {
++      DVB_HAND_OVER_TYPE_IDENTICAL_NEIGHBOURING_COUNTRY       = 0x01,
++      DVB_HAND_OVER_TYPE_LOCAL_VARIATION                      = 0x02,
++      DVB_HAND_OVER_TYPE_ASSOCIATED_SERVICE                   = 0x03,
++};
++
++/**
++ * Possible values for origin_type.
++ */
++enum {
++      DVB_ORIGIN_TYPE_NIT                             = 0x00,
++      DVB_ORIGIN_TYPE_SDT                             = 0x01,
++};
++
++/**
++ * dvb_linkage_descriptor structure.
++ */
++struct dvb_linkage_descriptor {
++      struct descriptor d;
++
++      uint16_t transport_stream_id;
++      uint16_t original_network_id;
++      uint16_t service_id;
++      uint8_t linkage_type;
++      /* uint8_t data[] */
++} __ucsi_packed;
++
++/**
++ * Data for a linkage_type of 0x08.
++ */
++struct dvb_linkage_data_08 {
++  EBIT3(uint8_t hand_over_type                : 4;  ,
++      uint8_t reserved                : 3;  ,
++      uint8_t origin_type             : 1;  );
++      /* uint16_t network_id if hand_over_type == 1,2,3 */
++      /* uint16_t initial_service_id if origin_type = 0 */
++      /* uint8_t data[] */
++} __ucsi_packed;
++
++/**
++ * Data for an linkage_type of 0x0b (IP/MAC Notification Table).
++ */
++struct dvb_linkage_data_0b {
++      uint8_t platform_id_data_length;
++      /* struct platform_id ids[] */
++} __ucsi_packed;
++
++/**
++ * Entries in the ids field of a dvb_linkage_data_0b.
++ */
++struct dvb_platform_id {
++  EBIT2(uint32_t platform_id                  : 24; ,
++      uint8_t platform_name_loop_length       : 8;  );
++      /* struct platform_name names[] */
++} __ucsi_packed;
++
++/**
++ * Entries in the names field of a dvb_platform_id.
++ */
++struct dvb_platform_name {
++      iso639lang_t language_code;
++      uint8_t platform_name_length;
++      /* uint8_t text[] */
++} __ucsi_packed;
++
++/**
++ * Data for a linkage_type of 0x0c (IP/MAC Notification Table).
++ */
++struct dvb_linkage_data_0c {
++      uint8_t table_type;
++      /* uint16_t bouquet_id if table_type == 0x02 */
++} __ucsi_packed;
++
++
++/**
++ * Process a dvb_linkage_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return dvb_linkage_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_linkage_descriptor*
++      dvb_linkage_descriptor_codec(struct descriptor* d)
++{
++      uint32_t pos = 0;
++      uint8_t* buf = (uint8_t*) d + 2;
++      uint32_t len = d->len;
++      struct dvb_linkage_descriptor *p =
++              (struct dvb_linkage_descriptor*) d;
++
++      if (len < (sizeof(struct dvb_linkage_descriptor) - 2))
++              return NULL;
++
++      bswap16(buf);
++      bswap16(buf+2);
++      bswap16(buf+4);
++
++      pos += sizeof(struct dvb_linkage_descriptor) - 2;
++
++      if (p->linkage_type == 0x08) {
++              struct dvb_linkage_data_08 *d08;
++
++              if ((len - pos) < sizeof(struct dvb_linkage_data_08))
++                      return NULL;
++              d08 = (struct dvb_linkage_data_08 *) (buf+pos);
++              pos += sizeof(struct dvb_linkage_data_08);
++
++              switch(d08->hand_over_type) {
++              case 1:
++              case 2:
++              case 3:
++                      if ((len - pos) < 2)
++                              return NULL;
++                      bswap16(buf+pos);
++                      pos += 2;
++                      break;
++              }
++              if (d08->origin_type == 0) {
++                      if ((len - pos) < 2)
++                              return NULL;
++                      bswap16(buf+pos);
++                      pos+=2;
++              }
++
++      } else if (p->linkage_type == 0x0b) {
++              uint32_t pos2=0;
++              struct dvb_linkage_data_0b *l_0b = (struct dvb_linkage_data_0b *) (buf + pos);
++
++              if ((len - pos) < sizeof(struct dvb_linkage_data_0b))
++                      return NULL;
++
++              pos += sizeof(struct dvb_linkage_data_0b);
++              if ((len - pos) < l_0b->platform_id_data_length)
++                      return NULL;
++
++              while (pos2 < l_0b->platform_id_data_length) {
++                      bswap32(buf + pos + pos2);
++
++                      struct dvb_platform_id *p_id = (struct dvb_platform_id *) (buf + pos + pos2);
++                      if ((len - pos - pos2) < p_id->platform_name_loop_length)
++                              return NULL;
++
++                      pos2 += sizeof(struct dvb_platform_id) + p_id->platform_name_loop_length;
++              }
++
++              pos += pos2;
++      } else if (p->linkage_type == 0x0c) {
++              struct dvb_linkage_data_0c *l_0c = (struct dvb_linkage_data_0c *) (buf + pos);
++
++              if ((len - pos) < sizeof(struct dvb_linkage_data_0c))
++                      return NULL;
++              pos += sizeof(struct dvb_linkage_data_0c);
++
++              if (l_0c->table_type == 0x02) {
++                      if ((len - pos) < 2)
++                              return NULL;
++                      bswap16(buf+pos);
++              }
++      }
++
++      return (struct dvb_linkage_descriptor*) d;
++}
++
++/**
++ * Accessor for the data field of a dvb_linkage_descriptor.
++ *
++ * @param d dvb_linkage_descriptor pointer.
++ * @return Pointer to the data field.
++ */
++static inline uint8_t *
++      dvb_linkage_descriptor_data(struct dvb_linkage_descriptor *d)
++{
++      return (uint8_t *) d + sizeof(struct dvb_linkage_descriptor);
++}
++
++/**
++ * Determine the length of the data field of a dvb_linkage_descriptor.
++ *
++ * @param d dvb_linkage_descriptor pointer.
++ * @return Length of the field in bytes.
++ */
++static inline int
++      dvb_linkage_descriptor_data_length(struct dvb_linkage_descriptor *d)
++{
++      return d->d.len - 7;
++}
++
++/**
++ * Accessor for a dvb_linkage_data_08 pointer.
++ *
++ * @param d dvb_linkage_descriptor pointer.
++ * @return Pointer to the data field.
++ */
++static inline struct dvb_linkage_data_08 *
++      dvb_linkage_data_08(struct dvb_linkage_descriptor *d)
++{
++      if (d->linkage_type != 0x08)
++              return NULL;
++      return (struct dvb_linkage_data_08 *) dvb_linkage_descriptor_data(d);
++}
++
++/**
++ * Accessor for the network_id field of a dvb_linkage_data_08.
++ *
++ * @param d dvb_linkage_descriptor pointer
++ * @param d08 dvb_linkage_data_08 pointer.
++ * @return network_id, or -1 if not present
++ */
++static inline int
++      dvb_linkage_data_08_network_id(struct dvb_linkage_descriptor *d, struct dvb_linkage_data_08 *d08)
++{
++      if (d->linkage_type != 0x08)
++              return -1;
++
++      switch(d08->hand_over_type) {
++      case 1:
++      case 2:
++      case 3:
++              return *((uint16_t*) ((uint8_t*) d08 + sizeof(struct dvb_linkage_data_08)));
++      }
++
++      return -1;
++}
++
++/**
++ * Accessor for the initial_service_id field of a dvb_linkage_data_08.
++ *
++ * @param d dvb_linkage_descriptor pointer
++ * @param d08 dvb_linkage_data_08 pointer.
++ * @return initial_service_id, or -1 if not present
++ */
++static inline int
++      dvb_linkage_data_08_initial_service_id(struct dvb_linkage_descriptor *d, struct dvb_linkage_data_08 *d08)
++{
++      uint8_t *pos;
++
++      if (d->linkage_type != 0x08)
++              return -1;
++      if (d08->origin_type != 0)
++              return -1;
++
++      pos = ((uint8_t*) d08) + sizeof(struct dvb_linkage_data_08);
++      switch(d08->hand_over_type) {
++      case 1:
++      case 2:
++      case 3:
++              pos +=2;
++              break;
++      }
++
++      return *((uint16_t*) pos);
++}
++
++/**
++ * Accessor for the data field of a dvb_linkage_data_08.
++ *
++ * @param d dvb_linkage_descriptor pointer
++ * @param d08 dvb_linkage_data_08 pointer.
++ * @param length Pointer to int destination for data length.
++ * @return Pointer to the data field, or NULL if invalid
++ */
++static inline uint8_t *
++      dvb_linkage_data_08_data(struct dvb_linkage_descriptor *d, struct dvb_linkage_data_08 *d08, int *length)
++{
++      uint8_t *pos;
++      int used = 0;
++
++      if (d->linkage_type != 0x08) {
++              *length = 0;
++              return NULL;
++      }
++
++      pos = ((uint8_t*) d08) + sizeof(struct dvb_linkage_data_08);
++      switch(d08->hand_over_type) {
++      case 1:
++      case 2:
++      case 3:
++              pos += 2;
++              used += 2;
++              break;
++      }
++      if (d08->origin_type == 0) {
++              pos+=2;
++              used+=2;
++      }
++
++      *length = dvb_linkage_descriptor_data_length(d) - (sizeof(struct dvb_linkage_data_08) + used);
++      return pos;
++}
++
++/**
++ * Accessor for a dvb_linkage_data_0b pointer.
++ *
++ * @param d dvb_linkage_descriptor pointer.
++ * @return Pointer to the data field.
++ */
++static inline struct dvb_linkage_data_0b *
++      dvb_linkage_data_0b(struct dvb_linkage_descriptor *d)
++{
++      if (d->linkage_type != 0x0b)
++              return NULL;
++      return (struct dvb_linkage_data_0b *) dvb_linkage_descriptor_data(d);
++}
++
++/**
++ * Iterator for the platform_id field of a dvb_linkage_data_0b.
++ *
++ * @param linkage dvb_linkage_data_0b pointer.
++ * @param pos Variable containing a pointer to the current dvb_platform_id.
++ */
++#define dvb_linkage_data_0b_platform_id_for_each(linkage, pos) \
++      for ((pos) = dvb_platform_id_first(linkage); \
++           (pos); \
++           (pos) = dvb_platform_id_next(linkage, pos))
++
++/**
++ * Iterator for the platform_name field of a dvb_platform_id.
++ *
++ * @param platid dvb_platform_id pointer.
++ * @param pos Variable containing a pointer to the current dvb_platform_name.
++ */
++#define dvb_platform_id_platform_name_for_each(platid, pos) \
++      for ((pos) = dvb_platform_name_first(platid); \
++           (pos); \
++           (pos) = dvb_platform_name_next(platid, pos))
++
++/**
++ * Accessor for the text field of a dvb_platform_name.
++ *
++ * @param p dvb_platform_name pointer.
++ * @return Pointer to the field.
++ */
++static inline uint8_t *
++      dvb_platform_name_text(struct dvb_platform_name *p)
++{
++      return (uint8_t *) p + sizeof(struct dvb_platform_name);
++}
++
++/**
++ * Accessor for a dvb_linkage_data_0c pointer.
++ *
++ * @param d dvb_linkage_descriptor pointer.
++ * @return Pointer to the data field.
++ */
++static inline struct dvb_linkage_data_0c *
++              dvb_linkage_data_0c(struct dvb_linkage_descriptor *d)
++{
++      if (d->linkage_type != 0x0c)
++              return NULL;
++      return (struct dvb_linkage_data_0c *) dvb_linkage_descriptor_data(d);
++}
++
++/**
++ * Accessor for the bouquet_id field of a dvb_linkage_data_0c if table_id == 0x02.
++ *
++ * @param l_0c dvb_linkage_data_0c pointer.
++ * @return The bouquet field, or -1 on error.
++ */
++static inline int
++      dvb_linkage_data_0c_bouquet_id(struct dvb_linkage_data_0c *l_0c)
++{
++      if (l_0c->table_type != 0x02)
++              return -1;
++
++      return *((uint16_t *) ((uint8_t*) l_0c + 1));
++}
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_platform_id *
++      dvb_platform_id_first(struct dvb_linkage_data_0b *d)
++{
++      if (d->platform_id_data_length == 0)
++              return NULL;
++
++      return (struct dvb_platform_id *) ((uint8_t *) d + sizeof(struct dvb_linkage_data_0b));
++}
++
++static inline struct dvb_platform_id *
++      dvb_platform_id_next(struct dvb_linkage_data_0b *d,
++                                  struct dvb_platform_id *pos)
++{
++      uint8_t *end = (uint8_t *) d + d->platform_id_data_length;
++      uint8_t *next = (uint8_t *) pos +
++                      sizeof(struct dvb_platform_id) +
++                      pos->platform_name_loop_length;
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_platform_id *) next;
++}
++
++static inline struct dvb_platform_name *
++      dvb_platform_name_first(struct dvb_platform_id *p)
++{
++      if (p->platform_name_loop_length == 0)
++              return NULL;
++
++      return (struct dvb_platform_name *) ((uint8_t *) p + sizeof(struct dvb_platform_id));
++}
++
++static inline struct dvb_platform_name *
++      dvb_platform_name_next(struct dvb_platform_id *p,
++                                  struct dvb_platform_name *pos)
++{
++      uint8_t *end = (uint8_t *) p + p->platform_name_loop_length;
++      uint8_t *next = (uint8_t *) pos +
++                      sizeof(struct dvb_platform_name) +
++                      pos->platform_name_length;
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_platform_name *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/local_time_offset_descriptor.h dvb-apps/lib/libucsi/dvb/local_time_offset_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/local_time_offset_descriptor.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/local_time_offset_descriptor.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,127 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_LOCAL_TIME_OFFSET_DESCRIPTOR
++#define _UCSI_DVB_LOCAL_TIME_OFFSET_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++#include <libucsi/types.h>
++#include <libucsi/dvb/types.h>
++
++/**
++ * dvb_local_time_offset_descriptor parameter.
++ */
++struct dvb_local_time_offset_descriptor {
++      struct descriptor d;
++
++      /* struct dvb_local_time_offset offsets[] */
++} __ucsi_packed;
++
++/**
++ * Entry in the offsets field of dvb_local_time_offset_descriptor.
++ */
++struct dvb_local_time_offset {
++      iso639country_t country_code;
++  EBIT3(uint8_t country_region_id             : 6; ,
++      uint8_t reserved                        : 1; ,
++      uint8_t local_time_offset_polarity      : 1; );
++      dvbhhmm_t local_time_offset;
++      dvbdate_t time_of_change;
++      dvbhhmm_t next_time_offset;
++} __ucsi_packed;
++
++/**
++ * Process a dvb_local_time_offset_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return dvb_local_time_offset_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_local_time_offset_descriptor*
++      dvb_local_time_offset_descriptor_codec(struct descriptor* d)
++{
++      uint32_t len = d->len;
++      uint32_t pos = 0;
++
++      if (len % sizeof(struct dvb_local_time_offset))
++              return NULL;
++
++      while(pos < len) {
++              pos += sizeof(struct dvb_local_time_offset);
++      }
++
++      return (struct dvb_local_time_offset_descriptor*) d;
++}
++
++/**
++ * Iterator for the offsets field of a dvb_local_time_offset_descriptor.
++ *
++ * @param d dvb_local_time_offset_descriptor pointer.
++ * @param pos Variable containing a pointer to the current dvb_local_time_offset.
++ */
++#define dvb_local_time_offset_descriptor_offsets_for_each(d, pos) \
++      for ((pos) = dvb_local_time_offset_descriptor_offsets_first(d); \
++           (pos); \
++           (pos) = dvb_local_time_offset_descriptor_offsets_next(d, pos))
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_local_time_offset*
++      dvb_local_time_offset_descriptor_offsets_first(struct dvb_local_time_offset_descriptor *d)
++{
++      if (d->d.len == 0)
++              return NULL;
++
++      return (struct dvb_local_time_offset *)
++              ((uint8_t*) d + sizeof(struct dvb_local_time_offset_descriptor));
++}
++
++static inline struct dvb_local_time_offset*
++      dvb_local_time_offset_descriptor_offsets_next(struct dvb_local_time_offset_descriptor *d,
++                                                    struct dvb_local_time_offset *pos)
++{
++      uint8_t *end = (uint8_t*) d + 2 + d->d.len;
++      uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_local_time_offset);
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_local_time_offset *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/Makefile dvb-apps/lib/libucsi/dvb/Makefile
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/Makefile    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/Makefile  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,123 @@
++# Makefile for linuxtv.org dvb-apps/lib/libucsi/dvb
++
++.PHONY: sub-error-dvb
++
++sub-error-dvb:
++      $(error You can't use this makefile directly.)
++
++ifneq ($(lib_name),)
++
++objects += dvb/bat_section.o           \
++           dvb/dit_section.o           \
++           dvb/eit_section.o           \
++           dvb/int_section.o           \
++           dvb/nit_section.o           \
++           dvb/rst_section.o           \
++           dvb/sdt_section.o           \
++           dvb/sit_section.o           \
++           dvb/st_section.o            \
++           dvb/tdt_section.o           \
++           dvb/tot_section.o           \
++           dvb/tva_container_section.o \
++           dvb/types.o
++
++sub-install += dvb
++
++else
++
++includes = ac3_descriptor.h                                    \
++           adaptation_field_data_descriptor.h                  \
++           ait_application_descriptor.h                        \
++           ait_application_icons_descriptor.h                  \
++           ait_application_name_descriptor.h                   \
++           ait_external_application_authorisation_descriptor.h \
++           ancillary_data_descriptor.h                         \
++           announcement_support_descriptor.h                   \
++           application_signalling_descriptor.h                 \
++           bat_section.h                                       \
++           bouquet_name_descriptor.h                           \
++           ca_identifier_descriptor.h                          \
++           cable_delivery_descriptor.h                         \
++           cell_frequency_link_descriptor.h                    \
++           cell_list_descriptor.h                              \
++           component_descriptor.h                              \
++           content_descriptor.h                                \
++           content_identifier_descriptor.h                     \
++           country_availability_descriptor.h                   \
++           data_broadcast_descriptor.h                         \
++           data_broadcast_id_descriptor.h                      \
++           default_authority_descriptor.h                      \
++           descriptor.h                                        \
++           dit_section.h                                       \
++           dsng_descriptor.h                                   \
++           eit_section.h                                       \
++           extended_event_descriptor.h                         \
++           frequency_list_descriptor.h                         \
++           int_section.h                                       \
++           ip_mac_platform_name_descriptor.h                   \
++           ip_mac_platform_provider_name_descriptor.h          \
++           ip_mac_stream_location_descriptor.h                 \
++           linkage_descriptor.h                                \
++           local_time_offset_descriptor.h                      \
++           mhp_data_broadcast_id_descriptor.h                  \
++           mosaic_descriptor.h                                 \
++           mpe_fec_section.h                                   \
++           multilingual_bouquet_name_descriptor.h              \
++           multilingual_component_descriptor.h                 \
++           multilingual_network_name_descriptor.h              \
++           multilingual_service_name_descriptor.h              \
++           network_name_descriptor.h                           \
++           nit_section.h                                       \
++           nvod_reference_descriptor.h                         \
++           parental_rating_descriptor.h                        \
++           partial_transport_stream_descriptor.h               \
++           pdc_descriptor.h                                    \
++           private_data_specifier_descriptor.h                 \
++           related_content_descriptor.h                        \
++           rnt_rar_over_dvb_stream_descriptor.h                \
++           rnt_rar_over_ip_descriptor.h                        \
++           rnt_rnt_scan_descriptor.h                           \
++           rst_section.h                                       \
++           s2_satellite_delivery_descriptor.h                  \
++           satellite_delivery_descriptor.h                     \
++           scrambling_descriptor.h                             \
++           sdt_section.h                                       \
++           section.h                                           \
++           service_availability_descriptor.h                   \
++           service_descriptor.h                                \
++           service_identifier_descriptor.h                     \
++           service_list_descriptor.h                           \
++           service_move_descriptor.h                           \
++           short_event_descriptor.h                            \
++           short_smoothing_buffer_descriptor.h                 \
++           sit_section.h                                       \
++           st_section.h                                        \
++           stream_identifier_descriptor.h                      \
++           stuffing_descriptor.h                               \
++           subtitling_descriptor.h                             \
++           target_ip_address_descriptor.h                      \
++           target_ipv6_address_descriptor.h                    \
++           target_ip_slash_descriptor.h                        \
++           target_ip_source_slash_descriptor.h                 \
++           target_ipv6_slash_descriptor.h                      \
++           target_ipv6_source_slash_descriptor.h               \
++           tdt_section.h                                       \
++           telephone_descriptor.h                              \
++           teletext_descriptor.h                               \
++           terrestrial_delivery_descriptor.h                   \
++           time_shifted_event_descriptor.h                     \
++           time_shifted_service_descriptor.h                   \
++           time_slice_fec_identifier_descriptor.h              \
++           tot_section.h                                       \
++           transport_stream_descriptor.h                       \
++           tva_container_section.h                             \
++           tva_id_descriptor.h                                 \
++           types.h                                             \
++           vbi_data_descriptor.h                               \
++           vbi_teletext_descriptor.h
++
++include ../../../Make.rules
++
++lib_name = libucsi/dvb
++
++endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/mhp_data_broadcast_id_descriptor.h dvb-apps/lib/libucsi/dvb/mhp_data_broadcast_id_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/mhp_data_broadcast_id_descriptor.h  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/mhp_data_broadcast_id_descriptor.h        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,110 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_MHP_DATA_BROADCAST_ID_DESCRIPTOR
++#define _UCSI_DVB_MHP_DATA_BROADCAST_ID_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#ifndef _UCSI_DVB_DATA_BROADCAST_ID_DESCRIPTOR
++#error Must include dvb/data_broadcast_id_descriptor.h first
++#endif
++
++/**
++ * Broadcast IDs for MHP.
++ */
++enum {
++      DVB_BROADCAST_ID_MHP_OBJECT_CAROUSEL = 0x00f0,
++      DVB_BROADCAST_ID_MHP_MPE = 0x00f1,
++};
++
++/**
++ * dvb_mhp_data_broadcast_id_descriptor structure.
++ */
++struct dvb_mhp_data_broadcast_id_descriptor {
++      struct dvb_data_broadcast_id_descriptor d;
++      /* uint16_t application_type[] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_mhp_data_broadcast_id_descriptor.
++ *
++ * @param d Generic descriptor structure.
++ * @return dvb_mhp_data_broadcast_id_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_mhp_data_broadcast_id_descriptor*
++      dvb_mhp_data_broadcast_id_descriptor_codec(struct dvb_data_broadcast_id_descriptor* d)
++{
++      uint8_t * buf;
++      int len;
++      int pos = 0;
++      struct dvb_mhp_data_broadcast_id_descriptor *res =
++              (struct dvb_mhp_data_broadcast_id_descriptor *) d;
++
++      if ((res->d.data_broadcast_id < 0xf0) || (res->d.data_broadcast_id > 0xfe))
++              return NULL;
++
++      buf = dvb_data_broadcast_id_descriptor_id_selector_byte(d);
++      len = dvb_data_broadcast_id_descriptor_id_selector_byte_length(d);
++
++      if (len % 2)
++              return NULL;
++
++      while(pos < len) {
++              bswap16(buf+pos);
++              pos+=2;
++      }
++
++      return res;
++}
++
++/**
++ * Accessor for the application_type field of a dvb_mhp_data_broadcast_id_descriptor.
++ *
++ * @param d dvb_mhp_data_broadcast_id_descriptor pointer.
++ * @return Pointer to the field.
++ */
++static inline uint16_t *
++      dvb_mhp_data_broadcast_id_descriptor_id_application_type(struct dvb_mhp_data_broadcast_id_descriptor *d)
++{
++      return (uint16_t *) dvb_data_broadcast_id_descriptor_id_selector_byte((struct dvb_data_broadcast_id_descriptor*) d);
++}
++
++/**
++ * Determine the number of entries in the application_type field of a dvb_mhp_data_broadcast_id_descriptor.
++ *
++ * @param d dvb_data_broadcast_id_descriptor pointer.
++ * @return Length of the field in bytes.
++ */
++static inline int
++      dvb_mhp_data_broadcast_id_descriptor_id_application_type_count(struct dvb_mhp_data_broadcast_id_descriptor *d)
++{
++      return dvb_data_broadcast_id_descriptor_id_selector_byte_length((struct dvb_data_broadcast_id_descriptor*) d) >> 1;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/mosaic_descriptor.h dvb-apps/lib/libucsi/dvb/mosaic_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/mosaic_descriptor.h 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/mosaic_descriptor.h       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,324 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_MOSAIC_DESCRIPTOR
++#define _UCSI_DVB_MOSAIC_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_mosaic_descriptor structure.
++ */
++struct dvb_mosaic_descriptor {
++      struct descriptor d;
++
++  EBIT4(uint8_t mosaic_entry_point            : 1; ,
++      uint8_t number_of_horiz_elementary_cells: 3; ,
++      uint8_t reserved                        : 1; ,
++      uint8_t number_of_vert_elementary_cells : 3; );
++      /* struct dvb_mosaic_info infos[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the infos field of a dvb_mosaic_descriptor.
++ */
++struct dvb_mosaic_info {
++  EBIT3(uint16_t logical_cell_id              : 6; ,
++      uint16_t reserved                       : 7; ,
++      uint16_t logical_cell_presentation_info : 3; );
++      uint8_t elementary_cell_field_length;
++      /* struct dvb_mosaic_elementary_cell_field fields[] */
++      /* struct dvb_mosaic_info_part2 part2 */
++      /* struct dvb_mosaic_linkage linkage */
++} __ucsi_packed;
++
++/**
++ * An entry in the fields field of a dvb_mosaic_info.
++ */
++struct dvb_mosaic_elementary_cell_field {
++  EBIT2(uint8_t reserved              : 2; ,
++      uint8_t elementary_cell_id      : 6; );
++} __ucsi_packed;
++
++/**
++ * Part2 of dvb_mosaic_info, following the variable length fields field.
++ */
++struct dvb_mosaic_info_part2 {
++      uint8_t cell_linkage_info;
++} __ucsi_packed;
++
++struct dvb_mosaic_linkage_01 {
++      uint16_t bouquet_id;
++} __ucsi_packed;
++
++struct dvb_mosaic_linkage_02 {
++      uint16_t original_network_id;
++      uint16_t transport_stream_id;
++      uint16_t service_id;
++} __ucsi_packed;
++
++struct dvb_mosaic_linkage_03 {
++      uint16_t original_network_id;
++      uint16_t transport_stream_id;
++      uint16_t service_id;
++} __ucsi_packed;
++
++struct dvb_mosaic_linkage_04 {
++      uint16_t original_network_id;
++      uint16_t transport_stream_id;
++      uint16_t service_id;
++      uint16_t event_id;
++} __ucsi_packed;
++
++/**
++ * Structure describing the linkage field of a dvb_mosaic_info
++ */
++struct dvb_mosaic_linkage {
++      union {
++              struct dvb_mosaic_linkage_01 linkage_01;
++              struct dvb_mosaic_linkage_02 linkage_02;
++              struct dvb_mosaic_linkage_03 linkage_03;
++              struct dvb_mosaic_linkage_04 linkage_04;
++      } u;
++} __ucsi_packed;
++
++/**
++ * Process a dvb_mosaic_descriptor.
++ *
++ * @param d Pointer to a generic descriptor structure.
++ */
++static inline struct dvb_mosaic_descriptor*
++      dvb_mosaic_descriptor_codec(struct descriptor* d)
++{
++      uint8_t* buf = (uint8_t*) d + 2;
++      uint32_t pos = 0;
++      uint32_t len = d->len;
++      struct dvb_mosaic_descriptor * p =
++              (struct dvb_mosaic_descriptor *) d;
++
++      pos += (sizeof(struct dvb_mosaic_descriptor) - 2);
++
++      if (pos > len)
++              return NULL;
++
++      while(pos < len) {
++              struct dvb_mosaic_info *e =
++                      (struct dvb_mosaic_info*) (buf+pos);
++              struct dvb_mosaic_info_part2 *e2;
++              struct dvb_mosaic_linkage *linkage;
++
++              if ((pos + sizeof(struct dvb_mosaic_info)) > len)
++                      return NULL;
++
++              bswap16(buf + pos);
++
++              pos += sizeof(struct dvb_mosaic_info) +
++                      e->elementary_cell_field_length;
++
++              if (pos > len)
++                      return NULL;
++
++              e2 = (struct dvb_mosaic_info_part2*) (buf+pos);
++
++              pos += sizeof(struct dvb_mosaic_info_part2);
++
++              if (pos > len)
++                      return NULL;
++
++              linkage = (struct dvb_mosaic_linkage*) (buf+pos);
++
++              switch(e2->cell_linkage_info) {
++              case 0x01:
++                      if ((pos + sizeof(struct dvb_mosaic_linkage_01)) > len)
++                              return NULL;
++                      bswap16(buf+pos);
++                      pos += sizeof(struct dvb_mosaic_linkage_01);
++                      break;
++
++              case 0x02:
++                      if ((pos + sizeof(struct dvb_mosaic_linkage_02)) > len)
++                              return NULL;
++                      bswap16(buf+pos);
++                      bswap16(buf+pos+2);
++                      bswap16(buf+pos+4);
++                      pos += sizeof(struct dvb_mosaic_linkage_02);
++                      break;
++
++              case 0x03:
++                      if ((pos + sizeof(struct dvb_mosaic_linkage_03)) > len)
++                              return NULL;
++                      bswap16(buf+pos);
++                      bswap16(buf+pos+2);
++                      bswap16(buf+pos+4);
++                      pos += sizeof(struct dvb_mosaic_linkage_03);
++                      break;
++
++              case 0x04:
++                      if ((pos + sizeof(struct dvb_mosaic_linkage_04)) > len)
++                              return NULL;
++                      bswap16(buf+pos);
++                      bswap16(buf+pos+2);
++                      bswap16(buf+pos+4);
++                      bswap16(buf+pos+6);
++                      pos += sizeof(struct dvb_mosaic_linkage_04);
++                      break;
++              }
++      }
++
++      return p;
++}
++
++/**
++ * Iterator over the infos field of a dvb_mosaic_descriptor.
++ *
++ * @param d dvb_mosaic_descriptor pointer.
++ * @param pos Variable containing a pointer to the current dvb_mosaic_info.
++ */
++#define dvb_mosaic_descriptor_infos_for_each(d, pos) \
++      for ((pos) = dvb_mosaic_descriptor_infos_first(d); \
++           (pos); \
++           (pos) = dvb_mosaic_descriptor_infos_next(d, pos))
++
++/**
++ * Iterator over the fields field of a dvb_mosaic_info.
++ *
++ * @param info dvb_mosaic_info pointer.
++ * @param pos Variable containing a pointer to the current dvb_mosaic_elementary_cell_field.
++ */
++#define dvb_mosaic_info_fields_for_each(info, pos) \
++      for ((pos) = dvb_mosaic_info_fields_first(info); \
++           (pos); \
++           (pos) = dvb_mosaic_info_fields_next(info, pos))
++
++/**
++ * Accessor for the second part of the dvb_mosaic_info structure.
++ *
++ * @param entry dvb_mosaic_info pointer.
++ * @return dvb_mosaic_info_part2 pointer.
++ */
++static inline struct dvb_mosaic_info_part2*
++      dvb_mosaic_info_part2(struct dvb_mosaic_info* entry)
++{
++      return (struct dvb_mosaic_info_part2*)
++              ((uint8_t*) entry + sizeof(struct dvb_mosaic_info) +
++               entry->elementary_cell_field_length);
++}
++
++/**
++ * Accessor for the linkage field a dvb_mosaic_info structure.
++ *
++ * @param entry dvb_mosaic_info_part2 pointer.
++ * @return dvb_mosaic_linkage pointer, or NULL on error.
++ */
++static inline struct dvb_mosaic_linkage*
++      dvb_mosaic_linkage(struct dvb_mosaic_info_part2* entry)
++{
++      if ((entry->cell_linkage_info != 0x01) &&
++          (entry->cell_linkage_info != 0x02) &&
++          (entry->cell_linkage_info != 0x03) &&
++          (entry->cell_linkage_info != 0x04))
++              return NULL;
++
++      return (struct dvb_mosaic_linkage*)
++              ((uint8_t*) entry + sizeof(struct dvb_mosaic_info_part2));
++}
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_mosaic_info*
++      dvb_mosaic_descriptor_infos_first(struct dvb_mosaic_descriptor *d)
++{
++      if (d->d.len == 1)
++              return NULL;
++
++      return (struct dvb_mosaic_info *)
++              ((uint8_t*) d + sizeof(struct dvb_mosaic_descriptor));
++}
++
++static inline struct dvb_mosaic_info*
++      dvb_mosaic_descriptor_infos_next(struct dvb_mosaic_descriptor *d,
++                                       struct dvb_mosaic_info *pos)
++{
++      struct dvb_mosaic_info_part2* part2 = dvb_mosaic_info_part2(pos);
++      uint8_t *end = (uint8_t*) d + 2 + d->d.len;
++      uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_mosaic_info) +
++                      pos->elementary_cell_field_length +
++                      sizeof(struct dvb_mosaic_info_part2);
++
++      if (part2->cell_linkage_info == 0x01)
++              next += sizeof(struct dvb_mosaic_linkage_01);
++      else if (part2->cell_linkage_info == 0x02)
++              next += sizeof(struct dvb_mosaic_linkage_02);
++      else if (part2->cell_linkage_info == 0x03)
++              next += sizeof(struct dvb_mosaic_linkage_03);
++      else if (part2->cell_linkage_info == 0x04)
++              next += sizeof(struct dvb_mosaic_linkage_04);
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_mosaic_info *) next;
++}
++
++static inline struct dvb_mosaic_elementary_cell_field*
++      dvb_mosaic_info_fields_first(struct dvb_mosaic_info *d)
++{
++      if (d->elementary_cell_field_length == 0)
++              return NULL;
++
++      return (struct dvb_mosaic_elementary_cell_field*)
++              ((uint8_t*) d + sizeof(struct dvb_mosaic_info));
++}
++
++static inline struct dvb_mosaic_elementary_cell_field*
++      dvb_mosaic_info_fields_next(struct dvb_mosaic_info *d,
++                                  struct dvb_mosaic_elementary_cell_field* pos)
++{
++      uint8_t *end = (uint8_t*) d + sizeof(struct dvb_mosaic_info) +
++                      d->elementary_cell_field_length;
++      uint8_t *next = (uint8_t *) pos +
++                      sizeof(struct dvb_mosaic_elementary_cell_field);
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_mosaic_elementary_cell_field *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/mpe_fec_section.h dvb-apps/lib/libucsi/dvb/mpe_fec_section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/mpe_fec_section.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/mpe_fec_section.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,73 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ * Copyright (C) 2008 Patrick Boettcher (pb@linuxtv.org)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_MPE_FEC_SECTION_H
++#define _UCSI_DVB_MPE_FEC_SECTION_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/mpeg/section.h>
++
++/**
++ * mpe_fec_section structure. TODO
++ */
++struct mpe_fec_section {
++      struct section head;
++};
++
++
++/**
++ * real_time_paramters
++ * can also be found in datagram_section in MAC4-1-bytes */
++struct real_time_parameters {
++  EBIT4(uint32_t delta_t         : 12; ,
++      uint32_t table_boundary  : 1;  ,
++      uint32_t frame_boundary  : 1;  ,
++      uint32_t address         : 18; )
++};
++
++
++static inline struct real_time_parameters * datagram_section_real_time_parameters_codec(struct datagram_section *d)
++{
++      struct real_time_parameters *rt = (struct real_time_parameters *) &d->MAC_address_4;
++      uint8_t b[4];
++      b[0] = d->MAC_address_4;
++      b[1] = d->MAC_address_3;
++      b[2] = d->MAC_address_2;
++      b[3] = d->MAC_address_1;
++
++      rt->delta_t = (b[0] << 4) | ((b[1] >> 4) & 0x0f);
++      rt->table_boundary = (b[1] >> 3) & 0x1;
++      rt->frame_boundary = (b[1] >> 2) & 0x1;
++      rt->address        = ((b[1] & 0x3) << 16) | (b[2] << 8) | b[3];
++
++      return rt;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/multilingual_bouquet_name_descriptor.h dvb-apps/lib/libucsi/dvb/multilingual_bouquet_name_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/multilingual_bouquet_name_descriptor.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/multilingual_bouquet_name_descriptor.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,145 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_MULTILINGUAL_BOUQUET_NAME_DESCRIPTOR
++#define _UCSI_DVB_MULTILINGUAL_BOUQUET_NAME_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++#include <libucsi/types.h>
++
++/**
++ * dvb_multilingual_bouquet_name_descriptor structure.
++ */
++struct dvb_multilingual_bouquet_name_descriptor {
++      struct descriptor d;
++
++      /* struct dvb_multilingual_bouquet_name names[]*/
++} __ucsi_packed;
++
++/**
++ * An entry in the names field of a dvb_multilingual_bouquet_name_descriptor.
++ */
++struct dvb_multilingual_bouquet_name {
++      iso639lang_t language_code;
++      uint8_t bouquet_name_length;
++      /* uint8_t name[] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_multilingual_bouquet_name_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return dvb_multilingual_bouquet_name_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_multilingual_bouquet_name_descriptor*
++      dvb_multilingual_bouquet_name_descriptor_codec(struct descriptor* d)
++{
++      uint8_t* buf = (uint8_t*) d + 2;
++      uint32_t pos = 0;
++      uint32_t len = d->len;
++
++      while(pos < len) {
++              struct dvb_multilingual_bouquet_name *e =
++                      (struct dvb_multilingual_bouquet_name*) (buf+pos);
++
++              pos += sizeof(struct dvb_multilingual_bouquet_name);
++
++              if (pos > len)
++                      return NULL;
++
++              pos += e->bouquet_name_length;
++
++              if (pos > len)
++                      return NULL;
++      }
++
++      return (struct dvb_multilingual_bouquet_name_descriptor*) d;
++}
++
++/**
++ * Iterator for entries in the names field of a dvb_multilingual_bouquet_name_descriptor.
++ *
++ * @param d dvb_multilingual_bouquet_name_descriptor pointer.
++ * @param pos Variable containing a pointer to the current dvb_multilingual_bouquet_name.
++ */
++#define dvb_multilingual_bouquet_name_descriptor_names_for_each(d, pos) \
++      for ((pos) = dvb_multilingual_bouquet_name_descriptor_names_first(d); \
++           (pos); \
++           (pos) = dvb_multilingual_bouquet_name_descriptor_names_next(d, pos))
++
++/**
++ * Accessor for the name field of a dvb_multilingual_bouquet_name.
++ *
++ * @param e dvb_multilingual_bouquet_name pointer.
++ * @return Pointer to the field.
++ */
++static inline uint8_t *
++      dvb_multilingual_bouquet_name_name(struct dvb_multilingual_bouquet_name *e)
++{
++      return (uint8_t *) e + sizeof(struct dvb_multilingual_bouquet_name);
++}
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_multilingual_bouquet_name*
++      dvb_multilingual_bouquet_name_descriptor_names_first(struct dvb_multilingual_bouquet_name_descriptor *d)
++{
++      if (d->d.len == 0)
++              return NULL;
++
++      return (struct dvb_multilingual_bouquet_name *)
++              ((uint8_t*) d + sizeof(struct dvb_multilingual_bouquet_name_descriptor));
++}
++
++static inline struct dvb_multilingual_bouquet_name*
++      dvb_multilingual_bouquet_name_descriptor_names_next(struct dvb_multilingual_bouquet_name_descriptor *d,
++                                                          struct dvb_multilingual_bouquet_name *pos)
++{
++      uint8_t *end = (uint8_t*) d + 2 + d->d.len;
++      uint8_t *next = (uint8_t *) pos +
++                      sizeof(struct dvb_multilingual_bouquet_name) +
++                      pos->bouquet_name_length;
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_multilingual_bouquet_name *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/multilingual_component_descriptor.h dvb-apps/lib/libucsi/dvb/multilingual_component_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/multilingual_component_descriptor.h 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/multilingual_component_descriptor.h       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,149 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_MULTILINGUAL_COMPONENT_DESCRIPTOR
++#define _UCSI_DVB_MULTILINGUAL_COMPONENT_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++#include <libucsi/types.h>
++
++/**
++ * dvb_multilingual_component_descriptor structure.
++ */
++struct dvb_multilingual_component_descriptor {
++      struct descriptor d;
++
++      uint8_t component_tag;
++      /* struct dvb_multilingual_component components[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the components field of a dvb_multilingual_component_descriptor.
++ */
++struct dvb_multilingual_component {
++      iso639lang_t language_code;
++      uint8_t text_description_length;
++      /* uint8_t text_char[] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_multilingual_component_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return dvb_multilingual_component_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_multilingual_component_descriptor*
++      dvb_multilingual_component_descriptor_codec(struct descriptor* d)
++{
++      uint8_t* buf = (uint8_t*) d + 2;
++      uint32_t pos = sizeof(struct dvb_multilingual_component_descriptor) - 2;
++      uint32_t len = d->len;
++
++      if (pos > len)
++              return NULL;
++
++      while(pos < len) {
++              struct dvb_multilingual_component *e =
++                      (struct dvb_multilingual_component*) (buf+pos);
++
++              pos += sizeof(struct dvb_multilingual_component);
++
++              if (pos > len)
++                      return NULL;
++
++              pos += e->text_description_length;
++
++              if (pos > len)
++                      return NULL;
++      }
++
++      return (struct dvb_multilingual_component_descriptor*) d;
++}
++
++/**
++ * Iterator for entries in the components field of a dvb_multilingual_component_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @param pos Variable containing a pointer to the current dvb_multilingual_component.
++ */
++#define dvb_multilingual_component_descriptor_components_for_each(d, pos) \
++      for ((pos) = dvb_multilingual_component_descriptor_components_first(d); \
++           (pos); \
++           (pos) = dvb_multilingual_component_descriptor_components_next(d, pos))
++
++/**
++ * Accessor for the text_char field in a dvb_multilingual_component.
++ *
++ * @param e dvb_multilingual_component pointer.
++ * @return Pointer to the field.
++ */
++static inline uint8_t *
++      dvb_multilingual_component_text_char(struct dvb_multilingual_component *e)
++{
++      return (uint8_t *) e + sizeof(struct dvb_multilingual_component);
++}
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_multilingual_component*
++      dvb_multilingual_component_descriptor_components_first(struct dvb_multilingual_component_descriptor *d)
++{
++      if (d->d.len == 1)
++              return NULL;
++
++      return (struct dvb_multilingual_component *)
++              ((uint8_t*) d + sizeof(struct dvb_multilingual_component_descriptor));
++}
++
++static inline struct dvb_multilingual_component*
++      dvb_multilingual_component_descriptor_components_next(struct dvb_multilingual_component_descriptor *d,
++                                                            struct dvb_multilingual_component *pos)
++{
++      uint8_t *end = (uint8_t*) d + 2 + d->d.len;
++      uint8_t *next = (uint8_t *) pos +
++                      sizeof(struct dvb_multilingual_component) +
++                      pos->text_description_length;
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_multilingual_component *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/multilingual_network_name_descriptor.h dvb-apps/lib/libucsi/dvb/multilingual_network_name_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/multilingual_network_name_descriptor.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/multilingual_network_name_descriptor.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,145 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_MULTILINGUAL_NETWORK_NAME_DESCRIPTOR
++#define _UCSI_DVB_MULTILINGUAL_NETWORK_NAME_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++#include <libucsi/types.h>
++
++/**
++ * dvb_multilingual_network_name_descriptor structure.
++ */
++struct dvb_multilingual_network_name_descriptor {
++      struct descriptor d;
++
++      /* struct dvb_multilingual_network_name names[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the names field of a dvb_multilingual_network_name_descriptor.
++ */
++struct dvb_multilingual_network_name {
++      iso639lang_t language_code;
++      uint8_t network_name_length;
++      /* uint8_t name[] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_multilingual_network_name_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return dvb_multilingual_network_name_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_multilingual_network_name_descriptor*
++      dvb_multilingual_network_name_descriptor_codec(struct descriptor* d)
++{
++      uint8_t* buf = (uint8_t*) d + 2;
++      uint32_t pos = 0;
++      uint32_t len = d->len;
++
++      while(pos < len) {
++              struct dvb_multilingual_network_name *e =
++                      (struct dvb_multilingual_network_name*) (buf + pos);
++
++              pos += sizeof(struct dvb_multilingual_network_name);
++
++              if (pos > len)
++                      return NULL;
++
++              pos += e->network_name_length;
++
++              if (pos > len)
++                      return NULL;
++      }
++
++      return (struct dvb_multilingual_network_name_descriptor*) d;
++}
++
++/**
++ * Iterator for entries in the names field of a dvb_multilingual_network_name_descriptor.
++ *
++ * @param d dvb_multilingual_network_name_descriptor pointer.
++ * @param pos Variable containing a pointer to the current dvb_multilingual_network_name.
++ */
++#define dvb_multilingual_network_name_descriptor_names_for_each(d, pos) \
++      for ((pos) = dvb_multilingual_network_name_descriptor_names_first(d); \
++           (pos); \
++           (pos) = dvb_multilingual_network_name_descriptor_names_next(d, pos))
++
++/**
++ * Accessor for the name field of a dvb_multilingual_network_name.
++ *
++ * @param e dvb_multilingual_network_name pointer.
++ * @return Pointer to the name field.
++ */
++static inline uint8_t *
++      dvb_multilingual_network_name_name(struct dvb_multilingual_network_name *e)
++{
++      return (uint8_t *) e + sizeof(struct dvb_multilingual_network_name);
++}
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_multilingual_network_name*
++      dvb_multilingual_network_name_descriptor_names_first(struct dvb_multilingual_network_name_descriptor *d)
++{
++      if (d->d.len == 0)
++              return NULL;
++
++      return (struct dvb_multilingual_network_name *)
++              ((uint8_t*) d + sizeof(struct dvb_multilingual_network_name_descriptor));
++}
++
++static inline struct dvb_multilingual_network_name*
++      dvb_multilingual_network_name_descriptor_names_next(struct dvb_multilingual_network_name_descriptor *d,
++                                                          struct dvb_multilingual_network_name *pos)
++{
++      uint8_t *end = (uint8_t*) d + 2 + d->d.len;
++      uint8_t *next = (uint8_t *) pos +
++                      sizeof(struct dvb_multilingual_network_name) +
++                      pos->network_name_length;
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_multilingual_network_name *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/multilingual_service_name_descriptor.h dvb-apps/lib/libucsi/dvb/multilingual_service_name_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/multilingual_service_name_descriptor.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/multilingual_service_name_descriptor.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,197 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_MULTILINGUAL_SERVICE_NAME_DESCRIPTOR
++#define _UCSI_DVB_MULTILINGUAL_SERVICE_NAME_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++#include <libucsi/types.h>
++
++/**
++ * dvb_multilingual_service_name_descriptor structure.
++ */
++struct dvb_multilingual_service_name_descriptor {
++      struct descriptor d;
++
++      /* struct dvb_multilingual_service_name names[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the service_names field of a dvb_multilingual_service_name_descriptor.
++ */
++struct dvb_multilingual_service_name {
++      iso639lang_t language_code;
++      uint8_t service_provider_name_length;
++      /* uint8_t service_provider_name[] */
++      /* struct dvb_multilingual_service_name_part2 part2 */
++} __ucsi_packed;
++
++/**
++ * Second part of a dvb_multilingual_service_name following the variable length
++ * service_provider_name.
++ */
++struct dvb_multilingual_service_name_part2 {
++      uint8_t service_name_length;
++      /* uint8_t service_name[] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_multilingual_service_name_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return dvb_multilingual_service_name_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_multilingual_service_name_descriptor*
++      dvb_multilingual_service_name_descriptor_codec(struct descriptor* d)
++{
++      uint8_t* buf = (uint8_t*) d + 2;
++      uint32_t pos = 0;
++      uint32_t len = d->len;
++
++      while(pos < len) {
++              struct dvb_multilingual_service_name *e =
++                      (struct dvb_multilingual_service_name*) (buf+pos);
++              struct dvb_multilingual_service_name_part2 *e2;
++
++              pos += sizeof(struct dvb_multilingual_service_name);
++
++              if (pos > len)
++                      return NULL;
++
++              pos += e->service_provider_name_length;
++
++              if (pos > len)
++                      return NULL;
++
++              e2 = (struct dvb_multilingual_service_name_part2*) (buf+pos);
++
++              pos += sizeof(struct dvb_multilingual_service_name_part2);
++
++              if (pos > len)
++                      return NULL;
++
++              pos += e2->service_name_length;
++
++              if (pos > len)
++                      return NULL;
++      }
++
++      return (struct dvb_multilingual_service_name_descriptor*) d;
++}
++
++/**
++ * Iterator for entries in the service_name field of a dvb_multilingual_service_name_descriptor.
++ *
++ * @param d dvb_multilingual_service_name_descriptor pointer,
++ * @param pos Variable containing pointer to the current dvb_multilingual_service_name.
++ */
++#define dvb_multilingual_service_name_descriptor_names_for_each(d, pos) \
++      for ((pos) = dvb_multilingual_service_name_descriptor_names_first(d); \
++           (pos); \
++           (pos) = dvb_multilingual_service_name_descriptor_names_next(d, pos))
++
++/**
++ * Accessor for the service_provider_name field of a dvb_multilingual_service_name.
++ *
++ * @param e dvb_multilingual_service_name pointer.
++ * @return Pointer to the field.
++ */
++static inline uint8_t *
++      dvb_multilingual_service_name_service_provider_name(struct dvb_multilingual_service_name *e)
++{
++      return (uint8_t *) e + sizeof(struct dvb_multilingual_service_name);
++}
++
++/**
++ * Accessor for the dvb_multilingual_service_name_part2 - second part of a
++ * dvb_multilingual_service_name following the service_name field.
++ *
++ * @param e dvb_multilingual_service_name Pointer.
++ * @return dvb_multilingual_service_name_part2 pointer.
++ */
++static inline struct dvb_multilingual_service_name_part2 *
++      dvb_multilingual_service_name_part2(struct dvb_multilingual_service_name *e)
++{
++      return (struct dvb_multilingual_service_name_part2 *)
++              ((uint8_t *) e + sizeof(struct dvb_multilingual_service_name) +
++               e->service_provider_name_length);
++}
++
++/**
++ * Accessor for the service_name field of a dvb_multilingual_service_name_part2.
++ *
++ * @param e dvb_multilingual_service_name_part2 pointer.
++ * @return Pointer to the field.
++ */
++static inline uint8_t *
++      dvb_multilingual_service_name_service_name(struct dvb_multilingual_service_name_part2 *e)
++{
++      return (uint8_t *) e + sizeof(struct dvb_multilingual_service_name_part2);
++}
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_multilingual_service_name*
++      dvb_multilingual_service_name_descriptor_names_first(struct dvb_multilingual_service_name_descriptor *d)
++{
++      if (d->d.len == 0)
++              return NULL;
++
++      return (struct dvb_multilingual_service_name *)
++              ((uint8_t*) d + sizeof(struct dvb_multilingual_service_name_descriptor));
++}
++
++static inline struct dvb_multilingual_service_name*
++      dvb_multilingual_service_name_descriptor_names_next(struct dvb_multilingual_service_name_descriptor *d,
++                                                          struct dvb_multilingual_service_name *pos)
++{
++      struct dvb_multilingual_service_name_part2 * part2 =
++                      dvb_multilingual_service_name_part2(pos);
++      uint8_t *end = (uint8_t*) d + 2 + d->d.len;
++      uint8_t *next = (uint8_t *) part2+
++                      sizeof(struct dvb_multilingual_service_name_part2) +
++                      part2->service_name_length;
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_multilingual_service_name *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/network_name_descriptor.h dvb-apps/lib/libucsi/dvb/network_name_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/network_name_descriptor.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/network_name_descriptor.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,82 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_NETWORK_NAME_DESCRIPTOR
++#define _UCSI_DVB_NETWORK_NAME_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_network_name_descriptor structure.
++ */
++struct dvb_network_name_descriptor {
++      struct descriptor d;
++
++      /* char name[] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_network_name_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return dvb_network_name_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_network_name_descriptor*
++      dvb_network_name_descriptor_codec(struct descriptor* d)
++{
++      return (struct dvb_network_name_descriptor*) d;
++}
++
++/**
++ * Accessor for the name field in a dvb_network_name_descriptor.
++ *
++ * @param d dvb_network_name_descriptor pointer.
++ * @return Pointer to the field.
++ */
++static inline uint8_t *
++      dvb_network_name_descriptor_name(struct dvb_network_name_descriptor *d)
++{
++      return (uint8_t *) d + sizeof(struct dvb_network_name_descriptor);
++}
++
++/**
++ * Calculate the length of the name field in a dvb_network_name_descriptor.
++ *
++ * @param d dvb_network_name_descriptor pointer.
++ * @return Length of the field in bytes.
++ */
++static inline int
++      dvb_network_name_descriptor_name_length(struct dvb_network_name_descriptor *d)
++{
++      return d->d.len;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/nit_section.c dvb-apps/lib/libucsi/dvb/nit_section.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/nit_section.c       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/nit_section.c     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,78 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <libucsi/dvb/nit_section.h>
++
++struct dvb_nit_section *dvb_nit_section_codec(struct section_ext * ext)
++{
++      uint8_t * buf = (uint8_t *) ext;
++      struct dvb_nit_section * ret = (struct dvb_nit_section *) ext;
++      size_t pos = sizeof(struct section_ext);
++      size_t len = section_ext_length(ext);
++
++      if (len < sizeof(struct dvb_nit_section))
++              return NULL;
++
++      bswap16(buf + pos);
++      pos += 2;
++
++      if ((pos + ret->network_descriptors_length) > len)
++              return NULL;
++
++      if (verify_descriptors(buf + pos, ret->network_descriptors_length))
++              return NULL;
++
++      pos += ret->network_descriptors_length;
++
++      if ((pos + sizeof(struct dvb_nit_section_part2)) > len)
++              return NULL;
++
++      bswap16(buf + pos);
++      pos += 2;
++
++      while (pos < len) {
++              struct dvb_nit_transport *transport =
++                      (struct dvb_nit_transport *)(buf + pos);
++
++              if ((pos + sizeof(struct dvb_nit_transport)) > len)
++                      return NULL;
++
++              bswap16(buf + pos);
++              bswap16(buf + pos + 2);
++              bswap16(buf + pos + 4);
++
++              pos += sizeof(struct dvb_nit_transport);
++
++              if ((pos + transport->transport_descriptors_length) > len)
++                      return NULL;
++
++              if (verify_descriptors(buf + pos,
++                                      transport->transport_descriptors_length))
++                      return NULL;
++
++              pos += transport->transport_descriptors_length;
++      }
++
++      if (pos != len)
++              return NULL;
++
++      return ret;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/nit_section.h dvb-apps/lib/libucsi/dvb/nit_section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/nit_section.h       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/nit_section.h     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,207 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_NIT_SECTION_H
++#define _UCSI_DVB_NIT_SECTION_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/section.h>
++
++/**
++ * dvb_nit_section structure.
++ */
++struct dvb_nit_section {
++      struct section_ext head;
++
++  EBIT2(uint16_t reserved_1                   : 4; ,
++      uint16_t network_descriptors_length     :12; );
++      /* struct descriptor descriptors[] */
++      /* struct dvb_nit_section_part2 part2 */
++};
++
++/**
++ * Second part of a dvb_nit_section, following the variable length descriptors field.
++ */
++struct dvb_nit_section_part2 {
++  EBIT2(uint16_t reserved_2                   : 4; ,
++      uint16_t transport_stream_loop_length   :12; );
++      /* struct dvb_nit_transport transports[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the transports field of a dvb_nit_section_part2
++ */
++struct dvb_nit_transport {
++      uint16_t transport_stream_id;
++      uint16_t original_network_id;
++  EBIT2(uint16_t reserved                     : 4; ,
++      uint16_t transport_descriptors_length   :12; );
++      /* struct descriptor descriptors[] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_nit_section.
++ *
++ * @param section Generic section_ext pointer.
++ * @return dvb_nit_section pointer, or NULL on error.
++ */
++struct dvb_nit_section * dvb_nit_section_codec(struct section_ext *section);
++
++/**
++ * Accessor for the network_id field of a NIT.
++ *
++ * @param nit NIT pointer.
++ * @return The network_id.
++ */
++static inline uint16_t dvb_nit_section_network_id(struct dvb_nit_section *nit)
++{
++      return nit->head.table_id_ext;
++}
++
++/**
++ * Iterator over the descriptors field in a dvb_nit_section.
++ *
++ * @param nit dvb_nit_section pointer.
++ * @param pos Variable containing a pointer to the current descriptor.
++ */
++#define dvb_nit_section_descriptors_for_each(nit, pos) \
++      for ((pos) = dvb_nit_section_descriptors_first(nit); \
++           (pos); \
++           (pos) = dvb_nit_section_descriptors_next(nit, pos))
++
++/**
++ * Accessor for a pointer to the dvb_nit_section_part2 structure.
++ *
++ * @param nit dvb_nit_section pointer.
++ * @return dvb_nit_section_part2 pointer.
++ */
++static inline struct dvb_nit_section_part2 *dvb_nit_section_part2(struct dvb_nit_section * nit)
++{
++      return (struct dvb_nit_section_part2 *)
++              ((uint8_t*) nit + sizeof(struct dvb_nit_section) +
++               nit->network_descriptors_length);
++}
++
++/**
++ * Iterator over the transports field in a dvb_nit_section_part2.
++ *
++ * @param nit dvb_nit_section pointer.
++ * @param part2 dvb_nit_section_part2 pointer.
++ * @param pos Pointer to the current dvb_nit_transport.
++ */
++#define dvb_nit_section_transports_for_each(nit, part2, pos) \
++      for ((pos) = dvb_nit_section_transports_first(part2); \
++           (pos); \
++           (pos) = dvb_nit_section_transports_next(part2, pos))
++
++/**
++ * Iterator over the descriptors field in a dvb_nit_transport.
++ *
++ * @param transport dvb_nit_transport pointer.
++ * @param pos Pointer to the current descriptor.
++ */
++#define dvb_nit_transport_descriptors_for_each(transport, pos) \
++      for ((pos) = dvb_nit_transport_descriptors_first(transport); \
++           (pos); \
++           (pos) = dvb_nit_transport_descriptors_next(transport, pos))
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct descriptor *
++      dvb_nit_section_descriptors_first(struct dvb_nit_section * nit)
++{
++      if (nit->network_descriptors_length == 0)
++              return NULL;
++
++      return (struct descriptor *)
++              ((uint8_t *) nit + sizeof(struct dvb_nit_section));
++}
++
++static inline struct descriptor *
++      dvb_nit_section_descriptors_next(struct dvb_nit_section * nit,
++                                       struct descriptor* pos)
++{
++      return next_descriptor((uint8_t*) nit + sizeof(struct dvb_nit_section),
++                            nit->network_descriptors_length,
++                            pos);
++}
++
++static inline struct dvb_nit_transport *
++      dvb_nit_section_transports_first(struct dvb_nit_section_part2 *part2)
++{
++      if (part2->transport_stream_loop_length == 0)
++              return NULL;
++
++      return (struct dvb_nit_transport *)
++              ((uint8_t *)part2 + sizeof(struct dvb_nit_section_part2));
++}
++
++static inline struct dvb_nit_transport *
++      dvb_nit_section_transports_next(struct dvb_nit_section_part2 *part2,
++                                      struct dvb_nit_transport *pos)
++{
++      uint8_t *end = (uint8_t*) part2 + sizeof(struct dvb_nit_section_part2) +
++              part2->transport_stream_loop_length;
++      uint8_t *next = (uint8_t*) pos + sizeof(struct dvb_nit_transport) +
++              pos->transport_descriptors_length;
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_nit_transport *) next;
++}
++
++static inline struct descriptor *
++      dvb_nit_transport_descriptors_first(struct dvb_nit_transport *t)
++{
++      if (t->transport_descriptors_length == 0)
++              return NULL;
++
++      return (struct descriptor *)
++              ((uint8_t*) t + sizeof(struct dvb_nit_transport));
++}
++
++static inline struct descriptor *
++      dvb_nit_transport_descriptors_next(struct dvb_nit_transport *t,
++                                         struct descriptor* pos)
++{
++      return next_descriptor((uint8_t*) t + sizeof(struct dvb_nit_transport),
++                            t->transport_descriptors_length,
++                            pos);
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/nvod_reference_descriptor.h dvb-apps/lib/libucsi/dvb/nvod_reference_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/nvod_reference_descriptor.h 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/nvod_reference_descriptor.h       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,125 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_NVOD_REFERENCE_DESCRIPTOR
++#define _UCSI_DVB_NVOD_REFERENCE_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_nvod_reference_descriptor structure.
++ */
++struct dvb_nvod_reference_descriptor {
++      struct descriptor d;
++
++      /* struct dvb_nvod_reference references[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the references field of a dvb_nvod_reference_descriptor.
++ */
++struct dvb_nvod_reference {
++      uint16_t transport_stream_id;
++      uint16_t original_network_id;
++      uint16_t service_id;
++} __ucsi_packed;
++
++/**
++ * Process a dvb_nvod_reference_descriptor.
++ *
++ * @param d Pointer to a generic descriptor structure pointer.
++ * @return dvb_nvod_reference_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_nvod_reference_descriptor*
++      dvb_nvod_reference_descriptor_codec(struct descriptor* d)
++{
++      uint32_t pos = 0;
++      uint8_t* buf = (uint8_t*) d + 2;
++      uint32_t len = d->len;
++
++      if (len % sizeof(struct dvb_nvod_reference))
++              return NULL;
++
++      while(pos < len) {
++              bswap16(buf+pos);
++              bswap16(buf+pos+2);
++              bswap16(buf+pos+4);
++              pos += sizeof(struct dvb_nvod_reference);
++      }
++
++      return (struct dvb_nvod_reference_descriptor*) d;
++}
++
++/**
++ * Iterator over the references field in a dvb_nvod_reference_descriptor.
++ *
++ * @param d dvb_nvod_reference_descriptor pointer.
++ * @param pos Variable containing a pointer to the current dvb_nvod_reference.
++ */
++#define dvb_nvod_reference_descriptor_references_for_each(d, pos) \
++      for ((pos) = dvb_nvod_reference_descriptor_references_first(d); \
++           (pos); \
++           (pos) = dvb_nvod_reference_descriptor_references_next(d, pos))
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_nvod_reference*
++      dvb_nvod_reference_descriptor_references_first(struct dvb_nvod_reference_descriptor *d)
++{
++      if (d->d.len == 0)
++              return NULL;
++
++      return (struct dvb_nvod_reference *)
++              ((uint8_t*) d + sizeof(struct dvb_nvod_reference_descriptor));
++}
++
++static inline struct dvb_nvod_reference*
++      dvb_nvod_reference_descriptor_references_next(struct dvb_nvod_reference_descriptor *d,
++                                                    struct dvb_nvod_reference *pos)
++{
++      uint8_t *end = (uint8_t*) d + 2 + d->d.len;
++      uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_nvod_reference);
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_nvod_reference *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/parental_rating_descriptor.h dvb-apps/lib/libucsi/dvb/parental_rating_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/parental_rating_descriptor.h        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/parental_rating_descriptor.h      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,135 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_PARENTAL_RATING_DESCRIPTOR
++#define _UCSI_DVB_PARENTAL_RATING_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++#include <libucsi/types.h>
++
++/**
++ * Defined values for the rating field.
++ */
++enum {
++      DVB_PARENTAL_RATING_MIN_3YEARS          = 0x01,
++      DVB_PARENTAL_RATING_MIN_4YEARS          = 0x02,
++      DVB_PARENTAL_RATING_MIN_5YEARS          = 0x03,
++      DVB_PARENTAL_RATING_MIN_6YEARS          = 0x04,
++      DVB_PARENTAL_RATING_MIN_7YEARS          = 0x05,
++      DVB_PARENTAL_RATING_MIN_8YEARS          = 0x06,
++      DVB_PARENTAL_RATING_MIN_9YEARS          = 0x07,
++      DVB_PARENTAL_RATING_MIN_10YEARS         = 0x08,
++      DVB_PARENTAL_RATING_MIN_11YEARS         = 0x09,
++      DVB_PARENTAL_RATING_MIN_12YEARS         = 0x0a,
++      DVB_PARENTAL_RATING_MIN_13YEARS         = 0x0b,
++      DVB_PARENTAL_RATING_MIN_14YEARS         = 0x0c,
++      DVB_PARENTAL_RATING_MIN_15YEARS         = 0x0d,
++      DVB_PARENTAL_RATING_MIN_16YEARS         = 0x0e,
++      DVB_PARENTAL_RATING_MIN_17YEARS         = 0x0f,
++};
++
++/**
++ * dvb_parental_rating_descriptor structure.
++ */
++struct dvb_parental_rating_descriptor {
++      struct descriptor d;
++
++      /* struct dvb_parental_rating ratings[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the ratings field of a dvb_parental_rating_descriptor.
++ */
++struct dvb_parental_rating {
++      iso639country_t country_code;
++      uint8_t rating;
++} __ucsi_packed;
++
++/**
++ * Process a dvb_parental_rating_descriptor.
++ *
++ * @param d Generic descriptor structure pointer.
++ * @return dvb_parental_rating_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_parental_rating_descriptor*
++      dvb_parental_rating_descriptor_codec(struct descriptor* d)
++{
++      if (d->len % sizeof(struct dvb_parental_rating))
++              return NULL;
++
++      return (struct dvb_parental_rating_descriptor*) d;
++}
++
++/**
++ * Iterator for entries in the ratings field of a dvb_parental_rating_descriptor.
++ *
++ * @param d dvb_parental_rating_descriptor pointer.
++ * @param pos Variable containing a pointer to the current dvb_parental_rating.
++ */
++#define dvb_parental_rating_descriptor_ratings_for_each(d, pos) \
++      for ((pos) = dvb_parental_rating_descriptor_ratings_first(d); \
++           (pos); \
++           (pos) = dvb_parental_rating_descriptor_ratings_next(d, pos))
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_parental_rating*
++      dvb_parental_rating_descriptor_ratings_first(struct dvb_parental_rating_descriptor *d)
++{
++      if (d->d.len == 0)
++              return NULL;
++
++      return (struct dvb_parental_rating *)
++              ((uint8_t*) d + sizeof(struct dvb_parental_rating_descriptor));
++}
++
++static inline struct dvb_parental_rating*
++      dvb_parental_rating_descriptor_ratings_next(struct dvb_parental_rating_descriptor *d,
++                                                  struct dvb_parental_rating *pos)
++{
++      uint8_t *end = (uint8_t*) d + 2 + d->d.len;
++      uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_parental_rating);
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_parental_rating *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/partial_transport_stream_descriptor.h dvb-apps/lib/libucsi/dvb/partial_transport_stream_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/partial_transport_stream_descriptor.h       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/partial_transport_stream_descriptor.h     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,68 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_PARTIAL_TRANSPORT_STREAM_DESCRIPTOR
++#define _UCSI_DVB_PARTIAL_TRANSPORT_STREAM_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_partial_transport_stream_descriptor structure.
++ */
++struct dvb_partial_transport_stream_descriptor {
++      struct descriptor d;
++
++  EBIT6(uint64_t reserved                             : 2;  ,
++      uint64_t peak_rate                              :22;  ,
++      uint64_t reserved_2                             : 2;  ,
++      uint64_t minimum_overall_smoothing_rate         :22;  ,
++      uint64_t reserved_3                             : 2;  ,
++      uint64_t maximum_overall_smoothing_rate         :14;  );
++} __ucsi_packed;
++
++/**
++ * Process a dvb_partial_transport_stream_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return dvb_partial_transport_stream_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_partial_transport_stream_descriptor*
++      dvb_partial_transport_stream_descriptor_codec(struct descriptor* d)
++{
++      if (d->len != (sizeof(struct dvb_partial_transport_stream_descriptor) - 2))
++              return NULL;
++
++      bswap64((uint8_t*) d + 2);
++
++      return (struct dvb_partial_transport_stream_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/pdc_descriptor.h dvb-apps/lib/libucsi/dvb/pdc_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/pdc_descriptor.h    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/pdc_descriptor.h  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,64 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_PDC_DESCRIPTOR
++#define _UCSI_DVB_PDC_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_pdc_descriptor structure.
++ */
++struct dvb_pdc_descriptor {
++      struct descriptor d;
++
++  EBIT2(uint32_t reserved             : 4; ,
++      uint32_t programme_id_label     :20; );
++} __ucsi_packed;
++
++/**
++ * Process a dvb_pdc_descriptor.
++ *
++ * @param d Pointer to a generic descriptor structure.
++ * @return dvb_pdc_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_pdc_descriptor*
++      dvb_pdc_descriptor_codec(struct descriptor* d)
++{
++      if (d->len != (sizeof(struct dvb_pdc_descriptor) - 2))
++              return NULL;
++
++      bswap24((uint8_t*) d + 2);
++
++      return (struct dvb_pdc_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/private_data_specifier_descriptor.h dvb-apps/lib/libucsi/dvb/private_data_specifier_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/private_data_specifier_descriptor.h 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/private_data_specifier_descriptor.h       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,63 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_PRIVATE_DATA_SPECIFIER_DESCRIPTOR
++#define _UCSI_DVB_PRIVATE_DATA_SPECIFIER_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_private_data_specifier_descriptor structure.
++ */
++struct dvb_private_data_specifier_descriptor {
++      struct descriptor d;
++
++      uint32_t private_data_specifier;
++} __ucsi_packed;
++
++/**
++ * Process a dvb_private_data_specifier_descriptor.
++ *
++ * @param d Generic descriptor structure.
++ * @return dvb_private_data_specifier_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_private_data_specifier_descriptor*
++      dvb_private_data_specifier_descriptor_codec(struct descriptor* d)
++{
++      if (d->len != (sizeof(struct dvb_private_data_specifier_descriptor) - 2))
++              return NULL;
++
++      bswap32((uint8_t*) d + 2);
++
++      return (struct dvb_private_data_specifier_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/related_content_descriptor.h dvb-apps/lib/libucsi/dvb/related_content_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/related_content_descriptor.h        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/related_content_descriptor.h      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,56 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_RELATED_CONTENT_DESCRIPTOR
++#define _UCSI_DVB_RELATED_CONTENT_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_related_content_descriptor structure.
++ */
++struct dvb_related_content_descriptor {
++      struct descriptor d;
++} __ucsi_packed;
++
++/**
++ * Process a dvb_related_content_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return dvb_related_content_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_related_content_descriptor*
++      dvb_related_content_descriptor_codec(struct descriptor* d)
++{
++      return (struct dvb_related_content_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/rnt_rar_over_dvb_stream_descriptor.h dvb-apps/lib/libucsi/dvb/rnt_rar_over_dvb_stream_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/rnt_rar_over_dvb_stream_descriptor.h        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/rnt_rar_over_dvb_stream_descriptor.h      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,110 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_RNT_RAR_OVER_DVB_STREAM_DESCRIPTOR
++#define _UCSI_DVB_RNT_RAR_OVER_DVB_STREAM_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_rnt_rar_over_dvb_stream_descriptor structure.
++ */
++struct dvb_rnt_rar_over_dvb_stream_descriptor {
++      struct descriptor d;
++
++      dvbdate_t first_valid_date;
++      dvbdate_t last_valid_date;
++  EBIT3(uint8_t weighting             : 6; ,
++      uint8_t complete_flag           : 1; ,
++      uint8_t scheduled_flag          : 1; );
++      uint16_t transport_stream_id;
++      uint16_t original_network_id;
++      uint16_t service_id;
++      uint8_t component_tag;
++      /* struct dvb_rnt_rar_over_dvb_stream_descriptor_scheduled_info scheduled_info */
++} __ucsi_packed;
++
++/**
++ * The scheduled_info field of a dvb_rnt_rar_over_dvb_stream_descriptor (only appears
++ * if scheduled_flag = 1).
++ */
++struct dvb_rnt_rar_over_dvb_stream_descriptor_scheduled_info {
++      dvbdate_t download_start_time;
++      uint8_t download_period_duration;
++      uint8_t download_cycle_time;
++} __ucsi_packed;
++
++/**
++ * Process a dvb_rnt_rar_over_dvb_stream_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return dvb_rnt_rar_over_dvb_stream_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_rnt_rar_over_dvb_stream_descriptor*
++      dvb_rnt_rar_over_dvb_stream_descriptor_codec(struct descriptor* d)
++{
++      uint8_t *buf = (uint8_t*) d;
++      uint32_t len = d->len + 2;
++      struct dvb_rnt_rar_over_dvb_stream_descriptor *ret =
++              (struct dvb_rnt_rar_over_dvb_stream_descriptor *) buf;
++
++      if (len < sizeof(struct dvb_rnt_rar_over_dvb_stream_descriptor))
++              return NULL;
++
++      bswap16(buf + 13);
++      bswap16(buf + 15);
++      bswap16(buf + 17);
++
++      if (ret->scheduled_flag == 1) {
++              if (len < (sizeof(struct dvb_rnt_rar_over_dvb_stream_descriptor)+
++                         sizeof(struct dvb_rnt_rar_over_dvb_stream_descriptor_scheduled_info)))
++                      return NULL;
++      }
++
++      return ret;
++}
++
++/**
++ * Accessor for the scheduled_info field of a dvb_rnt_rar_over_dvb_stream_descriptor.
++ *
++ * @param d dvb_rnt_rar_over_dvb_stream_descriptor pointer.
++ * @return Pointer, or NULL on error.
++ */
++static inline struct dvb_rnt_rar_over_dvb_stream_descriptor_scheduled_info*
++      dvb_rnt_rar_over_dvb_stream_descriptor_scheduled_info(struct dvb_rnt_rar_over_dvb_stream_descriptor *d)
++{
++      if (d->scheduled_flag != 1)
++              return NULL;
++      return (struct dvb_rnt_rar_over_dvb_stream_descriptor_scheduled_info*)
++                      ((uint8_t*) d + sizeof(struct dvb_rnt_rar_over_dvb_stream_descriptor));
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/rnt_rar_over_ip_descriptor.h dvb-apps/lib/libucsi/dvb/rnt_rar_over_ip_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/rnt_rar_over_ip_descriptor.h        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/rnt_rar_over_ip_descriptor.h      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,87 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_RNT_RAR_OVER_IP_DESCRIPTOR
++#define _UCSI_DVB_RNT_RAR_OVER_IP_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_rnt_rar_over_ip_descriptor structure.
++ */
++struct dvb_rnt_rar_over_ip_descriptor {
++      struct descriptor d;
++
++      dvbdate_t first_valid_date;
++      dvbdate_t last_valid_date;
++  EBIT3(uint8_t weighting             : 6; ,
++      uint8_t complete_flag           : 1; ,
++      uint8_t reserved                : 1; );
++      uint8_t url_length;
++      /* uint8_t url[] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_rnt_rar_over_ip_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return dvb_rnt_rar_over_ip_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_rnt_rar_over_ip_descriptor*
++      dvb_rnt_rar_over_ip_descriptor_codec(struct descriptor* d)
++{
++      uint8_t *buf = (uint8_t*) d;
++      uint32_t len = d->len + 2;
++      struct dvb_rnt_rar_over_ip_descriptor *ret =
++              (struct dvb_rnt_rar_over_ip_descriptor *) buf;
++
++      if (len < sizeof(struct dvb_rnt_rar_over_ip_descriptor))
++              return NULL;
++      if (len < (sizeof(struct dvb_rnt_rar_over_ip_descriptor) + buf[13]))
++              return NULL;
++
++      return ret;
++}
++
++/**
++ * Accessor for the url field of a dvb_rnt_rar_over_ip_descriptor.
++ *
++ * @param d dvb_rnt_rar_over_ip_descriptor pointer.
++ * @return Pointer.
++ */
++static inline uint8_t*
++      dvb_rnt_rar_over_ip_descriptor_url(struct dvb_rnt_rar_over_ip_descriptor *d)
++{
++      return (uint8_t*)
++              ((uint8_t*) d + sizeof(struct dvb_rnt_rar_over_ip_descriptor));
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/rnt_rnt_scan_descriptor.h dvb-apps/lib/libucsi/dvb/rnt_rnt_scan_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/rnt_rnt_scan_descriptor.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/rnt_rnt_scan_descriptor.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,125 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_RNT_RNT_SCAN_DESCRIPTOR
++#define _UCSI_DVB_RNT_RNT_SCAN_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++#include <libucsi/types.h>
++
++/**
++ * dvb_rnt_rnt_scan_descriptor structure.
++ */
++struct dvb_rnt_rnt_scan_descriptor {
++      struct descriptor d;
++
++      /* struct dvb_rnt_rnt_scan_entry entries[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the entries field of a dvb_rnt_rnt_scan_descriptor.
++ */
++struct dvb_rnt_rnt_scan_entry {
++      uint16_t transport_stream_id;
++      uint16_t original_network_id;
++      uint8_t scan_weighting;
++} __ucsi_packed;
++
++/**
++ * Process a dvb_rnt_rnt_scan_descriptor.
++ *
++ * @param d Generic descriptor.
++ * @return dvb_rnt_rnt_scan_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_rnt_rnt_scan_descriptor*
++      dvb_rnt_rnt_scan_descriptor_codec(struct descriptor* d)
++{
++      uint8_t *buf = (uint8_t*) d;
++      uint32_t len = d->len +2;
++      uint32_t pos = 2;
++
++      if ((len-2) % sizeof(struct dvb_rnt_rnt_scan_entry))
++              return NULL;
++
++      while(pos < len) {
++              bswap16(buf+pos);
++              bswap16(buf+pos+2);
++              pos += sizeof(struct dvb_rnt_rnt_scan_entry);
++      }
++
++      return (struct dvb_rnt_rnt_scan_descriptor*) d;
++}
++
++/**
++ * Iterator for entries field of a dvb_rnt_rnt_scan_descriptor.
++ *
++ * @param d dvb_rnt_rnt_scan_descriptor pointer.
++ * @param pos Variable holding a pointer to the current dvb_rnt_rnt_scan_entry.
++ */
++#define dvb_rnt_rnt_scan_descriptor_entries_for_each(d, pos) \
++      for ((pos) = dvb_rnt_rnt_scan_descriptor_entries_first(d); \
++           (pos); \
++           (pos) = dvb_rnt_rnt_scan_descriptor_entries_next(d, pos))
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_rnt_rnt_scan_entry*
++      dvb_rnt_rnt_scan_descriptor_entries_first(struct dvb_rnt_rnt_scan_descriptor *d)
++{
++      if (d->d.len == 0)
++              return NULL;
++
++      return (struct dvb_rnt_rnt_scan_entry *)
++              ((uint8_t*) d + sizeof(struct dvb_rnt_rnt_scan_descriptor));
++}
++
++static inline struct dvb_rnt_rnt_scan_entry*
++      dvb_rnt_rnt_scan_descriptor_entries_next(struct dvb_rnt_rnt_scan_descriptor *d,
++                                           struct dvb_rnt_rnt_scan_entry *pos)
++{
++      uint8_t *end = (uint8_t*) d + 2 + d->d.len;
++      uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_rnt_rnt_scan_entry);
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_rnt_rnt_scan_entry *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/rst_section.c dvb-apps/lib/libucsi/dvb/rst_section.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/rst_section.c       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/rst_section.c     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,47 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <libucsi/dvb/rst_section.h>
++
++struct dvb_rst_section * dvb_rst_section_codec(struct section *section)
++{
++      uint8_t * buf = (uint8_t *) section;
++      size_t pos = sizeof(struct section);
++      size_t len = section_length(section);
++      struct dvb_rst_section * ret = (struct dvb_rst_section *) section;
++
++      while (pos < len) {
++              if ((pos + sizeof(struct dvb_rst_status)) > len)
++                      return NULL;
++
++              bswap16(buf + pos);
++              bswap16(buf + pos + 2);
++              bswap16(buf + pos + 4);
++              bswap16(buf + pos + 6);
++
++              pos += sizeof(struct dvb_rst_status);
++      }
++
++      if (pos != len)
++              return NULL;
++
++      return ret;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/rst_section.h dvb-apps/lib/libucsi/dvb/rst_section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/rst_section.h       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/rst_section.h     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,110 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_RST_SECTION_H
++#define _UCSI_DVB_RST_SECTION_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/section.h>
++
++/**
++ * dvb_rst_section structure.
++ */
++struct dvb_rst_section {
++      struct section head;
++
++      /* struct dvb_rst_status statuses[] */
++};
++
++/**
++ * An entry in the statuses field of a dvb_rst_section structure.
++ */
++struct dvb_rst_status {
++      uint16_t transport_stream_id;
++      uint16_t original_network_id;
++      uint16_t service_id;
++      uint16_t event_id;
++  EBIT2(uint8_t reserved      : 5;  ,
++      uint8_t running_status  : 3;  );
++};
++
++/**
++ * Process a dvb_rst_section.
++ *
++ * @param section Pointer to a generic section strcuture.
++ * @return dvb_rst_section pointer, or NULL on error.
++ */
++struct dvb_rst_section *dvb_rst_section_codec(struct section *section);
++
++/**
++ * Iterator for entries in the statuses field of a dvb_rst_section.
++ *
++ * @param rst dvb_rst_section pointer.
++ * @param pos Variable containing a pointer to the current dvb_rst_status.
++ */
++#define dvb_rst_section_statuses_for_each(rst, pos) \
++      for ((pos) = dvb_rst_section_statuses_first(rst); \
++           (pos); \
++           (pos) = dvb_rst_section_statuses_next(rst, pos))
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_rst_status *
++      dvb_rst_section_statuses_first(struct dvb_rst_section *rst)
++{
++      size_t pos = sizeof(struct dvb_rst_section);
++
++      if (pos >= section_length(&rst->head))
++              return NULL;
++
++      return (struct dvb_rst_status*) ((uint8_t *) rst + pos);
++}
++
++static inline struct dvb_rst_status *
++      dvb_rst_section_statuses_next(struct dvb_rst_section * rst,
++                                    struct dvb_rst_status * pos)
++{
++      uint8_t *end = (uint8_t*) rst + section_length(&rst->head);
++      uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_rst_status);
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_rst_status *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/s2_satellite_delivery_descriptor.h dvb-apps/lib/libucsi/dvb/s2_satellite_delivery_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/s2_satellite_delivery_descriptor.h  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/s2_satellite_delivery_descriptor.h        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,116 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_S2_SATELLITE_DELIVERY_DESCRIPTOR
++#define _UCSI_DVB_S2_SATELLITE_DELIVERY_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_s2_satellite_delivery_descriptor structure.
++ */
++struct dvb_s2_satellite_delivery_descriptor {
++      struct descriptor d;
++
++  EBIT4(uint8_t scrambling_sequence_selector  : 1; ,
++      uint8_t multiple_input_stream           : 1; ,
++      uint8_t backwards_compatability         : 1; ,
++      uint8_t reserved                        : 5; );
++      /* uint32_t scrambling_sequence_index if scrambling_sequence_selector = 1 */
++      /* uint8_t input_stream_id if multiple_input_stream = 1 */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_s2_satellite_delivery_descriptor.
++ *
++ * @param d Pointer to a generic descriptor structure.
++ * @return dvb_s2_satellite_delivery_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_s2_satellite_delivery_descriptor*
++      dvb_s2_satellite_delivery_descriptor_codec(struct descriptor* d)
++{
++      struct dvb_s2_satellite_delivery_descriptor *s2 =
++                      (struct dvb_s2_satellite_delivery_descriptor*) d;
++
++      if (d->len < (sizeof(struct dvb_s2_satellite_delivery_descriptor) - 2))
++              return NULL;
++
++      int len = sizeof(struct dvb_s2_satellite_delivery_descriptor);
++      if (s2->scrambling_sequence_selector) {
++              len += 3;
++      }
++      if (s2->multiple_input_stream) {
++              len += 1;
++      }
++
++      if (d->len < len)
++              return NULL;
++
++      return s2;
++}
++
++/**
++ * Accessor for the scrambling_sequence_index field of a dvb_s2_satellite_delivery_descriptor.
++ *
++ * @param s2 dvb_s2_satellite_delivery_descriptor pointer.
++ * @return The scrambling_sequence_index.
++ */
++static inline uint32_t dvb_s2_satellite_delivery_descriptor_scrambling_sequence_index(struct dvb_s2_satellite_delivery_descriptor *s2)
++{
++      uint8_t *tmp = (uint8_t*) s2;
++
++      if (s2->scrambling_sequence_selector) {
++              return ((tmp[4] & 0x03) << 16) | (tmp[5] << 8) | tmp[6];
++      }
++      return 0;
++}
++
++/**
++ * Accessor for the input_stream_id field of a dvb_s2_satellite_delivery_descriptor.
++ *
++ * @param s2 dvb_s2_satellite_delivery_descriptor pointer.
++ * @return The input_stream_id.
++ */
++static inline uint8_t dvb_s2_satellite_delivery_descriptor_input_stream_id(struct dvb_s2_satellite_delivery_descriptor *s2)
++{
++      uint8_t *tmp = (uint8_t*) s2;
++
++      if (!s2->multiple_input_stream)
++              return 0;
++
++      int off = 3;
++      if (s2->scrambling_sequence_selector) {
++              off += 3;
++      }
++      return tmp[off];
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/satellite_delivery_descriptor.h dvb-apps/lib/libucsi/dvb/satellite_delivery_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/satellite_delivery_descriptor.h     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/satellite_delivery_descriptor.h   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,73 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_SATELLITE_DELIVERY_DESCRIPTOR
++#define _UCSI_DVB_SATELLITE_DELIVERY_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_satellite_delivery_descriptor structure.
++ */
++struct dvb_satellite_delivery_descriptor {
++      struct descriptor d;
++
++      uint32_t frequency;                     // BCD, units 10kHz
++      uint16_t orbital_position;
++  EBIT5(uint8_t west_east_flag                : 1; ,
++      uint8_t polarization            : 2; ,
++      uint8_t roll_off                : 2; ,
++      uint8_t modulation_system       : 1; ,
++      uint8_t modulation_type         : 2; );
++  EBIT2(uint32_t symbol_rate          : 28; , // BCD, units 100Hz
++      uint32_t fec_inner              : 4;  );
++} __ucsi_packed;
++
++/**
++ * Process a dvb_satellite_delivery_descriptor.
++ *
++ * @param d Pointer to a generic descriptor structure.
++ * @return dvb_satellite_delivery_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_satellite_delivery_descriptor*
++      dvb_satellite_delivery_descriptor_codec(struct descriptor* d)
++{
++      if (d->len < (sizeof(struct dvb_satellite_delivery_descriptor) - 2))
++              return NULL;
++
++      bswap32((uint8_t*) d + 2);
++      bswap16((uint8_t*) d + 6);
++      bswap32((uint8_t*) d + 9);
++
++      return (struct dvb_satellite_delivery_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/scrambling_descriptor.h dvb-apps/lib/libucsi/dvb/scrambling_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/scrambling_descriptor.h     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/scrambling_descriptor.h   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,61 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_SCRAMBLING_DESCRIPTOR
++#define _UCSI_DVB_SCRAMBLING_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_scrambling_descriptor structure.
++ */
++struct dvb_scrambling_descriptor {
++      struct descriptor d;
++
++      uint8_t scrambling_mode;
++} __ucsi_packed;
++
++/**
++ * Process a dvb_scrambling_descriptor.
++ *
++ * @param d Generic descriptor structure.
++ * @return Pointer to dvb_scrambling_descriptor, or NULL on error.
++ */
++static inline struct dvb_scrambling_descriptor*
++      dvb_scrambling_descriptor_codec(struct descriptor* d)
++{
++      if (d->len != (sizeof(struct dvb_scrambling_descriptor) - 2))
++              return NULL;
++
++      return (struct dvb_scrambling_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/sdt_section.c dvb-apps/lib/libucsi/dvb/sdt_section.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/sdt_section.c       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/sdt_section.c     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,60 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <libucsi/dvb/sdt_section.h>
++
++struct dvb_sdt_section * dvb_sdt_section_codec(struct section_ext * ext)
++{
++      uint8_t * buf = (uint8_t *) ext;
++      size_t pos = sizeof(struct section_ext);
++      size_t len = section_ext_length(ext);
++
++      if (len < sizeof(struct dvb_sdt_section))
++              return NULL;
++
++      bswap16(buf + pos);
++      pos += 3;
++
++      while (pos < len) {
++              struct dvb_sdt_service * service =
++                      (struct dvb_sdt_service *)(buf + pos);
++
++              if ((pos + sizeof(struct dvb_sdt_service)) > len)
++                      return NULL;
++
++              bswap16(buf + pos);
++              bswap16(buf + pos + 3);
++              pos += sizeof(struct dvb_sdt_service);
++
++              if ((pos + service->descriptors_loop_length) > len)
++                      return NULL;
++
++              if (verify_descriptors(buf + pos, service->descriptors_loop_length))
++                      return NULL;
++
++              pos += service->descriptors_loop_length;
++      }
++
++      if (pos != len)
++              return NULL;
++
++      return (struct dvb_sdt_section *) ext;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/sdt_section.h dvb-apps/lib/libucsi/dvb/sdt_section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/sdt_section.h       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/sdt_section.h     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,157 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_SDT_SECTION_H
++#define _UCSI_DVB_SDT_SECTION_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/section.h>
++
++/**
++ * dvb_sdt_section structure.
++ */
++struct dvb_sdt_section {
++      struct section_ext head;
++
++      uint16_t original_network_id;
++      uint8_t reserved;
++      /* struct dvb_sdt_service services[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the services field of a dvb_sdt_section.
++ */
++struct dvb_sdt_service {
++      uint16_t service_id;
++  EBIT3(uint8_t       reserved                        : 6; ,
++      uint8_t eit_schedule_flag               : 1; ,
++      uint8_t eit_present_following_flag      : 1; );
++  EBIT3(uint16_t running_status                       : 3; ,
++      uint16_t free_ca_mode                   : 1; ,
++      uint16_t descriptors_loop_length        :12; );
++      /* struct descriptor descriptors[] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_sdt_section.
++ *
++ * @param section Pointer to a generic section_ext structure.
++ * @return dvb_sdt_section pointer, or NULL on error.
++ */
++struct dvb_sdt_section * dvb_sdt_section_codec(struct section_ext *section);
++
++/**
++ * Accessor for the transport_stream_id field of an SDT.
++ *
++ * @param sdt SDT pointer.
++ * @return The transport_stream_id.
++ */
++static inline uint16_t dvb_sdt_section_transport_stream_id(struct dvb_sdt_section *sdt)
++{
++      return sdt->head.table_id_ext;
++}
++
++/**
++ * Iterator for the services field in a dvb_sdt_section.
++ *
++ * @param sdt dvb_sdt_section pointer.
++ * @param pos Variable containing a pointer to the current dvb_sdt_service.
++ */
++#define dvb_sdt_section_services_for_each(sdt, pos) \
++      for ((pos) = dvb_sdt_section_services_first(sdt); \
++           (pos); \
++           (pos) = dvb_sdt_section_services_next(sdt, pos))
++
++/**
++ * Iterator for the descriptors field in a dvb_sdt_service.
++ *
++ * @param service dvb_sdt_service pointer.
++ * @param pos Variable containing a pointer to the current descriptor.
++ */
++#define dvb_sdt_service_descriptors_for_each(service, pos) \
++      for ((pos) = dvb_sdt_service_descriptors_first(service); \
++           (pos); \
++           (pos) = dvb_sdt_service_descriptors_next(service, pos))
++
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_sdt_service *
++      dvb_sdt_section_services_first(struct dvb_sdt_section * sdt)
++{
++      size_t pos = sizeof(struct dvb_sdt_section);
++
++      if (pos >= section_ext_length(&sdt->head))
++              return NULL;
++
++      return (struct dvb_sdt_service*) ((uint8_t *) sdt + pos);
++}
++
++static inline struct dvb_sdt_service *
++      dvb_sdt_section_services_next(struct dvb_sdt_section * sdt,
++                                    struct dvb_sdt_service * pos)
++{
++      uint8_t *end = (uint8_t*) sdt + section_ext_length(&sdt->head);
++      uint8_t *next = (uint8_t*) pos + sizeof(struct dvb_sdt_service) +
++                      pos->descriptors_loop_length;
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_sdt_service *) next;
++}
++
++static inline struct descriptor *
++      dvb_sdt_service_descriptors_first(struct dvb_sdt_service *svc)
++{
++      if (svc->descriptors_loop_length == 0)
++              return NULL;
++
++      return (struct descriptor *)
++              ((uint8_t*) svc + sizeof(struct dvb_sdt_service));
++}
++
++static inline struct descriptor *
++      dvb_sdt_service_descriptors_next(struct dvb_sdt_service *svc,
++                                       struct descriptor* pos)
++{
++      return next_descriptor((uint8_t*) svc + sizeof(struct dvb_sdt_service),
++                             svc->descriptors_loop_length,
++                             pos);
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/section.h dvb-apps/lib/libucsi/dvb/section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/section.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/section.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,108 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_SECTION_H
++#define _UCSI_DVB_SECTION_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/dvb/bat_section.h>
++#include <libucsi/dvb/dit_section.h>
++#include <libucsi/dvb/eit_section.h>
++#include <libucsi/dvb/nit_section.h>
++#include <libucsi/dvb/rst_section.h>
++#include <libucsi/dvb/sdt_section.h>
++#include <libucsi/dvb/sit_section.h>
++#include <libucsi/dvb/st_section.h>
++#include <libucsi/dvb/tdt_section.h>
++#include <libucsi/dvb/tot_section.h>
++#include <libucsi/dvb/tva_container_section.h>
++#include <libucsi/dvb/int_section.h>
++#include <libucsi/dvb/mpe_fec_section.h>
++
++/**
++ * The following are not implemented just now.
++ */
++/*
++#include <libucsi/dvb/tva_related_content_section.h>
++#include <libucsi/dvb/tva_content_identifier_section.h>
++#include <libucsi/dvb/tva_resolution_provider_notification_section.h>
++#include <libucsi/dvb/ait_section.h>
++#include <libucsi/dvb/cit_section.h>
++#include <libucsi/dvb/rct_section.h>
++#include <libucsi/dvb/rnt_section.h>
++*/
++
++#define TRANSPORT_NIT_PID 0x10
++#define TRANSPORT_SDT_PID 0x11
++#define TRANSPORT_BAT_PID 0x11
++#define TRANSPORT_EIT_PID 0x12
++#define TRANSPORT_CIT_PID 0x12
++#define TRANSPORT_RST_PID 0x13
++#define TRANSPORT_TDT_PID 0x14
++#define TRANSPORT_TOT_PID 0x14
++#define TRANSPORT_RNT_PID 0x16
++#define TRANSPORT_DIT_PID 0x1e
++#define TRANSPORT_SIT_PID 0x1f
++
++/**
++ * Enumeration of DVB section tags.
++ */
++enum dvb_section_tag {
++      stag_dvb_network_information_actual                     = 0x40,
++      stag_dvb_network_information_other                      = 0x41,
++
++      stag_dvb_service_description_actual                     = 0x42,
++      stag_dvb_service_description_other                      = 0x46,
++
++      stag_dvb_bouquet_association                            = 0x4a,
++      stag_dvb_update_notification                            = 0x4b, /* same syntax as IP_MAC */
++      stag_dvb_ip_mac_notification                            = 0x4c,
++
++      stag_dvb_event_information_nownext_actual               = 0x4e,
++      stag_dvb_event_information_nownext_other                = 0x4f,
++      stag_dvb_event_information_schedule_actual              = 0x50, /* 0x50->0x5f */
++      stag_dvb_event_information_schedule_other               = 0x60, /* 0x60->0x6f */
++
++      stag_dvb_time_date                                      = 0x70,
++      stag_dvb_running_status                                 = 0x71,
++      stag_dvb_stuffing                                       = 0x72,
++      stag_dvb_time_offset                                    = 0x73,
++      stag_dvb_application_information                        = 0x74,
++      stag_dvb_tva_container                                  = 0x75,
++      stag_dvb_tva_related_content                            = 0x76,
++      stag_dvb_tva_content_identifier                         = 0x77,
++      stag_dvb_mpe_fec                                        = 0x78,
++      stag_dvb_tva_resolution_provider_notification           = 0x79,
++
++      stag_dvb_discontinuity_information                      = 0x7e,
++      stag_dvb_selection_information                          = 0x7f,
++
++};
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/service_availability_descriptor.h dvb-apps/lib/libucsi/dvb/service_availability_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/service_availability_descriptor.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/service_availability_descriptor.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,98 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_SERVICE_AVAILABILITY_DESCRIPTOR
++#define _UCSI_DVB_SERVICE_AVAILABILITY_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_service_availability_descriptor structure.
++ */
++struct dvb_service_availability_descriptor {
++      struct descriptor d;
++
++  EBIT2(uint8_t availability_flag     : 1; ,
++      uint8_t reserved                : 7; );
++      /* uint16_t cell_ids[] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_service_availability_descriptor.
++ *
++ * @param d Pointer to a generic descriptor structure.
++ * @return dvb_service_availability_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_service_availability_descriptor*
++      dvb_service_availability_descriptor_codec(struct descriptor* d)
++{
++      uint32_t pos = 0;
++      uint8_t* buf = (uint8_t*) d + 2;
++      uint32_t len = d->len;
++
++      pos += sizeof(struct dvb_service_availability_descriptor) - 2;
++
++      if ((len - pos) % 2)
++              return NULL;
++
++      while(pos < len) {
++              bswap16(buf+pos);
++              pos += 2;
++      }
++
++      return (struct dvb_service_availability_descriptor*) d;
++}
++
++/**
++ * Accessor for the cell_ids field of a dvb_service_availability_descriptor.
++ *
++ * @param d dvb_service_availability_descriptor pointer.
++ * @return Pointer to the field.
++ */
++static inline uint16_t *
++      dvb_service_availability_descriptor_cell_ids(struct dvb_service_availability_descriptor *d)
++{
++      return (uint16_t *) ((uint8_t *) d + sizeof(struct dvb_service_availability_descriptor));
++}
++
++/**
++ * Determine the number of entries in the cell_ids field of a dvb_service_availability_descriptor.
++ *
++ * @param d dvb_service_availability_descriptor pointer.
++ * @return The number of entries.
++ */
++static inline int
++      dvb_service_availability_descriptor_cell_ids_count(struct dvb_service_availability_descriptor *d)
++{
++      return (d->d.len - 1) >> 1;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/service_descriptor.h dvb-apps/lib/libucsi/dvb/service_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/service_descriptor.h        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/service_descriptor.h      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,163 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_SERVICE_DESCRIPTOR
++#define _UCSI_DVB_SERVICE_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * Possible values for service_type.
++ */
++enum {
++      DVB_SERVICE_TYPE_DIGITAL_TV             = 0x01,
++      DVB_SERVICE_TYPE_DIGITAL_RADIO          = 0x02,
++      DVB_SERVICE_TYPE_TELETEXT               = 0x03,
++      DVB_SERVICE_TYPE_NVOD_REF               = 0x04,
++      DVB_SERVICE_TYPE_NVOD_TIMESHIFT         = 0x05,
++      DVB_SERVICE_TYPE_MOSAIC                 = 0x06,
++      DVB_SERVICE_TYPE_PAL                    = 0x07,
++      DVB_SERVICE_TYPE_SECAM                  = 0x08,
++      DVB_SERVICE_TYPE_D_D2_MAC               = 0x09,
++      DVB_SERVICE_TYPE_FM_RADIO               = 0x0a,
++      DVB_SERVICE_TYPE_NTSC                   = 0x0b,
++      DVB_SERVICE_TYPE_DATA_BCAST             = 0x0c,
++      DVB_SERVICE_TYPE_EN50221                = 0x0d,
++      DVB_SERVICE_TYPE_RCS_MAP                = 0x0e,
++      DVB_SERVICE_TYPE_RCS_FLS                = 0x0f,
++      DVB_SERVICE_TYPE_MHP                    = 0x10,
++      DVB_SERVICE_TYPE_MPEG2_HD_DIGITAL_TV    = 0x11,
++      DVB_SERVICE_TYPE_ADVANCED_CODEC_SD_DIGITAL_TV = 0x16,
++      DVB_SERVICE_TYPE_ADVANCED_CODEC_SD_NVOD_TIMESHIFT = 0x17,
++      DVB_SERVICE_TYPE_ADVANCED_CODEC_SD_NVOD_REF = 0x18,
++      DVB_SERVICE_TYPE_ADVANCED_CODEC_HD_DIGITAL_TV = 0x19,
++      DVB_SERVICE_TYPE_ADVANCED_CODEC_HD_NVOD_TIMESHIFT = 0x1a,
++      DVB_SERVICE_TYPE_ADVANCED_CODEC_HD_NVOD_REF = 0x1b,
++};
++
++/**
++ * dvb_service_descriptor structure.
++ */
++struct dvb_service_descriptor {
++      struct descriptor d;
++
++      uint8_t service_type;
++      uint8_t service_provider_name_length;
++      /* uint8_t service_provider_name[] */
++      /* struct dvb_service_descriptor_part2 part2 */
++} __ucsi_packed;
++
++/**
++ * Second part of a dvb_service_descriptor following the variable length
++ * service_provider_name field.
++ */
++struct dvb_service_descriptor_part2 {
++      uint8_t service_name_length;
++      /* uint8_t service_name[] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_service_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return dvb_service_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_service_descriptor*
++      dvb_service_descriptor_codec(struct descriptor* d)
++{
++      struct dvb_service_descriptor *p =
++              (struct dvb_service_descriptor *) d;
++      struct dvb_service_descriptor_part2 *p2;
++      uint32_t pos = sizeof(struct dvb_service_descriptor) - 2;
++      uint32_t len = d->len;
++
++      if (pos > len)
++              return NULL;
++
++      pos += p->service_provider_name_length;
++
++      if (pos > len)
++              return NULL;
++
++      p2 = (struct dvb_service_descriptor_part2*) ((uint8_t*) d + 2 + pos);
++
++      pos += sizeof(struct dvb_service_descriptor_part2);
++
++      if (pos > len)
++              return NULL;
++
++      pos += p2->service_name_length;
++
++      if (pos != len)
++              return NULL;
++
++      return p;
++}
++
++/**
++ * Accessor for the service_provider_name field of a dvb_service_descriptor.
++ *
++ * @param d dvb_service_descriptor pointer.
++ * @return Pointer to the service_provider_name field.
++ */
++static inline uint8_t *
++      dvb_service_descriptor_service_provider_name(struct dvb_service_descriptor *d)
++{
++      return (uint8_t *) d + sizeof(struct dvb_service_descriptor);
++}
++
++/**
++ * Accessor for the second part of a dvb_service_descriptor.
++ *
++ * @param d dvb_service_descriptor pointer.
++ * @return dvb_service_descriptor_part2 pointer.
++ */
++static inline struct dvb_service_descriptor_part2 *
++      dvb_service_descriptor_part2(struct dvb_service_descriptor *d)
++{
++      return (struct dvb_service_descriptor_part2 *)
++              ((uint8_t*) d + sizeof(struct dvb_service_descriptor) +
++               d->service_provider_name_length);
++}
++
++/**
++ * Accessor for the service_name field of a dvb_service_descriptor_part2.
++ *
++ * @param d dvb_service_descriptor_part2 pointer.
++ * @return Pointer to the service_name field.
++ */
++static inline uint8_t *
++      dvb_service_descriptor_service_name(struct dvb_service_descriptor_part2 *d)
++{
++      return (uint8_t *) d + sizeof(struct dvb_service_descriptor_part2);
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/service_identifier_descriptor.h dvb-apps/lib/libucsi/dvb/service_identifier_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/service_identifier_descriptor.h     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/service_identifier_descriptor.h   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,82 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_SERVICE_IDENTIFIER_DESCRIPTOR
++#define _UCSI_DVB_SERVICE_IDENTIFIER_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_service_identifier_descriptor.
++ */
++struct dvb_service_identifier_descriptor {
++      struct descriptor d;
++
++      /* uint8_t identifier[] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_service_identifier_descriptor.
++ *
++ * @param d Generic descriptor structure.
++ * @return dvb_service_identifier_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_service_identifier_descriptor*
++      dvb_service_identifier_descriptor_codec(struct descriptor* d)
++{
++      return (struct dvb_service_identifier_descriptor*) d;
++}
++
++/**
++ * Retrieve a pointer to the identifier field of a dvb_service_identifier_descriptor.
++ *
++ * @param d dvb_service_identifier_descriptor pointer.
++ * @return Pointer to the field.
++ */
++static inline uint8_t *
++      dvb_service_identifier_descriptor_identifier(struct dvb_service_identifier_descriptor *d)
++{
++      return (uint8_t *) d + sizeof(struct dvb_service_identifier_descriptor);
++}
++
++/**
++ * Calculate length of the identifier field of a dvb_service_identifier_descriptor.
++ *
++ * @param d dvb_service_identifier_descriptor pointer.
++ * @return The length in bytes.
++ */
++static inline int
++      dvb_service_identifier_descriptor_identifier_length(struct dvb_service_identifier_descriptor *d)
++{
++      return d->d.len;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/service_list_descriptor.h dvb-apps/lib/libucsi/dvb/service_list_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/service_list_descriptor.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/service_list_descriptor.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,122 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_SERVICE_LIST_DESCRIPTOR
++#define _UCSI_DVB_SERVICE_LIST_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_service_list_descriptor structure.
++ */
++struct dvb_service_list_descriptor {
++      struct descriptor d;
++
++      /* struct dvb_service_list_service services[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the services field of a dvb_service_list_descriptor.
++ */
++struct dvb_service_list_service {
++      uint16_t service_id;
++      uint8_t service_type;
++} __ucsi_packed;
++
++/**
++ * Process a dvb_service_list_descriptor.
++ *
++ * @param d Generic descriptor structure.
++ * @return dvb_service_list_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_service_list_descriptor*
++      dvb_service_list_descriptor_codec(struct descriptor* d)
++{
++      uint32_t pos = 0;
++      uint32_t len = d->len;
++      uint8_t *p = (uint8_t*) d + 2;
++
++      if (len % sizeof(struct dvb_service_list_service))
++              return NULL;
++
++      while(pos < len) {
++              bswap16(p+pos);
++              pos += sizeof(struct dvb_service_list_service);
++      }
++
++      return (struct dvb_service_list_descriptor*) d;
++}
++
++/**
++ * Iterator for services field in a dvb_service_list_descriptor.
++ *
++ * @param d dvb_service_list_descriptor pointer.
++ * @param pos Variable containing a pointer to the current dvb_service_list_service.
++ */
++#define dvb_service_list_descriptor_services_for_each(d, pos) \
++      for ((pos) = dvb_service_list_descriptor_services_first(d); \
++           (pos); \
++           (pos) = dvb_service_list_descriptor_services_next(d, pos))
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_service_list_service*
++      dvb_service_list_descriptor_services_first(struct dvb_service_list_descriptor *d)
++{
++      if (d->d.len == 0)
++              return NULL;
++
++      return (struct dvb_service_list_service *)
++              ((uint8_t*) d + sizeof(struct dvb_service_list_descriptor));
++}
++
++static inline struct dvb_service_list_service*
++      dvb_service_list_descriptor_services_next(struct dvb_service_list_descriptor *d,
++                                                struct dvb_service_list_service *pos)
++{
++      uint8_t *end = (uint8_t*) d + 2 + d->d.len;
++      uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_service_list_service);
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_service_list_service *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/service_move_descriptor.h dvb-apps/lib/libucsi/dvb/service_move_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/service_move_descriptor.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/service_move_descriptor.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,67 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_SERVICE_MOVE_DESCRIPTOR
++#define _UCSI_DVB_SERVICE_MOVE_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_service_move_descriptor structure.
++ */
++struct dvb_service_move_descriptor {
++      struct descriptor d;
++
++      uint16_t new_original_network_id;
++      uint16_t new_transport_stream_id;
++      uint16_t new_service_id;
++} __ucsi_packed;
++
++/**
++ * Process a dvb_service_move_descriptor.
++ *
++ * @param d Generic descriptor structure.
++ * @return Pointer to dvb_service_move_descriptor, or NULL on error.
++ */
++static inline struct dvb_service_move_descriptor*
++      dvb_service_move_descriptor_codec(struct descriptor* d)
++{
++      if (d->len != (sizeof(struct dvb_service_move_descriptor) - 2))
++              return NULL;
++
++      bswap16((uint8_t*) d + 2);
++      bswap16((uint8_t*) d + 4);
++      bswap16((uint8_t*) d + 6);
++
++      return (struct dvb_service_move_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/short_event_descriptor.h dvb-apps/lib/libucsi/dvb/short_event_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/short_event_descriptor.h    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/short_event_descriptor.h  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,135 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_SHORT_EVENT_DESCRIPTOR
++#define _UCSI_DVB_SHORT_EVENT_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++#include <libucsi/types.h>
++
++/**
++ * dvb_short_event_descriptor structure.
++ */
++struct dvb_short_event_descriptor {
++      struct descriptor d;
++
++      iso639lang_t language_code;
++      uint8_t event_name_length;
++      /* uint8_t event_name[] */
++      /* struct dvb_short_event_descriptor_part2 part2 */
++} __ucsi_packed;
++
++/**
++ * Second part of a dvb_short_event_descriptor, following the variable length
++ * name field.
++ */
++struct dvb_short_event_descriptor_part2 {
++      uint8_t text_length;
++      /* uint8_t text[] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_short_event_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return dvb_short_event_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_short_event_descriptor*
++      dvb_short_event_descriptor_codec(struct descriptor* d)
++{
++      struct dvb_short_event_descriptor *p =
++              (struct dvb_short_event_descriptor*) d;
++      struct dvb_short_event_descriptor_part2 *p2;
++      uint32_t pos = sizeof(struct dvb_short_event_descriptor) - 2;
++      uint32_t len = d->len;
++
++      if (pos > len)
++              return NULL;
++
++      pos += p->event_name_length;
++
++      if (pos > len)
++              return NULL;
++
++      p2 = (struct dvb_short_event_descriptor_part2*) ((uint8_t*) d + 2 + pos);
++
++      pos += sizeof(struct dvb_short_event_descriptor_part2);
++
++      if (pos > len)
++              return NULL;
++
++      pos += p2->text_length;
++
++      if (pos != len)
++              return NULL;
++
++      return p;
++}
++
++/**
++ * Accessor for name field in a dvb_short_event_descriptor.
++ *
++ * @param d dvb_short_event_descriptor pointer.
++ * @return Pointer to name field.
++ */
++static inline uint8_t *
++      dvb_short_event_descriptor_event_name(struct dvb_short_event_descriptor *d)
++{
++      return (uint8_t *) d + sizeof(struct dvb_short_event_descriptor);
++}
++
++/**
++ * Accessor for second part of a dvb_short_event_descriptor.
++ *
++ * @param d dvb_short_event_descriptor pointer.
++ * @return dvb_short_event_descriptor_part2 pointer.
++ */
++static inline struct dvb_short_event_descriptor_part2 *
++      dvb_short_event_descriptor_part2(struct dvb_short_event_descriptor *d)
++{
++      return (struct dvb_short_event_descriptor_part2 *)
++              ((uint8_t*) d + sizeof(struct dvb_short_event_descriptor) +
++               d->event_name_length);
++}
++
++/**
++ * Accessor for text field in a dvb_short_event_descriptor_part2.
++ *
++ * @param d dvb_short_event_descriptor_part2 pointer.
++ * @return Pointer to text field.
++ */
++static inline uint8_t *
++      dvb_short_event_descriptor_text(struct dvb_short_event_descriptor_part2 *d)
++{
++      return (uint8_t *) d + sizeof(struct dvb_short_event_descriptor_part2);
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/short_smoothing_buffer_descriptor.h dvb-apps/lib/libucsi/dvb/short_smoothing_buffer_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/short_smoothing_buffer_descriptor.h 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/short_smoothing_buffer_descriptor.h       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,87 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_SHORT_SMOOTHING_BUFFER_DESCRIPTOR
++#define _UCSI_DVB_SHORT_SMOOTHING_BUFFER_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_short_smoothing_buffer_descriptor structure.
++ */
++struct dvb_short_smoothing_buffer_descriptor {
++      struct descriptor d;
++
++  EBIT2(uint8_t sb_size               : 2; ,
++      uint8_t sb_leak_rate    : 6; );
++      /* uint8_t reserved [] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_short_smoothing_buffer_descriptor.
++ *
++ * @param d Generic descriptor structure.
++ * @return dvb_short_smoothing_buffer_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_short_smoothing_buffer_descriptor*
++      dvb_short_smoothing_buffer_descriptor_codec(struct descriptor* d)
++{
++      if (d->len < (sizeof(struct dvb_short_smoothing_buffer_descriptor) - 2))
++              return NULL;
++
++      return (struct dvb_short_smoothing_buffer_descriptor*) d;
++}
++
++/**
++ * Accessor for reserved field in a dvb_short_smoothing_buffer_descriptor.
++ *
++ * @param d dvb_short_smoothing_buffer_descriptor pointer.
++ * @return Pointer to reserved field.
++ */
++static inline uint8_t *
++      dvb_short_smoothing_buffer_descriptor_reserved(struct dvb_short_smoothing_buffer_descriptor *d)
++{
++      return (uint8_t*) d + sizeof(struct dvb_short_smoothing_buffer_descriptor);
++}
++
++/**
++ * Calculate length of reserved field in a dvb_short_smoothing_buffer_descriptor.
++ *
++ * @param d dvb_short_smoothing_buffer_descriptor pointer.
++ * @return Length of the field in bytes.
++ */
++static inline int
++      dvb_short_smoothing_buffer_descriptor_reserved_length(struct dvb_short_smoothing_buffer_descriptor *d)
++{
++      return d->d.len - 1;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/sit_section.c dvb-apps/lib/libucsi/dvb/sit_section.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/sit_section.c       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/sit_section.c     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,69 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <libucsi/dvb/sit_section.h>
++
++struct dvb_sit_section * dvb_sit_section_codec(struct section_ext * ext)
++{
++      uint8_t * buf = (uint8_t *) ext;
++      struct dvb_sit_section * ret = (struct dvb_sit_section *) ext;
++      size_t pos = sizeof(struct section_ext);
++      size_t len = section_ext_length(ext);
++
++      if (len < sizeof(struct dvb_sit_section))
++              return NULL;
++
++      bswap16(buf + pos);
++      pos += 2;
++
++      if ((pos + ret->transmission_info_loop_length) > len)
++              return NULL;
++
++      if (verify_descriptors(buf + pos, ret->transmission_info_loop_length))
++              return NULL;
++
++      pos += ret->transmission_info_loop_length;
++
++      while (pos < len) {
++              struct dvb_sit_service * service = (void*)(buf + pos);
++
++              if ((pos + sizeof(struct dvb_sit_service)) > len)
++                      return NULL;
++
++              bswap16(buf + pos);
++              bswap16(buf + pos + 2);
++              bswap16(buf + pos + 4);
++              pos += sizeof(struct dvb_sit_service);
++
++              if ((pos + service->service_loop_length) > len)
++                      return NULL;
++
++              if (verify_descriptors(buf + pos, service->service_loop_length))
++                      return NULL;
++
++              pos += service->service_loop_length;
++      }
++
++      if (pos != len)
++              return NULL;
++
++      return ret;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/sit_section.h dvb-apps/lib/libucsi/dvb/sit_section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/sit_section.h       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/sit_section.h     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,173 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_SIT_SECTION_H
++#define _UCSI_DVB_SIT_SECTION_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/section.h>
++
++/**
++ * dvb_sit_section structure.
++ */
++struct dvb_sit_section {
++      struct section_ext head;
++
++  EBIT2(uint16_t reserved                     : 4; ,
++      uint16_t transmission_info_loop_length  :12; );
++      /* struct descriptor descriptors[] */
++      /* struct dvb_sit_service services[] */
++};
++
++/**
++ * An entry in the services field of a dvb_sit_section.
++ */
++struct dvb_sit_service {
++      uint16_t service_id;
++  EBIT3(uint16_t reserved             : 1; ,
++      uint16_t running_status         : 3; ,
++      uint16_t service_loop_length    :12; );
++      /* struct descriptor descriptors[] */
++};
++
++/**
++ * Process a dvb_sit_section.
++ *
++ * @param section Generic section_ext structure.
++ * @return dvb_sit_section pointer, or NULL on error.
++ */
++struct dvb_sit_section * dvb_sit_section_codec(struct section_ext *section);
++
++/**
++ * Iterator for descriptors field in a dvb_sit_section.
++ *
++ * @param sit dvb_sit_section Pointer.
++ * @param pos Variable holding pointer to current descriptor.
++ */
++#define dvb_sit_section_descriptors_for_each(sit, pos) \
++      for ((pos) = dvb_sit_section_descriptors_first(sit); \
++           (pos); \
++           (pos) = dvb_sit_section_descriptors_first(sit))
++
++/**
++ * Iterator for services field in a dvb_sit_section.
++ *
++ * @param sit dvb_sit_section Pointer.
++ * @param pos Variable holding pointer to current dvb_sit_service.
++ */
++#define dvb_sit_section_services_for_each(sit, pos) \
++      for ((pos) = dvb_sit_section_services_first(sit); \
++           (pos); \
++           (pos) = dvb_sit_section_services_next(sit, pos))
++
++/**
++ * Iterator for descriptors field in a dvb_sit_service.
++ *
++ * @param service dvb_sit_service Pointer.
++ * @param pos Variable holding pointer to current descriptor.
++ */
++#define dvb_sit_service_descriptors_for_each(service, pos) \
++      for ((pos) = dvb_sit_service_descriptors_first(service); \
++           (pos); \
++           (pos) = dvb_sit_service_descriptors_next(service, pos))
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct descriptor *
++      dvb_sit_section_descriptors_first(struct dvb_sit_section *sit)
++{
++      if (sit->transmission_info_loop_length == 0)
++              return NULL;
++
++      return (struct descriptor *)
++                      ((uint8_t *) sit + sizeof(struct dvb_sit_section));
++}
++
++static inline struct descriptor *
++      dvb_sit_section_descriptors_next(struct dvb_sit_section *sit,
++                                       struct descriptor* pos)
++{
++      return next_descriptor((uint8_t*) sit + sizeof(struct dvb_sit_section),
++                             sit->transmission_info_loop_length,
++                             pos);
++}
++
++static inline struct dvb_sit_service *
++      dvb_sit_section_services_first(struct dvb_sit_section *sit)
++{
++      size_t pos = sizeof(struct dvb_sit_section) + sit->transmission_info_loop_length;
++
++      if (pos >= section_ext_length(&sit->head))
++              return NULL;
++
++      return (struct dvb_sit_service*) ((uint8_t *) sit + pos);
++}
++
++static inline struct dvb_sit_service *
++      dvb_sit_section_services_next(struct dvb_sit_section *sit,
++                                    struct dvb_sit_service *pos)
++{
++      uint8_t *end = (uint8_t*) sit + section_ext_length(&sit->head);
++      uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_sit_service) +
++                      pos->service_loop_length;
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_sit_service *) next;
++}
++
++static inline struct descriptor *
++      dvb_sit_service_descriptors_first(struct dvb_sit_service * t)
++{
++      if (t->service_loop_length == 0)
++              return NULL;
++
++      return (struct descriptor *)
++                      ((uint8_t *) t + sizeof(struct dvb_sit_service));
++}
++
++static inline struct descriptor *
++      dvb_sit_service_descriptors_next(struct dvb_sit_service *t,
++                                       struct descriptor* pos)
++{
++      return next_descriptor((uint8_t*) t + sizeof(struct dvb_sit_service),
++                             t->service_loop_length,
++                             pos);
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/stream_identifier_descriptor.h dvb-apps/lib/libucsi/dvb/stream_identifier_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/stream_identifier_descriptor.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/stream_identifier_descriptor.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,61 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_STREAM_IDENTIFIER_DESCRIPTOR
++#define _UCSI_DVB_STREAM_IDENTIFIER_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_stream_identifier_descriptor structure.
++ */
++struct dvb_stream_identifier_descriptor {
++      struct descriptor d;
++
++      uint8_t component_tag;
++} __ucsi_packed;
++
++/**
++ * Process a dvb_stream_identifier_descriptor.
++ *
++ * @param d Pointer to generic descriptor structure.
++ * @return dvb_stream_identifier_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_stream_identifier_descriptor*
++      dvb_stream_identifier_descriptor_codec(struct descriptor* d)
++{
++      if (d->len != (sizeof(struct dvb_stream_identifier_descriptor) - 2))
++              return NULL;
++
++      return (struct dvb_stream_identifier_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/st_section.c dvb-apps/lib/libucsi/dvb/st_section.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/st_section.c        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/st_section.c      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,29 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <libucsi/dvb/st_section.h>
++
++struct dvb_st_section * dvb_st_section_codec(struct section * section)
++{
++      struct dvb_st_section * ret = (struct dvb_st_section *)section;
++
++      return ret;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/st_section.h dvb-apps/lib/libucsi/dvb/st_section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/st_section.h        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/st_section.h      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,77 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_ST_SECTION_H
++#define _UCSI_DVB_ST_SECTION_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/section.h>
++
++/**
++ * dvb_st_section structure.
++ */
++struct dvb_st_section {
++      struct section head;
++
++      /* uint8_t data[] */
++};
++
++/**
++ * Process a dvb_st_section.
++ *
++ * @param section Generic section header.
++ * @return dvb_st_section pointer, or NULL on error.
++ */
++struct dvb_st_section *dvb_st_section_codec(struct section *section);
++
++/**
++ * Accessor for data field of dvb_st_section.
++ *
++ * @param st dvb_st_section Pointer.
++ * @return Pointer to field.
++ */
++static inline uint8_t*
++      dvb_st_section_data(struct dvb_st_section* st)
++{
++      return (uint8_t*) st + sizeof(struct dvb_st_section);
++}
++
++/**
++ * Calculate length of data field of dvb_st_section.
++ *
++ * @param st dvb_st_section Pointer.
++ * @return Length in bytes.
++ */
++static inline int
++      dvb_st_section_data_length(struct dvb_st_section* st)
++{
++      return st->head.length;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/stuffing_descriptor.h dvb-apps/lib/libucsi/dvb/stuffing_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/stuffing_descriptor.h       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/stuffing_descriptor.h     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,82 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_STUFFING_DESCRIPTOR
++#define _UCSI_DVB_STUFFING_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_stuffing_descriptor.
++ */
++struct dvb_stuffing_descriptor {
++      struct descriptor d;
++
++      /* uint8_t data[] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_stuffing_descriptor.
++ *
++ * @param d Generic descriptor structure.
++ * @return dvb_stuffing_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_stuffing_descriptor*
++      dvb_stuffing_descriptor_codec(struct descriptor* d)
++{
++      return (struct dvb_stuffing_descriptor*) d;
++}
++
++/**
++ * Retrieve a pointer to the data field of a dvb_stuffing_descriptor.
++ *
++ * @param d dvb_stuffing_descriptor pointer.
++ * @return Pointer to the field.
++ */
++static inline uint8_t *
++      dvb_stuffing_descriptor_data(struct dvb_stuffing_descriptor *d)
++{
++      return (uint8_t *) d + sizeof(struct dvb_stuffing_descriptor);
++}
++
++/**
++ * Calculate length of the data field of a dvb_stuffing_descriptor.
++ *
++ * @param d dvb_stuffing_descriptor pointer.
++ * @return The length in bytes.
++ */
++static inline int
++      dvb_stuffing_descriptor_data_length(struct dvb_stuffing_descriptor *d)
++{
++      return d->d.len;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/subtitling_descriptor.h dvb-apps/lib/libucsi/dvb/subtitling_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/subtitling_descriptor.h     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/subtitling_descriptor.h   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,126 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_SUBTITLING_DESCRIPTOR
++#define _UCSI_DVB_SUBTITLING_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++#include <libucsi/types.h>
++
++/**
++ * dvb_subtitling_descriptor structure.
++ */
++struct dvb_subtitling_descriptor {
++      struct descriptor d;
++
++      /* struct dvb_subtitling_entry subtitles[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the subtitles field of the a dvb_subtitling_descriptor.
++ */
++struct dvb_subtitling_entry {
++      iso639lang_t language_code;
++      uint8_t subtitling_type;
++      uint16_t composition_page_id;
++      uint16_t ancillary_page_id;
++} __ucsi_packed;
++
++/**
++ * Process a dvb_subtitling_descriptor.
++ *
++ * @param d Generic descriptor.
++ * @return dvb_subtitling_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_subtitling_descriptor*
++      dvb_subtitling_descriptor_codec(struct descriptor* d)
++{
++      uint32_t pos = 0;
++      uint8_t* ptr = (uint8_t*) d + 2;
++      uint32_t len = d->len;
++
++      if (len % sizeof(struct dvb_subtitling_entry))
++              return NULL;
++
++      while(pos < len) {
++              bswap16(ptr+pos+4);
++              bswap16(ptr+pos+6);
++              pos += sizeof(struct dvb_subtitling_entry);
++      }
++
++      return (struct dvb_subtitling_descriptor*) d;
++}
++
++/**
++ * Iterator for subtitles field in dvb_subtitling_descriptor.
++ *
++ * @param d dvb_subtitling_descriptor pointer.
++ * @param pos Variable containing a pointer to current dvb_subtitling_entry.
++ */
++#define dvb_subtitling_descriptor_subtitles_for_each(d, pos) \
++      for ((pos) = dvb_subtitling_descriptor_subtitles_first(d); \
++           (pos); \
++           (pos) = dvb_subtitling_descriptor_subtitles_next(d, pos))
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_subtitling_entry*
++      dvb_subtitling_descriptor_subtitles_first(struct dvb_subtitling_descriptor *d)
++{
++      if (d->d.len == 0)
++              return NULL;
++
++      return (struct dvb_subtitling_entry *)
++              ((uint8_t*) d + sizeof(struct dvb_subtitling_descriptor));
++}
++
++static inline struct dvb_subtitling_entry*
++      dvb_subtitling_descriptor_subtitles_next(struct dvb_subtitling_descriptor *d,
++                                               struct dvb_subtitling_entry *pos)
++{
++      uint8_t *end = (uint8_t*) d + 2 + d->d.len;
++      uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_subtitling_entry);
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_subtitling_entry *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/target_ip_address_descriptor.h dvb-apps/lib/libucsi/dvb/target_ip_address_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/target_ip_address_descriptor.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/target_ip_address_descriptor.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,116 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_TARGET_IP_ADDRESS_DESCRIPTOR
++#define _UCSI_DVB_TARGET_IP_ADDRESS_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/types.h>
++
++/**
++ * dvb_target_ip_address_descriptor structure.
++ */
++struct dvb_target_ip_address_descriptor {
++      struct descriptor d;
++
++      uint8_t ipv4_addr_mask[4];
++      /* struct dvb_ipv4_addr ipv4_addr[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the ipv4_addr field of a dvb_target_ip_address_descriptor.
++ */
++struct dvb_ipv4_addr {
++      uint8_t ipv4_addr[4];
++} __ucsi_packed;
++
++/**
++ * Process a dvb_target_ip_address_descriptor.
++ *
++ * @param d Generic descriptor structure pointer.
++ * @return dvb_target_ip_address_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_target_ip_address_descriptor*
++      dvb_target_ip_address_descriptor_codec(struct descriptor* d)
++{
++      uint32_t len = d->len - 4;
++
++      if (len % sizeof(struct dvb_ipv4_addr))
++              return NULL;
++
++      return (struct dvb_target_ip_address_descriptor*) d;
++}
++
++/**
++ * Iterator for entries in the ipv4_addr field of a dvb_target_ip_address_descriptor.
++ *
++ * @param d dvb_target_ip_address_descriptor pointer.
++ * @param pos Variable containing a pointer to the current dvb_ipv4_addr.
++ */
++#define dvb_target_ip_address_descriptor_ipv4_addr_for_each(d, pos) \
++      for ((pos) = dvb_target_ip_address_descriptor_ipv4_addr_first(d); \
++           (pos); \
++           (pos) = dvb_target_ip_address_descriptor_ipv4_addr_next(d, pos))
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_ipv4_addr*
++      dvb_target_ip_address_descriptor_ipv4_addr_first(struct dvb_target_ip_address_descriptor *d)
++{
++      if (d->d.len == 4)
++              return NULL;
++
++      return (struct dvb_ipv4_addr *)
++              ((uint8_t*) d + sizeof(struct dvb_target_ip_address_descriptor));
++}
++
++static inline struct dvb_ipv4_addr*
++      dvb_target_ip_address_descriptor_ipv4_addr_next(struct dvb_target_ip_address_descriptor *d,
++                                                  struct dvb_ipv4_addr *pos)
++{
++      uint8_t *end = (uint8_t*) d + 2 + d->d.len - 4;
++      uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_ipv4_addr);
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_ipv4_addr *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/target_ip_slash_descriptor.h dvb-apps/lib/libucsi/dvb/target_ip_slash_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/target_ip_slash_descriptor.h        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/target_ip_slash_descriptor.h      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,116 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_TARGET_IP_SLASH_DESCRIPTOR
++#define _UCSI_DVB_TARGET_IP_SLASH_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/types.h>
++
++/**
++ * dvb_target_ip_slash_descriptor structure.
++ */
++struct dvb_target_ip_slash_descriptor {
++      struct descriptor d;
++
++      /* struct dvb_ipv4_slash ipv4_slash[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the ipv4_slash field of a dvb_target_ip_slash_descriptor.
++ */
++struct dvb_ipv4_slash {
++      uint8_t ipv4_addr[4];
++      uint8_t ipv4_slash;
++} __ucsi_packed;
++
++/**
++ * Process a dvb_target_ip_slash_descriptor.
++ *
++ * @param d Generic descriptor structure pointer.
++ * @return dvb_target_ip_slash_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_target_ip_slash_descriptor*
++      dvb_target_ip_slash_descriptor_codec(struct descriptor* d)
++{
++      uint32_t len = d->len;
++
++      if (len % sizeof(struct dvb_ipv4_slash))
++              return NULL;
++
++      return (struct dvb_target_ip_slash_descriptor*) d;
++}
++
++/**
++ * Iterator for entries in the ipv4_slash field of a dvb_target_ip_slash_descriptor.
++ *
++ * @param d dvb_target_ip_slash_descriptor pointer.
++ * @param pos Variable containing a pointer to the current dvb_ipv4_slash.
++ */
++#define dvb_target_ip_slash_descriptor_ipv4_slash_for_each(d, pos) \
++      for ((pos) = dvb_target_ip_slash_descriptor_ipv4_slash_first(d); \
++           (pos); \
++           (pos) = dvb_target_ip_slash_descriptor_ipv4_slash_next(d, pos))
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_ipv4_slash*
++      dvb_target_ip_slash_descriptor_ipv4_slash_first(struct dvb_target_ip_slash_descriptor *d)
++{
++      if (d->d.len == 0)
++              return NULL;
++
++      return (struct dvb_ipv4_slash *)
++              ((uint8_t*) d + sizeof(struct dvb_target_ip_slash_descriptor));
++}
++
++static inline struct dvb_ipv4_slash*
++      dvb_target_ip_slash_descriptor_ipv4_slash_next(struct dvb_target_ip_slash_descriptor *d,
++                                                  struct dvb_ipv4_slash *pos)
++{
++      uint8_t *end = (uint8_t*) d + 2 + d->d.len;
++      uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_ipv4_slash);
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_ipv4_slash *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/target_ip_source_slash_descriptor.h dvb-apps/lib/libucsi/dvb/target_ip_source_slash_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/target_ip_source_slash_descriptor.h 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/target_ip_source_slash_descriptor.h       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,118 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_TARGET_IP_SOURCE_SLASH_DESCRIPTOR
++#define _UCSI_DVB_TARGET_IP_SOURCE_SLASH_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/types.h>
++
++/**
++ * dvb_target_ip_source_slash_descriptor structure.
++ */
++struct dvb_target_ip_source_slash_descriptor {
++      struct descriptor d;
++
++      /* struct dvb_ipv4_source_slash ipv4_source_slash[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the ipv4_source_slash field of a dvb_target_ip_source_slash_descriptor.
++ */
++struct dvb_ipv4_source_slash {
++      uint8_t ipv4_source_addr[4];
++      uint8_t ipv4_source_slash;
++      uint8_t ipv4_dest_addr[4];
++      uint8_t ipv4_dest_slash;
++} __ucsi_packed;
++
++/**
++ * Process a dvb_target_ip_source_slash_descriptor.
++ *
++ * @param d Generic descriptor structure pointer.
++ * @return dvb_target_ip_source_slash_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_target_ip_source_slash_descriptor*
++      dvb_target_ip_source_slash_descriptor_codec(struct descriptor* d)
++{
++      uint32_t len = d->len;
++
++      if (len % sizeof(struct dvb_ipv4_source_slash))
++              return NULL;
++
++      return (struct dvb_target_ip_source_slash_descriptor*) d;
++}
++
++/**
++ * Iterator for entries in the ipv4_source_slash field of a dvb_target_ip_source_slash_descriptor.
++ *
++ * @param d dvb_target_ip_source_slash_descriptor pointer.
++ * @param pos Variable containing a pointer to the current dvb_ipv4_source_slash.
++ */
++#define dvb_target_ip_source_slash_descriptor_ipv4_source_slash_for_each(d, pos) \
++      for ((pos) = dvb_target_ip_source_slash_descriptor_ipv4_source_slash_first(d); \
++           (pos); \
++           (pos) = dvb_target_ip_source_slash_descriptor_ipv4_source_slash_next(d, pos))
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_ipv4_source_slash*
++      dvb_target_ip_source_slash_descriptor_ipv4_source_slash_first(struct dvb_target_ip_source_slash_descriptor *d)
++{
++      if (d->d.len == 0)
++              return NULL;
++
++      return (struct dvb_ipv4_source_slash *)
++              ((uint8_t*) d + sizeof(struct dvb_target_ip_source_slash_descriptor));
++}
++
++static inline struct dvb_ipv4_source_slash*
++      dvb_target_ip_source_slash_descriptor_ipv4_source_slash_next(struct dvb_target_ip_source_slash_descriptor *d,
++                                                  struct dvb_ipv4_source_slash *pos)
++{
++      uint8_t *end = (uint8_t*) d + 2 + d->d.len;
++      uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_ipv4_source_slash);
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_ipv4_source_slash *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/target_ipv6_address_descriptor.h dvb-apps/lib/libucsi/dvb/target_ipv6_address_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/target_ipv6_address_descriptor.h    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/target_ipv6_address_descriptor.h  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,116 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_TARGET_IPV6_ADDRESS_DESCRIPTOR
++#define _UCSI_DVB_TARGET_IPV6_ADDRESS_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/types.h>
++
++/**
++ * dvb_target_ipv6_address_descriptor structure.
++ */
++struct dvb_target_ipv6_address_descriptor {
++      struct descriptor d;
++
++      uint8_t ipv6_addr_mask[16];
++      /* struct dvb_ipv6_addr ipv6_addr[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the ipv6_addr field of a dvb_target_ipv6_address_descriptor.
++ */
++struct dvb_ipv6_addr {
++      uint8_t ipv6_addr[16];
++} __ucsi_packed;
++
++/**
++ * Process a dvb_target_ipv6_address_descriptor.
++ *
++ * @param d Generic descriptor structure pointer.
++ * @return dvb_target_ipv6_address_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_target_ipv6_address_descriptor*
++      dvb_target_ipv6_address_descriptor_codec(struct descriptor* d)
++{
++      uint32_t len = d->len - 16;
++
++      if (len % sizeof(struct dvb_ipv6_addr))
++              return NULL;
++
++      return (struct dvb_target_ipv6_address_descriptor*) d;
++}
++
++/**
++ * Iterator for entries in the ipv6_addr field of a dvb_target_ipv6_address_descriptor.
++ *
++ * @param d dvb_target_ipv6_address_descriptor pointer.
++ * @param pos Variable containing a pointer to the current dvb_ipv6_addr.
++ */
++#define dvb_target_ipv6_address_descriptor_ipv6_addr_for_each(d, pos) \
++      for ((pos) = dvb_target_ipv6_address_descriptor_ipv6_addr_first(d); \
++           (pos); \
++           (pos) = dvb_target_ipv6_address_descriptor_ipv6_addr_next(d, pos))
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_ipv6_addr*
++      dvb_target_ipv6_address_descriptor_ipv6_addr_first(struct dvb_target_ipv6_address_descriptor *d)
++{
++      if (d->d.len == 16)
++              return NULL;
++
++      return (struct dvb_ipv6_addr *)
++              ((uint8_t*) d + sizeof(struct dvb_target_ipv6_address_descriptor));
++}
++
++static inline struct dvb_ipv6_addr*
++      dvb_target_ipv6_address_descriptor_ipv6_addr_next(struct dvb_target_ipv6_address_descriptor *d,
++                                                  struct dvb_ipv6_addr *pos)
++{
++      uint8_t *end = (uint8_t*) d + 2 + d->d.len - 16;
++      uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_ipv6_addr);
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_ipv6_addr *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/target_ipv6_slash_descriptor.h dvb-apps/lib/libucsi/dvb/target_ipv6_slash_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/target_ipv6_slash_descriptor.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/target_ipv6_slash_descriptor.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,116 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_TARGET_IPV6_SLASH_DESCRIPTOR
++#define _UCSI_DVB_TARGET_IPV6_SLASH_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/types.h>
++
++/**
++ * dvb_target_ipv6_slash_descriptor structure.
++ */
++struct dvb_target_ipv6_slash_descriptor {
++      struct descriptor d;
++
++      /* struct dvb_ipv6_slash ipv6_slash[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the ipv6_slash field of a dvb_target_ipv6_slash_descriptor.
++ */
++struct dvb_ipv6_slash {
++      uint8_t ipv6_addr[16];
++      uint8_t ipv6_slash;
++} __ucsi_packed;
++
++/**
++ * Process a dvb_target_ipv6_slash_descriptor.
++ *
++ * @param d Generic descriptor structure pointer.
++ * @return dvb_target_ipv6_slash_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_target_ipv6_slash_descriptor*
++      dvb_target_ipv6_slash_descriptor_codec(struct descriptor* d)
++{
++      uint32_t len = d->len;
++
++      if (len % sizeof(struct dvb_ipv6_slash))
++              return NULL;
++
++      return (struct dvb_target_ipv6_slash_descriptor*) d;
++}
++
++/**
++ * Iterator for entries in the ipv6_slash field of a dvb_target_ipv6_slash_descriptor.
++ *
++ * @param d dvb_target_ipv6_slash_descriptor pointer.
++ * @param pos Variable containing a pointer to the current dvb_ipv6_slash.
++ */
++#define dvb_target_ipv6_slash_descriptor_ipv6_slash_for_each(d, pos) \
++      for ((pos) = dvb_target_ipv6_slash_descriptor_ipv6_slash_first(d); \
++           (pos); \
++           (pos) = dvb_target_ipv6_slash_descriptor_ipv6_slash_next(d, pos))
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_ipv6_slash*
++      dvb_target_ipv6_slash_descriptor_ipv6_slash_first(struct dvb_target_ipv6_slash_descriptor *d)
++{
++      if (d->d.len == 0)
++              return NULL;
++
++      return (struct dvb_ipv6_slash *)
++              ((uint8_t*) d + sizeof(struct dvb_target_ipv6_slash_descriptor));
++}
++
++static inline struct dvb_ipv6_slash*
++      dvb_target_ipv6_slash_descriptor_ipv6_slash_next(struct dvb_target_ipv6_slash_descriptor *d,
++                                                  struct dvb_ipv6_slash *pos)
++{
++      uint8_t *end = (uint8_t*) d + 2 + d->d.len;
++      uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_ipv6_slash);
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_ipv6_slash *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/target_ipv6_source_slash_descriptor.h dvb-apps/lib/libucsi/dvb/target_ipv6_source_slash_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/target_ipv6_source_slash_descriptor.h       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/target_ipv6_source_slash_descriptor.h     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,118 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_TARGET_IPV6_SOURCE_SLASH_DESCRIPTOR
++#define _UCSI_DVB_TARGET_IPV6_SOURCE_SLASH_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/types.h>
++
++/**
++ * dvb_target_ipv6_source_slash_descriptor structure.
++ */
++struct dvb_target_ipv6_source_slash_descriptor {
++      struct descriptor d;
++
++      /* struct dvb_ipv6_source_slash ipv6_source_slash[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the ipv6_source_slash field of a dvb_target_ipv6_source_slash_descriptor.
++ */
++struct dvb_ipv6_source_slash {
++      uint8_t ipv6_source_addr[16];
++      uint8_t ipv6_source_slash;
++      uint8_t ipv6_dest_addr[16];
++      uint8_t ipv6_dest_slash;
++} __ucsi_packed;
++
++/**
++ * Process a dvb_target_ipv6_source_slash_descriptor.
++ *
++ * @param d Generic descriptor structure pointer.
++ * @return dvb_target_ipv6_source_slash_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_target_ipv6_source_slash_descriptor*
++      dvb_target_ipv6_source_slash_descriptor_codec(struct descriptor* d)
++{
++      uint32_t len = d->len;
++
++      if (len % sizeof(struct dvb_ipv6_source_slash))
++              return NULL;
++
++      return (struct dvb_target_ipv6_source_slash_descriptor*) d;
++}
++
++/**
++ * Iterator for entries in the ipv6_source_slash field of a dvb_target_ipv6_source_slash_descriptor.
++ *
++ * @param d dvb_target_ipv6_source_slash_descriptor pointer.
++ * @param pos Variable containing a pointer to the current dvb_ipv6_source_slash.
++ */
++#define dvb_target_ipv6_source_slash_descriptor_ipv6_source_slash_for_each(d, pos) \
++      for ((pos) = dvb_target_ipv6_source_slash_descriptor_ipv6_source_slash_first(d); \
++           (pos); \
++           (pos) = dvb_target_ipv6_source_slash_descriptor_ipv6_source_slash_next(d, pos))
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_ipv6_source_slash*
++      dvb_target_ipv6_source_slash_descriptor_ipv6_source_slash_first(struct dvb_target_ipv6_source_slash_descriptor *d)
++{
++      if (d->d.len == 0)
++              return NULL;
++
++      return (struct dvb_ipv6_source_slash *)
++              ((uint8_t*) d + sizeof(struct dvb_target_ipv6_source_slash_descriptor));
++}
++
++static inline struct dvb_ipv6_source_slash*
++      dvb_target_ipv6_source_slash_descriptor_ipv6_source_slash_next(struct dvb_target_ipv6_source_slash_descriptor *d,
++                                                  struct dvb_ipv6_source_slash *pos)
++{
++      uint8_t *end = (uint8_t*) d + 2 + d->d.len;
++      uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_ipv6_source_slash);
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_ipv6_source_slash *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/tdt_section.c dvb-apps/lib/libucsi/dvb/tdt_section.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/tdt_section.c       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/tdt_section.c     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,33 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <libucsi/dvb/tdt_section.h>
++
++struct dvb_tdt_section * dvb_tdt_section_codec(struct section * section)
++{
++      size_t len = section_length(section);
++      struct dvb_tdt_section * ret = (struct dvb_tdt_section *) section;
++
++      if (len != sizeof(struct dvb_tdt_section))
++              return NULL;
++
++      return ret;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/tdt_section.h dvb-apps/lib/libucsi/dvb/tdt_section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/tdt_section.h       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/tdt_section.h     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,54 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_TDT_SECTION_H
++#define _UCSI_DVB_TDT_SECTION_H
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/section.h>
++#include <libucsi/dvb/types.h>
++
++/**
++ * dvb_tdt_section structure.
++ */
++struct dvb_tdt_section {
++      struct section head;
++
++      dvbdate_t utc_time;
++} __ucsi_packed;
++
++/**
++ * Process a dvb_tdt_section.
++ *
++ * @param section Generic section header.
++ * @return dvb_tdt_section pointer, or NULL on error.
++ */
++struct dvb_tdt_section *dvb_tdt_section_codec(struct section *section);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/telephone_descriptor.h dvb-apps/lib/libucsi/dvb/telephone_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/telephone_descriptor.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/telephone_descriptor.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,150 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_TELEPHONE_DESCRIPTOR
++#define _UCSI_DVB_TELEPHONE_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_telephone_descriptor stucture.
++ */
++struct dvb_telephone_descriptor {
++      struct descriptor d;
++
++  EBIT3(uint8_t reserved_1                    : 2; ,
++      uint8_t foreign_availability            : 1; ,
++      uint8_t connection_type                 : 5; );
++  EBIT4(uint8_t reserved_2                    : 1; ,
++      uint8_t country_prefix_length           : 2; ,
++      uint8_t international_area_code_length  : 3; ,
++      uint8_t operator_code_length            : 2; );
++  EBIT3(uint8_t reserved_3                    : 1; ,
++      uint8_t national_area_code_length       : 3; ,
++      uint8_t core_number_length              : 4; );
++      /* uint8_t country_prefix[] */
++      /* uint8_t international_area_code[] */
++      /* uint8_t operator_code[] */
++      /* uint8_t national_area_code[] */
++      /* uint8_t core_number[] */
++} __ucsi_packed;
++
++
++/**
++ * Process a dvb_telephone_descriptor.
++ *
++ * @param d Generic descriptor.
++ * @return dvb_telephone_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_telephone_descriptor*
++      dvb_telephone_descriptor_codec(struct descriptor* d)
++{
++      struct dvb_telephone_descriptor* p =
++              (struct dvb_telephone_descriptor*) d;
++      uint32_t pos = sizeof(struct dvb_telephone_descriptor) - 2;
++      uint32_t len = d->len;
++
++      if (pos > len)
++              return NULL;
++
++      pos +=  p->country_prefix_length +
++              p->international_area_code_length +
++              p->operator_code_length +
++              p->national_area_code_length +
++              p->core_number_length;
++
++      if (pos != len)
++              return NULL;
++
++      return p;
++}
++
++/**
++ * Retrieve pointer to country_prefix field of a dvb_telephone_descriptor.
++ *
++ * @param d dvb_telephone_descriptor pointer.
++ * @return Pointer to the field.
++ */
++static inline uint8_t*
++      dvb_telephone_descriptor_country_prefix(struct dvb_telephone_descriptor* d)
++{
++      return (uint8_t*) d + sizeof(struct dvb_telephone_descriptor);
++}
++
++/**
++ * Retrieve pointer to international_area_code field of a dvb_telephone_descriptor.
++ *
++ * @param d dvb_telephone_descriptor pointer.
++ * @return Pointer to the field.
++ */
++static inline uint8_t*
++      dvb_telephone_descriptor_international_area_code(struct dvb_telephone_descriptor* d)
++{
++      return dvb_telephone_descriptor_country_prefix(d) + d->country_prefix_length;
++}
++
++/**
++ * Retrieve pointer to operator_code field of a dvb_telephone_descriptor.
++ *
++ * @param d dvb_telephone_descriptor pointer.
++ * @return Pointer to the field.
++ */
++static inline uint8_t*
++      dvb_telephone_descriptor_operator_code(struct dvb_telephone_descriptor* d)
++{
++      return dvb_telephone_descriptor_international_area_code(d) + d->international_area_code_length;
++}
++
++/**
++ * Retrieve pointer to national_area_code field of a dvb_telephone_descriptor.
++ *
++ * @param d dvb_telephone_descriptor pointer.
++ * @return Pointer to the field.
++ */
++static inline uint8_t*
++      dvb_telephone_descriptor_national_area_code(struct dvb_telephone_descriptor* d)
++{
++      return dvb_telephone_descriptor_operator_code(d) + d->operator_code_length;
++}
++
++/**
++ * Retrieve pointer to core_number field of a dvb_telephone_descriptor.
++ *
++ * @param d dvb_telephone_descriptor pointer.
++ * @return Pointer to the field.
++ */
++static inline uint8_t*
++      dvb_telephone_descriptor_core_number(struct dvb_telephone_descriptor* d)
++{
++      return dvb_telephone_descriptor_national_area_code(d) + d->national_area_code_length;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/teletext_descriptor.h dvb-apps/lib/libucsi/dvb/teletext_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/teletext_descriptor.h       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/teletext_descriptor.h     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,127 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_TELETEXT_DESCRIPTOR
++#define _UCSI_DVB_TELETEXT_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++#include <libucsi/types.h>
++
++/**
++ * Possible values for the type field.
++ */
++enum {
++      DVB_TELETEXT_TYPE_INITIAL               = 0x01,
++      DVB_TELETEXT_TYPE_SUBTITLE              = 0x02,
++      DVB_TELETEXT_TYPE_ADDITIONAL            = 0x03,
++      DVB_TELETEXT_TYPE_SCHEDULE              = 0x04,
++      DVB_TELETEXT_TYPE_SUBTITLE_HEARING_IMPAIRED= 0x05,
++};
++
++/**
++ * dvb_teletext_descriptor structure.
++ */
++struct dvb_teletext_descriptor {
++      struct descriptor d;
++
++      /* struct dvb_teletext_entry entries[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the entries field of a dvb_teletext_descriptor.
++ */
++struct dvb_teletext_entry {
++      iso639lang_t language_code;
++  EBIT2(uint8_t type          : 5; ,
++      uint8_t magazine_number: 3; );
++      uint8_t page_number;
++} __ucsi_packed;
++
++/**
++ * Process a dvb_teletext_descriptor.
++ *
++ * @param d Generic descriptor.
++ * @return dvb_teletext_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_teletext_descriptor*
++      dvb_teletext_descriptor_codec(struct descriptor* d)
++{
++      if (d->len % sizeof(struct dvb_teletext_entry))
++              return NULL;
++
++      return (struct dvb_teletext_descriptor*) d;
++}
++
++/**
++ * Iterator for entries field of a dvb_teletext_descriptor.
++ *
++ * @param d dvb_teletext_descriptor pointer.
++ * @param pos Variable holding a pointer to the current dvb_teletext_entry.
++ */
++#define dvb_teletext_descriptor_entries_for_each(d, pos) \
++      for ((pos) = dvb_teletext_descriptor_entries_first(d); \
++           (pos); \
++           (pos) = dvb_teletext_descriptor_entries_next(d, pos))
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_teletext_entry*
++      dvb_teletext_descriptor_entries_first(struct dvb_teletext_descriptor *d)
++{
++      if (d->d.len == 0)
++              return NULL;
++
++      return (struct dvb_teletext_entry *)
++              ((uint8_t*) d + sizeof(struct dvb_teletext_descriptor));
++}
++
++static inline struct dvb_teletext_entry*
++      dvb_teletext_descriptor_entries_next(struct dvb_teletext_descriptor *d,
++                                           struct dvb_teletext_entry *pos)
++{
++      uint8_t *end = (uint8_t*) d + 2 + d->d.len;
++      uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_teletext_entry);
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_teletext_entry *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/terrestrial_delivery_descriptor.h dvb-apps/lib/libucsi/dvb/terrestrial_delivery_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/terrestrial_delivery_descriptor.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/terrestrial_delivery_descriptor.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,77 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_TERRESTRIAL_DELIVERY_DESCRIPTOR
++#define _UCSI_DVB_TERRESTRIAL_DELIVERY_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_terrestrial_delivery_descriptor structure.
++ */
++struct dvb_terrestrial_delivery_descriptor {
++      struct descriptor d;
++
++      uint32_t centre_frequency;              // Normal integer, units 10Hz
++  EBIT5(uint8_t bandwidth             : 3; ,
++      uint8_t priority                : 1; ,
++      uint8_t time_slicing_indicator  : 1; ,
++      uint8_t mpe_fec_indicator       : 1; ,
++      uint8_t reserved_1              : 2; );
++  EBIT3(uint8_t constellation         : 2; ,
++      uint8_t hierarchy_information   : 3; ,
++      uint8_t code_rate_hp_stream     : 3; );
++  EBIT4(uint8_t code_rate_lp_stream   : 3; ,
++      uint8_t guard_interval          : 2; ,
++      uint8_t transmission_mode       : 2; ,
++      uint8_t other_frequency_flag    : 1; );
++      uint32_t reserved_2;
++} __ucsi_packed;
++
++/**
++ * Process a dvb_terrestrial_delivery_descriptor.
++ *
++ * @param d Generic descriptor structure.
++ * @return dvb_terrestrial_delivery_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_terrestrial_delivery_descriptor*
++      dvb_terrestrial_delivery_descriptor_codec(struct descriptor* d)
++{
++      if (d->len != (sizeof(struct dvb_terrestrial_delivery_descriptor) - 2))
++              return NULL;
++
++      bswap32((uint8_t*) d + 2);
++      bswap32((uint8_t*) d + 9);
++
++      return (struct dvb_terrestrial_delivery_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/time_shifted_event_descriptor.h dvb-apps/lib/libucsi/dvb/time_shifted_event_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/time_shifted_event_descriptor.h     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/time_shifted_event_descriptor.h   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,65 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_TIME_SHIFTED_EVENT_DESCRIPTOR
++#define _UCSI_DVB_TIME_SHIFTED_EVENT_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_time_shifted_event_descriptor structure.
++ */
++struct dvb_time_shifted_event_descriptor {
++      struct descriptor d;
++
++      uint16_t reference_service_id;
++      uint16_t reference_event_id;
++} __ucsi_packed;
++
++/**
++ * Process a dvb_time_shifted_event_descriptor.
++ *
++ * @param d Generic descriptor.
++ * @return dvb_time_shifted_event_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_time_shifted_event_descriptor*
++      dvb_time_shifted_event_descriptor_codec(struct descriptor* d)
++{
++      if (d->len != (sizeof(struct dvb_time_shifted_event_descriptor) - 2))
++              return NULL;
++
++      bswap16((uint8_t*) d + 2);
++      bswap16((uint8_t*) d + 4);
++
++      return (struct dvb_time_shifted_event_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/time_shifted_service_descriptor.h dvb-apps/lib/libucsi/dvb/time_shifted_service_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/time_shifted_service_descriptor.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/time_shifted_service_descriptor.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,63 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_TIME_SHIFTED_SERVICE_DESCRIPTOR
++#define _UCSI_DVB_TIME_SHIFTED_SERVICE_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_time_shifted_service_descriptor structure.
++ */
++struct dvb_time_shifted_service_descriptor {
++      struct descriptor d;
++
++      uint16_t reference_service_id;
++} __ucsi_packed;
++
++/**
++ * Process a dvb_time_shifted_service_descriptor.
++ *
++ * @param d Generic descriptor.
++ * @return Pointer to dvb_time_shifted_service_descriptor, or NULL on error.
++ */
++static inline struct dvb_time_shifted_service_descriptor*
++      dvb_time_shifted_service_descriptor_codec(struct descriptor* d)
++{
++      if (d->len != (sizeof(struct dvb_time_shifted_service_descriptor) - 2))
++              return NULL;
++
++      bswap16((uint8_t*) d + 2);
++
++      return (struct dvb_time_shifted_service_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/time_slice_fec_identifier_descriptor.h dvb-apps/lib/libucsi/dvb/time_slice_fec_identifier_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/time_slice_fec_identifier_descriptor.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/time_slice_fec_identifier_descriptor.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,94 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ * Copyright (C) 2008 Patrick Boettcher (pb@linuxtv.org)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_TIME_SLICE_FEC_IDENTIFIER_DESCRIPTOR
++#define _UCSI_DVB_TIME_SLICE_FEC_IDENTIFIER_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/types.h>
++
++/*
++ * dvb_time_slice_fec_identifier_descriptor structure.
++ */
++struct dvb_time_slice_fec_identifier_descriptor {
++      struct descriptor d;
++
++  EBIT4(uint8_t time_slicing          :1;  ,
++      uint8_t mpe_fec                 :2;  ,
++      uint8_t reserved                :2;  ,
++      uint8_t frame_size              :3;  );
++
++      uint8_t max_burst_duration;
++
++  EBIT2(uint8_t max_average_rate      :4;  ,
++      uint8_t time_slice_fec_id       :4;  );
++      /* id_selector_bytes[] */
++};
++
++static inline struct dvb_time_slice_fec_identifier_descriptor *
++      dvb_time_slice_fec_identifier_descriptor_codec(struct descriptor* d)
++{
++      if (d->len < 3)
++              return NULL;
++      return (struct dvb_time_slice_fec_identifier_descriptor *) d;
++}
++
++static inline uint8_t dvb_time_slice_fec_identifier_selector_byte_length(struct dvb_time_slice_fec_identifier_descriptor *d)
++{
++      return d->d.len - 3;
++}
++
++static inline uint8_t * dvb_time_slice_fec_identifier_selector_bytes(struct dvb_time_slice_fec_identifier_descriptor *d)
++{
++      if (d->d.len < 3)
++              return NULL;
++      else
++              return ((uint8_t *) d) + 2 + 3;
++}
++
++static inline uint16_t dvb_time_slice_fec_identifier_max_burst_duration_msec(struct dvb_time_slice_fec_identifier_descriptor *d)
++{
++      return (d->max_burst_duration + 1) * 20;
++}
++
++static inline uint16_t dvb_time_slice_fec_identifier_frame_size_kbits(struct dvb_time_slice_fec_identifier_descriptor *d)
++{
++      if (d->frame_size > 3)
++              return 0;
++      return (d->frame_size+1) * 512;
++}
++
++static inline uint16_t dvb_time_slice_fec_identifier_frame_size_rows(struct dvb_time_slice_fec_identifier_descriptor *d)
++{
++      return dvb_time_slice_fec_identifier_frame_size_kbits(d) / 2;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/tot_section.c dvb-apps/lib/libucsi/dvb/tot_section.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/tot_section.c       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/tot_section.c     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,50 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <libucsi/dvb/tot_section.h>
++
++struct dvb_tot_section *dvb_tot_section_codec(struct section *section)
++{
++      uint8_t * buf = (uint8_t *)section;
++      size_t pos = sizeof(struct section);
++      size_t len = section_length(section) - CRC_SIZE;
++      struct dvb_tot_section * ret = (struct dvb_tot_section *)section;
++
++      if (len < sizeof(struct dvb_tot_section))
++              return NULL;
++
++      pos += 5;
++      bswap16(buf + pos);
++      pos += 2;
++
++      if ((pos + ret->descriptors_loop_length) > len)
++              return NULL;
++
++      if (verify_descriptors(buf + pos, ret->descriptors_loop_length))
++              return NULL;
++
++      pos += ret->descriptors_loop_length;
++
++      if (pos != len)
++              return NULL;
++
++      return ret;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/tot_section.h dvb-apps/lib/libucsi/dvb/tot_section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/tot_section.h       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/tot_section.h     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,97 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_TOT_SECTION_H
++#define _UCSI_DVB_TOT_SECTION_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/section.h>
++#include <libucsi/dvb/types.h>
++
++/**
++ * dvb_tot_section structure.
++ */
++struct dvb_tot_section {
++      struct section head;
++
++      dvbdate_t utc_time;
++  EBIT2(uint16_t reserved             : 4; ,
++      uint16_t descriptors_loop_length:12; );
++      /* struct descriptor descriptors[] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_tot_section.
++ *
++ * @param section Pointer to generic section structure.
++ * @return dvb_tot_section pointer, or NULL on error.
++ */
++struct dvb_tot_section * dvb_tot_section_codec(struct section *section);
++
++/**
++ * Iterator for descriptors field of dvb_tot_section.
++ *
++ * @param tot dvb_tot_section pointer.
++ * @param pos Variable holding a pointer to the current descriptor.
++ */
++#define dvb_tot_section_descriptors_for_each(tot, pos) \
++      for ((pos) = dvb_tot_section_descriptors_first(tot); \
++           (pos); \
++           (pos) = dvb_tot_section_descriptors_next(tot, pos))
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct descriptor *
++      dvb_tot_section_descriptors_first(struct dvb_tot_section * tot)
++{
++      if (tot->descriptors_loop_length == 0)
++              return NULL;
++
++      return (struct descriptor *)
++              ((uint8_t *) tot + sizeof(struct dvb_tot_section));
++}
++
++static inline struct descriptor *
++      dvb_tot_section_descriptors_next(struct dvb_tot_section *tot,
++                                       struct descriptor* pos)
++{
++      return next_descriptor((uint8_t *) tot + sizeof(struct dvb_tot_section),
++                             tot->descriptors_loop_length,
++                             pos);
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/transport_stream_descriptor.h dvb-apps/lib/libucsi/dvb/transport_stream_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/transport_stream_descriptor.h       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/transport_stream_descriptor.h     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,82 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_TRANSPORT_STREAM_DESCRIPTOR
++#define _UCSI_DVB_TRANSPORT_STREAM_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_transport_stream_descriptor structure.
++ */
++struct dvb_transport_stream_descriptor {
++      struct descriptor d;
++
++      /* uint8_t data[] */
++} __ucsi_packed;
++
++/**
++ * Process dvb_transport_stream_descriptor structure.
++ *
++ * @param d Pointer to generic descriptor.
++ * @return dvb_transport_stream_descriptor structure or NULL on error.
++ */
++static inline struct dvb_transport_stream_descriptor*
++      dvb_transport_stream_descriptor_codec(struct descriptor* d)
++{
++      return (struct dvb_transport_stream_descriptor*) d;
++}
++
++/**
++ * Retrieve a pointer to the data field of a dvb_transport_stream_descriptor.
++ *
++ * @param d dvb_transport_stream_descriptor structure.
++ * @return Pointer to data field.
++ */
++static inline uint8_t *
++      dvb_transport_stream_descriptor_data(struct dvb_transport_stream_descriptor *d)
++{
++      return (uint8_t *) d + sizeof(struct dvb_transport_stream_descriptor);
++}
++
++/**
++ * Calculate the length of the data field of a dvb_transport_stream_descriptor.
++ *
++ * @param d dvb_transport_stream_descriptor structure.
++ * @return length of data field in bytes.
++ */
++static inline int
++      dvb_transport_stream_descriptor_data_length(struct dvb_transport_stream_descriptor *d)
++{
++      return d->d.len;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/tva_container_section.c dvb-apps/lib/libucsi/dvb/tva_container_section.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/tva_container_section.c     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/tva_container_section.c   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,33 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <libucsi/dvb/tva_container_section.h>
++
++struct dvb_tva_container_section *dvb_tva_container_section_codec(struct section_ext *ext)
++{
++      size_t len = section_ext_length(ext);
++      struct dvb_tva_container_section* ret = (struct dvb_tva_container_section*) ext;
++
++      if (len < sizeof(struct dvb_tva_container_section))
++              return NULL;
++
++      return ret;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/tva_container_section.h dvb-apps/lib/libucsi/dvb/tva_container_section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/tva_container_section.h     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/tva_container_section.h   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,90 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_TVA_CONTAINER_SECTION_H
++#define _UCSI_DVB_TVA_CONTAINER_SECTION_H
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/section.h>
++#include <libucsi/dvb/types.h>
++
++/**
++ * dvb_tva_container_section structure.
++ */
++struct dvb_tva_container_section {
++      struct section_ext head;
++
++      /* uint8_t data[] */
++} __ucsi_packed;
++
++/**
++ * Process a dvb_tva_container_section.
++ *
++ * @param section Generic section header.
++ * @return dvb_tdt_section pointer, or NULL on error.
++ */
++struct dvb_tva_container_section *dvb_tva_container_section_codec(struct section_ext *ext);
++
++/**
++ * Accessor for the container_id field of a tva container section.
++ *
++ * @param container dvb_tva_container_section pointer.
++ * @return The container_id.
++ */
++static inline uint16_t dvb_tva_container_section_container_id(struct dvb_tva_container_section *container)
++{
++      return container->head.table_id_ext;
++}
++
++/**
++ * Accessor for the data field of a dvb_data_broadcast_id_descriptor.
++ *
++ * @param d dvb_data_broadcast_id_descriptor pointer.
++ * @return Pointer to the field.
++ */
++static inline uint8_t *
++dvb_tva_container_section_data(struct dvb_tva_container_section *s)
++{
++      return (uint8_t *) s + sizeof(struct dvb_tva_container_section);
++}
++
++/**
++ * Determine the number of bytes in the data field of a dvb_tva_container_section.
++ *
++ * @param d dvb_tva_container_section pointer.
++ * @return Length of the field in bytes.
++ */
++static inline int
++dvb_tva_container_section_data_length(struct dvb_tva_container_section *s)
++{
++      return section_ext_length(&s->head) - sizeof(struct dvb_tva_container_section);
++}
++
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/tva_id_descriptor.h dvb-apps/lib/libucsi/dvb/tva_id_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/tva_id_descriptor.h 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/tva_id_descriptor.h       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,124 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_TVA_ID_DESCRIPTOR
++#define _UCSI_DVB_TVA_ID_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * dvb_tva_id_descriptor structure.
++ */
++struct dvb_tva_id_descriptor {
++      struct descriptor d;
++
++      /* struct dvb_tva_id_entry entries[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the entries field of a dvb_tva_id_descriptor.
++ */
++struct dvb_tva_id_entry {
++      uint16_t tva_id;
++  EBIT2(uint8_t reserved              : 5; ,
++      uint8_t running_status          : 3; );
++} __ucsi_packed;
++
++/**
++ * Process a dvb_tva_id_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return dvb_tva_id_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_tva_id_descriptor*
++      dvb_tva_id_descriptor_codec(struct descriptor* d)
++{
++      uint32_t pos = 0;
++      uint32_t len = d->len;
++      uint8_t* buf = (uint8_t*) d + 2;
++
++      pos += sizeof(struct dvb_tva_id_descriptor) - 2;
++      if (len % sizeof(struct dvb_tva_id_entry))
++              return NULL;
++
++      while(pos < len) {
++              bswap16(buf+pos);
++              pos+=3;
++      }
++
++      return (struct dvb_tva_id_descriptor*) d;
++}
++
++/**
++ * Iterator for the entries field of a dvb_tva_id_descriptor.
++ *
++ * @param d dvb_tva_id_descriptor pointer.
++ * @param pos Variable containing a pointer to the current dvb_tva_id_entry.
++ */
++#define dvb_tva_id_descriptor_entries_for_each(d, pos) \
++      for ((pos) = dvb_tva_id_descriptor_entries_first(d); \
++           (pos); \
++           (pos) = dvb_tva_id_descriptor_entries_next(d, pos))
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_tva_id_entry*
++      dvb_tva_id_descriptor_entries_first(struct dvb_tva_id_descriptor *d)
++{
++      if (d->d.len == 0)
++              return NULL;
++
++      return (struct dvb_tva_id_entry *)
++              ((uint8_t*) d + sizeof(struct dvb_tva_id_descriptor));
++}
++
++static inline struct dvb_tva_id_entry*
++      dvb_tva_id_descriptor_entries_next(struct dvb_tva_id_descriptor *d,
++                                                           struct dvb_tva_id_entry *pos)
++{
++      uint8_t *end = (uint8_t*) d + 2 + d->d.len;
++      uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_tva_id_entry);
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_tva_id_entry *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/types.c dvb-apps/lib/libucsi/dvb/types.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/types.c     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/types.c   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,270 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <string.h>
++#include "types.h"
++
++time_t dvbdate_to_unixtime(dvbdate_t dvbdate)
++{
++      int k = 0;
++      struct tm tm;
++      double mjd;
++
++      /* check for the undefined value */
++      if ((dvbdate[0] == 0xff) &&
++          (dvbdate[1] == 0xff) &&
++          (dvbdate[2] == 0xff) &&
++          (dvbdate[3] == 0xff) &&
++          (dvbdate[4] == 0xff)) {
++              return -1;
++      }
++
++      memset(&tm, 0, sizeof(tm));
++      mjd = (dvbdate[0] << 8) | dvbdate[1];
++
++      tm.tm_year = (int) ((mjd - 15078.2) / 365.25);
++      tm.tm_mon = (int) (((mjd - 14956.1) - (int) (tm.tm_year * 365.25)) / 30.6001);
++      tm.tm_mday = (int) mjd - 14956 - (int) (tm.tm_year * 365.25) - (int) (tm.tm_mon * 30.6001);
++      if ((tm.tm_mon == 14) || (tm.tm_mon == 15)) k = 1;
++      tm.tm_year += k;
++      tm.tm_mon = tm.tm_mon - 2 - k * 12;
++      tm.tm_sec = bcd_to_integer(dvbdate[4]);
++      tm.tm_min = bcd_to_integer(dvbdate[3]);
++      tm.tm_hour = bcd_to_integer(dvbdate[2]);
++
++      return mktime(&tm);
++}
++
++void unixtime_to_dvbdate(time_t unixtime, dvbdate_t dvbdate)
++{
++      struct tm tm;
++      double l = 0;
++      int mjd;
++
++      /* the undefined value */
++      if (unixtime == -1) {
++              memset(dvbdate, 0xff, 5);
++              return;
++      }
++
++      gmtime_r(&unixtime, &tm);
++      tm.tm_mon++;
++      if ((tm.tm_mon == 1) || (tm.tm_mon == 2)) l = 1;
++      mjd = 14956 + tm.tm_mday + (int) ((tm.tm_year - l) * 365.25) + (int) ((tm.tm_mon + 1 + l * 12) * 30.6001);
++
++      dvbdate[0] = (mjd & 0xff00) >> 8;
++      dvbdate[1] = mjd & 0xff;
++      dvbdate[2] = integer_to_bcd(tm.tm_hour);
++      dvbdate[3] = integer_to_bcd(tm.tm_min);
++      dvbdate[4] = integer_to_bcd(tm.tm_sec);
++}
++
++int dvbduration_to_seconds(dvbduration_t dvbduration)
++{
++      int seconds = 0;
++
++      seconds += (bcd_to_integer(dvbduration[0]) * 60 * 60);
++      seconds += (bcd_to_integer(dvbduration[1]) * 60);
++      seconds += bcd_to_integer(dvbduration[2]);
++
++      return seconds;
++}
++
++void seconds_to_dvbduration(int seconds, dvbduration_t dvbduration)
++{
++      int hours, mins;
++
++      hours = seconds / (60*60);
++      seconds -= (hours * 60 * 60);
++      mins = seconds / 60;
++      seconds -= (mins * 60);
++
++      dvbduration[0] = integer_to_bcd(hours);
++      dvbduration[1] = integer_to_bcd(mins);
++      dvbduration[2] = integer_to_bcd(seconds);
++}
++
++int dvbhhmm_to_seconds(dvbhhmm_t dvbhhmm)
++{
++      int seconds = 0;
++
++      seconds += (bcd_to_integer(dvbhhmm[0]) * 60 * 60);
++      seconds += (bcd_to_integer(dvbhhmm[1]) * 60);
++
++      return seconds;
++}
++
++void seconds_to_dvbhhmm(int seconds, dvbhhmm_t dvbhhmm)
++{
++      int hours, mins;
++
++      hours = seconds / (60*60);
++      seconds -= (hours * 60 * 60);
++      mins = seconds / 60;
++
++      dvbhhmm[0] = integer_to_bcd(hours);
++      dvbhhmm[1] = integer_to_bcd(mins);
++}
++
++uint32_t integer_to_bcd(uint32_t intval)
++{
++      uint32_t val = 0;
++
++      int i;
++      for(i=0; i<=28;i+=4) {
++              val |= ((intval % 10) << i);
++              intval /= 10;
++      }
++
++      return val;
++}
++
++uint32_t bcd_to_integer(uint32_t bcdval)
++{
++      uint32_t val = 0;
++
++      int i;
++      for(i=28; i>=0;i-=4) {
++              val += ((bcdval >> i) & 0x0f);
++              if (i != 0) val *= 10;
++      }
++
++      return val;
++}
++
++const char *dvb_charset(char *dvb_text, int dvb_text_length, int *consumed)
++{
++      char *charset = "ISO6937";
++      int used = 0;
++
++      if (dvb_text_length == 0)
++              goto exit;
++      if (dvb_text[0] >= 32)
++              goto exit;
++      if (dvb_text[0] == 0x10) {
++              if (dvb_text_length < 3)
++                      goto exit;
++
++              used = 3;
++              uint16_t ext = (dvb_text[1] << 8) | dvb_text[2];
++              switch(ext) {
++              case 0x01:
++                      charset = "ISO8859-1";
++                      break;
++              case 0x02:
++                      charset = "ISO8859-2";
++                      break;
++              case 0x03:
++                      charset = "ISO8859-3";
++                      break;
++              case 0x04:
++                      charset = "ISO8859-4";
++                      break;
++              case 0x05:
++                      charset = "ISO8859-5";
++                      break;
++              case 0x06:
++                      charset = "ISO8859-6";
++                      break;
++              case 0x07:
++                      charset = "ISO8859-7";
++                      break;
++              case 0x08:
++                      charset = "ISO8859-8";
++                      break;
++              case 0x09:
++                      charset = "ISO8859-9";
++                      break;
++              case 0x0a:
++                      charset = "ISO8859-10";
++                      break;
++              case 0x0b:
++                      charset = "ISO8859-11";
++                      break;
++              case 0x0d:
++                      charset = "ISO8859-13";
++                      break;
++              case 0x0e:
++                      charset = "ISO8859-14";
++                      break;
++              case 0x0f:
++                      charset = "ISO8859-15";
++                      break;
++              default:
++                      used = 0;
++                      break;
++              }
++      } else {
++              used = 1;
++              switch(dvb_text[0]) {
++              case 0x01:
++                      charset = "ISO8859-5";
++                      break;
++              case 0x02:
++                      charset = "ISO8859-6";
++                      break;
++              case 0x03:
++                      charset = "ISO8859-7";
++                      break;
++              case 0x04:
++                      charset = "ISO8859-8";
++                      break;
++              case 0x05:
++                      charset = "ISO8859-9";
++                      break;
++              case 0x06:
++                      charset = "ISO8859-10";
++                      break;
++              case 0x07:
++                      charset = "ISO8859-11";
++                      break;
++              case 0x09:
++                      charset = "ISO8859-13";
++                      break;
++              case 0x0a:
++                      charset = "ISO8859-14";
++                      break;
++              case 0x0b:
++                      charset = "ISO8859-15";
++                      break;
++              case 0x11:
++                      charset = "UTF16";
++                      break;
++              case 0x12:
++                      charset = "EUC-KR";
++                      break;
++              case 0x13:
++                      charset = "GB2312";
++                      break;
++              case 0x14:
++                      charset = "GBK";
++                      break;
++              case 0x15:
++                      charset = "UTF8";
++                      break;
++              default:
++                      used = 0;
++                      break;
++              }
++      }
++exit:
++      *consumed = used;
++      return charset;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/types.h dvb-apps/lib/libucsi/dvb/types.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/types.h     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/types.h   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,127 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_TYPES_H
++#define _UCSI_DVB_TYPES_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <stdint.h>
++#include <time.h>
++
++typedef uint8_t dvbdate_t[5];
++typedef uint8_t dvbduration_t[3];
++typedef uint8_t dvbhhmm_t[2];
++
++/**
++ * Running status values.
++ */
++enum {
++      DVB_RUNNING_STATUS_NOT_RUNNING                  = 0x01,
++      DVB_RUNNING_STATUS_FEW_SECONDS                  = 0x02,
++      DVB_RUNNING_STATUS_PAUSING                      = 0x03,
++      DVB_RUNNING_STATUS_RUNNING                      = 0x04,
++};
++
++/**
++ * Convert from a 5 byte DVB UTC date to unix time.
++ * Note: this functions expects the DVB date in network byte order.
++ *
++ * @param d Pointer to DVB date.
++ * @return The unix timestamp, or -1 if the dvbdate was set to the 'undefined' value
++ */
++extern time_t dvbdate_to_unixtime(dvbdate_t dvbdate);
++
++/**
++ * Convert from a unix timestemp to a 5 byte DVB UTC date.
++ * Note: this function will always output the DVB date in
++ * network byte order.
++ *
++ * @param unixtime The unix timestamp, or -1 for the 'undefined' value.
++ * @param utc Pointer to 5 byte DVB date.
++ */
++extern void unixtime_to_dvbdate(time_t unixtime, dvbdate_t dvbdate);
++
++/**
++ * Convert from a DVB BCD duration to a number of seconds.
++ *
++ * @param dvbduration Pointer to 3 byte DVB duration.
++ * @return Number of seconds.
++ */
++extern int dvbduration_to_seconds(dvbduration_t dvbduration);
++
++/**
++ * Convert from a number of seconds to a DVB 3 byte BCD duration.
++ *
++ * @param seconds The number of seconds.
++ * @param dvbduration Pointer to 3 byte DVB duration.
++ */
++extern void seconds_to_dvbduration(int seconds, dvbduration_t dvbduration);
++
++/**
++ * Convert from a DVB BCD HHMM to a number of seconds.
++ *
++ * @param dvbduration Pointer to 2 byte DVB HHMM.
++ * @return Number of seconds.
++ */
++extern int dvbhhmm_to_seconds(dvbhhmm_t dvbhhmm);
++
++/**
++ * Convert from a number of seconds to a DVB 2 byte BCD HHMM.
++ *
++ * @param seconds The number of seconds.
++ * @param dvbduration Pointer to 2 byte DVB HHMM.
++ */
++extern void seconds_to_dvbhhmm(int seconds, dvbhhmm_t dvbhhmm);
++
++/**
++ * Convert a __ucsi_packed BCD value into a normal integer.
++ *
++ * @param bcd The value to convert.
++ * @return The value.
++ */
++extern uint32_t bcd_to_integer(uint32_t bcd);
++
++/**
++ * Convert a normal integer into a __ucsi_packed BCD value.
++ *
++ * @param integer The value to convert.
++ * @return The value.
++ */
++extern uint32_t integer_to_bcd(uint32_t integer);
++
++/**
++ * Determine the (iconv compatable) character set of a dvb string.
++ *
++ * @param dvb_text DVB text concerned.
++ * @param dvb_text_length Length of text.
++ * @param consumed Out parameter of number of bytes used to encode the character set.
++ * @return Name of the character set.
++ */
++extern const char *dvb_charset(char *dvb_text, int dvb_text_length, int *consumed);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/vbi_data_descriptor.h dvb-apps/lib/libucsi/dvb/vbi_data_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/vbi_data_descriptor.h       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/vbi_data_descriptor.h     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,186 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_VBI_DATA_DESCRIPTOR
++#define _UCSI_DVB_VBI_DATA_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * Possible values for the data_service_id field.
++ */
++enum {
++      DVB_VBI_DATA_SERVICE_ID_EBU             = 0x01,
++      DVB_VBI_DATA_SERVICE_ID_INVERTED        = 0x02,
++      DVB_VBI_DATA_SERVICE_ID_VPS             = 0x04,
++      DVB_VBI_DATA_SERVICE_ID_WSS             = 0x05,
++      DVB_VBI_DATA_SERVICE_ID_CC              = 0x06,
++      DVB_VBI_DATA_SERVICE_ID_MONO_422        = 0x07,
++};
++
++/**
++ * dvb_vbi_data_descriptor structure
++ */
++struct dvb_vbi_data_descriptor {
++      struct descriptor d;
++
++      /* struct dvb_vbi_data_entry entries[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the dvb_vbi_data_descriptor entries field.
++ */
++struct dvb_vbi_data_entry {
++      uint8_t data_service_id;
++      uint8_t data_length;
++      /* uint8_t data[] */
++} __ucsi_packed;
++
++/**
++ * Format of the dvb_vbi_data_entry data field, if data_service_id == 1,2,4,5,6,7.
++ */
++struct dvb_vbi_data_x {
++  EBIT3(uint8_t reserved      : 2; ,
++      uint8_t field_parity    : 1; ,
++      uint8_t line_offset     : 5; );
++} __ucsi_packed;
++
++/**
++ * Process a dvb_vbi_data_descriptor.
++ *
++ * @param d Generic descriptor structure.
++ * @return dvb_vbi_data_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_vbi_data_descriptor*
++      dvb_vbi_data_descriptor_codec(struct descriptor* d)
++{
++      uint8_t* p = (uint8_t*) d + 2;
++      uint32_t pos = 0;
++      uint32_t len = d->len;
++
++      while(pos < len) {
++              struct dvb_vbi_data_entry *e =
++                      (struct dvb_vbi_data_entry*) (p+pos);
++
++              pos += sizeof(struct dvb_vbi_data_entry);
++
++              if (pos > len)
++                      return NULL;
++
++              pos += e->data_length;
++
++              if (pos > len)
++                      return NULL;
++      }
++
++      return (struct dvb_vbi_data_descriptor*) d;
++}
++
++/**
++ * Iterator for entries field in a dvb_vbi_data_descriptor structure.
++ *
++ * @param d Pointer to dvb_vbi_data_descriptor structure.
++ * @param pos Variable holding pointer to the current dvb_vbi_data_entry structure.
++ */
++#define dvb_vbi_data_descriptor_entries_for_each(d, pos) \
++      for ((pos) = dvb_vbi_data_descriptor_entries_first(d); \
++           (pos); \
++           (pos) = dvb_vbi_data_descriptor_entries_next(d, pos))
++
++/**
++ * Get a pointer to the data field of a dvb_vbi_data_entry.
++ *
++ * @param d dvb_vbi_data_entry structure.
++ * @return Pointer to the data field.
++ */
++static inline uint8_t *
++      dvb_vbi_data_entry_data(struct dvb_vbi_data_entry *d)
++{
++      return (uint8_t *) d + sizeof(struct dvb_vbi_data_entry);
++}
++
++/**
++ * Get a pointer to the data field of a dvb_vbi_data_x for id 1,2,4,5,6,7.
++ *
++ * @param d dvb_vbi_data_entry structure.
++ * @return Pointer to the data field, or NULL if invalid
++ */
++static inline struct dvb_vbi_data_x*
++      dvb_vbi_data_entry_data_x(struct dvb_vbi_data_entry *d)
++{
++      switch(d->data_service_id) {
++      case 1:
++      case 2:
++      case 4:
++      case 5:
++      case 6:
++      case 7:
++              return (struct dvb_vbi_data_x*) ((uint8_t *) d + sizeof(struct dvb_vbi_data_entry));
++      }
++
++      return NULL;
++}
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_vbi_data_entry*
++      dvb_vbi_data_descriptor_entries_first(struct dvb_vbi_data_descriptor *d)
++{
++      if (d->d.len == 0)
++              return NULL;
++
++      return (struct dvb_vbi_data_entry *)
++              ((uint8_t*) d + sizeof(struct dvb_vbi_data_descriptor));
++}
++
++static inline struct dvb_vbi_data_entry*
++      dvb_vbi_data_descriptor_entries_next(struct dvb_vbi_data_descriptor *d,
++                                           struct dvb_vbi_data_entry *pos)
++{
++      uint8_t *end = (uint8_t*) d + 2 + d->d.len;
++      uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_vbi_data_entry) +
++                      pos->data_length;
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_vbi_data_entry *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/vbi_teletext_descriptor.h dvb-apps/lib/libucsi/dvb/vbi_teletext_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/dvb/vbi_teletext_descriptor.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/dvb/vbi_teletext_descriptor.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,116 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_DVB_VBI_TELETEXT_DESCRIPTOR
++#define _UCSI_DVB_VBI_TELETEXT_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++#include <libucsi/types.h>
++
++/**
++ * dvb_vbi_teletext_descriptor structure
++ */
++struct dvb_vbi_teletext_descriptor {
++      struct descriptor d;
++
++      /* struct dvb_vbi_teletext_entry entries[] */
++} __ucsi_packed;
++
++/**
++ * An entry in a dvb_vbi_teletext_descriptor structure.
++ */
++struct dvb_vbi_teletext_entry {
++      iso639lang_t language_code;
++  EBIT2(uint8_t type          : 5; ,
++      uint8_t magazine_number: 3;  );
++      uint8_t page_number;
++} __ucsi_packed;
++
++/**
++ * Process an dvb_vbi_teletext_descriptor.
++ *
++ * @param d Generic descriptor.
++ * @return dvb_vbi_teletext_descriptor pointer, or NULL on error.
++ */
++static inline struct dvb_vbi_teletext_descriptor*
++      dvb_vbi_teletext_descriptor_codec(struct descriptor* d)
++{
++      if (d->len % sizeof(struct dvb_vbi_teletext_entry))
++              return NULL;
++
++      return (struct dvb_vbi_teletext_descriptor*) d;
++}
++
++/**
++ * Iterator for entries field of a dvb_vbi_teletext_descriptor.
++ *
++ * @param d Pointer to dvb_vbi_teletext_descriptor.
++ * @param pos Variable holding a pointer to the current dvb_vbi_teletext_entry.
++ */
++#define dvb_vbi_teletext_descriptor_entries_for_each(d, pos) \
++      for ((pos) = dvb_vbi_teletext_descriptor_entries_first(d); \
++           (pos); \
++           (pos) = dvb_vbi_teletext_descriptor_entries_next(d, pos))
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct dvb_vbi_teletext_entry*
++      dvb_vbi_teletext_descriptor_entries_first(struct dvb_vbi_teletext_descriptor *d)
++{
++      if (d->d.len == 0)
++              return NULL;
++
++      return (struct dvb_vbi_teletext_entry *)
++              ((uint8_t*) d + sizeof(struct dvb_vbi_teletext_descriptor));
++}
++
++static inline struct dvb_vbi_teletext_entry*
++      dvb_vbi_teletext_descriptor_entries_next(struct dvb_vbi_teletext_descriptor *d,
++                                               struct dvb_vbi_teletext_entry *pos)
++{
++      uint8_t *end = (uint8_t*) d + 2 + d->d.len;
++      uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_vbi_teletext_entry);
++
++      if (next >= end)
++              return NULL;
++
++      return (struct dvb_vbi_teletext_entry *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/endianops.h dvb-apps/lib/libucsi/endianops.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/endianops.h     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/endianops.h   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,128 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_COMMON_H
++#define _UCSI_COMMON_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <stdint.h>
++#include <byteswap.h>
++#include <endian.h>
++
++#define __ucsi_packed __attribute__((packed))
++
++
++
++
++#if __BYTE_ORDER == __BIG_ENDIAN
++#define EBIT2(x1,x2) x1 x2
++#define EBIT3(x1,x2,x3) x1 x2 x3
++#define EBIT4(x1,x2,x3,x4) x1 x2 x3 x4
++#define EBIT5(x1,x2,x3,x4,x5) x1 x2 x3 x4 x5
++#define EBIT6(x1,x2,x3,x4,x5,x6) x1 x2 x3 x4 x5 x6
++#define EBIT7(x1,x2,x3,x4,x5,x6,x7) x1 x2 x3 x4 x5 x6 x7
++#define EBIT8(x1,x2,x3,x4,x5,x6,x7,x8) x1 x2 x3 x4 x5 x6 x7 x8
++
++static inline void bswap16(uint8_t *buf) {
++      (void) buf;
++}
++
++static inline void bswap32(uint8_t *buf) {
++      (void) buf;
++}
++
++static inline void bswap64(uint8_t *buf) {
++      (void) buf;
++}
++
++static inline void bswap24(uint8_t *buf) {
++      (void) buf;
++}
++
++static inline void bswap40(uint8_t *buf) {
++      (void) buf;
++}
++
++static inline void bswap48(uint8_t *buf) {
++      (void) buf;
++}
++
++#else
++#define EBIT2(x1,x2) x2 x1
++#define EBIT3(x1,x2,x3) x3 x2 x1
++#define EBIT4(x1,x2,x3,x4) x4 x3 x2 x1
++#define EBIT5(x1,x2,x3,x4,x5) x5 x4 x3 x2 x1
++#define EBIT6(x1,x2,x3,x4,x5,x6) x6 x5 x4 x3 x2 x1
++#define EBIT7(x1,x2,x3,x4,x5,x6,x7) x7 x6 x5 x4 x3 x2 x1
++#define EBIT8(x1,x2,x3,x4,x5,x6,x7,x8) x8 x7 x6 x5 x4 x3 x2 x1
++
++static inline void bswap16(uint8_t * buf) {
++      *((uint16_t*)buf) = bswap_16((*(uint16_t*)buf));
++}
++
++static inline void bswap32(uint8_t * buf) {
++      *((uint32_t*)buf) = bswap_32((*(uint32_t*)buf));
++}
++
++static inline void bswap64(uint8_t * buf) {
++      *((uint64_t*)buf) = bswap_64((*(uint64_t*)buf));
++}
++
++static inline void bswap24(uint8_t * buf) {
++      uint8_t tmp0 = buf[0];
++
++      buf[0] = buf[2];
++      buf[2] = tmp0;
++}
++
++static inline void bswap40(uint8_t * buf) {
++      uint8_t tmp0 = buf[0];
++      uint8_t tmp1 = buf[1];
++
++      buf[0] = buf[4];
++      buf[1] = buf[3];
++      buf[3] = tmp1;
++      buf[4] = tmp0;
++}
++
++static inline void bswap48(uint8_t * buf) {
++      uint8_t tmp0 = buf[0];
++      uint8_t tmp1 = buf[1];
++      uint8_t tmp2 = buf[2];
++
++      buf[0] = buf[5];
++      buf[1] = buf[4];
++      buf[2] = buf[3];
++      buf[3] = tmp2;
++      buf[4] = tmp1;
++      buf[5] = tmp0;
++}
++
++#endif // __BYTE_ORDER
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/Makefile dvb-apps/lib/libucsi/Makefile
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/Makefile        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/Makefile      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,34 @@
++# Makefile for linuxtv.org dvb-apps/lib/libucsi
++
++includes = crc32.h            \
++           descriptor.h       \
++           endianops.h        \
++           section.h          \
++           section_buf.h      \
++           transport_packet.h \
++           types.h
++
++objects  = crc32.o            \
++           section_buf.o      \
++           transport_packet.o
++
++lib_name = libucsi
++
++CPPFLAGS += -I../../lib
++
++.PHONY: all
++
++all: library
++
++include atsc/Makefile
++include dvb/Makefile
++include mpeg/Makefile
++
++.PHONY: $(sub-install)
++
++install:: $(sub-install)
++
++$(sub-install):
++      $(MAKE) -C $@ install
++
++include ../../Make.rules
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/audio_stream_descriptor.h dvb-apps/lib/libucsi/mpeg/audio_stream_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/audio_stream_descriptor.h  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/audio_stream_descriptor.h        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,65 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_AUDIO_STREAM_DESCRIPTOR
++#define _UCSI_MPEG_AUDIO_STREAM_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * mpeg_audio_stream_descriptor structure
++ */
++struct mpeg_audio_stream_descriptor {
++      struct descriptor d;
++
++  EBIT5(uint8_t free_format_flag              : 1; ,
++      uint8_t id                              : 1; ,
++      uint8_t layer                           : 2; ,
++      uint8_t variable_rate_audio_indicator   : 1; ,
++      uint8_t reserved                        : 3; );
++} __ucsi_packed;
++
++/**
++ * Process an mpeg_audio_stream_descriptor.
++ *
++ * @param d Pointer to the generic descriptor structure.
++ * @return Pointer to the mpeg_audio_stream_descriptor structure, or NULL on error.
++ */
++static inline struct mpeg_audio_stream_descriptor*
++      mpeg_audio_stream_descriptor_codec(struct descriptor *d)
++{
++      if (d->len != (sizeof(struct mpeg_audio_stream_descriptor) - 2))
++              return NULL;
++
++      return (struct mpeg_audio_stream_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/ca_descriptor.h dvb-apps/lib/libucsi/mpeg/ca_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/ca_descriptor.h    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/ca_descriptor.h  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,91 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_CA_DESCRIPTOR
++#define _UCSI_MPEG_CA_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * mpeg_ca_descriptor structure
++ */
++struct mpeg_ca_descriptor {
++      struct descriptor d;
++
++      uint16_t ca_system_id;
++  EBIT2(uint16_t reserved     : 3;  ,
++      uint16_t ca_pid         : 13; );
++      /* uint8_t  data[] */
++} __ucsi_packed;
++
++/**
++ * Process an mpeg_ca_descriptor.
++ *
++ * @param d Generic descriptor.
++ * @return Pointer to an mpeg_ca_descriptor, or NULL on error.
++ */
++static inline struct mpeg_ca_descriptor*
++      mpeg_ca_descriptor_codec(struct descriptor* d)
++{
++      if (d->len < (sizeof(struct mpeg_ca_descriptor) - 2))
++              return NULL;
++
++      bswap16((uint8_t*) d + 2);
++      bswap16((uint8_t*) d + 4);
++
++      return (struct mpeg_ca_descriptor*) d;
++}
++
++/**
++ * Accessor for pointer to data field of an mpeg_ca_descriptor.
++ *
++ * @param d The mpeg_ca_descriptor structure.
++ * @return Pointer to the field.
++ */
++static inline uint8_t *
++      mpeg_ca_descriptor_data(struct mpeg_ca_descriptor *d)
++{
++      return (uint8_t *) d + sizeof(struct mpeg_ca_descriptor);
++}
++
++/**
++ * Determine length of data field of an mpeg_ca_descriptor.
++ *
++ * @param d The mpeg_ca_descriptor structure.
++ * @return Length of the field in bytes.
++ */
++static inline int
++      mpeg_ca_descriptor_data_length(struct mpeg_ca_descriptor *d)
++{
++      return d->d.len - 4;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/cat_section.c dvb-apps/lib/libucsi/mpeg/cat_section.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/cat_section.c      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/cat_section.c    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,34 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <libucsi/mpeg/cat_section.h>
++
++struct mpeg_cat_section * mpeg_cat_section_codec(struct section_ext * ext)
++{
++      uint8_t * buf = (uint8_t *)ext;
++      size_t pos = sizeof(struct section_ext);
++
++      if (verify_descriptors(buf + pos,
++                             section_ext_length(ext) - sizeof(struct mpeg_cat_section)))
++              return NULL;
++
++      return (struct mpeg_cat_section *)ext;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/cat_section.h dvb-apps/lib/libucsi/mpeg/cat_section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/cat_section.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/cat_section.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,94 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_CAT_SECTION_H
++#define _UCSI_MPEG_CAT_SECTION_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/section.h>
++
++/**
++ * mpeg_cat_section structure.
++ */
++struct mpeg_cat_section {
++      struct section_ext head;
++
++      /* struct descriptor descriptors[] */
++} __ucsi_packed;
++
++/**
++ * Process an mpeg_cat_section.
++ *
++ * @param section The generic section_ext structure.
++ * @return Pointer to an mpeg_cat_section structure, or NULL on error.
++ */
++extern struct mpeg_cat_section *mpeg_cat_section_codec(struct section_ext *section);
++
++/**
++ * Convenience iterator for descriptors field of an mpeg_cat_section.
++ *
++ * @param cat The mpeg_cat_section pointer.
++ * @param pos Variable holding a pointer to the current descriptor.
++ */
++#define mpeg_cat_section_descriptors_for_each(cat, pos) \
++      for ((pos) = mpeg_cat_section_descriptors_first(cat); \
++           (pos); \
++           (pos) = mpeg_cat_section_descriptors_next(cat, pos))
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct descriptor *
++      mpeg_cat_section_descriptors_first(struct mpeg_cat_section *cat)
++{
++      size_t pos = sizeof(struct mpeg_cat_section);
++
++      if (pos >= section_ext_length(&cat->head))
++              return NULL;
++
++      return (struct descriptor*)((uint8_t *) cat + pos);
++}
++
++
++static inline struct descriptor *
++      mpeg_cat_section_descriptors_next(struct mpeg_cat_section *cat,
++                                        struct descriptor* pos)
++{
++      return next_descriptor((uint8_t *) cat + sizeof(struct mpeg_cat_section),
++                             section_ext_length(&cat->head) - sizeof(struct mpeg_cat_section),
++                             pos);
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/content_labelling_descriptor.h dvb-apps/lib/libucsi/mpeg/content_labelling_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/content_labelling_descriptor.h     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/content_labelling_descriptor.h   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,356 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_CONTENT_LABELLING_DESCRIPTOR
++#define _UCSI_MPEG_CONTENT_LABELLING_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * Possible values for content_time_base_indicator.
++ */
++enum {
++      MPEG_CONTENT_TIME_BASE_STC                      = 0x01,
++      MPEG_CONTENT_TIME_BASE_NPT                      = 0x02,
++};
++
++/**
++ * mpeg_content_labelling_descriptor structure.
++ */
++struct mpeg_content_labelling_descriptor {
++      struct descriptor d;
++
++      uint16_t metadata_application_format;
++      /* struct mpeg_content_labelling_descriptor_application_format_identifier id */
++      /* struct mpeg_content_labelling_descriptor_flags flags */
++      /* struct mpeg_content_labelling_descriptor_reference_id reference_id */
++      /* struct mpeg_content_labelling_descriptor_time_base time_base */
++      /* struct mpeg_content_labelling_descriptor_content_id content_id */
++      /* struct mpeg_content_labelling_descriptor_time_base_association time_base_assoc */
++      /* uint8_t private_data[] */
++} __ucsi_packed;
++
++/**
++ * id field of a content_labelling_descriptor.
++ */
++struct mpeg_content_labelling_descriptor_application_format_identifier {
++      uint32_t id;
++} __ucsi_packed;
++
++/**
++ * Flags field of a content_labelling_descriptor
++ */
++struct mpeg_content_labelling_descriptor_flags {
++  EBIT3(uint8_t content_reference_id_record_flag              : 1;  ,
++      uint8_t content_time_base_indicator                     : 4;  ,
++      uint8_t reserved                                        : 3;  );
++} __ucsi_packed;
++
++/**
++ * Reference_id field of a content_labelling_descriptor.
++ */
++struct mpeg_content_labelling_descriptor_reference_id {
++      uint8_t content_reference_id_record_length;
++      /* uint8_t data[] */
++} __ucsi_packed;
++
++/**
++ * time_base field of a content_labelling_descriptor.
++ */
++struct mpeg_content_labelling_descriptor_time_base {
++  EBIT2(uint64_t reserved_1                                   : 7;  ,
++      uint64_t content_time_base_value                        :33;  );
++  EBIT2(uint64_t reserved_2                                   : 7;  ,
++      uint64_t metadata_time_base_value                       :33;  );
++} __ucsi_packed;
++
++/**
++ * content_id field of a content_labelling_descriptor.
++ */
++struct mpeg_content_labelling_descriptor_content_id {
++  EBIT2(uint8_t reserved                                      : 1;  ,
++      uint8_t contentId                                       : 7;  );
++} __ucsi_packed;
++
++/**
++ * time_base_assoc field of a content_labelling_descriptor.
++ */
++struct mpeg_content_labelling_descriptor_time_base_association {
++      uint8_t time_base_association_data_length;
++      /* uint8_t data[] */
++} __ucsi_packed;
++
++
++
++/**
++ * Process an mpeg_content_labelling_descriptor.
++ *
++ * @param d Generic descriptor.
++ * @return Pointer to an mpeg_content_labelling_descriptor, or NULL on error.
++ */
++static inline struct mpeg_content_labelling_descriptor*
++      mpeg_content_labelling_descriptor_codec(struct descriptor* d)
++{
++      uint32_t pos = 2;
++      uint8_t *buf = (uint8_t*) d;
++      uint32_t len = d->len + 2;
++      struct mpeg_content_labelling_descriptor_flags *flags;
++      int id;
++
++      if (len < sizeof(struct mpeg_content_labelling_descriptor))
++              return NULL;
++
++      bswap16(buf + pos);
++      id = *((uint16_t*) (buf+pos));
++      pos += 2;
++
++      if (id == 0xffff) {
++              if (len < (pos+4))
++                      return NULL;
++              bswap32(buf+pos);
++              pos += 4;
++      }
++
++      if (len < (pos + sizeof(struct mpeg_content_labelling_descriptor_flags)))
++              return NULL;
++      flags = (struct mpeg_content_labelling_descriptor_flags*) (buf+pos);
++      pos += sizeof(struct mpeg_content_labelling_descriptor_flags);
++
++      if (flags->content_reference_id_record_flag == 1) {
++              if (len < (pos+1))
++                      return NULL;
++              if (len < (pos+1+buf[pos]))
++                      return NULL;
++              pos += 1 + buf[pos];
++      }
++
++      if ((flags->content_time_base_indicator == 1) ||
++          (flags->content_time_base_indicator == 2)) {
++              if (len < (pos + sizeof(struct mpeg_content_labelling_descriptor_time_base)))
++                      return NULL;
++              bswap40(buf+pos);
++              bswap40(buf+pos+5);
++              pos += sizeof(struct mpeg_content_labelling_descriptor_time_base);
++      }
++
++      if (flags->content_time_base_indicator == 2) {
++              if (len < (pos + sizeof(struct mpeg_content_labelling_descriptor_content_id)))
++                      return NULL;
++              pos += sizeof(struct mpeg_content_labelling_descriptor_content_id);
++      }
++
++      if (flags->content_time_base_indicator > 2) {
++              if (len < (pos+1))
++                      return NULL;
++              if (len < (pos+1+buf[pos]))
++                      return NULL;
++              pos += 1 + buf[pos];
++      }
++
++      if (len < pos)
++              return NULL;
++
++      return (struct mpeg_content_labelling_descriptor*) d;
++}
++
++/**
++ * Accessor for pointer to id field of an mpeg_content_labelling_descriptor.
++ *
++ * @param d The mpeg_content_labelling_descriptor structure.
++ * @return The pointer, or NULL on error.
++ */
++static inline struct mpeg_content_labelling_descriptor_application_format_identifier*
++      mpeg_content_labelling_descriptor_id(struct mpeg_content_labelling_descriptor *d)
++{
++      uint8_t *buf = (uint8_t*) d;
++
++      if (d->metadata_application_format != 0xffff)
++              return NULL;
++      return (struct mpeg_content_labelling_descriptor_application_format_identifier*)
++              (buf + sizeof(struct mpeg_content_labelling_descriptor));
++}
++
++/**
++ * Accessor for pointer to flags field of an mpeg_content_labelling_descriptor.
++ *
++ * @param d The mpeg_content_labelling_descriptor structure.
++ * @return The pointer, or NULL on error.
++ */
++static inline struct mpeg_content_labelling_descriptor_flags*
++        mpeg_content_labelling_descriptor_flags(struct mpeg_content_labelling_descriptor *d)
++{
++      uint8_t *buf = (uint8_t*) d + sizeof(struct mpeg_content_labelling_descriptor);
++
++      if (d->metadata_application_format != 0xffff)
++              buf += 4;
++
++      return (struct mpeg_content_labelling_descriptor_flags *) buf;
++}
++
++/**
++ * Accessor for reference_id field of an mpeg_content_labelling_descriptor.
++ *
++ * @param flags Pointer to the mpeg_content_labelling_descriptor_flags.
++ * @return Pointer to the field, or NULL on error.
++ */
++static inline struct mpeg_content_labelling_descriptor_reference_id*
++      mpeg_content_labelling_descriptor_reference_id(struct mpeg_content_labelling_descriptor_flags *flags)
++{
++      uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_content_labelling_descriptor_flags);
++
++      if (flags->content_reference_id_record_flag != 1)
++              return NULL;
++
++      return (struct mpeg_content_labelling_descriptor_reference_id *) buf;
++}
++
++/**
++ * Accessor for data field of an mpeg_content_reference_id.
++ *
++ * @param d The mpeg_content_reference_id structure.
++ * @return Pointer to the field.
++ */
++static inline uint8_t*
++      mpeg_content_reference_id_data(struct mpeg_content_labelling_descriptor_reference_id *d)
++{
++      return (uint8_t*) d + sizeof(struct mpeg_content_labelling_descriptor_reference_id);
++}
++
++/**
++ * Accessor for time_base field of an mpeg_content_labelling_descriptor.
++ *
++ * @param flags Pointer to the mpeg_content_labelling_descriptor_flags.
++ * @return Pointer to the field, or NULL on error.
++ */
++static inline struct mpeg_content_labelling_descriptor_time_base*
++      mpeg_content_labelling_descriptor_time_base(struct mpeg_content_labelling_descriptor_flags *flags)
++{
++      uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_content_labelling_descriptor_flags);
++
++      if ((flags->content_time_base_indicator!=1) && (flags->content_time_base_indicator!=2))
++              return NULL;
++
++      if (flags->content_reference_id_record_flag == 1)
++              buf += 1 + buf[1];
++
++      return (struct mpeg_content_labelling_descriptor_time_base *) buf;
++}
++
++/**
++ * Accessor for content_id field of an mpeg_content_labelling_descriptor.
++ *
++ * @param flags Pointer to the mpeg_content_labelling_descriptor_flags.
++ * @return Pointer to the field, or NULL on error.
++ */
++static inline struct mpeg_content_labelling_descriptor_content_id*
++      mpeg_content_labelling_descriptor_content_id(struct mpeg_content_labelling_descriptor_flags *flags)
++{
++      uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_content_labelling_descriptor_flags);
++
++      if (flags->content_time_base_indicator!=2)
++              return NULL;
++
++      if (flags->content_reference_id_record_flag == 1)
++              buf += 1 + buf[1];
++      if ((flags->content_time_base_indicator==1) || (flags->content_time_base_indicator==2))
++              buf += sizeof(struct mpeg_content_labelling_descriptor_time_base);
++
++      return (struct mpeg_content_labelling_descriptor_content_id *) buf;
++}
++
++/**
++ * Accessor for time_base_association field of an mpeg_content_labelling_descriptor.
++ *
++ * @param flags Pointer to the mpeg_content_labelling_descriptor_flags.
++ * @return Pointer to the field, or NULL on error.
++ */
++static inline struct mpeg_content_labelling_descriptor_time_base_association*
++      mpeg_content_labelling_descriptor_time_base_assoc(struct mpeg_content_labelling_descriptor_flags *flags)
++{
++      uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_content_labelling_descriptor_flags);
++
++      if (flags->content_time_base_indicator<3)
++              return NULL;
++
++      if (flags->content_reference_id_record_flag == 1)
++              buf += 1 + buf[1];
++      if ((flags->content_time_base_indicator==1) || (flags->content_time_base_indicator==2))
++              buf += sizeof(struct mpeg_content_labelling_descriptor_time_base);
++      if (flags->content_time_base_indicator==2)
++              buf += sizeof(struct mpeg_content_labelling_descriptor_content_id);
++
++      return (struct mpeg_content_labelling_descriptor_time_base_association *) buf;
++}
++
++/**
++ * Accessor for data field of an mpeg_time_base_association.
++ *
++ * @param d The mpeg_time_base_association structure.
++ * @return Pointer to the field.
++ */
++static inline uint8_t*
++      mpeg_time_base_association_data(struct mpeg_content_labelling_descriptor_time_base_association *d)
++{
++      return (uint8_t*) d + sizeof(struct mpeg_content_labelling_descriptor_time_base_association);
++}
++
++
++/**
++ * Accessor for private_data field of an mpeg_content_labelling_descriptor.
++ *
++ * @param d The mpeg_content_labelling_descriptor structure.
++ * @param flags Pointer to the mpeg_content_labelling_descriptor_flags.
++ * @param length Where the number of bytes in the field should be stored.
++ * @return Pointer to the field.
++ */
++static inline uint8_t*
++      mpeg_content_labelling_descriptor_data(struct mpeg_content_labelling_descriptor *d,
++                                             struct mpeg_content_labelling_descriptor_flags *flags,
++                                             int *length)
++{
++      uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_content_labelling_descriptor_flags);
++      uint8_t *end = (uint8_t*) d + d->d.len + 2;
++
++      if (flags->content_reference_id_record_flag == 1)
++              buf += 1 + buf[1];
++      if ((flags->content_time_base_indicator==1) || (flags->content_time_base_indicator==2))
++              buf += sizeof(struct mpeg_content_labelling_descriptor_time_base);
++      if (flags->content_time_base_indicator==2)
++              buf += sizeof(struct mpeg_content_labelling_descriptor_content_id);
++      if (flags->content_time_base_indicator<3)
++              buf += 1 + buf[1];
++
++      *length = end - buf;
++
++      return buf;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/copyright_descriptor.h dvb-apps/lib/libucsi/mpeg/copyright_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/copyright_descriptor.h     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/copyright_descriptor.h   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,89 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_COPYRIGHT_DESCRIPTOR
++#define _UCSI_MPEG_COPYRIGHT_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * mpeg_copyright_descriptor structure.
++ */
++struct mpeg_copyright_descriptor {
++      struct descriptor d;
++
++      uint32_t copyright_identifier;
++      /* uint8_t data[] */
++} __ucsi_packed;
++
++/**
++ * Process an mpeg_copyright_descriptor.
++ *
++ * @param d Generic descriptor.
++ * @return mpeg_copyright_descriptor pointer, or NULL on error.
++ */
++static inline struct mpeg_copyright_descriptor*
++      mpeg_copyright_descriptor_codec(struct descriptor* d)
++{
++      if (d->len < (sizeof(struct mpeg_copyright_descriptor) - 2))
++              return NULL;
++
++      bswap32((uint8_t*) d + 2);
++
++      return (struct mpeg_copyright_descriptor*) d;
++}
++
++/**
++ * Retrieve pointer to data field of an mpeg_copyright_descriptor.
++ *
++ * @param d mpeg_copyright_descriptor pointer.
++ * @return Pointer to the field.
++ */
++static inline uint8_t *
++      mpeg_copyright_descriptor_data(struct mpeg_copyright_descriptor *d)
++{
++      return (uint8_t *) d + sizeof(struct mpeg_copyright_descriptor);
++}
++
++
++/**
++ * Determine length of the data field of an mpeg_copyright_descriptor.
++ *
++ * @param d mpeg_copyright_descriptor pointer.
++ * @return Length of field in bytes.
++ */
++static inline int
++      mpeg_copyright_descriptor_data_length(struct mpeg_copyright_descriptor *d)
++{
++      return d->d.len - 4;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/datagram_section.h dvb-apps/lib/libucsi/mpeg/datagram_section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/datagram_section.h 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/datagram_section.h       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,81 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ * Copyright (C) 2008 Patrick Boettcher (pb@linuxtv.org)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_DATAGRAM_SECTION_H
++#define _UCSI_MPEG_DATAGRAM_SECTION_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/section.h>
++
++/**
++ * datagram_section structure.
++ */
++struct datagram_section {
++      struct section head;
++
++      uint8_t MAC_address_6;
++      uint8_t MAC_address_5;
++ EBIT5(uint8_t reserved                   : 2; ,
++      uint8_t payload_scrambling_control : 2; ,
++      uint8_t address_scrambling_control : 2; ,
++      uint8_t LLC_SNAP_flag              : 1; ,
++      uint8_t current_next_indicator     : 1; );
++      uint8_t section_number;
++      uint8_t last_section_number;
++      uint8_t MAC_address_4;
++      uint8_t MAC_address_3;
++      uint8_t MAC_address_2;
++      uint8_t MAC_address_1;
++
++      /* LLC_SNAP or IP-data */
++      /* if last section stuffing */
++      /* CRC */
++} __ucsi_packed;
++
++/**
++ */
++static inline struct datagram_section *datagram_section_codec(struct section *section)
++{
++      /* something to do here ? */
++      return (struct datagram_section *) section;
++}
++
++static inline uint8_t *datagram_section_ip_data(struct datagram_section *d)
++{
++      return (uint8_t *) d + sizeof(struct section) + 2 + 1 + 1 + 1 + 4;
++}
++
++static inline size_t datagram_section_ip_data_length(struct datagram_section *d)
++{
++      return section_length(&d->head) - (sizeof(struct section) + 2 + 1 + 1 + 1 + 4) - CRC_SIZE;
++}
++
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/data_stream_alignment_descriptor.h dvb-apps/lib/libucsi/mpeg/data_stream_alignment_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/data_stream_alignment_descriptor.h 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/data_stream_alignment_descriptor.h       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,73 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_DATA_STREAM_ALIGNMENT_DESCRIPTOR
++#define _UCSI_MPEG_DATA_STREAM_ALIGNMENT_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * Possible values for alignment_type.
++ */
++enum {
++      MPEG_DATA_STREAM_ALIGNMENT_VIDEO_SLICE_OR_AU            = 0x01,
++      MPEG_DATA_STREAM_ALIGNMENT_VIDEO_AU                     = 0x02,
++      MPEG_DATA_STREAM_ALIGNMENT_VIDEO_GOP_OR_SEQ             = 0x03,
++      MPEG_DATA_STREAM_ALIGNMENT_VIDEO_SEQ                    = 0x04,
++
++      MPEG_DATA_STREAM_ALIGNMENT_AUDIO_SYNC_WORD              = 0x01,
++};
++
++/**
++ * mpeg_data_stream_alignment_descriptor structure.
++ */
++struct mpeg_data_stream_alignment_descriptor {
++      struct descriptor d;
++
++      uint8_t alignment_type;
++} __ucsi_packed;
++
++/**
++ * Process an mpeg_data_stream_alignment_descriptor.
++ *
++ * @param d Pointer to generic descriptor structure.
++ * @return Pointer to mpeg_data_stream_alignment_descriptor, or NULL on error.
++ */
++static inline struct mpeg_data_stream_alignment_descriptor*
++      mpeg_data_stream_alignment_descriptor_codec(struct descriptor* d)
++{
++      if (d->len != (sizeof(struct mpeg_data_stream_alignment_descriptor) - 2))
++              return NULL;
++
++      return (struct mpeg_data_stream_alignment_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/descriptor.h dvb-apps/lib/libucsi/mpeg/descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/descriptor.h       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/descriptor.h     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,102 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_DESCRIPTOR_H
++#define _UCSI_MPEG_DESCRIPTOR_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/mpeg/mpeg4_audio_descriptor.h>
++#include <libucsi/mpeg/mpeg4_video_descriptor.h>
++#include <libucsi/mpeg/audio_stream_descriptor.h>
++#include <libucsi/mpeg/ca_descriptor.h>
++#include <libucsi/mpeg/content_labelling_descriptor.h>
++#include <libucsi/mpeg/copyright_descriptor.h>
++#include <libucsi/mpeg/data_stream_alignment_descriptor.h>
++#include <libucsi/mpeg/external_es_id_descriptor.h>
++#include <libucsi/mpeg/fmc_descriptor.h>
++#include <libucsi/mpeg/fmxbuffer_size_descriptor.h>
++#include <libucsi/mpeg/hierarchy_descriptor.h>
++#include <libucsi/mpeg/ibp_descriptor.h>
++#include <libucsi/mpeg/iod_descriptor.h>
++#include <libucsi/mpeg/iso_639_language_descriptor.h>
++#include <libucsi/mpeg/maximum_bitrate_descriptor.h>
++#include <libucsi/mpeg/metadata_descriptor.h>
++#include <libucsi/mpeg/metadata_pointer_descriptor.h>
++#include <libucsi/mpeg/metadata_std_descriptor.h>
++#include <libucsi/mpeg/multiplex_buffer_descriptor.h>
++#include <libucsi/mpeg/multiplex_buffer_utilization_descriptor.h>
++#include <libucsi/mpeg/muxcode_descriptor.h>
++#include <libucsi/mpeg/private_data_indicator_descriptor.h>
++#include <libucsi/mpeg/registration_descriptor.h>
++#include <libucsi/mpeg/sl_descriptor.h>
++#include <libucsi/mpeg/smoothing_buffer_descriptor.h>
++#include <libucsi/mpeg/std_descriptor.h>
++#include <libucsi/mpeg/system_clock_descriptor.h>
++#include <libucsi/mpeg/target_background_grid_descriptor.h>
++#include <libucsi/mpeg/video_stream_descriptor.h>
++#include <libucsi/mpeg/video_window_descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * Enumeration of MPEG descriptor tags.
++ */
++enum mpeg_descriptor_tag {
++      dtag_mpeg_video_stream                  = 0x02,
++      dtag_mpeg_audio_stream                  = 0x03,
++      dtag_mpeg_hierarchy                     = 0x04,
++      dtag_mpeg_registration                  = 0x05,
++      dtag_mpeg_data_stream_alignment         = 0x06,
++      dtag_mpeg_target_background_grid        = 0x07,
++      dtag_mpeg_video_window                  = 0x08,
++      dtag_mpeg_ca                            = 0x09,
++      dtag_mpeg_iso_639_language              = 0x0a,
++      dtag_mpeg_system_clock                  = 0x0b,
++      dtag_mpeg_multiplex_buffer_utilization  = 0x0c,
++      dtag_mpeg_copyright                     = 0x0d,
++      dtag_mpeg_maximum_bitrate               = 0x0e,
++      dtag_mpeg_private_data_indicator        = 0x0f,
++      dtag_mpeg_smoothing_buffer              = 0x10,
++      dtag_mpeg_std                           = 0x11,
++      dtag_mpeg_ibp                           = 0x12,
++      dtag_mpeg_4_video                       = 0x1b,
++      dtag_mpeg_4_audio                       = 0x1c,
++      dtag_mpeg_iod                           = 0x1d,
++      dtag_mpeg_sl                            = 0x1e,
++      dtag_mpeg_fmc                           = 0x1f,
++      dtag_mpeg_external_es_id                = 0x20,
++      dtag_mpeg_muxcode                       = 0x21,
++      dtag_mpeg_fmxbuffer_size                = 0x22,
++      dtag_mpeg_multiplex_buffer              = 0x23,
++      dtag_mpeg_content_labelling             = 0x24,
++      dtag_mpeg_metadata_pointer              = 0x25,
++      dtag_mpeg_metadata                      = 0x26,
++      dtag_mpeg_metadata_std                  = 0x27,
++};
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/external_es_id_descriptor.h dvb-apps/lib/libucsi/mpeg/external_es_id_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/external_es_id_descriptor.h        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/external_es_id_descriptor.h      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,63 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_EXTERNAL_ES_ID_DESCRIPTOR
++#define _UCSI_MPEG_EXTERNAL_ES_ID_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * mpeg_external_es_id_descriptor structure.
++ */
++struct mpeg_external_es_id_descriptor {
++      struct descriptor d;
++
++      uint16_t external_es_id;
++} __ucsi_packed;
++
++/**
++ * Process an mpeg_external_es_id_descriptor structure.
++ *
++ * @param d Generic descriptor structure.
++ * @return mpeg_external_es_id_descriptor pointer, or NULL on error.
++ */
++static inline struct mpeg_external_es_id_descriptor*
++      mpeg_external_es_id_descriptor_codec(struct descriptor* d)
++{
++      if (d->len != (sizeof(struct mpeg_external_es_id_descriptor) - 2))
++              return NULL;
++
++      bswap16((uint8_t*) d + 2);
++
++      return (struct mpeg_external_es_id_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/fmc_descriptor.h dvb-apps/lib/libucsi/mpeg/fmc_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/fmc_descriptor.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/fmc_descriptor.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,122 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_FMC_DESCRIPTOR
++#define _UCSI_MPEG_FMC_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * mpeg_fmc_descriptor structure.
++ */
++struct mpeg_fmc_descriptor {
++      struct descriptor d;
++
++      /* struct mpeg_flex_mux muxes[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the muxes field of an mpeg_fmc_descriptor structure.
++ */
++struct mpeg_flex_mux {
++      uint16_t es_id;
++      uint8_t flex_mux_channel;
++} __ucsi_packed;
++
++/**
++ * Process an mpeg_fmc_descriptor structure.
++ *
++ * @param d Generic descriptor structure.
++ * @return Pointer to an mpeg_fmc_descriptor structure, or NULL on error.
++ */
++static inline struct mpeg_fmc_descriptor*
++      mpeg_fmc_descriptor_codec(struct descriptor* d)
++{
++      uint8_t* buf = (uint8_t*) d + 2;
++      int pos = 0;
++      int len = d->len;
++
++      if (len % sizeof(struct mpeg_flex_mux))
++              return NULL;
++
++      while(pos < len) {
++              bswap16(buf+pos);
++              pos += sizeof(struct mpeg_flex_mux);
++      }
++
++      return (struct mpeg_fmc_descriptor*) d;
++}
++
++/**
++ * Convenience iterator for the muxes field of an mpeg_fmc_descriptor structure.
++ *
++ * @param d Generic descriptor structure.
++ * @param pos Variable holding a pointer to the the current entry within the muxes field.
++ */
++#define mpeg_fmc_descriptor_muxes_for_each(d, pos) \
++      for ((pos) = mpeg_fmc_descriptor_muxes_first(d); \
++           (pos); \
++           (pos) = mpeg_fmc_descriptor_muxes_next(d, pos))
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct mpeg_flex_mux*
++              mpeg_fmc_descriptor_muxes_first(struct mpeg_fmc_descriptor *d)
++{
++      if (d->d.len < sizeof(struct mpeg_flex_mux))
++              return NULL;
++
++      return (struct mpeg_flex_mux *)
++                      ((uint8_t*) d + sizeof(struct mpeg_fmc_descriptor));
++}
++
++static inline struct mpeg_flex_mux*
++      mpeg_fmc_descriptor_muxes_next(struct mpeg_fmc_descriptor *d,
++                                     struct mpeg_flex_mux *pos)
++{
++      uint8_t *end = (uint8_t*) d + 2 + d->d.len;
++      uint8_t *next = (uint8_t *) pos + sizeof(struct mpeg_flex_mux);
++
++      if (next >= end)
++              return NULL;
++
++      return (struct mpeg_flex_mux *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/fmxbuffer_size_descriptor.h dvb-apps/lib/libucsi/mpeg/fmxbuffer_size_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/fmxbuffer_size_descriptor.h        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/fmxbuffer_size_descriptor.h      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,83 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_FMXBUFFER_SIZE_DESCRIPTOR
++#define _UCSI_MPEG_FMXBUFFER_SIZE_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++
++/**
++ * mpeg_fmxbuffer_size_descriptor structure.
++ */
++struct mpeg_fmxbuffer_size_descriptor {
++      struct descriptor d;
++
++      /* uint8_t descriptors[] */
++} __ucsi_packed;
++
++/**
++ * Process an mpeg_fmxbuffer_size_descriptor structure.
++ *
++ * @param d Pointer to a generic descriptor structure.
++ * @return Pointer to an mpeg_fmxbuffer_size_descriptor structure, or NULL on error.
++ */
++static inline struct mpeg_fmxbuffer_size_descriptor*
++      mpeg_fmxbuffer_size_descriptor_codec(struct descriptor* d)
++{
++      return (struct mpeg_fmxbuffer_size_descriptor*) d;
++}
++
++/**
++ * Retrieve pointer to descriptors field of mpeg_fmxbuffer_size_descriptor structure.
++ *
++ * @param d mpeg_fmxbuffer_size_descriptor structure pointer.
++ * @return Pointer to the descriptors.
++ */
++static inline uint8_t *
++      mpeg_fmxbuffer_size_descriptor_descriptors(struct mpeg_fmxbuffer_size_descriptor *d)
++{
++      return (uint8_t *) d + sizeof(struct mpeg_fmxbuffer_size_descriptor);
++}
++
++/**
++ * Calculate the length of the descriptors field of an mpeg_fmxbuffer_size_descriptor structure.
++ *
++ * @param d mpeg_fmxbuffer_size_descriptor structure pointer.
++ * @return Length of descriptors in bytes.
++ */
++static inline int
++      mpeg_fmxbuffer_size_descriptor_descriptors_length(struct mpeg_fmxbuffer_size_descriptor *d)
++{
++      return d->d.len;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/hierarchy_descriptor.h dvb-apps/lib/libucsi/mpeg/hierarchy_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/hierarchy_descriptor.h     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/hierarchy_descriptor.h   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,83 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_HIERARCHY_DESCRIPTOR
++#define _UCSI_MPEG_HIERARCHY_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * Hierarchy type values.
++ */
++enum {
++      MPEG_HIERARCHY_TYPE_ISO13818_2_SPATIAL_SCALABILITY      = 0x01,
++      MPEG_HIERARCHY_TYPE_ISO13818_2_SNR_SCALABILITY          = 0x02,
++      MPEG_HIERARCHY_TYPE_ISO13818_2_TEMPORAL_SCALABILITY     = 0x03,
++      MPEG_HIERARCHY_TYPE_ISO13818_2_DATA_PARTITIONING        = 0x04,
++      MPEG_HIERARCHY_TYPE_ISO13818_3_EXTENSION_BITSTREAM      = 0x05,
++      MPEG_HIERARCHY_TYPE_ISO13818_1_PRIVATE_BITSTREAM        = 0x06,
++      MPEG_HIERARCHY_TYPE_ISO13818_2_MULTI_VIEW_PROFILE       = 0x07,
++      MPEG_HIERARCHY_TYPE_BASE_LAYER                          = 0x0f,
++};
++
++
++/**
++ * mpeg_hierarchy_descriptor structure.
++ */
++struct mpeg_hierarchy_descriptor {
++      struct descriptor d;
++
++  EBIT2(uint8_t reserved_1                    : 4; ,
++      uint8_t hierarchy_type                  : 4; );
++  EBIT2(uint8_t reserved_2                    : 2; ,
++      uint8_t hierarchy_layer_index           : 6; );
++  EBIT2(uint8_t reserved_3                    : 2; ,
++      uint8_t hierarchy_embedded_layer_index  : 6; );
++  EBIT2(uint8_t reserved_4                    : 2; ,
++      uint8_t hierarchy_channel               : 6; );
++} __ucsi_packed;
++
++/**
++ * Process an mpeg_hierarchy_descriptor.
++ *
++ * @param d Generic descriptor structure.
++ * @return Pointer to mpeg_hierarchy_descriptor structure, or NULL on error.
++ */
++static inline struct mpeg_hierarchy_descriptor*
++      mpeg_hierarchy_descriptor_codec(struct descriptor* d)
++{
++      if (d->len != (sizeof(struct mpeg_hierarchy_descriptor) - 2))
++              return NULL;
++
++      return (struct mpeg_hierarchy_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/ibp_descriptor.h dvb-apps/lib/libucsi/mpeg/ibp_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/ibp_descriptor.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/ibp_descriptor.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,65 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_IBP_DESCRIPTOR
++#define _UCSI_MPEG_IBP_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * mpeg_ibp_descriptor structure.
++ */
++struct mpeg_ibp_descriptor {
++      struct descriptor d;
++
++  EBIT3(uint16_t closed_gop_flag      : 1;  ,
++      uint16_t identical_gop_flag     : 1;  ,
++      uint16_t max_gop_length         : 14; );
++} __ucsi_packed;
++
++/**
++ * Process an mpeg_ibp_descriptor structure.
++ *
++ * @param d Generic descriptor structure.
++ * @return Pointer to the mpeg_ibp_descriptor structure, or NULL on error.
++ */
++static inline struct mpeg_ibp_descriptor*
++      mpeg_ibp_descriptor_codec(struct descriptor* d)
++{
++      if (d->len != (sizeof(struct mpeg_ibp_descriptor) - 2))
++              return NULL;
++
++      bswap16((uint8_t*) d + 2);
++
++      return (struct mpeg_ibp_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/iod_descriptor.h dvb-apps/lib/libucsi/mpeg/iod_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/iod_descriptor.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/iod_descriptor.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,87 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_IOD_DESCRIPTOR
++#define _UCSI_MPEG_IOD_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * mpeg_iod_descriptor structure.
++ */
++struct mpeg_iod_descriptor {
++      struct descriptor d;
++
++      uint8_t scope_of_iod_label;
++      uint8_t iod_label;
++      /* uint8_t iod[] */
++} __ucsi_packed;
++
++/**
++ * Process an mpeg_iod_descriptor.
++ *
++ * @param d Generic descriptor structure.
++ * @return Pointer to an mpeg_iod_descriptor structure, or NULL on error.
++ */
++static inline struct mpeg_iod_descriptor*
++      mpeg_iod_descriptor_codec(struct descriptor* d)
++{
++      if (d->len < (sizeof(struct mpeg_iod_descriptor) - 2))
++              return NULL;
++
++      return (struct mpeg_iod_descriptor*) d;
++}
++
++/**
++ * Retrieve pointer to iod field of an mpeg_iod_descriptor structure.
++ *
++ * @param d Pointer to mpeg_iod_descriptor structure.
++ * @return Pointer to the iod field.
++ */
++static inline uint8_t *
++      mpeg_iod_descriptor_iod(struct mpeg_iod_descriptor *d)
++{
++      return (uint8_t *) d + sizeof(struct mpeg_iod_descriptor);
++}
++
++/**
++ * Calculate the length of the iod field of an mpeg_iod_descriptor structure.
++ *
++ * @param d Pointer to mpeg_iod_descriptor structure.
++ * @return The number of bytes.
++ */
++static inline int
++      mpeg_iod_descriptor_iod_length(struct mpeg_iod_descriptor *d)
++{
++      return d->d.len - 2;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/iso_639_language_descriptor.h dvb-apps/lib/libucsi/mpeg/iso_639_language_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/iso_639_language_descriptor.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/iso_639_language_descriptor.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,124 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_ISO_639_LANGUAGE_DESCRIPTOR
++#define _UCSI_MPEG_ISO_639_LANGUAGE_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++#include <libucsi/types.h>
++
++/**
++ * Possible values for audio_type.
++ */
++enum {
++      MPEG_AUDIO_TYPE_CLEAN_EFFECTS                   = 0x01,
++      MPEG_AUDIO_TYPE_HEARING_IMPAIRED                = 0x02,
++      MPEG_AUDIO_TYPE_VISUAL_IMPAIRED_COMMENTARY      = 0x03,
++};
++
++/**
++ * mpeg_iso_639_language_descriptor structure.
++ */
++struct mpeg_iso_639_language_descriptor {
++      struct descriptor d;
++
++      /* struct mpeg_iso_639_language_code languages[] */
++} __ucsi_packed;
++
++/**
++ * An entry in the mpeg_iso_639_language_descriptor languages field.
++ */
++struct mpeg_iso_639_language_code {
++      iso639lang_t language_code;
++      uint8_t audio_type;
++} __ucsi_packed;
++
++/**
++ * Process an mpeg_iso_639_language_descriptor.
++ *
++ * @param d Generic descriptor structure.
++ * @return Pointer to an mpeg_iso_639_language_descriptor structure, or NULL
++ * on error.
++ */
++static inline struct mpeg_iso_639_language_descriptor*
++      mpeg_iso_639_language_descriptor_codec(struct descriptor* d)
++{
++      if (d->len % sizeof(struct mpeg_iso_639_language_code))
++              return NULL;
++
++      return (struct mpeg_iso_639_language_descriptor*) d;
++}
++
++/**
++ * Convenience iterator for the languages field of an mpeg_iso_639_language_descriptor
++ *
++ * @param d Pointer to the mpeg_iso_639_language_descriptor structure.
++ * @param pos Variable holding a pointer to the current entry.
++ */
++#define mpeg_iso_639_language_descriptor_languages_for_each(_d, _pos) \
++      for ((_pos) = mpeg_iso_639_language_descriptor_languages_first(_d); \
++           (_pos); \
++           (_pos) = mpeg_iso_639_language_descriptor_languages_next(_d, _pos))
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct mpeg_iso_639_language_code*
++      mpeg_iso_639_language_descriptor_languages_first(struct mpeg_iso_639_language_descriptor *d)
++{
++      if (d->d.len < sizeof(struct mpeg_iso_639_language_code))
++              return NULL;
++
++      return (struct mpeg_iso_639_language_code *)
++              ((uint8_t*) d + sizeof(struct mpeg_iso_639_language_descriptor));
++}
++
++static inline struct mpeg_iso_639_language_code*
++      mpeg_iso_639_language_descriptor_languages_next(struct mpeg_iso_639_language_descriptor *d,
++                                                      struct mpeg_iso_639_language_code *pos)
++{
++      uint8_t *end = (uint8_t*) d + 2 + d->d.len;
++      uint8_t *next = (uint8_t *) pos + sizeof(struct mpeg_iso_639_language_code);
++
++      if (next >= end)
++              return NULL;
++
++      return (struct mpeg_iso_639_language_code *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/Makefile dvb-apps/lib/libucsi/mpeg/Makefile
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/Makefile   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/Makefile 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,66 @@
++# Makefile for linuxtv.org dvb-apps/lib/libucsi/mpeg
++
++.PHONY: sub-error-mpeg
++
++sub-error-mpeg:
++      $(error You can't use this makefile directly.)
++
++ifneq ($(lib_name),)
++
++objects += mpeg/cat_section.o      \
++           mpeg/metadata_section.o \
++           mpeg/odsmt_section.o    \
++           mpeg/pat_section.o      \
++           mpeg/pmt_section.o      \
++           mpeg/tsdt_section.o
++
++sub-install += mpeg
++
++else
++
++includes = audio_stream_descriptor.h                 \
++           ca_descriptor.h                           \
++           cat_section.h                             \
++           content_labelling_descriptor.h            \
++           copyright_descriptor.h                    \
++           data_stream_alignment_descriptor.h        \
++           datagram_section.h                        \
++           descriptor.h                              \
++           external_es_id_descriptor.h               \
++           fmc_descriptor.h                          \
++           fmxbuffer_size_descriptor.h               \
++           hierarchy_descriptor.h                    \
++           ibp_descriptor.h                          \
++           iod_descriptor.h                          \
++           iso_639_language_descriptor.h             \
++           maximum_bitrate_descriptor.h              \
++           metadata_descriptor.h                     \
++           metadata_pointer_descriptor.h             \
++           metadata_section.h                        \
++           metadata_std_descriptor.h                 \
++           mpeg4_audio_descriptor.h                  \
++           mpeg4_video_descriptor.h                  \
++           multiplex_buffer_descriptor.h             \
++           multiplex_buffer_utilization_descriptor.h \
++           muxcode_descriptor.h                      \
++           odsmt_section.h                           \
++           pat_section.h                             \
++           pmt_section.h                             \
++           private_data_indicator_descriptor.h       \
++           registration_descriptor.h                 \
++           section.h                                 \
++           sl_descriptor.h                           \
++           smoothing_buffer_descriptor.h             \
++           std_descriptor.h                          \
++           system_clock_descriptor.h                 \
++           target_background_grid_descriptor.h       \
++           tsdt_section.h                            \
++           types.h                                   \
++           video_stream_descriptor.h                 \
++           video_window_descriptor.h
++
++include ../../../Make.rules
++
++lib_name = libucsi/mpeg
++
++endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/maximum_bitrate_descriptor.h dvb-apps/lib/libucsi/mpeg/maximum_bitrate_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/maximum_bitrate_descriptor.h       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/maximum_bitrate_descriptor.h     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,64 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_MAXIMUM_BITRATE_DESCRIPTOR
++#define _UCSI_MPEG_MAXIMUM_BITRATE_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * mpeg_maximum_bitrate_descriptor structure.
++ */
++struct mpeg_maximum_bitrate_descriptor {
++      struct descriptor d;
++
++  EBIT2(uint32_t reserved             : 2;  ,
++      uint32_t maximum_bitrate        : 22; );
++} __ucsi_packed;
++
++/**
++ * Process an mpeg_maximum_bitrate_descriptor.
++ *
++ * @param d Pointer to generic descriptor structure.
++ * @return Pointer to mpeg_maximum_bitrate_descriptor, or NULL on error.
++ */
++static inline struct mpeg_maximum_bitrate_descriptor*
++      mpeg_maximum_bitrate_descriptor_codec(struct descriptor* d)
++{
++      if (d->len != (sizeof(struct mpeg_maximum_bitrate_descriptor) - 2))
++              return NULL;
++
++      bswap24((uint8_t*) d + 2);
++
++      return (struct mpeg_maximum_bitrate_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/metadata_descriptor.h dvb-apps/lib/libucsi/mpeg/metadata_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/metadata_descriptor.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/metadata_descriptor.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,472 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_METADATA_DESCRIPTOR
++#define _UCSI_MPEG_METADATA_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * Values for the decoder_config_flags field.
++ */
++enum {
++      MPEG_DECODER_CONFIG_NONE                                = 0x00,
++      MPEG_DECODER_CONFIG_IN_DECODER_CONFIG                   = 0x01,
++      MPEG_DECODER_CONFIG_SAME_METADATA_SERVICE               = 0x02,
++      MPEG_DECODER_CONFIG_DSMCC                               = 0x03,
++      MPEG_DECODER_CONFIG_SAME_PROGRAM                        = 0x04,
++};
++
++/**
++ * mpeg_metadata_descriptor structure.
++ */
++struct mpeg_metadata_descriptor {
++      struct descriptor d;
++
++      uint16_t metadata_application_format;
++      /* struct mpeg_metadata_descriptor_application_format_identifier appid */
++      /* uint8_t metadata_format */
++      /* struct mpeg_metadata_descriptor_format_identifier formid */
++      /* struct mpeg_metadata_descriptor_flags flags */
++      /* struct mpeg_metadata_descriptor_service_identifier service_identifier */
++      /* struct mpeg_metadata_descriptor_decoder_config decoder_config */
++      /* struct mpeg_metadata_descriptor_decoder_config_id_record decoder_config_id_record */
++      /* struct mpeg_metadata_descriptor_decoder_config_service_id decoder_config_service_id */
++      /* struct mpeg_metadata_descriptor_decoder_config_reserved decoder_config_reserved */
++      /* uint8_t private_data[] */
++} __ucsi_packed;
++
++/**
++ * appid field of a metadata_descriptor.
++ */
++struct mpeg_metadata_descriptor_application_format_identifier {
++      uint32_t id;
++} __ucsi_packed;
++
++/**
++ * formid field of a metadata_descriptor.
++ */
++struct mpeg_metadata_descriptor_format_identifier {
++      uint32_t id;
++} __ucsi_packed;
++
++/**
++ * Flags field of a metadata_descriptor
++ */
++struct mpeg_metadata_descriptor_flags {
++      uint8_t metadata_service_id;
++  EBIT3(uint8_t decoder_config_flags                          : 3;  ,
++      uint8_t dsm_cc_flag                                     : 1;  ,
++      uint8_t reserved                                        : 4;  );
++} __ucsi_packed;
++
++/**
++ * service_identifier field of a metadata_descriptor.
++ */
++struct mpeg_metadata_descriptor_service_identifier {
++      uint8_t service_identification_length;
++      /* uint8_t data[] */
++} __ucsi_packed;
++
++/**
++ * decoder_config field of a metadata_descriptor.
++ */
++struct mpeg_metadata_descriptor_decoder_config {
++      uint8_t decoder_config_length;
++      /* uint8_t data[] */
++} __ucsi_packed;
++
++/**
++ * decoder_config_id_record field of a metadata_descriptor.
++ */
++struct mpeg_metadata_descriptor_decoder_config_id_record {
++      uint8_t decoder_config_id_record_length;
++      /* uint8_t data[] */
++} __ucsi_packed;
++
++/**
++ * decoder_config_service_id field of a metadata_descriptor.
++ */
++struct mpeg_metadata_descriptor_decoder_config_service_id {
++      uint8_t decoder_config_metadata_service_id;
++} __ucsi_packed;
++
++/**
++ * decoder_config_reserved field of a metadata_descriptor.
++ */
++struct mpeg_metadata_descriptor_decoder_config_reserved {
++      uint8_t reserved_data_length;
++      /* uint8_t data[] */
++} __ucsi_packed;
++
++
++
++
++/**
++ * Process an mpeg_metadata_descriptor.
++ *
++ * @param d Generic descriptor.
++ * @return Pointer to an mpeg_metadata_descriptor, or NULL on error.
++ */
++static inline struct mpeg_metadata_descriptor*
++      mpeg_metadata_descriptor_codec(struct descriptor* d)
++{
++      uint32_t pos = 2;
++      uint8_t *buf = (uint8_t*) d;
++      uint32_t len = d->len + 2;
++      struct mpeg_metadata_descriptor_flags *flags;
++      int id;
++
++      if (len < sizeof(struct mpeg_metadata_descriptor))
++              return NULL;
++
++      bswap16(buf + pos);
++      id = *((uint16_t*) (buf+pos));
++      pos += 2;
++
++      if (id == 0xffff) {
++              if (len < (pos+4))
++                      return NULL;
++              bswap32(buf+pos);
++              pos += 4;
++      }
++
++      if (len < (pos+1))
++              return NULL;
++
++      id = buf[pos];
++      pos++;
++      if (id == 0xff) {
++              if (len < (pos+4))
++                      return NULL;
++              bswap32(buf+pos);
++              pos += 4;
++      }
++
++      if (len < (pos + sizeof(struct mpeg_metadata_descriptor_flags)))
++              return NULL;
++      flags = (struct mpeg_metadata_descriptor_flags*) (buf+pos);
++      pos += sizeof(struct mpeg_metadata_descriptor_flags);
++
++      if (flags->dsm_cc_flag == 1) {
++              if (len < (pos+1))
++                      return NULL;
++              if (len < (pos+1+buf[pos]))
++                      return NULL;
++              pos += 1 + buf[pos];
++      }
++
++      if (flags->decoder_config_flags == 1) {
++              if (len < (pos+1))
++                      return NULL;
++              if (len < (pos+1+buf[pos]))
++                      return NULL;
++              pos += 1 + buf[pos];
++      }
++
++      if (flags->decoder_config_flags == 3) {
++              if (len < (pos+1))
++                      return NULL;
++              if (len < (pos+1+buf[pos]))
++                      return NULL;
++              pos += 1 + buf[pos];
++      }
++
++      if (flags->decoder_config_flags == 4) {
++              if (len < (pos+1))
++                      return NULL;
++              pos++;
++      }
++
++      if ((flags->decoder_config_flags == 5) ||
++          (flags->decoder_config_flags == 6)) {
++              if (len < (pos+1))
++                      return NULL;
++              if (len < (pos+1+buf[pos]))
++                      return NULL;
++              pos += 1 + buf[pos];
++      }
++
++      if (len < pos)
++              return NULL;
++
++      return (struct mpeg_metadata_descriptor*) d;
++}
++
++/**
++ * Accessor for pointer to appid field of an mpeg_metadata_descriptor.
++ *
++ * @param d The mpeg_metadata_descriptor structure.
++ * @return The pointer, or NULL on error.
++ */
++static inline struct mpeg_metadata_descriptor_application_format_identifier*
++      mpeg_metadata_descriptor_appid(struct mpeg_metadata_descriptor *d)
++{
++      uint8_t *buf = (uint8_t*) d + sizeof(struct mpeg_metadata_descriptor);
++
++      if (d->metadata_application_format != 0xffff)
++              return NULL;
++      return (struct mpeg_metadata_descriptor_application_format_identifier*) buf;
++}
++
++/**
++ * Accessor for metadata_format field of an mpeg_metadata_descriptor.
++ *
++ * @param d The mpeg_metadata_descriptor structure.
++ * @return The pointer, or NULL on error.
++ */
++static inline uint8_t
++      mpeg_metadata_descriptor_metadata_format(struct mpeg_metadata_descriptor *d)
++{
++      uint8_t *buf = (uint8_t*) d + sizeof(struct mpeg_metadata_descriptor);
++
++      if (d->metadata_application_format == 0xffff)
++              buf+=4;
++      return *buf;
++}
++
++/**
++ * Accessor for pointer to formid field of an mpeg_metadata_descriptor.
++ *
++ * @param d The mpeg_metadata_descriptor structure.
++ * @return The pointer, or NULL on error.
++ */
++static inline struct mpeg_metadata_descriptor_format_identifier*
++        mpeg_metadata_descriptor_formid(struct mpeg_metadata_descriptor *d)
++{
++      uint8_t *buf = (uint8_t*) d + sizeof(struct mpeg_metadata_descriptor);
++
++      if (d->metadata_application_format == 0xffff)
++              buf+=4;
++      if (*buf != 0xff)
++              return NULL;
++
++      return (struct mpeg_metadata_descriptor_format_identifier*) (buf+1);
++}
++
++/**
++ * Accessor for flags field of an mpeg_metadata_descriptor.
++ *
++ * @param d The mpeg_metadata_descriptor structure.
++ * @return Pointer to the field, or NULL on error.
++ */
++static inline struct mpeg_metadata_descriptor_flags*
++      mpeg_metadata_descriptor_flags(struct mpeg_metadata_descriptor *d)
++{
++      uint8_t *buf = (uint8_t*) d + sizeof(struct mpeg_metadata_descriptor);
++
++      if (d->metadata_application_format == 0xffff)
++              buf+=4;
++      if (*buf == 0xff)
++              buf+=4;
++
++      return (struct mpeg_metadata_descriptor_flags*) buf;
++}
++
++
++/**
++ * Accessor for service_identifier field of an mpeg_metadata_descriptor.
++ *
++ * @param flags Pointer to the mpeg_metadata_descriptor_flags.
++ * @return Pointer to the field, or NULL on error.
++ */
++static inline struct mpeg_metadata_descriptor_service_identifier*
++      mpeg_metadata_descriptor_sevice_identifier(struct mpeg_metadata_descriptor_flags *flags)
++{
++      uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_descriptor_flags);
++
++      if (flags->dsm_cc_flag!=1)
++              return NULL;
++
++      return (struct mpeg_metadata_descriptor_service_identifier *) buf;
++}
++
++/**
++ * Accessor for data field of an mpeg_metadata_descriptor_service_identifier.
++ *
++ * @param d The mpeg_metadata_descriptor_service_identifier structure.
++ * @return Pointer to the field.
++ */
++static inline uint8_t*
++      mpeg_metadata_descriptor_service_identifier_data(struct mpeg_metadata_descriptor_service_identifier *d)
++{
++      return (uint8_t*) d + sizeof(struct mpeg_metadata_descriptor_service_identifier);
++}
++
++/**
++ * Accessor for decoder_config field of an mpeg_metadata_descriptor.
++ *
++ * @param flags Pointer to the mpeg_metadata_descriptor_flags.
++ * @return Pointer to the field, or NULL on error.
++ */
++static inline struct mpeg_metadata_descriptor_decoder_config*
++      mpeg_metadata_descriptor_decoder_config(struct mpeg_metadata_descriptor_flags *flags)
++{
++      uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_descriptor_flags);
++
++      if (flags->decoder_config_flags != 1)
++              return NULL;
++
++      if (flags->dsm_cc_flag==1)
++              buf += 1 + buf[1];
++
++      return (struct mpeg_metadata_descriptor_decoder_config*) buf;
++}
++
++/**
++ * Accessor for data field of an mpeg_metadata_descriptor_service_identifier.
++ *
++ * @param d The mpeg_metadata_descriptor_service_identifier structure.
++ * @return Pointer to the field.
++ */
++static inline uint8_t*
++      mpeg_metadata_descriptor_decoder_config_data(struct mpeg_metadata_descriptor_decoder_config *d)
++{
++      return (uint8_t*) d + sizeof(struct mpeg_metadata_descriptor_decoder_config);
++}
++
++/**
++ * Accessor for decoder_config_id_record field of an mpeg_metadata_descriptor.
++ *
++ * @param flags Pointer to the mpeg_metadata_descriptor_flags.
++ * @return Pointer to the field, or NULL on error.
++ */
++static inline struct mpeg_metadata_descriptor_decoder_config_id_record*
++      mpeg_metadata_descriptor_decoder_config_id_record(struct mpeg_metadata_descriptor_flags *flags)
++{
++      uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_descriptor_flags);
++
++      if (flags->decoder_config_flags != 3)
++              return NULL;
++
++      if (flags->dsm_cc_flag==1)
++              buf += 1 + buf[1];
++
++      return (struct mpeg_metadata_descriptor_decoder_config_id_record *) buf;
++}
++
++/**
++ * Accessor for data field of an mpeg_metadata_descriptor_decoder_config_id_record.
++ *
++ * @param d The mpeg_metadata_descriptor_decoder_config_id_record structure.
++ * @return Pointer to the field.
++ */
++static inline uint8_t*
++      mpeg_metadata_descriptor_decoder_config_id_record_data(struct mpeg_metadata_descriptor_decoder_config_id_record *d)
++{
++      return (uint8_t*) d + sizeof(struct mpeg_metadata_descriptor_decoder_config_id_record);
++}
++
++/**
++ * Accessor for decoder_config_service_id field of an mpeg_metadata_descriptor.
++ *
++ * @param flags Pointer to the mpeg_metadata_descriptor_flags.
++ * @return Pointer to the field, or NULL on error.
++ */
++static inline struct mpeg_metadata_descriptor_decoder_config_service_id*
++      mpeg_metadata_descriptor_decoder_config_service_id(struct mpeg_metadata_descriptor_flags *flags)
++{
++      uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_descriptor_flags);
++
++      if (flags->decoder_config_flags != 4)
++              return NULL;
++
++      if (flags->dsm_cc_flag==1)
++              buf += 1 + buf[1];
++
++      return (struct mpeg_metadata_descriptor_decoder_config_service_id *) buf;
++}
++
++/**
++ * Accessor for decoder_config_reserved field of an mpeg_metadata_descriptor.
++ *
++ * @param flags Pointer to the mpeg_metadata_descriptor_flags.
++ * @return Pointer to the field, or NULL on error.
++ */
++static inline struct mpeg_metadata_descriptor_decoder_config_reserved*
++      mpeg_metadata_descriptor_decoder_config_reserved(struct mpeg_metadata_descriptor_flags *flags)
++{
++      uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_descriptor_flags);
++
++      if ((flags->decoder_config_flags != 5) && (flags->decoder_config_flags != 6))
++              return NULL;
++
++      if (flags->dsm_cc_flag==1)
++              buf += 1 + buf[1];
++
++      return (struct mpeg_metadata_descriptor_decoder_config_reserved *) buf;
++}
++
++/**
++ * Accessor for data field of an mpeg_metadata_descriptor_decoder_config_reserved.
++ *
++ * @param d The mpeg_metadata_descriptor_decoder_config_reserved structure.
++ * @return Pointer to the field.
++ */
++static inline uint8_t*
++      mpeg_metadata_descriptor_decoder_config_reserved_data(struct mpeg_metadata_descriptor_decoder_config_reserved *d)
++{
++      return (uint8_t*) d + sizeof(struct mpeg_metadata_descriptor_decoder_config_reserved);
++}
++
++/**
++ * Accessor for private_data field of an mpeg_metadata_descriptor.
++ *
++ * @param d The mpeg_metadata_descriptor structure.
++ * @param flags Pointer to the mpeg_metadata_descriptor_flags.
++ * @param length Where the number of bytes in the field should be stored.
++ * @return Pointer to the field.
++ */
++static inline uint8_t*
++      mpeg_metadata_descriptor_private_data(struct mpeg_metadata_descriptor *d,
++                                            struct mpeg_metadata_descriptor_flags *flags,
++                                            int *length)
++{
++      uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_descriptor_flags);
++      uint8_t *end = (uint8_t*) d + d->d.len + 2;
++
++
++      if (flags->dsm_cc_flag==1)
++              buf += 1 + buf[1];
++      if (flags->decoder_config_flags==1)
++              buf += 1 + buf[1];
++      if (flags->decoder_config_flags==3)
++              buf += 1 + buf[1];
++      if (flags->decoder_config_flags==4)
++              buf++;
++      if ((flags->decoder_config_flags==5)||(flags->decoder_config_flags==6))
++              buf += 1 + buf[1];
++
++      *length = end - buf;
++      return buf;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/metadata_pointer_descriptor.h dvb-apps/lib/libucsi/mpeg/metadata_pointer_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/metadata_pointer_descriptor.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/metadata_pointer_descriptor.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,360 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_METADATA_POINTER_DESCRIPTOR
++#define _UCSI_MPEG_METADATA_POINTER_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * Possible values for the mpeg_carriage_flags field.
++ */
++enum {
++      MPEG_CARRIAGE_SAME_TS                                   = 0x00,
++      MPEG_CARRIAGE_DIFFERENT_TS                              = 0x01,
++      MPEG_CARRIAGE_PS                                        = 0x02,
++      MPEG_CARRIAGE_OTHER                                     = 0x03,
++};
++
++/**
++ * mpeg_metadata_pointer_descriptor structure.
++ */
++struct mpeg_metadata_pointer_descriptor {
++      struct descriptor d;
++
++      uint16_t metadata_application_format;
++      /* struct mpeg_metadata_pointer_descriptor_application_format_identifier appid */
++      /* uint8_t metadata_format */
++      /* struct mpeg_metadata_pointer_descriptor_format_identifier formid */
++      /* struct mpeg_metadata_pointer_descriptor_flags flags */
++      /* struct mpeg_metadata_pointer_descriptor_locator locator */
++      /* struct mpeg_metadata_pointer_descriptor_program_number program_number */
++      /* struct mpeg_metadata_pointer_descriptor_carriage carriage */
++      /* uint8_t private_data[] */
++} __ucsi_packed;
++
++/**
++ * appid field of a metadata_pointer_descriptor.
++ */
++struct mpeg_metadata_pointer_descriptor_application_format_identifier {
++      uint32_t id;
++} __ucsi_packed;
++
++/**
++ * formid field of a metadata_pointer_descriptor.
++ */
++struct mpeg_metadata_pointer_descriptor_format_identifier {
++      uint32_t id;
++} __ucsi_packed;
++
++/**
++ * Flags field of a metadata_pointer_descriptor
++ */
++struct mpeg_metadata_pointer_descriptor_flags {
++      uint8_t metadata_service_id;
++  EBIT3(uint8_t metadata_locator_record_flag                  : 1;  ,
++      uint8_t mpeg_carriage_flags                             : 2;  ,
++      uint8_t reserved                                        : 5;  );
++} __ucsi_packed;
++
++/**
++ * Reference_id field of a metadata_pointer_descriptor.
++ */
++struct mpeg_metadata_pointer_descriptor_locator {
++      uint8_t metadata_locator_record_length;
++      /* uint8_t data[] */
++} __ucsi_packed;
++
++/**
++ * program_number field of a metadata_pointer_descriptor.
++ */
++struct mpeg_metadata_pointer_descriptor_program_number {
++      uint16_t number;
++} __ucsi_packed;
++
++/**
++ * carriage field of a metadata_pointer_descriptor.
++ */
++struct mpeg_metadata_pointer_descriptor_carriage {
++      uint16_t transport_stream_location;
++      uint16_t transport_stream_id;
++} __ucsi_packed;
++
++
++
++
++/**
++ * Process an mpeg_metadata_pointer_descriptor.
++ *
++ * @param d Generic descriptor.
++ * @return Pointer to an mpeg_metadata_pointer_descriptor, or NULL on error.
++ */
++static inline struct mpeg_metadata_pointer_descriptor*
++      mpeg_metadata_pointer_descriptor_codec(struct descriptor* d)
++{
++      uint32_t pos = 2;
++      uint8_t *buf = (uint8_t*) d;
++      uint32_t len = d->len + 2;
++      struct mpeg_metadata_pointer_descriptor_flags *flags;
++      int id;
++
++      if (len < sizeof(struct mpeg_metadata_pointer_descriptor))
++              return NULL;
++
++      bswap16(buf + pos);
++      id = *((uint16_t*) (buf+pos));
++      pos += 2;
++
++      if (id == 0xffff) {
++              if (len < (pos+4))
++                      return NULL;
++              bswap32(buf+pos);
++              pos += 4;
++      }
++
++      if (len < (pos+1))
++              return NULL;
++
++      id = buf[pos];
++      pos++;
++      if (id == 0xff) {
++              if (len < (pos+4))
++                      return NULL;
++              bswap32(buf+pos);
++              pos += 4;
++      }
++
++      if (len < (pos + sizeof(struct mpeg_metadata_pointer_descriptor_flags)))
++              return NULL;
++      flags = (struct mpeg_metadata_pointer_descriptor_flags*) (buf+pos);
++      pos += sizeof(struct mpeg_metadata_pointer_descriptor_flags);
++
++      if (flags->metadata_locator_record_flag == 1) {
++              if (len < (pos+1))
++                      return NULL;
++              if (len < (pos+1+buf[pos]))
++                      return NULL;
++              pos += 1 + buf[pos];
++      }
++
++      if (flags->mpeg_carriage_flags < 3) {
++              if (len < (pos + 2))
++                      return NULL;
++              bswap16(buf+pos);
++              pos += 2;
++      }
++
++      if (flags->mpeg_carriage_flags == 1) {
++              if (len < (pos + 4))
++                      return NULL;
++              bswap16(buf+pos);
++              bswap16(buf+pos+2);
++              pos += 4;
++      }
++
++      if (len < pos)
++              return NULL;
++
++      return (struct mpeg_metadata_pointer_descriptor*) d;
++}
++
++/**
++ * Accessor for pointer to appid field of an mpeg_metadata_pointer_descriptor.
++ *
++ * @param d The mpeg_metadata_pointer_descriptor structure.
++ * @return The pointer, or NULL on error.
++ */
++static inline struct mpeg_metadata_pointer_descriptor_application_format_identifier*
++      mpeg_metadata_pointer_descriptor_appid(struct mpeg_metadata_pointer_descriptor *d)
++{
++      uint8_t *buf = (uint8_t*) d + sizeof(struct mpeg_metadata_pointer_descriptor);
++
++      if (d->metadata_application_format != 0xffff)
++              return NULL;
++      return (struct mpeg_metadata_pointer_descriptor_application_format_identifier*) buf;
++}
++
++/**
++ * Accessor for metadata_format field of an mpeg_metadata_pointer_descriptor.
++ *
++ * @param d The mpeg_metadata_pointer_descriptor structure.
++ * @return The pointer, or NULL on error.
++ */
++static inline uint8_t
++      mpeg_metadata_pointer_descriptor_metadata_format(struct mpeg_metadata_pointer_descriptor *d)
++{
++      uint8_t *buf = (uint8_t*) d + sizeof(struct mpeg_metadata_pointer_descriptor);
++
++      if (d->metadata_application_format == 0xffff)
++              buf+=4;
++      return *buf;
++}
++
++/**
++ * Accessor for pointer to formid field of an mpeg_metadata_pointer_descriptor.
++ *
++ * @param d The mpeg_metadata_pointer_descriptor structure.
++ * @return The pointer, or NULL on error.
++ */
++static inline struct mpeg_metadata_pointer_descriptor_format_identifier*
++        mpeg_metadata_pointer_descriptor_formid(struct mpeg_metadata_pointer_descriptor *d)
++{
++      uint8_t *buf = (uint8_t*) d + sizeof(struct mpeg_metadata_pointer_descriptor);
++
++      if (d->metadata_application_format == 0xffff)
++              buf+=4;
++      if (*buf != 0xff)
++              return NULL;
++
++      return (struct mpeg_metadata_pointer_descriptor_format_identifier*) (buf+1);
++}
++
++/**
++ * Accessor for flags field of an mpeg_metadata_pointer_descriptor.
++ *
++ * @param d The mpeg_metadata_pointer_descriptor structure.
++ * @return Pointer to the field, or NULL on error.
++ */
++static inline struct mpeg_metadata_pointer_descriptor_flags*
++      mpeg_metadata_pointer_descriptor_flags(struct mpeg_metadata_pointer_descriptor *d)
++{
++      uint8_t *buf = (uint8_t*) d + sizeof(struct mpeg_metadata_pointer_descriptor);
++
++      if (d->metadata_application_format == 0xffff)
++              buf+=4;
++      if (*buf == 0xff)
++              buf+=4;
++
++      return (struct mpeg_metadata_pointer_descriptor_flags*) buf;
++}
++
++
++/**
++ * Accessor for locator field of an mpeg_metadata_pointer_descriptor.
++ *
++ * @param flags Pointer to the mpeg_metadata_pointer_descriptor_flags.
++ * @return Pointer to the field, or NULL on error.
++ */
++static inline struct mpeg_metadata_pointer_descriptor_locator*
++      mpeg_metadata_pointer_descriptor_locator(struct mpeg_metadata_pointer_descriptor_flags *flags)
++{
++      uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_pointer_descriptor_flags);
++
++      if (flags->metadata_locator_record_flag!=1)
++              return NULL;
++
++      return (struct mpeg_metadata_pointer_descriptor_locator *) buf;
++}
++
++/**
++ * Accessor for data field of an mpeg_metadata_pointer_descriptor_locator.
++ *
++ * @param d The mpeg_metadata_pointer_descriptor_locator structure.
++ * @return Pointer to the field.
++ */
++static inline uint8_t*
++      mpeg_metadata_pointer_descriptor_locator_data(struct mpeg_metadata_pointer_descriptor_locator *d)
++{
++      return (uint8_t*) d + sizeof(struct mpeg_metadata_pointer_descriptor_locator);
++}
++
++
++/**
++ * Accessor for program_number field of an mpeg_metadata_pointer_descriptor.
++ *
++ * @param flags Pointer to the mpeg_metadata_pointer_descriptor_flags.
++ * @return Pointer to the field, or NULL on error.
++ */
++static inline struct mpeg_metadata_pointer_descriptor_program_number*
++      mpeg_metadata_pointer_descriptor_program_number(struct mpeg_metadata_pointer_descriptor_flags *flags)
++{
++      uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_pointer_descriptor_flags);
++
++      if (flags->mpeg_carriage_flags < 3)
++              return NULL;
++
++      if (flags->metadata_locator_record_flag==1)
++              buf += 1 + buf[1];
++
++      return (struct mpeg_metadata_pointer_descriptor_program_number*) buf;
++}
++
++/**
++ * Accessor for carriage field of an mpeg_metadata_pointer_descriptor.
++ *
++ * @param flags Pointer to the mpeg_metadata_pointer_descriptor_flags.
++ * @return Pointer to the field, or NULL on error.
++ */
++static inline struct mpeg_metadata_pointer_descriptor_carriage*
++      mpeg_metadata_pointer_descriptor_carriage(struct mpeg_metadata_pointer_descriptor_flags *flags)
++{
++      uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_pointer_descriptor_flags);
++
++      if (flags->mpeg_carriage_flags != 1)
++              return NULL;
++
++      if (flags->metadata_locator_record_flag==1)
++              buf += 1 + buf[1];
++      if (flags->mpeg_carriage_flags < 3)
++              buf += sizeof(struct mpeg_metadata_pointer_descriptor_program_number);
++
++      return (struct mpeg_metadata_pointer_descriptor_carriage *) buf;
++}
++
++/**
++ * Accessor for private_data field of an mpeg_metadata_pointer_descriptor.
++ *
++ * @param d The mpeg_metadata_pointer_descriptor structure.
++ * @param flags Pointer to the mpeg_metadata_pointer_descriptor_flags.
++ * @param length Where the number of bytes in the field should be stored.
++ * @return Pointer to the field.
++ */
++static inline uint8_t*
++      mpeg_metadata_pointer_descriptor_private_data(struct mpeg_metadata_pointer_descriptor *d,
++                                                    struct mpeg_metadata_pointer_descriptor_flags *flags,
++                                                    int *length)
++{
++      uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_pointer_descriptor_flags);
++      uint8_t *end = (uint8_t*) d + d->d.len + 2;
++
++
++      if (flags->metadata_locator_record_flag==1)
++              buf += 1 + buf[1];
++      if (flags->mpeg_carriage_flags < 3)
++              buf += sizeof(struct mpeg_metadata_pointer_descriptor_program_number);
++      if (flags->mpeg_carriage_flags != 1)
++              buf += sizeof(struct mpeg_metadata_pointer_descriptor_carriage);
++
++      *length = end - buf;
++      return buf;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/metadata_section.c dvb-apps/lib/libucsi/mpeg/metadata_section.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/metadata_section.c 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/metadata_section.c       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,27 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <libucsi/mpeg/metadata_section.h>
++
++struct mpeg_metadata_section * mpeg_metadata_section_codec(struct section_ext * ext)
++{
++      return (struct mpeg_metadata_section *)ext;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/metadata_section.h dvb-apps/lib/libucsi/mpeg/metadata_section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/metadata_section.h 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/metadata_section.h       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,122 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_METADATA_SECTION_H
++#define _UCSI_MPEG_METADATA_SECTION_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/section.h>
++
++/**
++ * mpeg_metadata_section structure.
++ */
++struct mpeg_metadata_section {
++      struct section_ext head;
++
++      /* uint8_t data[] */
++} __ucsi_packed;
++
++/**
++ * Process an mpeg_metadata_section structure.
++ *
++ * @param section Pointer to the section_ext structure.
++ * @return Pointer to the mpeg_metadata_section structure, or NULL on error.
++ */
++extern struct mpeg_metadata_section *mpeg_metadata_section_codec(struct section_ext *section);
++
++/**
++ * Accessor for the random_access_indicator field of a metadata section.
++ *
++ * @param metadata metadata section pointer.
++ * @return The random_access_indicator.
++ */
++static inline uint8_t mpeg_metadata_section_random_access_indicator(struct mpeg_metadata_section *metadata)
++{
++      return metadata->head.reserved >> 1;
++}
++
++/**
++ * Accessor for the decoder_config_flag field of a metadata section.
++ *
++ * @param metadata metadata section pointer.
++ * @return The decoder_config_flag.
++ */
++static inline uint8_t mpeg_metadata_section_decoder_config_flag(struct mpeg_metadata_section *metadata)
++{
++      return metadata->head.reserved & 1;
++}
++
++/**
++ * Accessor for the fragment_indicator field of a metadata section.
++ *
++ * @param metadata metadata section pointer.
++ * @return The fragment_indicator.
++ */
++static inline uint8_t mpeg_metadata_section_fragment_indicator(struct mpeg_metadata_section *metadata)
++{
++      return metadata->head.reserved1;
++}
++
++/**
++ * Accessor for the service_id field of a metadata section.
++ *
++ * @param metadata metadata section pointer.
++ * @return The service_id.
++ */
++static inline uint16_t mpeg_metadata_section_service_id(struct mpeg_metadata_section *metadata)
++{
++      return metadata->head.table_id_ext >> 8;
++}
++
++/**
++ * Retrieve pointer to data field of an mpeg_metadata_section.
++ *
++ * @param s mpeg_metadata_section pointer.
++ * @return Pointer to the field.
++ */
++static inline uint8_t *
++      mpeg_metadata_section_data(struct mpeg_metadata_section *s)
++{
++      return (uint8_t *) s + sizeof(struct mpeg_metadata_section);
++}
++
++
++/**
++ * Determine length of the data field of an mpeg_copyright_descriptor.
++ *
++ * @param s mpeg_metadata_section_data pointer.
++ * @return Length of field in bytes.
++ */
++static inline int
++      mpeg_metadata_section_data_length(struct mpeg_metadata_section *s)
++{
++      return section_ext_length(&s->head) - sizeof(struct mpeg_metadata_section);
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/metadata_std_descriptor.h dvb-apps/lib/libucsi/mpeg/metadata_std_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/metadata_std_descriptor.h  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/metadata_std_descriptor.h        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,72 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_METADATA_STD_DESCRIPTOR
++#define _UCSI_MPEG_METADATA_STD_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * mpeg_metadata_std_descriptor structure.
++ */
++struct mpeg_metadata_std_descriptor {
++      struct descriptor d;
++
++  EBIT2(uint32_t reserved_1                   : 2; ,
++      uint32_t metadata_input_leak_rate       :22; );
++  EBIT2(uint32_t reserved_2                   : 2; ,
++      uint32_t metadata_buffer_size           :22; );
++  EBIT2(uint32_t reserved_3                   : 2; ,
++      uint32_t metadata_output_leak_rate      :22; );
++} __ucsi_packed;
++
++/**
++ * Process an mpeg_metadata_std_descriptor.
++ *
++ * @param d Pointer to the generic descriptor structure.
++ * @return Pointer to the mpeg_metadata_std_descriptor, or NULL on error.
++ */
++static inline struct mpeg_metadata_std_descriptor*
++      mpeg_metadata_std_descriptor_codec(struct descriptor* d)
++{
++      uint8_t *buf = (uint8_t*) d;
++
++      if (d->len != (sizeof(struct mpeg_metadata_std_descriptor) - 2))
++              return NULL;
++
++      bswap24(buf + 2);
++      bswap24(buf + 5);
++      bswap24(buf + 8);
++
++      return (struct mpeg_metadata_std_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/mpeg4_audio_descriptor.h dvb-apps/lib/libucsi/mpeg/mpeg4_audio_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/mpeg4_audio_descriptor.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/mpeg4_audio_descriptor.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,61 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG4_AUDIO_DESCRIPTOR
++#define _UCSI_MPEG4_AUDIO_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * mpeg4_audio_descriptor structure.
++ */
++struct mpeg4_audio_descriptor {
++      struct descriptor d;
++
++      uint8_t mpeg4_audio_profile_and_level;
++} __ucsi_packed;
++
++/**
++ * Process an mpeg4_audio_descriptor.
++ *
++ * @param d Generic descriptor structure.
++ * @return Pointer to an mpeg4_audio_descriptor structure, or NULL on error.
++ */
++static inline struct mpeg4_audio_descriptor*
++      mpeg4_audio_descriptor_codec(struct descriptor* d)
++{
++      if (d->len != (sizeof(struct mpeg4_audio_descriptor) - 2))
++              return NULL;
++
++      return (struct mpeg4_audio_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/mpeg4_video_descriptor.h dvb-apps/lib/libucsi/mpeg/mpeg4_video_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/mpeg4_video_descriptor.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/mpeg4_video_descriptor.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,61 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG4_VIDEO_DESCRIPTOR
++#define _UCSI_MPEG4_VIDEO_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * mpeg4_video_descriptor structure.
++ */
++struct mpeg4_video_descriptor {
++      struct descriptor d;
++
++      uint8_t mpeg4_visual_profile_and_level;
++} __ucsi_packed;
++
++/**
++ * Process an mpeg4_video_descriptor structure.
++ *
++ * @param d Pointer to generic descriptor structure.
++ * @return Pointer to mpeg4_video_descriptor structure, or NULL on error.
++ */
++static inline struct mpeg4_video_descriptor*
++      mpeg4_video_descriptor_codec(struct descriptor* d)
++{
++      if (d->len != (sizeof(struct mpeg4_video_descriptor) - 2))
++              return NULL;
++
++      return (struct mpeg4_video_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/multiplex_buffer_descriptor.h dvb-apps/lib/libucsi/mpeg/multiplex_buffer_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/multiplex_buffer_descriptor.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/multiplex_buffer_descriptor.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,65 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_MULTIPLEX_BUFFER_DESCRIPTOR
++#define _UCSI_MPEG_MULTIPLEX_BUFFER_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * mpeg_multiplex_buffer_descriptor descriptor.
++ */
++struct mpeg_multiplex_buffer_descriptor {
++      struct descriptor d;
++
++  EBIT2(uint64_t mb_buffer_size : 24;  ,
++      uint64_t tb_leak_rate   : 24;  );
++} __ucsi_packed;
++
++/**
++ * Process an mpeg_multiplex_buffer_descriptor.
++ *
++ * @param d Pointer to generic descriptor structure.
++ * @return Pointer to an mpeg_multiplex_buffer_descriptor structure, or NULL on
++ * error.
++ */
++static inline struct mpeg_multiplex_buffer_descriptor*
++      mpeg_multiplex_buffer_descriptor_codec(struct descriptor* d)
++{
++      if (d->len != (sizeof(struct mpeg_multiplex_buffer_descriptor) - 2))
++              return NULL;
++
++      bswap48((uint8_t*) d + 2);
++
++      return (struct mpeg_multiplex_buffer_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/multiplex_buffer_utilization_descriptor.h dvb-apps/lib/libucsi/mpeg/multiplex_buffer_utilization_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/multiplex_buffer_utilization_descriptor.h  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/multiplex_buffer_utilization_descriptor.h        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,67 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_MULTIPLEX_BUFFER_UTILIZATION_DESCRIPTOR
++#define _UCSI_MPEG_MULTIPLEX_BUFFER_UTILIZATION_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * mpeg_multiplex_buffer_utilization_descriptor structure.
++ */
++struct mpeg_multiplex_buffer_utilization_descriptor {
++      struct descriptor d;
++
++  EBIT2(uint16_t bound_valid_flag             : 1;  ,
++      uint16_t ltw_offset_lower_bound         : 15; );
++  EBIT2(uint16_t reserved                     : 1;  ,
++      uint16_t ltw_offset_upper_bound         : 15; );
++} __ucsi_packed;
++
++/**
++ * Process a mpeg_multiplex_buffer_utilization_descriptor.
++ *
++ * @param d Generic descriptor pointer.
++ * @return mpeg_multiplex_buffer_utilization_descriptor pointer, or NULL on error.
++ */
++static inline struct mpeg_multiplex_buffer_utilization_descriptor*
++      mpeg_multiplex_buffer_utilization_descriptor_codec(struct descriptor* d)
++{
++      if (d->len != (sizeof(struct mpeg_multiplex_buffer_utilization_descriptor) - 2))
++              return NULL;
++
++      bswap16((uint8_t*) d + 2);
++      bswap16((uint8_t*) d + 4);
++
++      return (struct mpeg_multiplex_buffer_utilization_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/muxcode_descriptor.h dvb-apps/lib/libucsi/mpeg/muxcode_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/muxcode_descriptor.h       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/muxcode_descriptor.h     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,82 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_MUXCODE_DESCRIPTOR
++#define _UCSI_MPEG_MUXCODE_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * mpeg_muxcode_descriptor structure
++ */
++struct mpeg_muxcode_descriptor {
++      struct descriptor d;
++
++      /* uint8_t entries[] */
++} __ucsi_packed;
++
++/**
++ * Process an mpeg_muxcode_descriptor.
++ *
++ * @param d Pointer to a generic descriptor structure.
++ * @return Pointer to an mpeg_muxcode_descriptor structure, or NULL on error.
++ */
++static inline struct mpeg_muxcode_descriptor*
++      mpeg_muxcode_descriptor_codec(struct descriptor* d)
++{
++      return (struct mpeg_muxcode_descriptor*) d;
++}
++
++/**
++ * Retrieve pointer to entries field of an mpeg_muxcode_descriptor structure.
++ *
++ * @param d Generic descriptor structure.
++ * @return Pointer to the entries field.
++ */
++static inline uint8_t *
++      mpeg_muxcode_descriptor_entries(struct mpeg_muxcode_descriptor *d)
++{
++      return (uint8_t *) d + sizeof(struct mpeg_muxcode_descriptor);
++}
++
++/**
++ * Determine length of entries field of an mpeg_muxcode_descriptor structure.
++ *
++ * @param d Generic descriptor structure.
++ * @return Number of bytes in the entries field.
++ */
++static inline int
++      mpeg_muxcode_descriptor_entries_length(struct mpeg_muxcode_descriptor *d)
++{
++      return d->d.len;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/odsmt_section.c dvb-apps/lib/libucsi/mpeg/odsmt_section.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/odsmt_section.c    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/odsmt_section.c  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,80 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <libucsi/mpeg/odsmt_section.h>
++
++struct mpeg_odsmt_section *mpeg_odsmt_section_codec(struct section_ext * ext)
++{
++      struct mpeg_odsmt_section * odsmt = (struct mpeg_odsmt_section *)ext;
++      uint8_t * buf = (uint8_t *)ext;
++      size_t pos = sizeof(struct section_ext);
++      size_t len = section_ext_length(ext);
++      int i;
++
++      if (len < sizeof(struct mpeg_odsmt_section))
++              return NULL;
++
++      pos++;
++
++      if (odsmt->stream_count == 0) {
++              struct mpeg_odsmt_stream * stream =
++                      (struct mpeg_odsmt_stream *) (buf + pos);
++
++              if ((pos + sizeof(struct mpeg_odsmt_stream_single)) > len)
++                      return NULL;
++
++              bswap16(buf+pos);
++              pos+=3;
++
++              if ((pos + stream->u.single.es_info_length) >= len)
++                      return NULL;
++
++              if (verify_descriptors(buf + pos, stream->u.single.es_info_length))
++                      return NULL;
++
++              pos += stream->u.single.es_info_length;
++      } else {
++              for (i=0; i< odsmt->stream_count; i++) {
++                      struct mpeg_odsmt_stream * stream =
++                              (struct mpeg_odsmt_stream *)(buf + pos);
++
++                      if ((pos + sizeof(struct mpeg_odsmt_stream_multi)) > len)
++                              return NULL;
++
++                      bswap16(buf+pos);
++                      pos += sizeof(struct mpeg_odsmt_stream_multi);
++
++                      if ((pos + stream->u.multi.es_info_length) > len)
++                              return NULL;
++
++                      if (verify_descriptors(buf + pos,
++                          stream->u.multi.es_info_length))
++                              return NULL;
++
++                      pos += stream->u.multi.es_info_length;
++              }
++      }
++
++      if (pos != len)
++              return NULL;
++
++      return (struct mpeg_odsmt_section *) ext;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/odsmt_section.h dvb-apps/lib/libucsi/mpeg/odsmt_section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/odsmt_section.h    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/odsmt_section.h  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,224 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_ODSMT_SECTION_H
++#define _UCSI_MPEG_ODSMT_SECTION_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/section.h>
++
++/**
++ * mpeg_odsmt_section structure.
++ */
++struct mpeg_odsmt_section {
++      struct section_ext head;
++
++      uint8_t stream_count;
++      /* stream_count==0 => struct mpeg_odsmt_stream_single streams
++         stream_count>0  => struct mpeg_odsmt_stream_multi streams[] */
++      /* uint8_t object_descriptors[] */
++} __ucsi_packed;
++
++struct mpeg_odsmt_stream_single
++{
++      uint16_t esid;
++      uint8_t es_info_length;
++      /* struct descriptor descriptors[] */
++} __ucsi_packed;
++
++struct mpeg_odsmt_stream_multi
++{
++      uint16_t esid;
++      uint8_t fmc;
++      uint8_t es_info_length;
++      /* struct descriptor descriptors[] */
++} __ucsi_packed;
++
++/**
++ * Structure describing the stream information held in an mpeg_odsmt_section.
++ */
++struct mpeg_odsmt_stream {
++      union {
++              struct mpeg_odsmt_stream_single single;
++              struct mpeg_odsmt_stream_multi multi;
++      } u;
++} __ucsi_packed;
++
++/**
++ * Process an mpeg_odsmt_section.
++ *
++ * @param section Pointer to the generic section_ext structure.
++ * @return Pointer to a mpeg_odsmt_section structure, or NULL on error.
++ */
++extern struct mpeg_odsmt_section *mpeg_odsmt_section_codec(struct section_ext *section);
++
++/**
++ * Accessor for the PID field of an ODSMT.
++ *
++ * @param odsmt odsmt pointer.
++ * @return The pid.
++ */
++static inline uint16_t mpeg_odsmt_section_pid(struct mpeg_odsmt_section *odsmt)
++{
++      return odsmt->head.table_id_ext & 0x1fff;
++}
++
++/**
++ * Convenience iterator for the streams field of an mpeg_odsmt_section.
++ *
++ * @param osdmt Pointer to the mpeg_odsmt_section structure.
++ * @param pos Variable holding pointer to the current mpeg_odsmt_stream structure.
++ * @param index Variable holding the stream index.
++ */
++#define mpeg_odsmt_section_streams_for_each(osdmt, pos, index) \
++      for (index=0, (pos) = mpeg_odsmt_section_streams_first(odsmt); \
++           (pos); \
++           (pos) = mpeg_odsmt_section_streams_next(odsmt, pos, ++index))
++
++/**
++ * Convenience iterator for the descriptors field of an mpeg_odsmt_stream.
++ *
++ * @param osdmt Pointer to the mpeg_odsmt_section structure.
++ * @param stream Pointer to the mpeg_odsmt_stream structure.
++ * @param pos Variable holding pointer to the current descriptor structure.
++ */
++#define mpeg_odsmt_stream_descriptors_for_each(osdmt, stream, pos) \
++      for ((pos) = mpeg_odsmt_stream_descriptors_first(odsmt, stream); \
++           (pos); \
++           (pos) = mpeg_odsmt_stream_descriptors_next(odsmt, stream, pos))
++
++/**
++ * Retrieve a pointer to the object_descriptors field of an mpeg_odsmt_section.
++ *
++ * @param osdmt Pointer to the mpeg_odsmt_section structure.
++ * @param len On return, will contain the number of bytes in the object descriptors field.
++ * @return Pointer to the object_descriptors field, or NULL on error.
++ */
++static inline uint8_t*
++      mpeg_odsmt_section_object_descriptors(struct mpeg_odsmt_section * odsmt,
++                                            size_t* len);
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct mpeg_odsmt_stream *
++      mpeg_odsmt_section_streams_first(struct mpeg_odsmt_section *odsmt)
++{
++      size_t pos = sizeof(struct mpeg_odsmt_section);
++
++      if (pos >= section_ext_length(&odsmt->head))
++              return NULL;
++
++      return (struct mpeg_odsmt_stream *) ((uint8_t *) odsmt + pos);
++}
++
++static inline struct mpeg_odsmt_stream *
++      mpeg_odsmt_section_streams_next(struct mpeg_odsmt_section *odsmt,
++                                      struct mpeg_odsmt_stream *pos,
++                                      int _index)
++{
++      uint8_t *end = (uint8_t*) odsmt + section_ext_length(&odsmt->head);
++      uint8_t *next;
++
++      if (_index > odsmt->stream_count)
++              return NULL;
++
++      next = (uint8_t *) pos + sizeof(struct mpeg_odsmt_stream_multi) +
++              pos->u.multi.es_info_length;
++
++      if (next >= end)
++              return NULL;
++
++      return (struct mpeg_odsmt_stream *) next;
++}
++
++static inline struct descriptor *
++      mpeg_odsmt_stream_descriptors_first(struct mpeg_odsmt_section *odsmt,
++                                          struct mpeg_odsmt_stream *stream)
++{
++      if (odsmt->stream_count == 0) {
++              if (stream->u.single.es_info_length == 0)
++                      return NULL;
++
++              return (struct descriptor *)
++                      ((uint8_t*) stream + sizeof(struct mpeg_odsmt_stream_single));
++      } else {
++              if (stream->u.multi.es_info_length == 0)
++                      return NULL;
++
++              return (struct descriptor *)
++                      ((uint8_t*) stream + sizeof(struct mpeg_odsmt_stream_multi));
++      }
++}
++
++static inline struct descriptor *
++      mpeg_odsmt_stream_descriptors_next(struct mpeg_odsmt_section *odsmt,
++                                         struct mpeg_odsmt_stream *stream,
++                                         struct descriptor* pos)
++{
++      if (odsmt->stream_count == 0) {
++              return next_descriptor((uint8_t *) stream + sizeof(struct mpeg_odsmt_stream_single),
++                                     stream->u.single.es_info_length,
++                                     pos);
++      } else {
++              return next_descriptor((uint8_t *) stream + sizeof(struct mpeg_odsmt_stream_multi),
++                                     stream->u.multi.es_info_length,
++                                     pos);
++      }
++}
++
++static inline uint8_t*
++      mpeg_odsmt_section_object_descriptors(struct mpeg_odsmt_section * odsmt,
++                                            size_t* len)
++{
++      struct mpeg_odsmt_stream* pos;
++      size_t size = sizeof(struct mpeg_odsmt_section);
++      int _index;
++
++      mpeg_odsmt_section_streams_for_each(odsmt, pos, _index) {
++              if (odsmt->stream_count == 0)
++                      size += sizeof(struct mpeg_odsmt_stream_single) +
++                                      pos->u.single.es_info_length;
++              else
++                      size += sizeof(struct mpeg_odsmt_stream_multi) +
++                                      pos->u.multi.es_info_length;
++      }
++
++      *len = section_ext_length(&odsmt->head) - size;
++      return (uint8_t*) odsmt + size;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/pat_section.c dvb-apps/lib/libucsi/mpeg/pat_section.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/pat_section.c      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/pat_section.c    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,46 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <libucsi/mpeg/pat_section.h>
++
++struct mpeg_pat_section *mpeg_pat_section_codec(struct section_ext * ext)
++{
++      uint8_t *buf = (uint8_t *)ext;
++      size_t pos = sizeof(struct section_ext);
++      size_t len = section_ext_length(ext);
++
++      if (len < sizeof(struct mpeg_pat_section))
++              return NULL;
++
++      while (pos < len) {
++              if ((pos + 4) > len)
++                      return NULL;
++
++              bswap16(buf + pos);
++              bswap16(buf + pos + 2);
++              pos += 4;
++      }
++
++      if (pos != len)
++              return NULL;
++
++      return (struct mpeg_pat_section *)ext;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/pat_section.h dvb-apps/lib/libucsi/mpeg/pat_section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/pat_section.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/pat_section.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,118 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_PAT_SECTION_H
++#define _UCSI_MPEG_PAT_SECTION_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/section.h>
++
++/**
++ * mpeg_pat_section structure.
++ */
++struct mpeg_pat_section {
++      struct section_ext head; /* table_id_ext == transport_stream_id */
++
++      /* struct mpeg_pat_program programs[] */
++} __ucsi_packed;
++
++/**
++ * A program within an mpeg_pat_section.
++ */
++struct mpeg_pat_program {
++      uint16_t program_number;
++  EBIT2(uint16_t reserved     : 3; ,
++      uint16_t pid            :13; );
++} __ucsi_packed;
++
++/**
++ * Process an mpeg_pat_section.
++ *
++ * @param section Pointer to the generic section_ext structure.
++ * @return Pointer to the mpeg_pat_section structure, or NULL on error.
++ */
++extern struct mpeg_pat_section *mpeg_pat_section_codec(struct section_ext *section);
++
++/**
++ * Accessor for the transport_stream_id field of a PAT.
++ *
++ * @param pat PAT pointer.
++ * @return The transport_stream_id.
++ */
++static inline uint16_t mpeg_pat_section_transport_stream_id(struct mpeg_pat_section *pat)
++{
++      return pat->head.table_id_ext;
++}
++
++/**
++ * Conveience iterator for the programs field of an mpeg_pat_section.
++ *
++ * @param pat Pointer to the mpeg_pat_section structure.
++ * @param pos Variable holding a pointer to the current mpeg_pat_program structure.
++ */
++#define mpeg_pat_section_programs_for_each(pat, pos) \
++      for ((pos) = mpeg_pat_section_programs_first(pat); \
++           (pos); \
++           (pos) = mpeg_pat_section_programs_next(pat, pos))
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct mpeg_pat_program *
++      mpeg_pat_section_programs_first(struct mpeg_pat_section * pat)
++{
++      size_t pos = sizeof(struct mpeg_pat_section);
++
++      if (pos >= section_ext_length(&pat->head))
++              return NULL;
++
++      return (struct mpeg_pat_program*)((uint8_t *) pat + pos);
++}
++
++static inline
++      struct mpeg_pat_program *mpeg_pat_section_programs_next(struct mpeg_pat_section * pat,
++                                                              struct mpeg_pat_program * pos)
++{
++      uint8_t *end = (uint8_t*) pat + section_ext_length(&pat->head);
++      uint8_t *next= (uint8_t *) pos + sizeof(struct mpeg_pat_program);
++
++      if (next >= end)
++              return NULL;
++
++      return (struct mpeg_pat_program *) next;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/pmt_section.c dvb-apps/lib/libucsi/mpeg/pmt_section.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/pmt_section.c      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/pmt_section.c    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,71 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <libucsi/mpeg/pmt_section.h>
++
++struct mpeg_pmt_section * mpeg_pmt_section_codec(struct section_ext * ext)
++{
++      uint8_t * buf = (uint8_t *) ext;
++      struct mpeg_pmt_section * pmt = (struct mpeg_pmt_section *) ext;
++      size_t pos = sizeof(struct section_ext);
++      size_t len = section_ext_length(ext);
++
++      if (len < sizeof(struct mpeg_pmt_section))
++              return NULL;
++
++      bswap16(buf + pos);
++      pos += 2;
++      bswap16(buf + pos);
++      pos += 2;
++
++      if ((pos + pmt->program_info_length) > len)
++              return NULL;
++
++      if (verify_descriptors(buf + pos, pmt->program_info_length))
++              return NULL;
++
++      pos += pmt->program_info_length;
++
++      while (pos < len) {
++              struct mpeg_pmt_stream * stream =
++                      (struct mpeg_pmt_stream *) (buf + pos);
++
++              if ((pos + sizeof(struct mpeg_pmt_stream)) > len)
++                      return NULL;
++
++              bswap16(buf + pos + 1);
++              bswap16(buf + pos + 3);
++              pos += sizeof(struct mpeg_pmt_stream);
++
++              if ((pos + stream->es_info_length) > len)
++                      return NULL;
++
++              if (verify_descriptors(buf + pos, stream->es_info_length))
++                      return NULL;
++
++              pos += stream->es_info_length;
++      }
++
++      if (pos != len)
++              return NULL;
++
++      return (struct mpeg_pmt_section *) ext;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/pmt_section.h dvb-apps/lib/libucsi/mpeg/pmt_section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/pmt_section.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/pmt_section.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,188 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_PMT_SECTION_H
++#define _UCSI_MPEG_PMT_SECTION_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/section.h>
++
++/**
++ * mpeg_pmt_section structure.
++ */
++struct mpeg_pmt_section {
++      struct section_ext head;
++
++  EBIT2(uint16_t reserved_1           : 3; ,
++      uint16_t pcr_pid                :13; );
++  EBIT2(uint16_t reserved_2           : 4; ,
++      uint16_t program_info_length    :12; );
++      /* struct descriptor descriptors[] */
++      /* struct mpeg_pmt_stream streams[] */
++} __ucsi_packed;
++
++/**
++ * A stream within an mpeg_pmt_section.
++ */
++struct mpeg_pmt_stream {
++      uint8_t stream_type;
++  EBIT2(uint16_t reserved_1           : 3; ,
++      uint16_t pid                    :13; );
++  EBIT2(uint16_t reserved_2           : 4; ,
++      uint16_t es_info_length         :12; );
++
++      /* struct descriptor descriptors[] */
++} __ucsi_packed;
++
++/**
++ * Process an mpeg_pmt_section section.
++ *
++ * @param section Pointer to the generic section header.
++ * @return Pointer to the mpeg_pmt_section structure, or NULL on error.
++ */
++extern struct mpeg_pmt_section *mpeg_pmt_section_codec(struct section_ext *section);
++
++/**
++ * Accessor for program_number field of a PMT.
++ *
++ * @param pmt PMT pointer.
++ * @return The program_number.
++ */
++static inline uint16_t mpeg_pmt_section_program_number(struct mpeg_pmt_section *pmt)
++{
++      return pmt->head.table_id_ext;
++}
++
++/**
++ * Convenience iterator for the descriptors field of the mpeg_pmt_section structure.
++ *
++ * @param pmt Pointer to the mpeg_pmt_section structure.
++ * @param pos Variable holding a pointer to the current descriptor.
++ */
++#define mpeg_pmt_section_descriptors_for_each(pmt, pos) \
++      for ((pos) = mpeg_pmt_section_descriptors_first(pmt); \
++           (pos); \
++           (pos) = mpeg_pmt_section_descriptors_next(pmt, pos))
++
++/**
++ * Convenience iterator for the streams field of the mpeg_pmt_section structure.
++ *
++ * @param pmt Pointer to the mpeg_pmt_section structure.
++ * @param pos Variable holding a pointer to the current mpeg_pmt_stream.
++ */
++#define mpeg_pmt_section_streams_for_each(pmt, pos) \
++      for ((pos) = mpeg_pmt_section_streams_first(pmt); \
++           (pos); \
++           (pos) = mpeg_pmt_section_streams_next(pmt, pos))
++
++/**
++ * Convenience iterator for the descriptors field of an mpeg_pmt_stream structure.
++ *
++ * @param stream Pointer to the mpeg_pmt_stream structure.
++ * @param pos Variable holding a pointer to the current descriptor.
++ */
++#define mpeg_pmt_stream_descriptors_for_each(stream, pos) \
++      for ((pos) = mpeg_pmt_stream_descriptors_first(stream); \
++           (pos); \
++           (pos) = mpeg_pmt_stream_descriptors_next(stream, pos))
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct descriptor *
++      mpeg_pmt_section_descriptors_first(struct mpeg_pmt_section * pmt)
++{
++      if (pmt->program_info_length == 0)
++              return NULL;
++
++      return (struct descriptor *)
++              ((uint8_t *) pmt + sizeof(struct mpeg_pmt_section));
++}
++
++static inline struct descriptor *
++      mpeg_pmt_section_descriptors_next(struct mpeg_pmt_section *pmt,
++                                        struct descriptor* pos)
++{
++      return next_descriptor((uint8_t *) pmt + sizeof(struct mpeg_pmt_section),
++                             pmt->program_info_length,
++                             pos);
++}
++
++static inline struct mpeg_pmt_stream *
++      mpeg_pmt_section_streams_first(struct mpeg_pmt_section * pmt)
++{
++      size_t pos = sizeof(struct mpeg_pmt_section) + pmt->program_info_length;
++
++      if (pos >= section_ext_length(&pmt->head))
++              return NULL;
++
++      return (struct mpeg_pmt_stream *)((uint8_t *)pmt + pos);
++}
++
++static inline struct mpeg_pmt_stream *
++      mpeg_pmt_section_streams_next(struct mpeg_pmt_section * pmt,
++                                    struct mpeg_pmt_stream * pos)
++{
++      uint8_t *end = (uint8_t*) pmt + section_ext_length(&pmt->head);
++      uint8_t *next = (uint8_t *) pos + sizeof(struct mpeg_pmt_stream) +
++                      pos->es_info_length;
++
++      if (next >= end)
++              return NULL;
++
++      return (struct mpeg_pmt_stream *) next;
++}
++
++static inline struct descriptor *
++      mpeg_pmt_stream_descriptors_first(struct mpeg_pmt_stream *stream)
++{
++      if (stream->es_info_length == 0)
++              return NULL;
++
++      return (struct descriptor *)
++              ((uint8_t*) stream + sizeof(struct mpeg_pmt_stream));
++}
++
++static inline struct descriptor *
++      mpeg_pmt_stream_descriptors_next(struct mpeg_pmt_stream *stream,
++                                       struct descriptor* pos)
++{
++      return next_descriptor((uint8_t *) stream + sizeof(struct mpeg_pmt_stream),
++                             stream->es_info_length,
++                             pos);
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/private_data_indicator_descriptor.h dvb-apps/lib/libucsi/mpeg/private_data_indicator_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/private_data_indicator_descriptor.h        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/private_data_indicator_descriptor.h      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,63 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_PRIVATE_DATA_INDICATOR_DESCRIPTOR
++#define _UCSI_MPEG_PRIVATE_DATA_INDICATOR_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * mpeg_private_data_indicator_descriptor structure
++ */
++struct mpeg_private_data_indicator_descriptor {
++      struct descriptor d;
++
++      uint32_t private_data_indicator;
++} __ucsi_packed;
++
++/**
++ * Process an mpeg_private_data_indicator_descriptor structure.
++ *
++ * @param d Pointer to the generic descriptor structure.
++ * @return Pointer to the mpeg_private_data_indicator_descriptor, or NULL on error.
++ */
++static inline struct mpeg_private_data_indicator_descriptor*
++      mpeg_private_data_indicator_descriptor_codec(struct descriptor* d)
++{
++      if (d->len != (sizeof(struct mpeg_private_data_indicator_descriptor) - 2))
++              return NULL;
++
++      bswap32((uint8_t*) d + 2);
++
++      return (struct mpeg_private_data_indicator_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/registration_descriptor.h dvb-apps/lib/libucsi/mpeg/registration_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/registration_descriptor.h  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/registration_descriptor.h        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,91 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_REGISTRATION_DESCRIPTOR
++#define _UCSI_MPEG_REGISTRATION_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * mpeg_registration_descriptor structure.
++ */
++struct mpeg_registration_descriptor {
++      struct descriptor d;
++
++      uint32_t format_identifier;
++      /* uint8_t additional_id_info[] */
++} __ucsi_packed;
++
++/**
++ * Process an mpeg_registration_descriptor.
++ *
++ * @param d Pointer to the generic descriptor structure.
++ * @return Pointer to the mpeg_registration_descriptor structure, or NULL on error.
++ */
++static inline struct mpeg_registration_descriptor*
++      mpeg_registration_descriptor_codec(struct descriptor* d)
++{
++      if (d->len < (sizeof(struct mpeg_registration_descriptor) - 2))
++              return NULL;
++
++      bswap32((uint8_t*) d + 2);
++
++      return (struct mpeg_registration_descriptor*) d;
++}
++
++/**
++ * Retrieve a pointer to the additional_id_info field of the
++ * mpeg_registration_descriptor structure.
++ *
++ * @param d Pointer to the mpeg_registration_descriptor structure.
++ * @return Pointer to the field.
++ */
++static inline uint8_t *
++      mpeg_registration_descriptor_additional_id_info(struct mpeg_registration_descriptor *d)
++{
++      return (uint8_t *) d + sizeof(struct mpeg_registration_descriptor);
++}
++
++/**
++ * Determine number of bytes in the additional_id_info field of the
++ * mpeg_registration_descriptor structure.
++ *
++ * @param d Pointer to the mpeg_registration_descriptor structure.
++ * @return Number of bytes.
++ */
++
++static inline int
++      mpeg_registration_descriptor_additional_id_info_length(struct mpeg_registration_descriptor *d)
++{
++      return d->d.len - 4;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/section.h dvb-apps/lib/libucsi/mpeg/section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/section.h  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/section.h        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,60 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_SECTION_H
++#define _UCSI_MPEG_SECTION_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/mpeg/cat_section.h>
++#include <libucsi/mpeg/odsmt_section.h>
++#include <libucsi/mpeg/pat_section.h>
++#include <libucsi/mpeg/pmt_section.h>
++#include <libucsi/mpeg/tsdt_section.h>
++#include <libucsi/mpeg/metadata_section.h>
++#include <libucsi/mpeg/datagram_section.h>
++
++#define TRANSPORT_PAT_PID 0x00
++#define TRANSPORT_CAT_PID 0x01
++#define TRANSPORT_TSDT_PID 0x02
++
++/**
++ * Enumeration of MPEG section tags.
++ */
++enum mpeg_section_tag {
++      stag_mpeg_program_association                   = 0x00,
++      stag_mpeg_conditional_access                    = 0x01,
++      stag_mpeg_program_map                           = 0x02,
++      stag_mpeg_transport_stream_description          = 0x03,
++      stag_mpeg_iso14496_scene_description            = 0x04,
++      stag_mpeg_iso14496_object_description           = 0x05,
++      stag_mpeg_metadata                              = 0x06,
++      stag_mpeg_datagram                              = 0x3e,
++};
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/sl_descriptor.h dvb-apps/lib/libucsi/mpeg/sl_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/sl_descriptor.h    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/sl_descriptor.h  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,63 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_SL_DESCRIPTOR
++#define _UCSI_MPEG_SL_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * mpeg_sl_descriptor structure.
++ */
++struct mpeg_sl_descriptor {
++      struct descriptor d;
++
++      uint16_t es_id;
++} __ucsi_packed;
++
++/**
++ * Process an mpeg_sl_descriptor.
++ *
++ * @param d The generic descriptor structure.
++ * @return Pointer to an mpeg_sl_descriptor structure, or NULL on error.
++ */
++static inline struct mpeg_sl_descriptor*
++      mpeg_sl_descriptor_codec(struct descriptor* d)
++{
++      if (d->len != (sizeof(struct mpeg_sl_descriptor) - 2))
++              return NULL;
++
++      bswap16((uint8_t*) d + 2);
++
++      return (struct mpeg_sl_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/smoothing_buffer_descriptor.h dvb-apps/lib/libucsi/mpeg/smoothing_buffer_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/smoothing_buffer_descriptor.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/smoothing_buffer_descriptor.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,66 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_SMOOTHING_BUFFER_DESCRIPTOR
++#define _UCSI_MPEG_SMOOTHING_BUFFER_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * mpeg_smoothing_buffer_descriptor structure.
++ */
++struct mpeg_smoothing_buffer_descriptor {
++      struct descriptor d;
++
++  EBIT4(uint64_t reserved_1           : 2; ,
++      uint64_t sb_leak_rate           :22; ,
++      uint64_t reserved_2             : 2; ,
++      uint64_t sb_size                :22; );
++} __ucsi_packed;
++
++/**
++ * Process an mpeg_smoothing_buffer_descriptor.
++ *
++ * @param d The generic descriptor structure.
++ * @return Pointer to mpeg_smoothing_buffer_descriptor, or NULL on error.
++ */
++static inline struct mpeg_smoothing_buffer_descriptor*
++      mpeg_smoothing_buffer_descriptor_codec(struct descriptor* d)
++{
++      if (d->len != (sizeof(struct mpeg_smoothing_buffer_descriptor) - 2))
++              return NULL;
++
++      bswap48((uint8_t*) d + 2);
++
++      return (struct mpeg_smoothing_buffer_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/std_descriptor.h dvb-apps/lib/libucsi/mpeg/std_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/std_descriptor.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/std_descriptor.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,62 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_STD_DESCRIPTOR
++#define _UCSI_MPEG_STD_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * mpeg_std_descriptor structure.
++ */
++struct mpeg_std_descriptor {
++      struct descriptor d;
++
++  EBIT2(uint8_t reserved      : 7; ,
++      uint8_t leak_valid_flag : 1; );
++} __ucsi_packed;
++
++/**
++ * Process an mpeg_std_descriptor.
++ *
++ * @param d Pointer to the generic descriptor structure.
++ * @return Pointer to the mpeg_std_descriptor, or NULL on error.
++ */
++static inline struct mpeg_std_descriptor*
++      mpeg_std_descriptor_codec(struct descriptor* d)
++{
++      if (d->len != (sizeof(struct mpeg_std_descriptor) - 2))
++              return NULL;
++
++      return (struct mpeg_std_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/system_clock_descriptor.h dvb-apps/lib/libucsi/mpeg/system_clock_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/system_clock_descriptor.h  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/system_clock_descriptor.h        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,65 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_SYSTEM_CLOCK_DESCRIPTOR
++#define _UCSI_MPEG_SYSTEM_CLOCK_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * mpeg_system_clock_descriptor structure.
++ */
++struct mpeg_system_clock_descriptor {
++      struct descriptor d;
++
++  EBIT3(uint8_t external_clock_reference_indicator    : 1; ,
++      uint8_t reserved_1                              : 1; ,
++      uint8_t clock_accuracy_integer                  : 6; );
++  EBIT2(uint8_t clock_accuracy_exponent                       : 3; ,
++      uint8_t reserved_2                              : 5; );
++} __ucsi_packed;
++
++/**
++ * Process an mpeg_system_clock_descriptor.
++ *
++ * @param d The generic descriptor structure.
++ * @return Pointer to a mpeg_system_clock_descriptor structure, or NULL on error.
++ */
++static inline struct mpeg_system_clock_descriptor*
++      mpeg_system_clock_descriptor_codec(struct descriptor* d)
++{
++      if (d->len != (sizeof(struct mpeg_system_clock_descriptor) - 2))
++              return NULL;
++
++      return (struct mpeg_system_clock_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/target_background_grid_descriptor.h dvb-apps/lib/libucsi/mpeg/target_background_grid_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/target_background_grid_descriptor.h        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/target_background_grid_descriptor.h      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,66 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_TARGET_BACKGROUND_GRID_DESCRIPTOR
++#define _UCSI_MPEG_TARGET_BACKGROUND_GRID_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * mpeg_target_background_grid_descriptor structure.
++ */
++struct mpeg_target_background_grid_descriptor {
++      struct descriptor d;
++
++  EBIT3(uint32_t horizontal_size              : 14; ,
++      uint32_t vertical_size                  : 14; ,
++      uint32_t aspect_ratio_information       : 4;  );
++} __ucsi_packed;
++
++/**
++ * Process an mpeg_target_background_grid_descriptor structure.
++ *
++ * @param d Pointer to the generic descriptor structure.
++ * @return Pointer to the mpeg_target_background_grid_descriptor structure, or
++ * NULL on error.
++ */
++static inline struct mpeg_target_background_grid_descriptor*
++      mpeg_target_background_grid_descriptor_codec(struct descriptor* d)
++{
++      if (d->len != (sizeof(struct mpeg_target_background_grid_descriptor) - 2))
++              return NULL;
++
++      bswap32((uint8_t*) d + 2);
++
++      return (struct mpeg_target_background_grid_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/tsdt_section.c dvb-apps/lib/libucsi/mpeg/tsdt_section.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/tsdt_section.c     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/tsdt_section.c   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,34 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <libucsi/mpeg/tsdt_section.h>
++
++struct mpeg_tsdt_section * mpeg_tsdt_section_codec(struct section_ext * ext)
++{
++      uint8_t * buf = (uint8_t *)ext;
++      size_t pos = sizeof(struct section_ext);
++
++      if (verify_descriptors(buf + pos,
++          section_ext_length(ext) - sizeof(struct mpeg_tsdt_section)))
++              return NULL;
++
++      return (struct mpeg_tsdt_section *)ext;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/tsdt_section.h dvb-apps/lib/libucsi/mpeg/tsdt_section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/tsdt_section.h     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/tsdt_section.h   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,94 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_TSDT_SECTION_H
++#define _UCSI_MPEG_TSDT_SECTION_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/section.h>
++
++/**
++ * mpeg_tsdt_section structure.
++ */
++struct mpeg_tsdt_section {
++      struct section_ext head;
++
++      /* struct descriptor descriptors[] */
++} __ucsi_packed;
++
++/**
++ * Process an mpeg_tsdt_section structure.
++ *
++ * @param section Pointer to the section_ext structure.
++ * @return Pointer to the mpeg_tsdt_section structure, or NULL on error.
++ */
++extern struct mpeg_tsdt_section *mpeg_tsdt_section_codec(struct section_ext *section);
++
++/**
++ * Convenience iterator for descriptors field.
++ *
++ * @param tsdt Pointer to the mpeg_tsdt_section structure.
++ * @param pos Variable holding a pointer to the current descriptor.
++ */
++#define mpeg_tsdt_section_descriptors_for_each(tsdt, pos) \
++      for ((pos) = mpeg_tsdt_section_descriptors_first(tsdt); \
++           (pos); \
++           (pos) = mpeg_tsdt_section_descriptors_next(tsdt, pos))
++
++
++
++
++
++
++
++
++
++
++/******************************** PRIVATE CODE ********************************/
++static inline struct descriptor *
++      mpeg_tsdt_section_descriptors_first(struct mpeg_tsdt_section * tsdt)
++{
++      size_t pos = sizeof(struct mpeg_tsdt_section);
++
++      if (pos >= section_ext_length(&tsdt->head))
++              return NULL;
++
++      return (struct descriptor*)((uint8_t *) tsdt + pos);
++}
++
++static inline struct descriptor *
++      mpeg_tsdt_section_descriptors_next(struct mpeg_tsdt_section *tsdt,
++                                         struct descriptor* pos)
++{
++      return next_descriptor((uint8_t *) tsdt + sizeof(struct mpeg_tsdt_section),
++                            section_ext_length(&tsdt->head) - sizeof(struct mpeg_tsdt_section),
++                            pos);
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/types.h dvb-apps/lib/libucsi/mpeg/types.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/types.h    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/types.h  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,127 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_TYPES_H
++#define _UCSI_MPEG_TYPES_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++/**
++ * Known stream types.
++ */
++enum {
++      MPEG_STREAM_TYPE_ISO11172_VIDEO    = 0x01,
++      MPEG_STREAM_TYPE_ISO13818_2_VIDEO    = 0x02,
++      MPEG_STREAM_TYPE_ISO11172_AUDIO    = 0x03,
++      MPEG_STREAM_TYPE_ISO13818_3_AUDIO    = 0x04,
++      MPEG_STREAM_TYPE_ISO13818_1_PRIVATE_SECTIONS = 0x05,
++      MPEG_STREAM_TYPE_ISO13818_1_PRIVATE_PES  = 0x06,
++      MPEG_STREAM_TYPE_ISO13522_MHEG     = 0x07,
++      MPEG_STREAM_TYPE_ISO13818_DSMCC    = 0x08,
++      MPEG_STREAM_TYPE_ITUH222_1     = 0x09,
++      MPEG_STREAM_TYPE_ISO13818_6_A    = 0x0a,
++      MPEG_STREAM_TYPE_ISO13818_6_B    = 0x0b,
++      MPEG_STREAM_TYPE_ISO13818_6_C    = 0x0c,
++      MPEG_STREAM_TYPE_ISO13818_6_D    = 0x0d,
++      MPEG_STREAM_TYPE_ISO13818_1_AUX    = 0x0e,
++      MPEG_STREAM_TYPE_ISO13818_7_AUDIO_ADTS = 0x0f,
++      MPEG_STREAM_TYPE_ISO14496_2_VISUAL   = 0x10,
++      MPEG_STREAM_TYPE_ISO14496_3_AUDIO_LATM = 0x11,
++      MPEG_STREAM_TYPE_ISO14496_1_PES    = 0x12,
++      MPEG_STREAM_TYPE_ISO14496_1_SECTIONS   = 0x13,
++      MPEG_STREAM_TYPE_ISO14496_6_SYNCDOWNLOAD = 0x14,
++      MPEG_STREAM_TYPE_METADATA_PES    = 0x15,
++      MPEG_STREAM_TYPE_METADATA_SECTIONS   = 0x16,
++      MPEG_STREAM_TYPE_METADATA_DSMCC_DATA   = 0x17,
++      MPEG_STREAM_TYPE_METADATA_DSMCC_OBJECT = 0x18,
++      MPEG_STREAM_TYPE_METADATA_SYNCDOWNLOAD = 0x19,
++};
++
++/**
++ * Metadata formats
++ */
++enum {
++      MPEG_METADATA_FORMAT_ISO15938_1_TEM                             = 0x01,
++      MPEG_METADATA_FORMAT_ISO15938_1_BIM                             = 0x02,
++      MPEG_METADATA_FORMAT_METADATA_APPLICATION_FORMAT                = 0x3F,
++      MPEG_METADATA_FORMAT_METADATA_APPLICATION_FORMAT_ID             = 0xFF,
++};
++
++/**
++ * MPEG 4 audio profile and levels.
++ */
++enum {
++      MPEG4_AUDIO_PROFILE_MAIN_LEVEL_1                = 0x10,
++      MPEG4_AUDIO_PROFILE_MAIN_LEVEL_2                = 0x11,
++      MPEG4_AUDIO_PROFILE_MAIN_LEVEL_3                = 0x12,
++      MPEG4_AUDIO_PROFILE_MAIN_LEVEL_4                = 0x13,
++
++      MPEG4_AUDIO_PROFILE_SCALABLE_LEVEL_1            = 0x18,
++      MPEG4_AUDIO_PROFILE_SCALABLE_LEVEL_2            = 0x19,
++      MPEG4_AUDIO_PROFILE_SCALABLE_LEVEL_3            = 0x1a,
++      MPEG4_AUDIO_PROFILE_SCALABLE_LEVEL_4            = 0x1b,
++
++      MPEG4_AUDIO_PROFILE_SPEECH_LEVEL_1              = 0x20,
++      MPEG4_AUDIO_PROFILE_SPEECH_LEVEL_2              = 0x21,
++
++      MPEG4_AUDIO_PROFILE_SYNTHESIS_LEVEL_1           = 0x28,
++      MPEG4_AUDIO_PROFILE_SYNTHESIS_LEVEL_2           = 0x29,
++      MPEG4_AUDIO_PROFILE_SYNTHESIS_LEVEL_3           = 0x2a,
++
++      MPEG4_AUDIO_PROFILE_HQ_LEVEL_1                  = 0x30,
++      MPEG4_AUDIO_PROFILE_HQ_LEVEL_2                  = 0x31,
++      MPEG4_AUDIO_PROFILE_HQ_LEVEL_3                  = 0x32,
++      MPEG4_AUDIO_PROFILE_HQ_LEVEL_4                  = 0x33,
++      MPEG4_AUDIO_PROFILE_HQ_LEVEL_5                  = 0x34,
++      MPEG4_AUDIO_PROFILE_HQ_LEVEL_6                  = 0x35,
++      MPEG4_AUDIO_PROFILE_HQ_LEVEL_7                  = 0x36,
++      MPEG4_AUDIO_PROFILE_HQ_LEVEL_8                  = 0x37,
++
++      MPEG4_AUDIO_PROFILE_LOW_DELAY_LEVEL_1           = 0x38,
++      MPEG4_AUDIO_PROFILE_LOW_DELAY_LEVEL_2           = 0x39,
++      MPEG4_AUDIO_PROFILE_LOW_DELAY_LEVEL_3           = 0x3a,
++      MPEG4_AUDIO_PROFILE_LOW_DELAY_LEVEL_4           = 0x3b,
++      MPEG4_AUDIO_PROFILE_LOW_DELAY_LEVEL_5           = 0x3c,
++      MPEG4_AUDIO_PROFILE_LOW_DELAY_LEVEL_6           = 0x3d,
++      MPEG4_AUDIO_PROFILE_LOW_DELAY_LEVEL_7           = 0x3e,
++      MPEG4_AUDIO_PROFILE_LOW_DELAY_LEVEL_8           = 0x3f,
++
++      MPEG4_AUDIO_PROFILE_NATURAL_LEVEL_1             = 0x40,
++      MPEG4_AUDIO_PROFILE_NATURAL_LEVEL_2             = 0x41,
++      MPEG4_AUDIO_PROFILE_NATURAL_LEVEL_3             = 0x42,
++      MPEG4_AUDIO_PROFILE_NATURAL_LEVEL_4             = 0x43,
++
++      MPEG4_AUDIO_PROFILE_MOBILE_LEVEL_1              = 0x48,
++      MPEG4_AUDIO_PROFILE_MOBILE_LEVEL_2              = 0x49,
++      MPEG4_AUDIO_PROFILE_MOBILE_LEVEL_3              = 0x4a,
++      MPEG4_AUDIO_PROFILE_MOBILE_LEVEL_4              = 0x4b,
++      MPEG4_AUDIO_PROFILE_MOBILE_LEVEL_5              = 0x4c,
++      MPEG4_AUDIO_PROFILE_MOBILE_LEVEL_6              = 0x4d,
++};
++
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/video_stream_descriptor.h dvb-apps/lib/libucsi/mpeg/video_stream_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/video_stream_descriptor.h  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/video_stream_descriptor.h        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,101 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_VIDEO_STREAM_DESCRIPTOR
++#define _UCSI_MPEG_VIDEO_STREAM_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++#include <libucsi/endianops.h>
++
++/**
++ * The mpeg_video_stream_descriptor structure
++ */
++struct mpeg_video_stream_descriptor {
++      struct descriptor d;
++
++  EBIT5(uint8_t multiple_frame_rate_flag      : 1; ,
++      uint8_t frame_rate_code                 : 4; ,
++      uint8_t mpeg_1_only_flag                : 1; ,
++      uint8_t constrained_parameter_flag      : 1; ,
++      uint8_t still_picture_flag              : 1; );
++      /* if (mpeg_1_only_flag == 0) struct mpeg_video_stream_extra extra */
++} __ucsi_packed;
++
++/**
++ * The mpeg_video_stream_extra - only present in non-MPEG1-only streams.
++ */
++struct mpeg_video_stream_extra {
++      uint8_t profile_and_level_indication;
++  EBIT3(uint8_t chroma_format                 : 2; ,
++      uint8_t frame_rate_extension            : 1; ,
++      uint8_t reserved                        : 5; );
++} __ucsi_packed;
++
++/**
++ * Process an mpeg_video_stream_descriptor structure.
++ *
++ * @param d Pointer to the generic descriptor structure.
++ * @return Pointer to the mpeg_video_stream_descriptor, or NULL on error.
++ */
++static inline struct mpeg_video_stream_descriptor*
++      mpeg_video_stream_descriptor_codec(struct descriptor* d)
++{
++      struct mpeg_video_stream_descriptor* vsd =
++                      (struct mpeg_video_stream_descriptor*) d;
++
++      if (d->len < (sizeof(struct mpeg_video_stream_descriptor) - 2))
++              return NULL;
++
++      if (!vsd->mpeg_1_only_flag) {
++              if (d->len != (sizeof(struct mpeg_video_stream_descriptor) +
++                                sizeof(struct mpeg_video_stream_extra) - 2))
++                      return NULL;
++      }
++
++      return (struct mpeg_video_stream_descriptor*) d;
++}
++
++/**
++ * Get a pointer to the mpeg_video_stream_extra structure.
++ *
++ * @param d Pointer to the mpeg_video_stream_descriptor structure.
++ * @return Pointer to the mpeg_video_stream_extra structure, or NULL on error.
++ */
++static inline struct mpeg_video_stream_extra*
++      mpeg_video_stream_descriptor_extra(struct mpeg_video_stream_descriptor* d)
++{
++      if (d->mpeg_1_only_flag != 0)
++              return NULL;
++
++      return (struct mpeg_video_stream_extra*)
++              ((uint8_t*) d + sizeof(struct mpeg_video_stream_descriptor));
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/video_window_descriptor.h dvb-apps/lib/libucsi/mpeg/video_window_descriptor.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/mpeg/video_window_descriptor.h  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/mpeg/video_window_descriptor.h        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,64 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_MPEG_VIDEO_WINDOW_DESCRIPTOR
++#define _UCSI_MPEG_VIDEO_WINDOW_DESCRIPTOR 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/descriptor.h>
++
++/**
++ * mpeg_video_window_descriptor structure.
++ */
++struct mpeg_video_window_descriptor {
++      struct descriptor d;
++
++  EBIT3(uint32_t horizontal_offset            : 14; ,
++      uint32_t vertical_offset                : 14; ,
++      uint32_t window_priority                : 4;  );
++} __ucsi_packed;
++
++/**
++ * Process an mpeg_video_window_descriptor.
++ *
++ * @param d Pointer to the generic descriptor structure.
++ * @return Pointer to the mpeg_video_window_descriptor structure, or NULL on error.
++ */
++static inline struct mpeg_video_window_descriptor*
++      mpeg_video_window_descriptor_codec(struct descriptor* d)
++{
++      if (d->len != (sizeof(struct mpeg_video_window_descriptor) - 2))
++              return NULL;
++
++      bswap32((uint8_t*) d + 2);
++
++      return (struct mpeg_video_window_descriptor*) d;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/section_buf.c dvb-apps/lib/libucsi/section_buf.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/section_buf.c   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/section_buf.c 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,173 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <errno.h>
++#include <string.h>
++#include "section_buf.h"
++
++#define SECTION_HDR_SIZE 3
++#define SECTION_PAD 0xff
++
++int section_buf_init(struct section_buf *section, int max)
++{
++      if (max < SECTION_HDR_SIZE)
++              return -EINVAL;
++
++      memset(section, 0, sizeof(struct section_buf));
++      section->max = max; /* max size of data */
++      section->len = SECTION_HDR_SIZE;
++      section->wait_pdu = 1;
++
++      return 0;
++}
++
++int section_buf_add(struct section_buf *section, uint8_t* frag, int len, int *section_status)
++{
++      int copy;
++      int used = 0;
++      uint8_t *data;
++      uint8_t *pos = (uint8_t*) section + sizeof(struct section_buf) + section->count;
++
++      /* have we finished? */
++      if (section->header && (section->len == section->count)) {
++              *section_status = 1;
++              return 0;
++      }
++
++      /* skip over section padding bytes */
++      *section_status = 0;
++      if (section->count == 0) {
++              while(len && (*frag == SECTION_PAD)) {
++                      frag++;
++                      len--;
++                      used++;
++              }
++
++              if (len == 0)
++                      return used;
++      }
++
++      /* grab the header to get the section length */
++      if (!section->header) {
++              /* copy the header frag */
++              copy = SECTION_HDR_SIZE - section->count;
++              if (copy > len)
++                      copy = len;
++              memcpy(pos, frag, copy);
++              section->count += copy;
++              pos += copy;
++              frag += copy;
++              used += copy;
++              len -= copy;
++
++              /* we need 3 bytes for the section header */
++              if (section->count != SECTION_HDR_SIZE)
++                      return used;
++
++              /* work out the length & check it isn't too big */
++              data = (uint8_t*) section + sizeof(struct section_buf);
++              section->len = SECTION_HDR_SIZE + (((data[1] & 0x0f) << 8) | data[2]);
++              if (section->len > section->max) {
++                      *section_status = -ERANGE;
++                      return len + used;
++              }
++
++              /* update fields */
++              section->header = 1;
++      }
++
++      /* accumulate frag */
++      copy = section->len - section->count;
++      if (copy > len)
++              copy = len;
++      memcpy(pos, frag, copy);
++      section->count += copy;
++      used += copy;
++
++      /* have we finished? */
++      if (section->header && (section->len == section->count))
++              *section_status = 1;
++
++      /* return number of bytes used */
++      return used;
++}
++
++int section_buf_add_transport_payload(struct section_buf *section,
++                                    uint8_t* payload, int len,
++                                    int pdu_start, int *section_status)
++{
++      int used = 0;
++      int tmp;
++
++      /* have we finished? */
++      if (section->header && (section->len == section->count)) {
++              *section_status = 1;
++              return 0;
++      }
++
++      /* don't bother if we're waiting for a PDU */
++      *section_status = 0;
++      if (section->wait_pdu && (!pdu_start))
++              return len;
++
++      /* if we're at a PDU start, we need extra handling for the extra first
++       * byte giving the offset to the start of the next section. */
++      if (pdu_start) {
++              /* we have received a pdu */
++              section->wait_pdu = 0;
++
++              /* work out the offset to the _next_ payload */
++              int offset = payload[0];
++              if ((offset+1) > len) {
++                      section->wait_pdu = 1;
++                      *section_status = -EINVAL;
++                      return len;
++              }
++
++              /* accumulate the end if we need to */
++              if (section->count != 0) {
++                      /* add the final fragment. */
++                      tmp = section_buf_add(section, payload + 1, offset, section_status);
++
++                      /* the stream said this was the final fragment
++                       * (PDU START bit) - check that it really was! */
++                      if ((tmp != offset) || section_buf_remaining(section) || (*section_status != 1)) {
++                              *section_status = -ERANGE;
++                              section->wait_pdu = 1;
++                              return 1 + tmp;
++                      }
++
++                      /* it is complete - return the number of bytes we used */
++                      return 1 + tmp;
++              }
++
++              /* otherwise, we skip the end of the previous section, and
++               * start accumulating the new data. */
++              used = 1 + offset;
++      }
++
++      /* ok, just accumulate the data as normal */
++      tmp = section_buf_add(section, payload+used, len - used, section_status);
++      if (*section_status < 0) {
++              section->wait_pdu = 1;
++      }
++
++      return used + tmp;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/section_buf.h dvb-apps/lib/libucsi/section_buf.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/section_buf.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/section_buf.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,124 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_SECTION_BUF_H
++#define _UCSI_SECTION_BUF_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <stdint.h>
++
++#define DVB_MAX_SECTION_BYTES 4096
++
++/**
++ * Buffer used to keep track of  section fragments. You should allocate an
++ * area of memory of size (sizeof(section_buf) + <maxsectionsize>), and pass that area
++ * to section_buf_init() to set it up.
++ */
++struct section_buf {
++      uint32_t max;      /* maximum size of section - setup by section_buf_init() */
++      uint32_t count;    /* number of bytes currently accumulated */
++      uint32_t len;      /* total number of bytes expected in the complete section */
++      uint8_t header:1;  /* flag indicating the section header has been commpletely received */
++      uint8_t wait_pdu:1;/* flag indicating to wait till the next PDU start */
++      /* uint8_t data[] */
++};
++
++/**
++ * Initialise a section_buf structure.
++ *
++ * @param section The section_buf to initialise.
++ * @param max Maximum number of bytes in section (must be > 3)
++ * @return 0 on success, nonzero on error.
++ */
++extern int section_buf_init(struct section_buf *section, int max);
++
++/**
++ * Reset a section_buf structure (e.g. if a discontinuity occurred). The
++ * section_buf will wait for the first PDU start indicator.
++ *
++ * @param section The section_buf to reset.
++ */
++static inline void section_buf_reset(struct section_buf *section)
++{
++      int tmp = section->wait_pdu;
++      section_buf_init(section, section->max);
++      section->wait_pdu = tmp;
++}
++
++/**
++ * Add a data fragment to a section_buf.
++ *
++ * @param section section_buf to add to.
++ * @param frag Pointer to data fragment.
++ * @param len Number of bytes of data.
++ * @param section_status 0: nothing special. 1: section complete. -ERANGE indicates that the
++ * section is larger than section->max.
++ * @return Number of bytes which were consumed.
++ */
++extern int section_buf_add(struct section_buf *section, uint8_t* frag, int len, int *section_status);
++
++/**
++ * Add a transport packet PSI payload to a section_buf. This takes into account
++ * the extra byte present in PDU_START flagged packets.
++ *
++ * @param section section_buf to add to.
++ * @param payload Pointer to packet payload data.
++ * @param len Number of bytes of data.
++ * @param pdu_start True if the payload_unit_start_indicator flag was set in the
++ * TS packet.
++ * @param section_status 0: nothing special. 1: section complete. -ERANGE indicates that the
++ * section is larger than section->max. -EINVAL indicates the pointer_field was completely
++ * invalid (too large).
++ */
++extern int section_buf_add_transport_payload(struct section_buf *section,
++                                           uint8_t* payload, int len,
++                                           int pdu_start, int *section_status);
++
++/**
++ * Get the number of bytes left to be received in a section_buf.
++ *
++ * @param section The section_buf concerned.
++ * @return The number of bytes.
++ */
++static inline int section_buf_remaining(struct section_buf *section)
++{
++      return section->len - section->count;
++}
++
++/**
++ * Return a pointer to the start of the data in the section_buf.
++ *
++ * @param section The section_buf concerned.
++ * @return The data.
++ */
++static inline uint8_t* section_buf_data(struct section_buf *section)
++{
++      return (uint8_t*) section + sizeof(struct section_buf);
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/section.h dvb-apps/lib/libucsi/section.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/section.h       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/section.h     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,253 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_SECTION_H
++#define _UCSI_SECTION_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <libucsi/endianops.h>
++#include <libucsi/descriptor.h>
++#include <libucsi/crc32.h>
++#include <stdint.h>
++#include <string.h>
++
++#define CRC_SIZE 4
++
++
++/**
++ * Generic section header.
++ */
++struct section {
++      uint8_t table_id;
++  EBIT4(uint16_t syntax_indicator     : 1; ,
++      uint16_t private_indicator      : 1; , /* 2.4.4.10 */
++      uint16_t reserved               : 2; ,
++      uint16_t length                 :12; );
++} __ucsi_packed;
++
++/**
++ * Generic extended section header structure.
++ */
++struct section_ext {
++      uint8_t table_id;
++  EBIT4(uint16_t syntax_indicator     : 1; ,
++      uint16_t private_indicator      : 1; , /* 2.4.4.10 */
++      uint16_t reserved               : 2; ,
++      uint16_t length                 :12; );
++
++      uint16_t table_id_ext;
++  EBIT3(uint8_t reserved1             : 2; ,
++      uint8_t version_number          : 5; ,
++      uint8_t current_next_indicator  : 1; );
++      uint8_t section_number;
++      uint8_t last_section_number;
++} __ucsi_packed;
++
++/**
++ * Structure for keeping track of sections of a PSI table.
++ */
++struct psi_table_state {
++      uint8_t version_number;
++      uint16_t next_section_number;
++      uint8_t complete:1;
++      uint8_t new_table:1;
++} __ucsi_packed;
++
++
++/**
++ * Determine the total length of a section, including the header.
++ *
++ * @param section The parsed section structure.
++ * @return The length.
++ */
++static inline size_t section_length(struct section *section)
++{
++      return section->length + sizeof(struct section);
++}
++
++/**
++ * Determine the total length of an extended section, including the header,
++ * but omitting the CRC.
++ *
++ * @param section The parsed section_ext structure.
++ * @return The length.
++ */
++static inline size_t section_ext_length(struct section_ext * section)
++{
++      return section->length + sizeof(struct section) - CRC_SIZE;
++}
++
++/**
++ * Process a section structure in-place.
++ *
++ * @param buf Pointer to the data.
++ * @param len Length of data.
++ * @return Pointer to the section structure, or NULL if invalid.
++ */
++static inline struct section * section_codec(uint8_t * buf, size_t len)
++{
++      struct section * ret = (struct section *)buf;
++
++      if (len < 3)
++              return NULL;
++
++      bswap16(buf+1);
++
++      if (len != ret->length + 3U)
++              return NULL;
++
++      return ret;
++}
++
++/**
++ * Some sections have a CRC even though they are not section_exts.
++ * This function is to allow checking of them.
++ *
++ * @param section Pointer to the processed section structure.
++ * @return Nonzero on error, or 0 if the CRC was correct.
++ */
++static inline int section_check_crc(struct section *section)
++{
++      uint8_t * buf = (uint8_t *) section;
++      size_t len = section_length(section);
++      uint32_t crc;
++
++      /* the crc check has to be performed on the unswapped data */
++      bswap16(buf+1);
++      crc = crc32(CRC32_INIT, buf, len);
++      bswap16(buf+1);
++
++      /* the crc check includes the crc value,
++       * the result should therefore be zero.
++       */
++      if (crc)
++              return -1;
++      return 0;
++}
++
++
++/**
++ * Decode an extended section structure.
++ *
++ * @param section Pointer to the processed section structure.
++ * @param check_crc If 1, the CRC of the section will also be checked.
++ * @return Pointer to the parsed section_ext structure, or NULL if invalid.
++ */
++static inline struct section_ext * section_ext_decode(struct section * section,
++                                                    int check_crc)
++{
++      if (section->syntax_indicator == 0)
++              return NULL;
++
++      if (check_crc) {
++              if (section_check_crc(section))
++                      return NULL;
++      }
++
++      bswap16((uint8_t *)section + sizeof(struct section));
++
++      return (struct section_ext *)section;
++}
++
++/**
++ * Encode an extended section structure for transmission.
++ *
++ * @param section Pointer to the section_ext structure.
++ * @param update_crc If 1, the CRC of the section will also be updated.
++ * @return Pointer to the encoded section_ext structure, or NULL if invalid.
++ */
++static inline struct section_ext * section_ext_encode(struct section_ext* section,
++                                                    int update_crc)
++{
++      if (section->syntax_indicator == 0)
++              return NULL;
++
++      bswap16((uint8_t *)section + sizeof(struct section));
++
++      if (update_crc) {
++              uint8_t * buf = (uint8_t *) section;
++              int len = sizeof(struct section) + section->length;
++              uint32_t crc;
++
++              /* the crc has to be performed on the swapped data */
++              bswap16(buf+1);
++              crc = crc32(CRC32_INIT, buf, len-4);
++              bswap16(buf+1);
++
++              /* update the CRC */
++              *((uint32_t*) (buf+len-4)) = crc;
++              bswap32(buf+len-4);
++      }
++
++      return (struct section_ext *)section;
++}
++
++/**
++ * Reset a psi_table_state structure.
++ *
++ * @param tstate The structure to reset.
++ */
++static inline void psi_table_state_reset(struct psi_table_state *tstate)
++{
++      tstate->version_number = 0xff;
++}
++
++/**
++ * Check if a supplied section_ext is something we want to process.
++ *
++ * @param section The parsed section_ext structure.
++ * @param tstate The state structure for this PSI table.
++ * @return 0=> not useful. nonzero => useful.
++ */
++static inline int section_ext_useful(struct section_ext *section, struct psi_table_state *tstate)
++{
++      if ((section->version_number == tstate->version_number) && tstate->complete)
++              return 0;
++      if (section->version_number != tstate->version_number) {
++              if (section->section_number != 0)
++                      return 0;
++
++              tstate->next_section_number = 0;
++              tstate->complete = 0;
++              tstate->version_number = section->version_number;
++              tstate->new_table = 1;
++      } else if (section->section_number == tstate->next_section_number) {
++              tstate->new_table = 0;
++      } else {
++              return 0;
++      }
++
++      tstate->next_section_number++;
++      if (section->last_section_number < tstate->next_section_number) {
++              tstate->complete = 1;
++      }
++
++      return 1;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/testrecord.txt dvb-apps/lib/libucsi/testrecord.txt
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/testrecord.txt  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/testrecord.txt        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,146 @@
++libucsi test record. Anything without PASS is either not tested, or is
++currently broken.
++
++Testing means (a) ensure there are no segfaults etc. (b) dump the raw hex,
++decode it by hand, and check it matches the output.
++
++Sections:
++PASS mpeg/cat_section.h
++     mpeg/odsmt_section.h
++PASS mpeg/pat_section.h
++PASS mpeg/pmt_section.h
++     mpeg/tsdt_section.h
++     mpeg/metadata_section.h
++
++PASS dvb/bat_section.h
++     dvb/dit_section.h
++PASS dvb/eit_section.h
++     dvb/int_section.h
++PASS dvb/nit_section.h
++     dvb/rst_section.h
++PASS dvb/sdt_section.h
++     dvb/sit_section.h
++PASS dvb/st_section.h
++PASS dvb/tdt_section.h
++PASS dvb/tot_section.h
++     dvb/tva_container_section.h
++
++PASS atsc/cvct_section.h
++     atsc/dccsct_section.h
++     atsc/dcct_section.h
++PASS atsc/eit_section.h
++PASS atsc/ett_section.h
++PASS atsc/mgt_section.h
++     atsc/rrt_section.h
++PASS atsc/stt_section.h
++PASS atsc/tvct_section.h
++
++Descriptors:
++PASS mpeg/audio_stream_descriptor.h
++PASS mpeg/ca_descriptor.h
++     mpeg/content_labelling_descriptor.h
++PASS mpeg/copyright_descriptor.h
++PASS mpeg/data_stream_alignment_descriptor.h
++PASS mpeg/external_es_id_descriptor.h
++     mpeg/fmc_descriptor.h
++PASS mpeg/fmxbuffer_size_descriptor.h
++     mpeg/hierarchy_descriptor.h
++     mpeg/ibp_descriptor.h
++     mpeg/iod_descriptor.h
++PASS mpeg/iso_639_language_descriptor.h
++PASS mpeg/maximum_bitrate_descriptor.h
++     mpeg/metadata_descriptor.h
++     mpeg/metadata_pointer_descriptor.h
++     mpeg/metadata_std_descriptor.h
++     mpeg/mpeg4_audio_descriptor.h
++     mpeg/mpeg4_video_descriptor.h
++     mpeg/multiplex_buffer_descriptor.h
++PASS mpeg/multiplex_buffer_utilization_descriptor.h
++     mpeg/muxcode_descriptor.h
++PASS mpeg/private_data_indicator_descriptor.h
++PASS mpeg/registration_descriptor.h
++     mpeg/sl_descriptor.h
++PASS mpeg/smoothing_buffer_descriptor.h
++PASS mpeg/std_descriptor.h
++PASS mpeg/system_clock_descriptor.h
++     mpeg/target_background_grid_descriptor.h
++PASS mpeg/video_stream_descriptor.h
++     mpeg/video_window_descriptor.h
++
++     dvb/ac3_descriptor.h
++     dvb/adaptation_field_data_descriptor.h
++     dvb/ait_application_descriptor.h
++     dvb/ait_application_icons_descriptor.h
++     dvb/ait_application_name_descriptor.h
++     dvb/ait_external_application_authorisation_descriptor.h
++     dvb/ancillary_data_descriptor.h
++     dvb/announcement_support_descriptor.h
++     dvb/application_signalling_descriptor.h
++PASS dvb/bouquet_name_descriptor.h
++PASS dvb/ca_identifier_descriptor.h
++     dvb/cable_delivery_descriptor.h
++     dvb/cell_frequency_link_descriptor.h
++     dvb/cell_list_descriptor.h
++PASS dvb/component_descriptor.h
++PASS dvb/content_descriptor.h
++     dvb/content_identifier_descriptor.h
++     dvb/country_availability_descriptor.h
++     dvb/data_broadcast_descriptor.h
++PASS dvb/data_broadcast_id_descriptor.h
++     dvb/default_authority_descriptor.h
++     dvb/dsng_descriptor.h
++     dvb/extended_event_descriptor.h
++PASS dvb/frequency_list_descriptor.h
++PASS dvb/linkage_descriptor.h
++PASS dvb/local_time_offset_descriptor.h
++     dvb/mhp_data_broadcast_id_descriptor.h
++     dvb/mosaic_descriptor.h
++     dvb/multilingual_bouquet_name_descriptor.h
++PASS dvb/multilingual_component_descriptor.h
++     dvb/multilingual_network_name_descriptor.h
++     dvb/multilingual_service_name_descriptor.h
++PASS dvb/network_name_descriptor.h
++     dvb/nvod_reference_descriptor.h
++PASS dvb/parental_rating_descriptor.h
++     dvb/partial_transport_stream_descriptor.h
++     dvb/pdc_descriptor.h
++PASS dvb/private_data_specifier_descriptor.h
++     dvb/related_content_descriptor.h
++     dvb/rnt_rar_over_dvb_stream_descriptor.h
++     dvb/rnt_rar_over_ip_descriptor.h
++     dvb/rnt_rnt_scan_descriptor.h
++     dvb/s2_satellite_delivery_descriptor.h
++PASS dvb/satellite_delivery_descriptor.h
++     dvb/scrambling_descriptor.h
++     dvb/service_availablility_descriptor.h
++PASS dvb/service_descriptor.h
++     dvb/service_identifier_descriptor.h
++PASS dvb/service_list_descriptor.h
++     dvb/service_move_descriptor.h
++PASS dvb/short_event_descriptor.h
++     dvb/short_smoothing_buffer_descriptor.h
++PASS dvb/stream_identifier_descriptor.h
++PASS dvb/stuffing_descriptor.h
++PASS dvb/subtitling_descriptor.h
++     dvb/telephone_descriptor.h
++     dvb/teletext_descriptor.h
++PASS dvb/terrestrial_delivery_descriptor.h
++     dvb/time_shifted_event_descriptor.h
++     dvb/time_shifted_service_descriptor.h
++     dvb/transport_stream_descriptor.h
++     dvb/tva_id_descriptor.h
++     dvb/vbi_data_descriptor.h
++     dvb/vbi_teletext_descriptor.h
++
++PASS atsc/ac3_descriptor.h
++PASS atsc/caption_service_descriptor.h
++     atsc/component_name_descriptor.h
++PASS atsc/content_advisory_descriptor.h
++     atsc/dcc_arriving_request_descriptor.h
++     atsc/dcc_departing_request_descriptor.h
++PASS atsc/extended_channel_name_descriptor.h
++     atsc/genre_descriptor.h
++     atsc/rc_descriptor.h
++PASS atsc/service_location_descriptor.h
++PASS atsc/stuffing_descriptor.h
++     atsc/time_shifted_service_descriptor.h
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/transport_packet.c dvb-apps/lib/libucsi/transport_packet.c
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/transport_packet.c      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/transport_packet.c    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,256 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include "transport_packet.h"
++
++#define CONTINUITY_VALID 0x80
++#define CONTINUITY_DUPESEEN 0x40
++
++int transport_packet_values_extract(struct transport_packet *pkt,
++                                  struct transport_values *out,
++                                  enum transport_value extract)
++{
++      uint8_t *end = (uint8_t*) pkt + TRANSPORT_PACKET_LENGTH;
++      uint8_t *adapend;
++      uint8_t *pos = (uint8_t*) pkt + sizeof(struct transport_packet);
++      enum transport_value extracted = 0;
++      enum transport_adaptation_flags adapflags = 0;
++      enum transport_adaptation_extension_flags adapextflags = 0;
++      int adaplength = 0;
++      int adapextlength = 0;
++
++      /* does the packet contain an adaptation field ? */
++      if ((pkt->adaptation_field_control & 2) == 0)
++              goto extract_payload;
++
++      /* get the adaptation field length and skip the byte */
++      adaplength = *pos++;
++
++      /* do we actually have any adaptation data? */
++      if (adaplength == 0)
++              goto extract_payload;
++
++      /* sanity check */
++      adapend = pos + adaplength;
++      if (adapend > end)
++              return -1;
++
++      /* extract the adaptation flags (we must have at least 1 byte to be here) */
++      adapflags = *pos++;
++
++      /* do we actually want anything else? */
++      if ((extract & 0xffff) == 0)
++              goto extract_payload;
++
++      /* PCR? */
++      if (adapflags & transport_adaptation_flag_pcr) {
++              if ((pos+6) > adapend)
++                      return -1;
++
++              if (extract & transport_value_pcr) {
++                      uint64_t base = ((uint64_t) pos[0] << 25) |
++                                      ((uint64_t) pos[1] << 17) |
++                                      ((uint64_t) pos[2] << 9) |
++                                      ((uint64_t) pos[3] << 1) |
++                                      ((uint64_t) pos[4] >> 7);
++                      uint64_t ext = (((uint64_t) pos[4] & 1) << 8) |
++                                      (uint64_t) pos[5];
++                      out->pcr= base * 300ULL + ext;
++                      extracted |= transport_value_pcr;
++              }
++              pos += 6;
++      }
++
++      /* OPCR? */
++      if (adapflags & transport_adaptation_flag_opcr) {
++              if ((pos+6) > adapend)
++                      return -1;
++
++              if (extract & transport_value_opcr) {
++                      uint64_t base = ((uint64_t) pos[0] << 25) |
++                                      ((uint64_t) pos[1] << 17) |
++                                      ((uint64_t) pos[2] << 9) |
++                                      ((uint64_t) pos[3] << 1) |
++                                      ((uint64_t) pos[4] >> 7);
++                      uint64_t ext = (((uint64_t) pos[4] & 1) << 8) |
++                                      (uint64_t) pos[5];
++                      out->opcr= base * 300ULL + ext;
++                      extracted |= transport_value_opcr;
++              }
++              pos += 6;
++      }
++
++      /* splice countdown? */
++      if (adapflags & transport_adaptation_flag_splicing_point) {
++              if ((pos+1) > adapend)
++                      return -1;
++
++              if (extract & transport_value_splice_countdown) {
++                      out->splice_countdown = *pos;
++                      extracted |= transport_value_splice_countdown;
++              }
++              pos++;
++      }
++
++      /* private data? */
++      if (adapflags & transport_adaptation_flag_private_data) {
++              if ((pos+1) > adapend)
++                      return -1;
++              if ((pos+1+*pos) > adapend)
++                      return -1;
++
++              if (extract & transport_value_private_data) {
++                      out->private_data_length = *pos;
++                      out->private_data = pos + 1;
++                      extracted |= transport_value_private_data;
++              }
++              pos += 1 + *pos;
++      }
++
++      /* is there an adaptation extension? */
++      if (!(adapflags & transport_adaptation_flag_extension))
++              goto extract_payload;
++
++      /* get/check the length */
++      if (pos >= adapend)
++              return -1;
++      adapextlength = *pos++;
++      if ((pos + adapextlength) > adapend)
++              return -1;
++
++      /* do we want/have anything in the adaptation extension? */
++      if (((extract & 0xff00) == 0) || (adapextlength == 0))
++              goto extract_payload;
++
++      /* extract the adaptation extension flags (we must have at least 1 byte
++       * to be here) */
++      adapextflags = *pos++;
++
++      /* LTW? */
++      if (adapextflags & transport_adaptation_extension_flag_ltw) {
++              if ((pos+2) > adapend)
++                      return -1;
++
++              if (extract & transport_value_ltw) {
++                      if (*pos & 0x80) {
++                              out->ltw_offset = ((pos[0] & 0x7f) << 8) |
++                                                (pos[1]);
++                              extracted |= transport_value_ltw;
++                      }
++              }
++              pos += 2;
++      }
++
++      /* piecewise_rate? */
++      if (adapextflags & transport_adaptation_extension_flag_piecewise_rate) {
++              if ((pos+3) > adapend)
++                      return -1;
++
++              if (extract & transport_value_piecewise_rate) {
++                      out->piecewise_rate = ((pos[0] & 0x3f) << 16) |
++                                            (pos[1] << 8) |
++                                            pos[2];
++                      extracted |= transport_value_piecewise_rate;
++              }
++              pos += 3;
++      }
++
++      /* seamless_splice? */
++      if (adapextflags & transport_adaptation_extension_flag_seamless_splice) {
++              if ((pos+5) > adapend)
++                      return -1;
++
++              if (extract & transport_value_piecewise_rate) {
++                      out->splice_type = pos[0] >> 4;
++                      out->dts_next_au = ((pos[0] & 0x0e) << 29) |
++                                         (pos[1] << 22) |
++                                         ((pos[2] & 0xfe) << 14) |
++                                         (pos[3] << 7) |
++                                         ((pos[4] & 0xfe) >> 1);
++                      extracted |= transport_value_seamless_splice;
++              }
++              pos += 5;
++      }
++
++
++
++extract_payload:
++      /* does the packet contain a payload? */
++      if (pkt->adaptation_field_control & 1) {
++              int off = sizeof(struct transport_packet);
++              if (pkt->adaptation_field_control & 2)
++                      off++;
++              off += adaplength;
++
++              out->payload = (uint8_t*) pkt + off;
++              out->payload_length = TRANSPORT_PACKET_LENGTH - off;
++      } else {
++              out->payload = NULL;
++              out->payload_length = 0;
++      }
++
++      out->flags = adapflags;
++      return extracted;
++}
++
++int transport_packet_continuity_check(struct transport_packet *pkt,
++                                    int discontinuity_indicator, unsigned char *cstate)
++{
++      unsigned char pktcontinuity = pkt->continuity_counter;
++      unsigned char prevcontinuity = *cstate & 0x0f;
++      unsigned char nextcontinuity;
++
++      /* NULL packets have undefined continuity */
++      if (transport_packet_pid(pkt) == TRANSPORT_NULL_PID)
++              return 0;
++
++      /* is the state valid? */
++      if (!(*cstate & CONTINUITY_VALID)) {
++              *cstate = pktcontinuity | CONTINUITY_VALID;
++              return 0;
++      }
++
++      /* check for discontinuity_indicator */
++      if (discontinuity_indicator) {
++              *cstate = pktcontinuity | CONTINUITY_VALID;
++              return 0;
++      }
++
++      /* only packets with a payload should increment the counter */
++      if (pkt->adaptation_field_control & 1)
++              nextcontinuity = (prevcontinuity + 1) & 0xf;
++      else
++              nextcontinuity = prevcontinuity;
++
++      /* check for a normal continuity progression */
++      if (nextcontinuity == pktcontinuity) {
++              *cstate = pktcontinuity | CONTINUITY_VALID;
++              return 0;
++      }
++
++      /* one dupe is allowed */
++      if ((prevcontinuity == pktcontinuity) && (!(*cstate & CONTINUITY_DUPESEEN))) {
++              *cstate = pktcontinuity | (CONTINUITY_VALID|CONTINUITY_DUPESEEN);
++              return 0;
++      }
++
++      /* continuity error */
++      return -1;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/transport_packet.h dvb-apps/lib/libucsi/transport_packet.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/transport_packet.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/transport_packet.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,195 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_TRANSPORT_PACKET_H
++#define _UCSI_TRANSPORT_PACKET_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <stdint.h>
++#include "descriptor.h"
++
++#define TRANSPORT_PACKET_LENGTH 188
++#define TRANSPORT_PACKET_SYNC   0x47
++#define TRANSPORT_MAX_PIDS      0x2000
++#define TRANSPORT_NULL_PID      0x1fff
++
++
++/**
++ * Enumeration of adaptation field control values.
++ */
++enum transport_adaptation_field_control {
++      transport_adaptation_field_control_reserved             = 0x00,
++      transport_adaptation_field_control_payload_only         = 0x01,
++      transport_adaptation_field_control_adaptation_only      = 0x02,
++      transport_adaptation_field_control_adaptation_payload   = 0x03,
++};
++
++/**
++ * Enumeration of scrambling control values.
++ */
++enum transport_scrambling_control {
++      transport_scrambling_control_unscrambled                = 0x00,
++      transport_scrambling_control_user_1                     = 0x01,
++      transport_scrambling_control_user_2                     = 0x02,
++      transport_scrambling_control_user_3                     = 0x03,
++};
++
++/**
++ * Enumeration of adaptation flags.
++ */
++enum transport_adaptation_flags {
++      transport_adaptation_flag_discontinuity                 = 0x80,
++      transport_adaptation_flag_random_access                 = 0x40,
++      transport_adaptation_flag_es_priority                   = 0x20,
++      transport_adaptation_flag_pcr                           = 0x10,
++      transport_adaptation_flag_opcr                          = 0x08,
++      transport_adaptation_flag_splicing_point                = 0x04,
++      transport_adaptation_flag_private_data                  = 0x02,
++      transport_adaptation_flag_extension                     = 0x01,
++};
++
++/**
++ * Enumeration of adaptation extension flags.
++ */
++enum transport_adaptation_extension_flags {
++      transport_adaptation_extension_flag_ltw                 = 0x80,
++      transport_adaptation_extension_flag_piecewise_rate      = 0x40,
++      transport_adaptation_extension_flag_seamless_splice     = 0x20,
++};
++
++/**
++ * Enumeration of flags controlling which values to extract using the
++ * transport_packet_values_extract() function.
++ */
++enum transport_value {
++      /* normal adaptation */
++      transport_value_pcr                                     = 0x0001,
++      transport_value_opcr                                    = 0x0002,
++      transport_value_splice_countdown                        = 0x0004,
++      transport_value_private_data                            = 0x0008,
++
++      /* extension adaptation */
++      transport_value_ltw                                     = 0x0100,
++      transport_value_piecewise_rate                          = 0x0200,
++      transport_value_seamless_splice                         = 0x0400,
++};
++
++/**
++ * Structure describing a transport packet header.
++ */
++struct transport_packet {
++      uint8_t sync_byte;
++  EBIT4(uint8_t transport_error_indicator     : 1; ,
++      uint8_t payload_unit_start_indicator    : 1; ,
++      uint8_t transport_priority              : 1; ,
++      uint8_t pid_hi                          : 5; );
++      uint8_t pid_lo;
++  EBIT3(uint8_t transport_scrambling_control  : 2; ,
++      uint8_t adaptation_field_control        : 2; ,
++      uint8_t continuity_counter              : 4; );
++      /* values */
++} __ucsi_packed;
++
++/**
++ * Structure to extract values into using the transport_packet_values_extract()
++ * function.
++ */
++struct transport_values {
++      enum transport_adaptation_flags flags;  /* always extracted */
++      uint8_t *payload;                       /* always extracted */
++      uint16_t payload_length;                /* always extracted */
++
++      uint64_t pcr;
++      uint64_t opcr;
++      uint8_t  splice_countdown;
++      uint8_t private_data_length;
++      uint8_t *private_data;
++      uint16_t ltw_offset;
++      uint32_t piecewise_rate;
++      uint8_t splice_type;
++      uint64_t dts_next_au;
++};
++
++/**
++ * Extract the PID from a transport packet.
++ *
++ * @param pkt The packet.
++ * @return The PID.
++ */
++static inline int transport_packet_pid(struct transport_packet *pkt)
++{
++      return (pkt->pid_hi << 8) | (pkt->pid_lo);
++}
++
++/**
++ * Process a buffer into a transport packet.
++ *
++ * @param buf Raw buffer. Note, this function assumes there are 188 bytes available.
++ * @return transport_packet pointer, or NULL on error.
++ */
++static inline struct transport_packet *transport_packet_init(unsigned char *buf)
++{
++      struct transport_packet *pkt = (struct transport_packet*) buf;
++
++      if (pkt->sync_byte != TRANSPORT_PACKET_SYNC)
++              return NULL;
++
++      if (transport_packet_pid(pkt) >= TRANSPORT_MAX_PIDS)
++              return NULL;
++
++      return pkt;
++}
++
++/**
++ * Check the continuity counter for a packet in a PID stream.
++ *
++ * @param pkt transport_packet to check.
++ * @param discontinuity_indicator Set to 1 if the packet's discontinuity_indicator flag is set.
++ * @param cstate Pointer to a single 8 bit character, used to store state for validating
++ * continuity. To initialise the state, simply set it to 0 before the first call.
++ * @return 0 if the continuity was correct, or nonzero on error. cstate will not be updated on error,
++ * it is up to the caller to clear it to accept the next packet.
++ */
++extern int transport_packet_continuity_check(struct transport_packet *pkt,
++                                           int discontinuity_indicator, unsigned char *cstate);
++
++/**
++ * Extract selected fields from a transport packet.
++ *
++ * @param pkt The packet.
++ * @param out Destination structure for values.
++ * @param extract Orred bitmask of enum transport_value - tells it what fields
++ * to extract if they are available.
++ * @return < 0 => error. Otherwise, an orred bitmask of enum transport_value
++ * telling you what fields were successfully extracted.
++ */
++extern int transport_packet_values_extract(struct transport_packet *pkt,
++                                         struct transport_values *out,
++                                         enum transport_value extract);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/libucsi/types.h dvb-apps/lib/libucsi/types.h
+--- linuxtv-dvb-apps-1.1.1/lib/libucsi/types.h 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/libucsi/types.h       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,36 @@
++/*
++ * section and descriptor parser
++ *
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#ifndef _UCSI_TYPES_H
++#define _UCSI_TYPES_H 1
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++typedef uint8_t iso639lang_t[3];
++typedef uint8_t iso639country_t[3];
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/lib/Makefile dvb-apps/lib/Makefile
+--- linuxtv-dvb-apps-1.1.1/lib/Makefile        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/lib/Makefile      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,11 @@
++# Makefile for linuxtv.org dvb-apps/lib
++
++.PHONY: all clean install
++
++all clean install:
++      $(MAKE) -C libdvbapi $@
++      $(MAKE) -C libdvbcfg $@
++      $(MAKE) -C libdvben50221 $@
++      $(MAKE) -C libdvbsec $@
++      $(MAKE) -C libesg $@
++      $(MAKE) -C libucsi $@
+diff -Nurd linuxtv-dvb-apps-1.1.1/libdvb2/README dvb-apps/libdvb2/README
+--- linuxtv-dvb-apps-1.1.1/libdvb2/README      2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/libdvb2/README    1970-01-01 01:00:00.000000000 +0100
+@@ -1,23 +0,0 @@
+-Late in 2003 the idea to create a simple DVB library from the code snippets
+-in the test/utility programs was discussed on the linux-dvb mailing list.
+-Hopefully someone will invest some time in this project to turn the idea into
+-reality...
+-
+-Here is an outline of what libdvb2 should be, according to my recollection:
+-(For first hand information search the linux-dvb list archives for "libdvb2".)
+-
+-- C
+-- small: The goal is to make the library usable in *any* DVB project, which
+-  is easier if the library sticks to the basics. Advanced stuff can be
+-  done in a second library. What exacty "basic" and "advanced" means
+-  is subject of discussion, but I want avoid to impose a certain programming
+-  model (e.g. multi-threaded vw. event-loop) on users of the library.
+-- a prime target is to establish a standard DVB config and service list
+-  format, to make this sharable between different applications
+-- LGPL
+-
+-About the name: There already is a libdvb written by the Metzler Bros.,
+-but the main drawback is that it is written in C++ and thus rejected
+-by many projects.
+-
+-Johannes Stezenbach <js@convergence.de>
+diff -Nurd linuxtv-dvb-apps-1.1.1/Makefile dvb-apps/Makefile
+--- linuxtv-dvb-apps-1.1.1/Makefile    2004-02-04 19:41:55.000000000 +0100
++++ dvb-apps/Makefile  2009-06-21 13:29:06.000000000 +0200
+@@ -1,28 +1,12 @@
+ # Makefile for linuxtv.org dvb-apps
+-VERSION := 1.1.0
+-PACKAGE := linuxtv-dvb-apps-$(VERSION)
+-CVSROOT := $(shell cat CVS/Root)
+-RELEASE_TAG := LINUXTV-DVB-$(subst .,_,$(subst -,_,$(VERSION)))
+-
+-all:
++.PHONY: all clean install update
+-release dist:
+-      rm -rf release-tmp $(PACKAGE).tar.gz
+-      mkdir release-tmp
+-      ( cd release-tmp; cvs -d$(CVSROOT) export -r$(RELEASE_TAG) -d$(PACKAGE) dvb-apps )
+-      find release-tmp -name .cvsignore | xargs rm -v
+-      ( cd release-tmp; tar cjf ../$(PACKAGE).tar.bz2 $(PACKAGE) )
+-      rm -rf release-tmp
+-      @echo
+-      @echo --------------------------------------------------------------------------------
+-      @echo
+-      @echo "dist package: ./$(PACKAGE).tar.bz2"
+-      @echo
+-      @echo --------------------------------------------------------------------------------
+-      @echo
++all clean install:
++      $(MAKE) -C lib $@
++      $(MAKE) -C test $@
++      $(MAKE) -C util $@
+-%::
+-#     $(MAKE) -C libdvb2 $(MAKECMDGOALS)
+-      $(MAKE) -C util $(MAKECMDGOALS)
+-      $(MAKE) -C test $(MAKECMDGOALS)
++update:
++      @echo "Pulling changes & updating from master repository"
++      hg pull -u
+diff -Nurd linuxtv-dvb-apps-1.1.1/Make.rules dvb-apps/Make.rules
+--- linuxtv-dvb-apps-1.1.1/Make.rules  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/Make.rules        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,104 @@
++# build rules for linuxtv.org dvb-apps
++
++CFLAGS ?= -g -Wall -W -Wshadow -Wpointer-arith -Wstrict-prototypes
++
++ifneq ($(lib_name),)
++
++# additional rules for libraries
++
++CFLAGS_LIB ?= -fPIC
++CFLAGS += $(CFLAGS_LIB)
++
++libraries = $(lib_name).so $(lib_name).a
++
++.PHONY: library
++
++library: $(libraries)
++
++$(libraries): $(objects)
++
++endif
++
++prerequisites = $(subst .o,.d,$(objects)) $(addsuffix .d,$(binaries))
++
++.PHONY: clean install
++
++ifeq ($(static),1)
++LDFLAGS += -static
++endif
++
++prefix ?= /usr
++
++bindir     ?= $(prefix)/bin
++includedir ?= $(prefix)/include
++libdir     ?= $(prefix)/lib
++sharedir   ?= $(prefix)/share
++
++ifneq ($(DESTDIR),)
++DESTDIR = $(DESTDIR)/
++endif
++
++ifeq ($(V),1)
++%.o: %.c
++      $(CC) -c $(CPPFLAGS) $(CFLAGS) -MMD -o $@ $< $(filter-out %.h %.c,$^)
++%: %.o
++      $(CC) $(LDFLAGS) -o $@ $^ $(LOADLIBES) $(LDLIBS)
++%: %.c
++      $(CC) $(CPPFLAGS) $(CFLAGS) -MMD $(LDFLAGS) -o $@ $< $(filter-out %.h %.c,$^) $(LOADLIBES) $(LDLIBS)
++%.so:
++      $(CC) -shared -o $@ $^
++%.a:
++      $(AR) rcs $@ $^
++clean::
++      $(RM) -f $(prerequisites) $(objects) $(libraries) $(binaries) $(removing) *~
++install::
++ifneq ($(includes),)
++      mkdir -p $(DESTDIR)$(includedir)/$(lib_name)
++      install -m 644 $(includes) $(DESTDIR)$(includedir)/$(lib_name)/
++endif
++ifneq ($(libraries),)
++      mkdir -p $(DESTDIR)$(libdir)
++      install -m 644 $(libraries) $(DESTDIR)$(libdir)/
++endif
++ifneq ($(inst_bin),)
++      mkdir -p $(DESTDIR)$(bindir)
++      install -m 755 $(inst_bin) $(DESTDIR)$(bindir)/
++endif
++else
++%.o: %.c
++      @echo CC $@
++      @$(CC) -c $(CPPFLAGS) $(CFLAGS) -MMD -o $@ $< $(filter-out %.h %.c,$^)
++%: %.o
++      @echo CC $@
++      @$(CC) $(LDFLAGS) -o $@ $^ $(LOADLIBES) $(LDLIBS)
++%: %.c
++      @echo CC $@
++      @$(CC) $(CPPFLAGS) $(CFLAGS) -MMD $(LDFLAGS) -o $@ $< $(filter-out %.h %.c,$^) $(LOADLIBES) $(LDLIBS)
++%.so:
++      @echo CC $@
++      @$(CC) -shared -o $@ $^
++%.a:
++      @echo AR $@
++      @$(AR) rcs $@ $^
++clean::
++      @echo cleaning
++      @$(RM) -f $(prerequisites) $(objects) $(libraries) $(binaries) $(removing) *~
++install::
++ifneq ($(includes),)
++      @echo installing headers
++      @mkdir -p $(DESTDIR)$(includedir)/$(lib_name)
++      @install -m 644 $(includes) $(DESTDIR)$(includedir)/$(lib_name)/
++endif
++ifneq ($(libraries),)
++      @echo installing libraries
++      @mkdir -p $(DESTDIR)$(libdir)
++      @install -m 644 $(libraries) $(DESTDIR)$(libdir)/
++endif
++ifneq ($(inst_bin),)
++      @echo installing binaries
++      @mkdir -p $(DESTDIR)$(bindir)
++      @install -m 755 $(inst_bin) $(DESTDIR)$(bindir)/
++endif
++endif
++
++-include $(prerequisites)
+diff -Nurd linuxtv-dvb-apps-1.1.1/README dvb-apps/README
+--- linuxtv-dvb-apps-1.1.1/README      2006-05-18 01:37:39.000000000 +0200
++++ dvb-apps/README    2009-06-21 13:29:06.000000000 +0200
+@@ -1,28 +1,40 @@
+-linuxtv-dvb-apps-1.1.1
++linuxtv-dvb-apps-1.?
+ ======================
+-Linux DVB API test/demo applications and utilities.
++Linux DVB API applications and utilities.
+-You find a README in each subdirectory explaining what the code there does.
+-For beginners utils/szap/ and utils/scan/ are probably most useful.
++All applications support the DVB-S, DVB-C, DVB-T, and ATSC standards.
+-For convenience, dvb-apps contains a copy of the DVB API include
+-files as they are contained in the linuxtv-dvb-1.1.0 realease
+-and the 2.6.x Linux kernel. However, since the DVB API hasn't changed,
+-the apps will still work with the old "DVB" drivers, should you decide not
+-to use linuxtv-dvb-1.1.0 (or the dvb-kernel CVS).
++Main User Applications:
++util/scan     - Scan for channels on your digital TV device.
++util/gnutv    - Tune, watch and stream your TV.
++General Utilities:
++util/dvbdate  - Set your clock from digital TV.
++util/dvbnet   - Control digital data network interfaces.
++util/dvbtraffic       - Monitor traffic on a digital device.
++util/femon    - Monitor the tuning on a digital TV device.
++util/zap      - *Just* tunes a digital device - really intended for developers.
+-Historical note:
+-The apps have been copied from the "DVB" CVS tree, which means that
+-the stuff in "DVB" is now unmaintained and out of date.
++Hardware Specific Utilities:
++util/av7110_loadkeys  - Load remote keys into an av7110 based card
++util/dib3000-watch    - Monitor DIB3000 demodulators
++util/dst-utils                - Utilities for DST based cards.
++util/ttusb_dec_reset  - Reset a TechnoTrends TTUSB DEC device.
++Libraries:
++lib/libdvbapi - Interface library to digital TV devices.
++lib/libdvbcfg - Library to parse/create digital TV channel configuration files.
++lib/libdvbsec - Library for Satellite Equipment Control operations.
++lib/libucsi   - Fast MPEG2 Transport Stream SI table parsing library.
++lib/libdvben50221- Complete implementation of a Cenelec EN 50221 CAM stack.
++lib/libdvbmisc        - Miscellaneous utilities used by the other libraries.
+-Johannes Stezenbach <js@convergence.de>
++Various testing applications also live in test.
+-This is an interim point release adding support for ATSC to the 1.1.0 release.
+-dvb-apps is currently being rewritten completely with new standardised DVB 
+-libraries for all aspects of DVB, ca support etc, so expect a 1.2.0 release 
+-at some point soon.
++For convenience, dvb-apps contains a copy of the DVB API include
++files as they are contained in the linuxtv-dvb-1.? release
++and the 2.6.x Linux kernel.
++Johannes Stezenbach <js@convergence.de>
+ Andrew de Quincey <adq_dvb@lidskialf.net>
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/dia dvb-apps/test/dia
+--- linuxtv-dvb-apps-1.1.1/test/dia    2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/test/dia  2009-06-21 13:29:06.000000000 +0200
+@@ -4,4 +4,4 @@
+ do /usr/X11R6/bin/convert  -geomtry 702x576 $f test.mpg
+ test_video test.mpg
+ rm test.mpg
+-done
+\ No newline at end of file
++done
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/diseqc.c dvb-apps/test/diseqc.c
+--- linuxtv-dvb-apps-1.1.1/test/diseqc.c       2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/test/diseqc.c     2009-06-21 13:29:06.000000000 +0200
+@@ -1,11 +1,13 @@
+-/*
+- * Test sending DiSEqC commands on a SAT frontend.
+- *
+- * usage: FRONTEND=/dev/dvb/adapterX/frontendX diseqc [test_seq_no]
+- */
++#define USAGE \
++"\n" \
++"\nTest sending DiSEqC commands on a SAT frontend." \
++"\n" \
++"\nusage: FRONTEND=/dev/dvb/adapterX/frontendX diseqc [test_seq_no|'all']" \
++"\n"
+ #include <pthread.h>
+ #include <time.h>
++#include <string.h>
+ #include <stdlib.h>
+ #include <stdint.h>
+ #include <stdio.h>
+@@ -109,7 +111,10 @@
+               return -1;
+       }
+-      if (argc > 1) {
++      if (argc != 2) {
++          fprintf (stderr, "usage: %s [number|'all']\n" USAGE, argv[0]);
++          return 1;
++      } else if (strcmp(argv[1], "all")) {
+               int i = atol(argv[1]);
+               cmd[0] = &switch_cmds[i];
+               diseqc_send_msg(fd,
+@@ -136,5 +141,3 @@
+       return 0;
+ }
+-
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/evtest.c dvb-apps/test/evtest.c
+--- linuxtv-dvb-apps-1.1.1/test/evtest.c       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/test/evtest.c     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,251 @@
++/*
++ * $Id: evtest.c,v 1.3 2005/08/15 20:43:52 js Exp $
++ *
++ *  Copyright (c) 1999-2000 Vojtech Pavlik
++ *
++ *  Event device test program
++ */
++
++/*
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++ *
++ * Should you need to contact me, the author, you can do so either by
++ * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
++ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
++ */
++
++#include <linux/input.h>
++
++#include <string.h>
++#include <fcntl.h>
++#include <unistd.h>
++#include <stdio.h>
++#include <stdlib.h>
++
++char *events[EV_MAX + 1] = { "Sync", "Key", "Relative", "Absolute", "Misc", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
++NULL, NULL, NULL, "LED", "Sound", NULL, "Repeat", "ForceFeedback", "Power", "ForceFeedbackStatus"};
++char *syncs[2] = { "Sync", "Config"};
++char *keys[KEY_MAX + 1] = {
++  // 0x000
++  "Reserved", "Esc", "1", "2", "3", "4", "5", "6",
++  "7", "8", "9", "0", "Minus", "Equal", "Backspace", "Tab",
++  // 0x010
++  "Q", "W", "E", "R", "T", "Y", "U", "I",
++  "O", "P", "LeftBrace", "RightBrace", "Enter", "LeftControl", "A", "S",
++  // 0x020
++  "D", "F", "G", "H", "J", "K", "L", "Semicolon",
++  "Apostrophe", "Grave", "LeftShift", "BackSlash", "Z", "X", "C", "V",
++  // 0x030
++  "B", "N", "M", "Comma", "Dot", "Slash", "RightShift", "KPAsterisk",
++  "LeftAlt", "Space", "CapsLock", "F1", "F2", "F3", "F4", "F5",
++  // 0x040
++  "F6", "F7", "F8", "F9", "F10", "NumLock", "ScrollLock", "KP7",
++  "KP8", "KP9", "KPMinus", "KP4", "KP5", "KP6", "KPPlus", "KP1",
++  // 0x050
++  "KP2", "KP3", "KP0", "KPDot", NULL, "ZENKAKUHANKAKU", "102nd", "F11",
++  "F12", "RO", "KATAKANA", "HIRAGANA", "HENKAN", "KATAKANAHIRAGANA", "MUHENKAN", "KPJPCOMMA",
++  // 0x060
++  "KPEnter", "RightCtrl", "KPSlash", "SysRq", "RightAlt", "LineFeed", "Home", "Up",
++  "PageUp", "Left", "Right", "End", "Down", "PageDown", "Insert", "Delete",
++  // 0x070
++  "Macro", "Mute", "VolumeDown", "VolumeUp", "Power", "KPEqual", "KPPlusMinus", "Pause",
++  NULL, "KPComma", "HANGUEL", "HANJA", "YEN", "LeftMeta", "RightMeta", "Compose",
++  // 0x080
++  "Stop", "Again", "Props", "Undo", "Front", "Copy", "Open", "Paste",
++  "Find", "Cut", "Help", "Menu", "Calc", "Setup", "Sleep", "WakeUp",
++  // 0x090
++  "File", "SendFile", "DeleteFile", "X-fer", "Prog1", "Prog2", "WWW", "MSDOS",
++  "Coffee", "Direction", "CycleWindows", "Mail", "Bookmarks", "Computer", "Back", "Forward",
++  // 0x0A0
++  "CloseCD", "EjectCD", "EjectCloseCD", "NextSong", "PlayPause", "PreviousSong", "StopCD", "Record",
++  "Rewind", "Phone", "ISOKey", "Config", "HomePage", "Refresh", "Exit", "Move",
++  // 0x0B0
++  "Edit", "ScrollUp", "ScrollDown", "KPLeftParenthesis", "KPRightParenthesis", NULL, NULL, "F13",
++  "F14", "F15", "F16", "F17", "F18", "F19", "F20", "F21",
++  // 0x0C0
++  "F22", "F23", "F24", NULL, NULL, NULL, NULL, NULL,
++  "PlayCD", "PauseCD", "Prog3", "Prog4", NULL, "Suspend", "Close", "Play",
++  // 0x0D0
++  "FastForward", "BassBoost", "Print", "HP", "Camera", "Sound", "Question", "EMail",
++  "Chat", "Search", "Connect", "Finance", "Sport", "Shop", "AltErase", "Cancel",
++  // 0x0E0
++  "BrightnessDown", "BrightnessUp", "Media", NULL, NULL, NULL, NULL, NULL,
++  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
++  // 0x0F0
++  "Unknown", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
++  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
++  // 0x100
++  "Btn0", "Btn1", "Btn2", "Btn3", "Btn4", "Btn5", "Btn6", "Btn7",
++  "Btn8", "Btn9", NULL, NULL,  NULL, NULL, NULL, NULL,
++  // 0x110
++  "LeftBtn", "RightBtn", "MiddleBtn", "SideBtn", "ExtraBtn", "ForwardBtn", "BackBtn", "TaskBtn",
++  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
++  // 0x120
++  "Trigger", "ThumbBtn", "ThumbBtn2", "TopBtn", "TopBtn2", "PinkieBtn", "BaseBtn", "BaseBtn2",
++  "BaseBtn3", "BaseBtn4", "BaseBtn5", "BaseBtn6", NULL, NULL, NULL, "BtnDead",
++  // 0x130
++  "BtnA", "BtnB", "BtnC", "BtnX", "BtnY", "BtnZ", "BtnTL", "BtnTR",
++  "BtnTL2", "BtnTR2", "BtnSelect", "BtnStart", "BtnMode", "BtnThumbL", "BtnThumbR", NULL,
++  // 0x140
++  "ToolPen", "ToolRubber", "ToolBrush", "ToolPencil", "ToolAirbrush", "ToolFinger", "ToolMouse", "ToolLens",
++  NULL, NULL, "Touch", "Stylus", "Stylus2", "ToolDoubleTap", "ToolTripleTap", NULL,
++  // 0x150
++  "GearDown", "GearUp", NULL, NULL, NULL, NULL, NULL, NULL,
++  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
++  // 0x160
++  "Ok", "Select", "Goto", "Clear", "Power2", "Option", "Info", "Time",
++  "Vendor", "Archive", "Program", "Channel", "Favorites", "EPG", "PVR", "MHP",
++  // 0x170
++  "Language", "Title", "Subtitle", "Angle", "Zoom", "Mode", "Keyboard", "Screen",
++  "PC", "TV", "TV2", "VCR", "VCR2", "Sat", "Sat2", "CD",
++  // 0x180
++  "Tape", "Radio", "Tuner", "Player", "Text", "DVD", "Aux", "MP3",
++  "Audio", "Video", "Directory", "List", "Memo", "Calendar", "Red", "Green",
++  // 0x190
++  "Yellow", "Blue", "ChannelUp", "ChannelDown", "First", "Last", "AB", "Next",
++  "Restart", "Slow", "Shuffle", "Break", "Previous", "Digits", "Teen", "Twen",
++  // 0x1A0
++  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
++  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
++  // 0x1B0
++  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
++  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
++  // 0x1C0
++  "DelEOL", "DelEOS", "InsLine", "DelLine", NULL, NULL, NULL, NULL,
++  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
++  // 0x1D0
++  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
++  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
++  // 0x1E0
++  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
++  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
++  // 0x1F0
++  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
++  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
++};
++
++char *absval[5] = { "Value", "Min  ", "Max  ", "Fuzz ", "Flat " };
++char *relatives[REL_MAX + 1] = {
++  "X", "Y", "Z", NULL, NULL, NULL, "HWheel", "Dial",
++  "Wheel", "Misc", NULL, NULL, NULL, NULL, NULL, NULL,
++};
++char *absolutes[ABS_MAX + 1] = {
++  // 0x00
++  "X", "Y", "Z", "Rx", "Ry", "Rz", "Throttle", "Rudder",
++  "Wheel", "Gas", "Brake", NULL, NULL, NULL, NULL, NULL,
++  // 0x10
++  "Hat0X", "Hat0Y", "Hat1X", "Hat1Y", "Hat2X", "Hat2Y", "Hat3X", "Hat 3Y",
++  "Pressure", "Distance", "XTilt", "YTilt", "ToolWidth", NULL, NULL, NULL,
++  // 0x20
++  "Volume", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
++  "Misc", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
++  // 0x30
++  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
++  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
++};
++char *leds[LED_MAX + 1] = { "NumLock", "CapsLock", "ScrollLock", "Compose", "Kana", "Sleep", "Suspend", "Mute" };
++char *repeats[REP_MAX + 1] = { "Delay", "Period" };
++char *sounds[SND_MAX + 1] = { "Bell", "Click" };
++
++char **names[EV_MAX + 1] = { syncs, keys, relatives, absolutes, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
++NULL, NULL, leds, sounds, NULL, repeats, NULL, NULL, NULL };
++
++#ifndef BITS_PER_LONG
++#define BITS_PER_LONG (sizeof(long) * 8)
++#endif
++#define NBITS(x) ((((x)-1)/BITS_PER_LONG)+1)
++#define OFF(x)  ((x)%BITS_PER_LONG)
++#define BIT(x)  (1UL<<OFF(x))
++#define LONG(x) ((x)/BITS_PER_LONG)
++#define test_bit(bit, array)  ((array[LONG(bit)] >> OFF(bit)) & 1)
++
++int main (int argc, char **argv)
++{
++      int fd, rd, i, j, k;
++      struct input_event ev[64];
++      int version;
++      unsigned short id[4];
++      unsigned long bit[EV_MAX][NBITS(KEY_MAX)];
++      char name[256] = "Unknown";
++      int _abs[5];
++
++      if (argc < 2) {
++              printf("Usage: evtest /dev/input/eventX\n");
++              printf("Where X = input device number\n");
++              exit(1);
++      }
++
++      if ((fd = open(argv[argc - 1], O_RDONLY)) < 0) {
++              perror("evtest");
++              exit(1);
++      }
++
++      if (ioctl(fd, EVIOCGVERSION, &version)) {
++              perror("evtest: can't get version");
++              exit(1);
++      }
++
++      printf("Input driver version is %d.%d.%d\n",
++              version >> 16, (version >> 8) & 0xff, version & 0xff);
++
++      ioctl(fd, EVIOCGID, id);
++      printf("Input device ID: bus 0x%x vendor 0x%x product 0x%x version 0x%x\n",
++              id[ID_BUS], id[ID_VENDOR], id[ID_PRODUCT], id[ID_VERSION]);
++
++      ioctl(fd, EVIOCGNAME(sizeof(name)), name);
++      printf("Input device name: \"%s\"\n", name);
++
++      memset(bit, 0, sizeof(bit));
++      ioctl(fd, EVIOCGBIT(0, EV_MAX), bit[0]);
++      printf("Supported events:\n");
++
++      for (i = 0; i < EV_MAX; i++)
++              if (test_bit(i, bit[0])) {
++                      printf("  Event type %d (%s)\n", i, events[i] ? events[i] : "?");
++                      ioctl(fd, EVIOCGBIT(i, KEY_MAX), bit[i]);
++                      for (j = 0; j < KEY_MAX; j++)
++                              if (test_bit(j, bit[i])) {
++                                      printf("    Event code %d (%s)\n", j, names[i] ? (names[i][j] ? names[i][j] : "?") : "?");
++                                      if (i == EV_ABS) {
++                                              ioctl(fd, EVIOCGABS(j), _abs);
++                                              for (k = 0; k < 5; k++)
++                                                      if ((k < 3) || _abs[k])
++                                                              printf("      %s %6d\n", absval[k], _abs[k]);
++                                      }
++                              }
++              }
++
++
++      printf("Testing ... (interrupt to exit)\n");
++
++      while (1) {
++              rd = read(fd, ev, sizeof(struct input_event) * 64);
++
++              if (rd < (int) sizeof(struct input_event)) {
++                      printf("yyy\n");
++                      perror("\nevtest: error reading");
++                      exit (1);
++              }
++
++              for (i = 0; i < rd / (int) sizeof(struct input_event); i++)
++                      printf("Event: time %ld.%06ld, type %d (%s), code %d (%s), value %d\n",
++                              ev[i].time.tv_sec, ev[i].time.tv_usec, ev[i].type,
++                              events[ev[i].type] ? events[ev[i].type] : "?",
++                              ev[i].code,
++                              names[ev[i].type] ? (names[ev[i].type][ev[i].code] ? names[ev[i].type][ev[i].code] : "?") : "?",
++                              ev[i].value);
++
++      }
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/hex_dump.c dvb-apps/test/hex_dump.c
+--- linuxtv-dvb-apps-1.1.1/test/hex_dump.c     2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/test/hex_dump.c   2009-06-21 13:29:06.000000000 +0200
+@@ -60,4 +60,3 @@
+       }
+       printf("\n");
+ }
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/libdvbcfg/dvbcfg_test.c dvb-apps/test/libdvbcfg/dvbcfg_test.c
+--- linuxtv-dvb-apps-1.1.1/test/libdvbcfg/dvbcfg_test.c        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/test/libdvbcfg/dvbcfg_test.c      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,100 @@
++/**
++ * dvbcfg testing.
++ *
++ * Copyright (c) 2005 by Andrew de Quincey <adq_dvb@lidskialf.net>
++ *
++ * This library is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU Lesser General Public License as
++ * published by the Free Software Foundation; either version 2.1 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++ */
++
++#include <stdlib.h>
++#include <stdio.h>
++#include <string.h>
++#include <libdvbcfg/dvbcfg_zapchannel.h>
++
++void syntax(void);
++
++struct dvbcfg_zapchannel *channels = NULL;
++int zapcount = 0;
++int zappos = 0;
++
++int zapload_callback(struct dvbcfg_zapchannel *channel, void *private);
++int zapsave_callback(struct dvbcfg_zapchannel *channel, void *private);
++
++int main(int argc, char *argv[])
++{
++        if (argc != 4) {
++                syntax();
++        }
++
++      if (!strcmp(argv[1], "-zapchannel")) {
++
++              FILE *f = fopen(argv[2], "r");
++              if (!f) {
++                      fprintf(stderr, "Unable to load %s\n", argv[2]);
++                      exit(1);
++              }
++              dvbcfg_zapchannel_parse(f, zapload_callback, NULL);
++              fclose(f);
++
++              f = fopen(argv[3], "w");
++              if (!f) {
++                      fprintf(stderr, "Unable to write %s\n", argv[3]);
++                      exit(1);
++              }
++              dvbcfg_zapchannel_save(f, zapsave_callback, NULL);
++              fclose(f);
++
++      } else {
++                syntax();
++        }
++
++        exit(0);
++}
++
++int zapload_callback(struct dvbcfg_zapchannel *channel, void *private)
++{
++      (void) private;
++
++      struct dvbcfg_zapchannel *tmp = realloc(channels, (zapcount+1) * sizeof(struct dvbcfg_zapchannel));
++      if (tmp == NULL) {
++              fprintf(stderr, "Out of memory\n");
++              exit(1);
++      }
++      channels = tmp;
++
++      memcpy(&channels[zapcount++], channel, sizeof(struct dvbcfg_zapchannel));
++
++      return 0;
++}
++
++int zapsave_callback(struct dvbcfg_zapchannel *channel, void *private)
++{
++      (void) private;
++
++      if (zappos >= zapcount)
++              return 1;
++
++      memcpy(channel, channels + zappos, sizeof(struct dvbcfg_zapchannel));
++      zappos++;
++
++      return 0;
++}
++
++void syntax()
++{
++        fprintf(stderr,
++                "Syntax: dvbcfg_test <-zapchannel> <input filename> <output filename>\n");
++        exit(1);
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/libdvbcfg/Makefile dvb-apps/test/libdvbcfg/Makefile
+--- linuxtv-dvb-apps-1.1.1/test/libdvbcfg/Makefile     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/test/libdvbcfg/Makefile   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,12 @@
++# Makefile for linuxtv.org dvb-apps/test/libdvbcfg
++
++binaries = dvbcfg_test
++
++CPPFLAGS += -I../../lib
++LDLIBS   += ../../lib/libdvbcfg/libdvbcfg.a
++
++.PHONY: all
++
++all: $(binaries)
++
++include ../../Make.rules
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/libdvbcfg/test_zapchannels.txt dvb-apps/test/libdvbcfg/test_zapchannels.txt
+--- linuxtv-dvb-apps-1.1.1/test/libdvbcfg/test_zapchannels.txt 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/test/libdvbcfg/test_zapchannels.txt       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,446 @@
++# Most of the major channels in the Raleigh Durham Area.  Frequencies the NTSC center freq.
++WRAL:707000000:8VSB:33:36
++WNCN:719000000:8VSB:49:52
++WTVD:701000000:8VSB:49:52
++WRAZ:683000000:8VSB:49:52
++WUNC:743000000:8VSB:49:52
++WRDU:551000000:8VSB:33:36
++WLFL:731000000:8VSB:33:36
++3sat:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:210:220
++ARD-Online-Kanal:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1805
++CNBC:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:510:520
++DLF-Köln:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:810
++DLR-Berlin:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:710
++EinsExtra:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:101:102
++EinsFestival:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:201:202
++EinsMuXx:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:301:302
++EuroNews:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2221:2233
++Eurosport:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:410:420
++Fritz:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:901
++KiKa:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:310:320
++MDR FERNSEHEN:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:401:402
++MDR KULTUR:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:801
++MDR info:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1101
++MHP ARD Online-Kanal:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:102
++NDR Fernsehen:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2401:2402
++ORB-Fernsehen:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:501:502
++RADIOmultikulti:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1301
++Radio 3:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:701
++SFB1:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:601:602
++SWR2:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1401
++SÜDWEST BW:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:801:802
++SÜDWEST RP:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:3101:3102
++WDR 3:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1501
++WDR 5:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1601
++ZDF:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:110:120
++ZDFdigitext:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++ZDFdokukanal:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:660:670
++ZDFinfokanal:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:610:620
++ZDFtheaterkanal:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++JUMP:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1001
++SPUTNIK:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1201
++Österreich 1:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:169
++ATV 2:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:631:632
++ATV 2:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:631:632
++Adagio:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++All Jazz:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++Avante:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:741:743
++B5 aktuell:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3101
++BBC Prime:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:761:762
++BData3:402000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++BData4:402000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++BData5:402000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++BR-alpha:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:701:702
++Barock Fantasie:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++Bayerisches FS:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:201:202
++Bayern 1:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3601
++Bayern 4 Klassik:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3001
++BibelTV:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:731:732
++Bloomberg:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++CLASSICA:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:767:768
++COUNTRY:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:656
++Canal 24 Horas:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:991:992
++Club:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:711:713
++Cristal New Age:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++DANCE:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:304
++DW-tv:610000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:634:632
++Das Erste:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:101:102
++Detskij Mir:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:931:932
++ERT-Sat:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:691:692
++Einstein TV:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:701:702
++Euronews:610000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:597:596
++Eurosport News:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:771:772
++Extreme Sports:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:791:793
++Extreme Sports:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++Fashion TV:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++Fox Kids:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:671:672
++Fox Kids:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:671:673
++GOLD:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:320
++HITLISTE:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:784
++HR XXL:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3501
++JAZZ:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:640
++Jazz legends:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++Kabel Wizard:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++Kanal 7:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++Kanal 7:610000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:49:52
++Kanal D:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:651:652
++Kanal D:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:651:652
++LATIN:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:368
++Landscape:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++Leitseite:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2254:0
++Liberty TV:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:721:723
++MTV Base:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:781:782
++MV-Test:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++Modem-Setup:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++Movie Sounds:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++Musica Antica:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++Musica Camerata:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++NDR Info:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3701
++NTV international:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++NTVI:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:611:612
++Nashe Kino:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:621:622
++NordwestRadio:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3801
++OLD GOLD:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:336
++Opernfestival:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++PCNE:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:681:682
++PREMIERE SPORT INTERACTIVE:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++PREMIERE DIREKT 1:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++PREMIERE DIREKT 2:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++PREMIERE DIREKT 3:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++PREMIERE DIREKT 4:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2815:2816
++PREMIERE EROTIK:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1279:1280
++PREMIERE NOSTALGIE:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2559:2560
++PREMIERE SERIE:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1023:1024
++PREMIERE SPORT 1:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:255:258
++PREMIERE SPORT 2:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:3839:3840
++PREMIERE START:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:255:256
++Parlamentsfernsehen:610000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:33:36
++Phoenix:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:901:902
++Portal:402000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++RTP Internacional:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:661:662
++Rai 1:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:951:952
++Rai 2:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:961:962
++Rai 3:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:971:972
++SCHLAGER:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:384
++SR 1:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3901
++SR Fernsehen Suedwest:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:501:502
++Show TV:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:911:912
++Sinfonica:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++TGRT:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:921:922
++TM V1.0:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++TV Polonia:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:641:642
++TVEi:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:981:982
++TW1:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:751:752
++Test-R:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:701:702
++Travel:610000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:595:594
++VCR-Setup:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++VH1 Classic:610000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:604:603
++Videotext:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++WDR FERNSEHEN:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:601:602
++ZEE TV:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++arte:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:401:403
++hessen fernsehen:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:301:302
++hr-chronos:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3201
++hr-klassik:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3401
++hr2:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3301
++13 TH STREET:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2303:2304
++ALTERNATIVE ROCK:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:544
++BEATE-UHSE.TV:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1023:1024
++CHILLOUT:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:400
++CLASSIC ROCK:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:352
++DISCOVERY CHANNEL:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1791:1792
++DISNEY CHANNEL:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2559:2560
++DEUTSCHE HITS:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:800
++EASY LISTENING:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:608
++Einstein:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++FILM & MUSICAL:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:592
++FOX KIDS:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1279:1280
++GOLDSTAR TV:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:3839:3840
++HARD ROCK:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:816
++HEIMATKANAL:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1535:1536
++HIP HOP/R&B:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:576
++JUNIOR:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:255:256
++K-TOON:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++KLASSIK POPULÄR:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:624
++KRIMI &CO:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1535:1536
++LOVE SONGS:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:592
++NEW COUNTRY:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:384
++ORCHESTRALE WERKE:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:560
++PLANET:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1791:1792
++PREMIERE 1:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:511:512
++PREMIERE 2:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1791:1793
++PREMIERE 3:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2303:2304
++PREMIERE 4:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:767:768
++PREMIERE 5:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1279:1280
++PREMIERE 6:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1535:1536
++PREMIERE 7:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1023:1024
++SOUL CLASSICS:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:352
++STUDIO UNIVERSAL:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2047:2048
++Sonnenklar TV:402000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++Das Erste:11837:h:0:27500:101:102:28106
++ZDF:11954:h:0:27500:110:120:28006
++3sat:11954:h:0:27500:210:220:28007
++EinsMuXx:12110:h:0:27500:301:302:28203
++EinsFestival:12110:h:0:27500:201:202:28202
++EinsExtra:12110:h:0:27500:101:102:28201
++MDR FERNSEHEN:12110:h:0:27500:401:402:28204
++ORB-Fernsehen:12110:h:0:27500:501:502:28205
++B1 Berlin:12110:h:0:27500:601:602:28206
++SWR Fernsehen:11837:h:0:27500:801:802:28113
++SR Fernsehen Suedwes:11837:h:0:27500:501:502:28110
++hessen fernsehen:11837:h:0:27500:301:302:28108
++WDR FERNSEHEN:11837:h:0:27500:601:602:28111
++Bayerisches FS:11837:h:0:27500:201:202:28107
++N3:12110:h:0:27500:2401:2402:28224
++BR-alpha:11837:h:0:27500:701:702:28112
++KiKa:11954:h:0:27500:310:320:28008
++arte:11836:h:0:27500:401:402:28109
++ZDF Theaterkanal:11954:h:0:27500:1110:1120:28016
++ZDF.info:11954:h:0:27500:610:620:28011
++ZDF.doku:11954:h:0:27500:660:670:28014
++Phoenix:11837:h:0:27500:901:902:28114
++DW-tv:10786:v:0:21997:305:306:9005
++RTL Television:12188:h:0:27500:163:104:12003
++SAT.1:12480:v:0:27500:1791:1792:46
++ProSieben:12480:v:0:27500:255:256:898
++RTL2:12188:h:0:27500:166:128:12020
++Super RTL:12188:h:0:27500:165:120:12040
++KABEL1:12480:v:0:27500:511:512:899
++VOX:12188:h:0:27500:167:136:12060
++tm3:12480:v:0:27500:767:768:897
++Bloomberg TV Germany:12552:v:0:22000:162:99:12160
++EuroNews:11954:h:0:27500:2221:2233:28015
++N24:12480:v:0:27500:2047:2048:47
++n-tv:12670:v:0:22000:162:96:12730
++DSF:12480:v:0:27500:1023:1024:900
++Eurosport:11954:h:0:27500:410:420:28009
++Via 1 - Sch ner Re:12148:h:0:27500:511:512:44
++Home Order Tel:12480:v:0:27500:1279:1280:40
++QVC GERMANY:12552:v:0:22000:165:166:12100
++TW 1:12692:h:0:22000:166:167:13013
++Canal Canarias:12441:v:0:27500:513:681:29700
++ProSieben A:12051:v:0:27500:161:84:20002
++ProSieben CH:12051:v:0:27500:289:290:20001
++Kabel 1 Austria:12051:v:0:27500:166:167:20004
++Kabel 1 Schweiz:12051:v:0:27500:162:163:20003
++CNN Int.:12168:v:0:27500:165:100:28512
++Sky News:12552:v:0:22000:305:306:3995
++Travel:12168:v:0:27500:163:92:28001
++AB SAT / XXL:12266:h:0:27500:164:96:17004
++MOTEURS:12266:h:0:27500:160:80:17000
++HOT GM:12148:h:0:27500:767:768:45
++KTO:12129:v:0:27500:170:120:8411
++LA CINQUIEME:12207:v:0:27500:160:80:8501
++LCP:12207:v:0:27500:165:100:8506
++LibertyTV.com:12611:v:0:22000:941:942:12280
++TV5 Europe:12611:v:0:22000:45:46:12240
++Motors TV:12611:v:0:22000:191:194:12300
++Wishline:12611:v:0:22000:214:216:12320
++TV 5:10786:v:0:21997:164:112:9001
++RTM - MAROC:10786:v:0:21997:162:96:9002
++ESC1 - EGYPTE:10786:v:0:21997:163:104:9003
++RAI 1:10786:v:0:21997:289:290:9004
++RTPI:10786:v:0:21997:300:301:9006
++TV7:10786:v:0:21997:166:128:9007
++ARTE:10786:v:0:21997:167:136:9009
++Colourbars:12611:v:0:22000:48:49:3982
++Alice:12611:v:0:22000:162:96:12200
++Video Italia:12611:v:0:22000:121:122:12220
++ANDALUCIA TV:11934:v:0:27500:166:104:29011
++TVC INT.:12441:v:0:27500:512:660:29701
++TV4:11992:h:0:27500:165:98:20365
++TV Niepokalanow:11876:h:0:27500:161:82:20601
++VIVA:12670:v:0:22000:309:310:12732
++VIVA ZWEI:12552:v:0:22000:171:172:12120
++MTV Central:12699:v:0:22000:3031:3032:28643
++ONYX:12692:h:1:27500:161:84:502
++VIVA polska:11603:h:1:27500:190:191:611
++DeeJay TV:11603:h:1:27500:160:161:602
++NBC:11053:h:1:27500:550:551:8008
++EWTN:10722:h:1:29900:1001:1201:4601
++MTA INTL:10722:h:1:29900:1004:1204:4604
++VOX:11053:h:1:27500:500:501:8002
++SAT.1 A:11053:h:1:27500:511:512:8003
++RTL2 AUSTRIA:11053:h:1:27500:520:521:8004
++ZDF:11053:h:1:27500:570:571:8011
++K-TV:11053:h:1:27500:580:581:8012
++RTL Television:11053:h:1:27500:160:80:8001
++ARTE:11059:v:1:6510:98:99:1
++HOT Italia:11095:h:1:27500:4194:4195:3714
++Olisat:11095:h:1:27500:33:34:3718
++VIVA-POLSKA:11128:h:1:4340:98:99:1
++DW-tv:11195:v:1:9099:101:102:5301
++Canal 24 Horas:11203:h:1:3999:4130:4131:5301
++TV5:11337:v:1:5631:512:640:1
++SAT.1 CH:11603:h:1:27500:101:102:601
++KurdSat:11603:h:1:27500:111:112:603
++ARD "Das Erste":11603:h:1:27500:172:173:606
++RTL 2 CH:11603:h:1:27500:175:176:609
++Super RTL A:11603:h:1:27500:180:181:610
++TV ROMANIA:11622:v:1:27500:227:247:10707
++MRTV:11622:v:1:27500:222:242:10702
++102.5 HIT Ch:11622:v:1:27500:224:244:10704
++TLC SAT:11622:v:1:27500:225:245:10705
++PRO-SAT:11622:v:1:27500:246:226:10706
++Channel SUN:11622:v:1:27500:229:249:10709
++Racing Channel:11622:v:1:27500:228:248:10708
++3 ABN:11622:v:1:27500:221:241:10701
++Bloom.Germany:11642:h:1:27500:1460:1420:4
++Bloomberg TV UK:11642:h:1:27500:1560:1520:4
++Sat 7:11642:h:1:27500:1660:1620:4
++EDTV 1:11746:h:1:27500:4130:4131:9501
++EDTV SPORT:11746:h:1:27500:4386:4387:9502
++EDTV BUSINESS:11746:h:1:27500:4642:4643:9503
++EDTV DRAMA:11746:h:1:27500:4898:4899:9504
++RAI1:11765:v:1:27499:160:80:3401
++RAI2:11765:v:1:27499:161:84:3402
++RAI3:11765:v:1:27499:162:88:3403
++RaiWayTEST2:11765:v:1:27499:516:654:3405
++RAIMOSAICO:11765:v:1:27499:518:8191:3407
++RAINews24:11803:v:1:27500:516:654:3301
++CAMERA DEPUTATI:11803:v:1:27500:517:655:3302
++TELEPACE:11803:v:1:27500:515:653:3304
++RAISPORTSAT:11803:v:1:27500:512:650:3305
++RAINettunoSAT2:11803:v:1:27500:513:651:3306
++RAIeducational:11803:v:1:27500:514:652:3307
++RAINettunoSAT1:11803:v:1:27500:519:657:3308
++SAT2000:11803:v:1:27500:518:656:3309
++I1:11918:v:1:27499:512:650:1
++C5:11918:v:1:27499:513:660:2
++R4:11918:v:1:27499:514:670:3
++Telesierra:12091:h:1:27500:4160:4161:8704
++C. Milagro:12091:h:1:27500:4368:4369:8711
++Italia Sat:12091:h:1:27500:4600:4601:8728
++TVE Internacional:12091:h:1:27500:4208:4209:8707
++Fiesta:12091:h:1:27500:4432:4433:8720
++Retelsat:12091:h:1:27500:4464:4465:8722
++ART EUROPE:12013:h:1:27495:164:96:450
++EGYPT SAT. CH. 2:12013:h:1:27495:166:104:470
++IQRA:12013:h:1:27495:168:112:474
++MAURITANIA TV:12110:v:1:27500:230:231:704
++ARMENIA TV:12110:v:1:27500:240:241:705
++SAILING CHANNEL:12110:v:1:27500:260:261:707
++AL JAZEERA:12110:v:1:27500:270:271:708
++Coming Soon TV:12110:v:1:27500:310:311:717
++SaluteBenessere:12110:v:1:27500:320:321:718
++AH-EDP1:12148:v:1:27499:96:97:7201
++AH-EDP2:12148:v:1:27499:112:113:7202
++Espresso:12148:v:1:27499:192:193:7203
++Alice:12148:v:1:27499:160:161:7220
++Nuvolari:12148:v:1:27499:176:177:7221
++Leonardo:12148:v:1:27499:128:129:7222
++AH-EDP3:12148:v:1:27499:36:37:7205
++OTE Promo:12187:v:1:27500:517:655:1001
++RTS SAT:12187:v:1:27500:519:657:1022
++ERT SAT:12187:v:1:27500:514:652:1102
++EXTRA:12187:v:1:27500:516:654:1106
++TRIAL:12187:v:1:27500:513:651:1108
++Minimax:11303:h:1:19540:300:301:3
++TVN1:12209:h:1:5631:4194:4195:1
++RR TEST:10978:v:1:8998:33:34:1
++TV 5 Thailand:10978:v:1:8998:1057:1058:2
++TEST-1:10978:v:1:8998:3105:3106:4
++FASHION:12244:h:1:27500:123:133:103
++AJARA TV:12244:h:1:27500:127:137:107
++SLO-TV1:12300:v:1:27495:200:201:3201
++POLONIA 1:12302:v:1:27500:205:206:3203
++SUPER 1:12302:v:1:27500:207:208:3207
++NAPOLI INT.:12302:v:1:27500:240:241:3210
++MAGIC:12302:v:1:27500:245:246:3211
++COUNTDOWN:12302:v:1:27500:235:236:3212
++TBNE:12302:v:1:27500:230:231:3213
++NAPOLI CHANNEL:12302:v:1:27500:227:228:3215
++KURDISTAN TV:12302:v:1:27500:225:226:3214
++ATLAS TV:12379:v:1:27500:3022:3032:3002
++TELE 24 SWITZERLAND:12379:v:1:27500:3023:3033:3003
++Abu Dhabi TV:12379:v:1:27500:3024:3034:3004
++RTV MONTENEGRO:12379:v:1:27500:3026:3036:3006
++JAAM-E-JAM 1:12436:h:1:27500:160:80:1
++JAAM-E-JAM 2:12436:h:1:27500:161:82:2
++SAHAR:12436:h:1:27500:162:84:3
++SAHAR 2:12436:h:1:27500:163:86:4
++IRINN:12436:h:1:27500:164:88:5
++Musicmax:11303:h:1:19540:500:501:6
++TEST:12474:h:1:27500:771:8191:10608
++EbS:12474:h:1:27500:101:201:10601
++MOU.2:12474:h:1:27500:42:43:10602
++PINK PLUS:12474:h:1:27500:308:256:10605
++LibertyTV.com:12474:h:1:27500:941:942:10603
++2M Maroc:12474:h:1:27500:601:602:10607
++ZEE TV:12474:h:1:27500:910:911:10604
++WorldNet Europe:12483:v:1:8299:4260:4220:1
++WorldNet:12483:v:1:8299:4560:4520:4
++SICILIA INTERNATIONA:12519:v:1:27499:501:502:8309
++SARDEGNA UNO:12519:v:1:27499:503:504:8310
++EuroMed:12519:v:1:27499:510:511:8312
++TGRT:12519:v:1:27499:505:506:8313
++VIDEOLINA:12519:v:1:27499:515:516:8318
++MEDIOLANUM:12538:h:1:27500:1131:1132:8987
++www.travel:12538:h:1:27500:1180:1183:8992
++MonteCarloSat:12538:h:1:27500:5126:5122:8877
++Bulgaria TV:12538:h:1:27500:4612:4613:8827
++TVN1:12571:h:1:5631:4194:4195:1
++JSTV 1:12595:v:1:27500:2000:2001:8213
++JSTV 2:12595:v:1:27500:2011:2013:8214
++MBC:12595:v:1:27500:160:80:8201
++ANN:12595:v:1:27500:161:84:8202
++BET:12595:v:1:27500:167:108:8208
++EuroNews:12595:v:1:27500:2221:2231:8211
++Sharjah        Arabs:12653:h:1:27500:1160:1120:1
++Qatar          Arabs:12653:h:1:27500:1260:1220:2
++Saudi 1        Arabs:12653:h:1:27500:1360:1320:3
++Kuwait         Arabs:12653:h:1:27500:1460:1420:4
++Libya          Arabs:12653:h:1:27500:1560:1520:5
++Sudan          Arabs:12653:h:1:27500:1660:1620:6
++Oman           Arabs:12653:h:1:27500:1760:1720:7
++Jordan         Arabs:12653:h:1:27500:1860:1820:8
++IRAQ TV:12653:h:1:27500:1960:1920:9
++Dubai Sport:12653:h:1:27500:1060:1020:10
++Digitaly:12672:v:1:27500:220:221:4203
++Telemarket:12672:v:1:27500:350:351:4211
++eVision:12672:v:1:27500:360:361:4214
++Thai TV5:12672:v:1:27500:200:201:4201
++Studio Europa:12672:v:1:27500:230:231:4204
++Video  Italia:12672:v:1:27500:340:341:4210
++GAME NETWORK:12672:v:1:27500:291:292:4213
++BBC-Choice:578000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:620:621
++BBC-Knowledge:578000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:630:631
++BBC-News24:578000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:640:641
++BBC-1:578000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:600:601
++BBC-Parliament:578000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:660
++BBC-2:578000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:610:611
++ITV-1:850000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:513:651
++ITV-2:850000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2818:2819
++ITV-Sport:850000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2836:2837
++FilmFour:850000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2822:2823
++C4:850000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2826:2827
++E4:850000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2831:2832
++C5:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6017:6018
++Shop:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6049:6050
++ITVSelect-Info:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6065:6066
++ITVSelect-1:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6081:6082
++ITVSelect-2:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6097:6098
++ITVSelect-3:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6113:6114
++ITVSelect-4:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6129:6130
++Carlton-Cinema:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:288:289
++Sky-One:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:544:545
++Sky-Sports-1:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:800:801
++Sky-Premier:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:1056:1057
++CartoonNetwork:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:1312:1313
++UK-Horizons:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2336:2337
++ITV-Sport-Plus:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2592:2593
++ITVSportSelect:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:2596
++BreezeMen&Mtrs:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:800:801
++Granada-Plus:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:544:545
++MTV:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:1568:1569
++Sky-Movie-Max:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:1312:1313
++Sky-Sports-2:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2080:2081
++UK-Gold:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:288:289
++Wellbeing:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:1824:1825
++PLAY-uk:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:288:289
++UK-Style:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:544:545
++no-name:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:800:801
++Discovery:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:1312:1313
++Nick/Paramount:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2080:2081
++Sky-Sports-3:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2336:2337
++Brit-Eurosport:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2592:2593
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/libdvben50221/Makefile dvb-apps/test/libdvben50221/Makefile
+--- linuxtv-dvb-apps-1.1.1/test/libdvben50221/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/test/libdvben50221/Makefile       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,14 @@
++# Makefile for linuxtv.org dvb-apps/test/libdvben50221
++
++binaries = test-app       \
++           test-session   \
++           test-transport
++
++CPPFLAGS += -I../../lib
++LDLIBS   += ../../lib/libdvbapi/libdvbapi.a ../../lib/libdvben50221/libdvben50221.a ../../lib/libucsi/libucsi.a -lpthread
++
++.PHONY: all
++
++all: $(binaries)
++
++include ../../Make.rules
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/libdvben50221/test-app.c dvb-apps/test/libdvben50221/test-app.c
+--- linuxtv-dvb-apps-1.1.1/test/libdvben50221/test-app.c       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/test/libdvben50221/test-app.c     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,854 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 transport layer
++
++    Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
++    Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
++    Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#include <stdio.h>
++#include <ctype.h>
++#include <unistd.h>
++#include <libdvben50221/en50221_session.h>
++#include <libdvben50221/en50221_app_utils.h>
++#include <libdvben50221/en50221_app_ai.h>
++#include <libdvben50221/en50221_app_auth.h>
++#include <libdvben50221/en50221_app_ca.h>
++#include <libdvben50221/en50221_app_datetime.h>
++#include <libdvben50221/en50221_app_dvb.h>
++#include <libdvben50221/en50221_app_epg.h>
++#include <libdvben50221/en50221_app_lowspeed.h>
++#include <libdvben50221/en50221_app_mmi.h>
++#include <libdvben50221/en50221_app_rm.h>
++#include <libdvben50221/en50221_app_smartcard.h>
++#include <libdvben50221/en50221_app_teletext.h>
++#include <libdvbapi/dvbca.h>
++#include <pthread.h>
++#include <libdvbcfg/dvbcfg_zapchannel.h>
++#include <libdvbapi/dvbdemux.h>
++#include <libucsi/section.h>
++#include <libucsi/mpeg/section.h>
++
++#define DEFAULT_SLOT 0
++
++#define MAX_SESSIONS 256
++#define MAX_TC 32
++
++void *stackthread_func(void* arg);
++void *pmtthread_func(void* arg);
++int test_lookup_callback(void *arg, uint8_t slot_id, uint32_t requested_resource_id,
++                         en50221_sl_resource_callback *callback_out, void **arg_out, uint32_t *connected_resource_id);
++int test_session_callback(void *arg, int reason, uint8_t slot_id, uint16_t session_number, uint32_t resource_id);
++
++int test_datetime_enquiry_callback(void *arg, uint8_t slot_id, uint16_t session_number, uint8_t response_interval);
++
++int test_rm_enq_callback(void *arg, uint8_t slot_id, uint16_t session_number);
++int test_rm_reply_callback(void *arg, uint8_t slot_id, uint16_t session_number, uint32_t resource_id_count, uint32_t *resource_ids);
++int test_rm_changed_callback(void *arg, uint8_t slot_id, uint16_t session_number);
++
++int test_ai_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                     uint8_t application_type, uint16_t application_manufacturer,
++                     uint16_t manufacturer_code, uint8_t menu_string_length,
++                     uint8_t *menu_string);
++
++int test_ca_info_callback(void *arg, uint8_t slot_id, uint16_t session_number, uint32_t ca_id_count, uint16_t *ca_ids);
++int test_ca_pmt_reply_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                               struct en50221_app_pmt_reply *reply, uint32_t reply_size);
++
++int test_mmi_close_callback(void *arg, uint8_t slot_id, uint16_t session_number, uint8_t cmd_id, uint8_t delay);
++
++int test_mmi_display_control_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                                        uint8_t cmd_id, uint8_t mmi_mode);
++
++int test_mmi_keypad_control_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                                        uint8_t cmd_id, uint8_t *key_codes, uint32_t key_codes_count);
++
++int test_mmi_subtitle_segment_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                                        uint8_t *segment, uint32_t segment_size);
++
++int test_mmi_scene_end_mark_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                                        uint8_t decoder_continue_flag, uint8_t scene_reveal_flag,
++                                        uint8_t send_scene_done, uint8_t scene_tag);
++
++int test_mmi_scene_control_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                                    uint8_t decoder_continue_flag, uint8_t scene_reveal_flag,
++                                    uint8_t scene_tag);
++
++int test_mmi_subtitle_download_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                                        uint8_t *segment, uint32_t segment_size);
++
++int test_mmi_flush_download_callback(void *arg, uint8_t slot_id, uint16_t session_number);
++
++int test_mmi_enq_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                            uint8_t blind_answer, uint8_t expected_answer_length,
++                            uint8_t *text, uint32_t text_size);
++
++int test_mmi_menu_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                            struct en50221_app_mmi_text *title,
++                            struct en50221_app_mmi_text *sub_title,
++                            struct en50221_app_mmi_text *bottom,
++                            uint32_t item_count, struct en50221_app_mmi_text *items,
++                            uint32_t item_raw_length, uint8_t *items_raw);
++
++int test_app_mmi_list_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                                struct en50221_app_mmi_text *title,
++                                struct en50221_app_mmi_text *sub_title,
++                                struct en50221_app_mmi_text *bottom,
++                                uint32_t item_count, struct en50221_app_mmi_text *items,
++                                uint32_t item_raw_length, uint8_t *items_raw);
++
++struct section_ext *read_section_ext(char *buf, int buflen, int adapter, int demux, int pid, int table_id);
++
++
++
++
++
++
++
++int adapterid;
++
++int shutdown_stackthread = 0;
++int shutdown_pmtthread = 0;
++int in_menu = 0;
++int in_enq = 0;
++int ca_connected = 0;
++int pmt_pid = -1;
++int ca_session_number = 0;
++
++
++// instances of resources we actually implement here
++struct en50221_app_rm *rm_resource;
++struct en50221_app_datetime *datetime_resource;
++struct en50221_app_ai *ai_resource;
++struct en50221_app_ca *ca_resource;
++struct en50221_app_mmi *mmi_resource;
++
++// lookup table used in resource manager implementation
++struct resource {
++    struct en50221_app_public_resource_id resid;
++    uint32_t binary_resource_id;
++    en50221_sl_resource_callback callback;
++    void *arg;
++};
++struct resource resources[20];
++int resources_count = 0;
++
++// this contains all known resource ids so we can see if the cam asks for something exotic
++uint32_t resource_ids[] = { EN50221_APP_TELETEXT_RESOURCEID,
++                            EN50221_APP_SMARTCARD_RESOURCEID(1),
++                            EN50221_APP_RM_RESOURCEID,
++                            EN50221_APP_MMI_RESOURCEID,
++                            EN50221_APP_LOWSPEED_RESOURCEID(1,1),
++                            EN50221_APP_EPG_RESOURCEID(1),
++                            EN50221_APP_DVB_RESOURCEID,
++                            EN50221_APP_CA_RESOURCEID,
++                            EN50221_APP_DATETIME_RESOURCEID,
++                            EN50221_APP_AUTH_RESOURCEID,
++                            EN50221_APP_AI_RESOURCEID, };
++int resource_ids_count = sizeof(resource_ids)/4;
++
++
++uint16_t ai_session_numbers[5];
++
++uint16_t mmi_session_number;
++
++int main(int argc, char * argv[])
++{
++    pthread_t stackthread;
++    pthread_t pmtthread;
++    struct en50221_app_send_functions sendfuncs;
++
++    if ((argc < 2) || (argc > 3)) {
++        fprintf(stderr, "Syntax: test-app <adapterid> [<pmtpid>]\n");
++        exit(1);
++    }
++    adapterid = atoi(argv[1]);
++    if (argc == 3) {
++        if (sscanf(argv[2], "%i", &pmt_pid) != 1) {
++            fprintf(stderr, "Unable to parse PMT PID\n");
++            exit(1);
++        }
++    }
++
++    // create transport layer
++    struct en50221_transport_layer *tl = en50221_tl_create(5, 32);
++    if (tl == NULL) {
++        fprintf(stderr, "Failed to create transport layer\n");
++        exit(1);
++    }
++
++    // find CAMs
++    int cafd;
++    if (((cafd = dvbca_open(adapterid, 0)) < 0) || (dvbca_get_cam_state(cafd, DEFAULT_SLOT) == DVBCA_CAMSTATE_MISSING)) {
++        fprintf(stderr, "Unable to open CAM on adapter %i\n", adapterid);
++        exit(1);
++    }
++
++    // reset it and wait
++    dvbca_reset(cafd, DEFAULT_SLOT);
++    printf("Found a CAM on adapter%i... waiting...\n", adapterid);
++    while(dvbca_get_cam_state(cafd, DEFAULT_SLOT) != DVBCA_CAMSTATE_READY) {
++        usleep(1000);
++    }
++
++    // register it with the CA stack
++    int slot_id = 0;
++    if ((slot_id = en50221_tl_register_slot(tl, cafd, DEFAULT_SLOT, 1000, 100)) < 0) {
++        fprintf(stderr, "Slot registration failed\n");
++        exit(1);
++    }
++    printf("slotid: %i\n", slot_id);
++
++    // create session layer
++    struct en50221_session_layer *sl = en50221_sl_create(tl, 256);
++    if (sl == NULL) {
++        fprintf(stderr, "Failed to create session layer\n");
++        exit(1);
++    }
++
++    // create the sendfuncs
++    sendfuncs.arg        = sl;
++    sendfuncs.send_data  = (en50221_send_data) en50221_sl_send_data;
++    sendfuncs.send_datav = (en50221_send_datav) en50221_sl_send_datav;
++
++    // create the resource manager resource
++    rm_resource = en50221_app_rm_create(&sendfuncs);
++    en50221_app_decode_public_resource_id(&resources[resources_count].resid, EN50221_APP_RM_RESOURCEID);
++    resources[resources_count].binary_resource_id = EN50221_APP_RM_RESOURCEID;
++    resources[resources_count].callback = (en50221_sl_resource_callback) en50221_app_rm_message;
++    resources[resources_count].arg = rm_resource;
++    en50221_app_rm_register_enq_callback(rm_resource, test_rm_enq_callback, NULL);
++    en50221_app_rm_register_reply_callback(rm_resource, test_rm_reply_callback, NULL);
++    en50221_app_rm_register_changed_callback(rm_resource, test_rm_changed_callback, NULL);
++    resources_count++;
++
++    // create the datetime resource
++    datetime_resource = en50221_app_datetime_create(&sendfuncs);
++    en50221_app_decode_public_resource_id(&resources[resources_count].resid, EN50221_APP_DATETIME_RESOURCEID);
++    resources[resources_count].binary_resource_id = EN50221_APP_DATETIME_RESOURCEID;
++    resources[resources_count].callback = (en50221_sl_resource_callback) en50221_app_datetime_message;
++    resources[resources_count].arg = datetime_resource;
++    en50221_app_datetime_register_enquiry_callback(datetime_resource, test_datetime_enquiry_callback, NULL);
++    resources_count++;
++
++    // create the application information resource
++    ai_resource = en50221_app_ai_create(&sendfuncs);
++    en50221_app_decode_public_resource_id(&resources[resources_count].resid, EN50221_APP_AI_RESOURCEID);
++    resources[resources_count].binary_resource_id = EN50221_APP_AI_RESOURCEID;
++    resources[resources_count].callback = (en50221_sl_resource_callback) en50221_app_ai_message;
++    resources[resources_count].arg = ai_resource;
++    en50221_app_ai_register_callback(ai_resource, test_ai_callback, NULL);
++    resources_count++;
++
++    // create the CA resource
++    ca_resource = en50221_app_ca_create(&sendfuncs);
++    en50221_app_decode_public_resource_id(&resources[resources_count].resid, EN50221_APP_CA_RESOURCEID);
++    resources[resources_count].binary_resource_id = EN50221_APP_CA_RESOURCEID;
++    resources[resources_count].callback = (en50221_sl_resource_callback) en50221_app_ca_message;
++    resources[resources_count].arg = ca_resource;
++    en50221_app_ca_register_info_callback(ca_resource, test_ca_info_callback, NULL);
++    en50221_app_ca_register_pmt_reply_callback(ca_resource, test_ca_pmt_reply_callback, NULL);
++    resources_count++;
++
++    // create the MMI resource
++    mmi_resource = en50221_app_mmi_create(&sendfuncs);
++    en50221_app_decode_public_resource_id(&resources[resources_count].resid, EN50221_APP_MMI_RESOURCEID);
++    resources[resources_count].binary_resource_id = EN50221_APP_MMI_RESOURCEID;
++    resources[resources_count].callback = (en50221_sl_resource_callback) en50221_app_mmi_message;
++    resources[resources_count].arg = mmi_resource;
++    en50221_app_mmi_register_close_callback(mmi_resource, test_mmi_close_callback, NULL);
++    en50221_app_mmi_register_display_control_callback(mmi_resource, test_mmi_display_control_callback, NULL);
++    en50221_app_mmi_register_keypad_control_callback(mmi_resource, test_mmi_keypad_control_callback, NULL);
++    en50221_app_mmi_register_subtitle_segment_callback(mmi_resource, test_mmi_subtitle_segment_callback, NULL);
++    en50221_app_mmi_register_scene_end_mark_callback(mmi_resource, test_mmi_scene_end_mark_callback, NULL);
++    en50221_app_mmi_register_scene_control_callback(mmi_resource, test_mmi_scene_control_callback, NULL);
++    en50221_app_mmi_register_subtitle_download_callback(mmi_resource, test_mmi_subtitle_download_callback, NULL);
++    en50221_app_mmi_register_flush_download_callback(mmi_resource, test_mmi_flush_download_callback, NULL);
++    en50221_app_mmi_register_enq_callback(mmi_resource, test_mmi_enq_callback, NULL);
++    en50221_app_mmi_register_menu_callback(mmi_resource, test_mmi_menu_callback, NULL);
++    en50221_app_mmi_register_list_callback(mmi_resource, test_app_mmi_list_callback, NULL);
++    resources_count++;
++
++    // start another thread running the stack
++    pthread_create(&stackthread, NULL, stackthread_func, tl);
++
++    // start another thread parsing PMT
++    if (pmt_pid != -1) {
++        pthread_create(&pmtthread, NULL, pmtthread_func, tl);
++    }
++
++    // register callbacks
++    en50221_sl_register_lookup_callback(sl, test_lookup_callback, sl);
++    en50221_sl_register_session_callback(sl, test_session_callback, sl);
++
++    // create a new connection on each slot
++    int tc = en50221_tl_new_tc(tl, slot_id);
++    printf("tcid: %i\n", tc);
++
++    printf("Press a key to enter menu\n");
++    getchar();
++    en50221_app_ai_entermenu(ai_resource, ai_session_numbers[slot_id]);
++
++    // wait
++    char tmp[256];
++    while(1) {
++        fgets(tmp, sizeof(tmp), stdin);
++        int choice = atoi(tmp);
++
++        if (in_menu) {
++            en50221_app_mmi_menu_answ(mmi_resource, mmi_session_number, choice);
++            in_menu = 0;
++        }
++        if (in_enq) {
++            uint32_t i;
++            uint32_t len = strlen(tmp);
++            for(i=0; i< len; i++) {
++                if (!isdigit(tmp[i])) {
++                    len = i;
++                    break;
++                }
++            }
++          en50221_app_mmi_answ(mmi_resource, mmi_session_number, MMI_ANSW_ID_ANSWER, (uint8_t*) tmp, len);
++            in_enq = 0;
++        }
++    }
++    printf("Press a key to exit\n");
++    getchar();
++
++    // destroy slots
++    en50221_tl_destroy_slot(tl, slot_id);
++    shutdown_stackthread = 1;
++    shutdown_pmtthread = 1;
++    pthread_join(stackthread, NULL);
++    if (pmt_pid != -1) {
++        pthread_join(pmtthread, NULL);
++    }
++
++    // destroy session layer
++    en50221_sl_destroy(sl);
++
++    // destroy transport layer
++    en50221_tl_destroy(tl);
++
++    return 0;
++}
++
++int test_lookup_callback(void *arg, uint8_t slot_id, uint32_t requested_resource_id,
++                         en50221_sl_resource_callback *callback_out, void **arg_out, uint32_t *connected_resource_id)
++{
++    struct en50221_app_public_resource_id resid;
++    (void)arg;
++
++    // decode the resource id
++    if (en50221_app_decode_public_resource_id(&resid, requested_resource_id)) {
++        printf("%02x:Public resource lookup callback %i %i %i\n", slot_id,
++               resid.resource_class, resid.resource_type, resid.resource_version);
++    } else {
++        printf("%02x:Private resource lookup callback %08x\n", slot_id, requested_resource_id);
++        return -1;
++    }
++
++    // FIXME: need better comparison
++    // FIXME: return resourceid we actually connected to
++
++    // try and find an instance of the resource
++    int i;
++    for(i=0; i<resources_count; i++) {
++        if ((resid.resource_class == resources[i].resid.resource_class) &&
++            (resid.resource_type == resources[i].resid.resource_type)) {
++            *callback_out = resources[i].callback;
++            *arg_out = resources[i].arg;
++            *connected_resource_id = resources[i].binary_resource_id;
++            return 0;
++        }
++    }
++
++    return -1;
++}
++
++int test_session_callback(void *arg, int reason, uint8_t slot_id, uint16_t session_number, uint32_t resource_id)
++{
++    (void)arg;
++    switch(reason) {
++        case S_SCALLBACK_REASON_CAMCONNECTING:
++            printf("%02x:CAM connecting to resource %08x, session_number %i\n",
++                   slot_id, resource_id, session_number);
++            break;
++        case S_SCALLBACK_REASON_CAMCONNECTED:
++            printf("%02x:CAM successfully connected to resource %08x, session_number %i\n",
++                   slot_id, resource_id, session_number);
++
++            if (resource_id == EN50221_APP_RM_RESOURCEID) {
++                en50221_app_rm_enq(rm_resource, session_number);
++            } else if (resource_id == EN50221_APP_AI_RESOURCEID) {
++                en50221_app_ai_enquiry(ai_resource, session_number);
++            } else if (resource_id == EN50221_APP_CA_RESOURCEID) {
++                en50221_app_ca_info_enq(ca_resource, session_number);
++                ca_session_number = session_number;
++            }
++
++            break;
++        case S_SCALLBACK_REASON_CAMCONNECTFAIL:
++            printf("%02x:CAM on failed to connect to resource %08x\n", slot_id, resource_id);
++            break;
++        case S_SCALLBACK_REASON_CONNECTED:
++            printf("%02x:Host connection to resource %08x connected successfully, session_number %i\n",
++                   slot_id, resource_id, session_number);
++            break;
++        case S_SCALLBACK_REASON_CONNECTFAIL:
++            printf("%02x:Host connection to resource %08x failed, session_number %i\n",
++                   slot_id, resource_id, session_number);
++            break;
++        case S_SCALLBACK_REASON_CLOSE:
++            printf("%02x:Connection to resource %08x, session_number %i closed\n",
++                   slot_id, resource_id, session_number);
++            break;
++        case S_SCALLBACK_REASON_TC_CONNECT:
++            printf("%02x:Host originated transport connection %i connected\n", slot_id, session_number);
++            break;
++        case S_SCALLBACK_REASON_TC_CAMCONNECT:
++            printf("%02x:CAM originated transport connection %i connected\n", slot_id, session_number);
++            break;
++    }
++    return 0;
++}
++
++
++
++int test_rm_enq_callback(void *arg, uint8_t slot_id, uint16_t session_number)
++{
++    (void)arg;
++
++    printf("%02x:%s\n", slot_id, __func__);
++
++    if (en50221_app_rm_reply(rm_resource, session_number, resource_ids_count, resource_ids)) {
++        printf("%02x:Failed to send reply to ENQ\n", slot_id);
++    }
++
++    return 0;
++}
++
++int test_rm_reply_callback(void *arg, uint8_t slot_id, uint16_t session_number, uint32_t resource_id_count, uint32_t *_resource_ids)
++{
++    (void)arg;
++    printf("%02x:%s\n", slot_id, __func__);
++
++    uint32_t i;
++    for(i=0; i< resource_id_count; i++) {
++        printf("  CAM provided resource id: %08x\n", _resource_ids[i]);
++    }
++
++    if (en50221_app_rm_changed(rm_resource, session_number)) {
++        printf("%02x:Failed to send REPLY\n", slot_id);
++    }
++
++    return 0;
++}
++
++int test_rm_changed_callback(void *arg, uint8_t slot_id, uint16_t session_number)
++{
++    (void)arg;
++    printf("%02x:%s\n", slot_id, __func__);
++
++    if (en50221_app_rm_enq(rm_resource, session_number)) {
++        printf("%02x:Failed to send ENQ\n", slot_id);
++    }
++
++    return 0;
++}
++
++
++
++int test_datetime_enquiry_callback(void *arg, uint8_t slot_id, uint16_t session_number, uint8_t response_interval)
++{
++    (void)arg;
++    printf("%02x:%s\n", slot_id, __func__);
++    printf("  response_interval:%i\n", response_interval);
++
++    if (en50221_app_datetime_send(datetime_resource, session_number, time(NULL), -1)) {
++        printf("%02x:Failed to send datetime\n", slot_id);
++    }
++
++    return 0;
++}
++
++
++
++int test_ai_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                     uint8_t application_type, uint16_t application_manufacturer,
++                     uint16_t manufacturer_code, uint8_t menu_string_length,
++                     uint8_t *menu_string)
++{
++    (void)arg;
++
++    printf("%02x:%s\n", slot_id, __func__);
++    printf("  Application type: %02x\n", application_type);
++    printf("  Application manufacturer: %04x\n", application_manufacturer);
++    printf("  Manufacturer code: %04x\n", manufacturer_code);
++    printf("  Menu string: %.*s\n", menu_string_length, menu_string);
++
++    ai_session_numbers[slot_id] = session_number;
++
++    return 0;
++}
++
++
++
++int test_ca_info_callback(void *arg, uint8_t slot_id, uint16_t session_number, uint32_t ca_id_count, uint16_t *ca_ids)
++{
++    (void)arg;
++    (void)session_number;
++
++    printf("%02x:%s\n", slot_id, __func__);
++    uint32_t i;
++    for(i=0; i< ca_id_count; i++) {
++        printf("  Supported CA ID: %04x\n", ca_ids[i]);
++    }
++
++    ca_connected = 1;
++    return 0;
++}
++
++int test_ca_pmt_reply_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                               struct en50221_app_pmt_reply *reply, uint32_t reply_size)
++{
++    (void)arg;
++    (void)session_number;
++    (void)reply;
++    (void)reply_size;
++
++    printf("%02x:%s\n", slot_id, __func__);
++
++    return 0;
++}
++
++
++int test_mmi_close_callback(void *arg, uint8_t slot_id, uint16_t session_number, uint8_t cmd_id, uint8_t delay)
++{
++    (void)arg;
++    (void)session_number;
++
++    printf("%02x:%s\n", slot_id, __func__);
++    printf("  cmd_id: %02x\n", cmd_id);
++    printf("  delay: %02x\n", delay);
++
++    return 0;
++}
++
++int test_mmi_display_control_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                                        uint8_t cmd_id, uint8_t mmi_mode)
++{
++    (void)arg;
++    (void)session_number;
++
++    printf("%02x:%s\n", slot_id, __func__);
++    printf("  cmd_id: %02x\n", cmd_id);
++    printf("  mode: %02x\n", mmi_mode);
++
++    if (cmd_id == MMI_DISPLAY_CONTROL_CMD_ID_SET_MMI_MODE) {
++        struct en50221_app_mmi_display_reply_details details;
++
++        details.u.mode_ack.mmi_mode = mmi_mode;
++        if (en50221_app_mmi_display_reply(mmi_resource, session_number, MMI_DISPLAY_REPLY_ID_MMI_MODE_ACK, &details)) {
++            printf("%02x:Failed to send mode ack\n", slot_id);
++        }
++    }
++
++    return 0;
++}
++
++int test_mmi_keypad_control_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                                        uint8_t cmd_id, uint8_t *key_codes, uint32_t key_codes_count)
++{
++    (void)arg;
++    (void)session_number;
++    (void)cmd_id;
++    (void)key_codes;
++    (void)key_codes_count;
++
++    printf("%02x:%s\n", slot_id, __func__);
++
++    return 0;
++}
++
++int test_mmi_subtitle_segment_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                                        uint8_t *segment, uint32_t segment_size)
++{
++    (void)arg;
++    (void)session_number;
++    (void)segment;
++    (void)segment_size;
++
++    printf("%02x:%s\n", slot_id, __func__);
++
++    return 0;
++}
++
++int test_mmi_scene_end_mark_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                                        uint8_t decoder_continue_flag, uint8_t scene_reveal_flag,
++                                        uint8_t send_scene_done, uint8_t scene_tag)
++{
++    (void)arg;
++    (void)session_number;
++    (void)decoder_continue_flag;
++    (void)scene_reveal_flag;
++    (void)send_scene_done;
++    (void)scene_tag;
++
++    printf("%02x:%s\n", slot_id, __func__);
++
++    return 0;
++}
++
++int test_mmi_scene_control_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                                    uint8_t decoder_continue_flag, uint8_t scene_reveal_flag,
++                                    uint8_t scene_tag)
++{
++    (void)arg;
++    (void)session_number;
++    (void)decoder_continue_flag;
++    (void)scene_reveal_flag;
++    (void)scene_tag;
++
++    printf("%02x:%s\n", slot_id, __func__);
++
++    return 0;
++}
++
++int test_mmi_subtitle_download_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                                        uint8_t *segment, uint32_t segment_size)
++{
++    (void)arg;
++    (void)session_number;
++    (void)segment;
++    (void)segment_size;
++
++    printf("%02x:%s\n", slot_id, __func__);
++
++    return 0;
++}
++
++int test_mmi_flush_download_callback(void *arg, uint8_t slot_id, uint16_t session_number)
++{
++    (void)arg;
++    (void)session_number;
++
++    printf("%02x:%s\n", slot_id, __func__);
++
++    return 0;
++}
++
++int test_mmi_enq_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                            uint8_t blind_answer, uint8_t expected_answer_length,
++                            uint8_t *text, uint32_t text_size)
++{
++    (void)arg;
++    (void)text;
++    (void)text_size;
++
++    printf("%02x:%s\n", slot_id, __func__);
++    printf("  blind: %i\n", blind_answer);
++    printf("  expected_answer_length: %i\n", expected_answer_length);
++
++    mmi_session_number = session_number;
++    in_enq = 1;
++
++    return 0;
++}
++
++int test_mmi_menu_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                            struct en50221_app_mmi_text *title,
++                            struct en50221_app_mmi_text *sub_title,
++                            struct en50221_app_mmi_text *bottom,
++                            uint32_t item_count, struct en50221_app_mmi_text *items,
++                            uint32_t item_raw_length, uint8_t *items_raw)
++{
++    (void)arg;
++    (void)items_raw;
++
++    printf("%02x:%s\n", slot_id, __func__);
++
++    printf("  title: %.*s\n", title->text_length, title->text);
++    printf("  sub_title: %.*s\n", sub_title->text_length, sub_title->text);
++    printf("  bottom: %.*s\n", bottom->text_length, bottom->text);
++
++    uint32_t i;
++    for(i=0; i< item_count; i++) {
++        printf("  item %i: %.*s\n", i+1, items[i].text_length, items[i].text);
++    }
++    printf("  raw_length: %i\n", item_raw_length);
++
++    mmi_session_number = session_number;
++    in_menu = 1;
++
++    return 0;
++}
++
++int test_app_mmi_list_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                                struct en50221_app_mmi_text *title,
++                                struct en50221_app_mmi_text *sub_title,
++                                struct en50221_app_mmi_text *bottom,
++                                uint32_t item_count, struct en50221_app_mmi_text *items,
++                                uint32_t item_raw_length, uint8_t *items_raw)
++{
++    (void)arg;
++    (void)items_raw;
++    (void)arg;
++
++    printf("%02x:%s\n", slot_id, __func__);
++
++    printf("  title: %.*s\n", title->text_length, title->text);
++    printf("  sub_title: %.*s\n", sub_title->text_length, sub_title->text);
++    printf("  bottom: %.*s\n", bottom->text_length, bottom->text);
++
++    uint32_t i;
++    for(i=0; i< item_count; i++) {
++        printf("  item %i: %.*s\n", i+1, items[i].text_length, items[i].text);
++    }
++    printf("  raw_length: %i\n", item_raw_length);
++
++    mmi_session_number = session_number;
++    in_menu = 1;
++
++    return 0;
++}
++
++
++
++
++
++
++
++void *stackthread_func(void* arg) {
++    struct en50221_transport_layer *tl = arg;
++    int lasterror = 0;
++
++    while(!shutdown_stackthread) {
++        int error;
++        if ((error = en50221_tl_poll(tl)) != 0) {
++            if (error != lasterror) {
++                fprintf(stderr, "Error reported by stack slot:%i error:%i\n",
++                        en50221_tl_get_error_slot(tl),
++                        en50221_tl_get_error(tl));
++            }
++            lasterror = error;
++        }
++    }
++
++    shutdown_stackthread = 0;
++    return 0;
++}
++
++void *pmtthread_func(void* arg) {
++    (void)arg;
++    char buf[4096];
++    uint8_t capmt[4096];
++    int pmtversion = -1;
++
++    while(!shutdown_pmtthread) {
++
++        if (!ca_connected) {
++            sleep(1);
++            continue;
++        }
++
++        // read the PMT
++        struct section_ext *section_ext = read_section_ext(buf, sizeof(buf), adapterid, 0, pmt_pid, stag_mpeg_program_map);
++        if (section_ext == NULL) {
++            fprintf(stderr, "Failed to read PMT\n");
++            exit(1);
++        }
++        struct mpeg_pmt_section *pmt = mpeg_pmt_section_codec(section_ext);
++        if (pmt == NULL) {
++            fprintf(stderr, "Bad PMT received\n");
++            exit(1);
++        }
++        if (pmt->head.version_number == pmtversion) {
++            continue;
++        }
++
++        // translate it into a CA PMT
++        int listmgmt = CA_LIST_MANAGEMENT_ONLY;
++        if (pmtversion != -1) {
++            listmgmt = CA_LIST_MANAGEMENT_UPDATE;
++        }
++        int size;
++        if ((size = en50221_ca_format_pmt(pmt,
++                                         capmt,
++                                         sizeof(capmt),
++                                         listmgmt,
++                                         0,
++                                         CA_PMT_CMD_ID_OK_DESCRAMBLING)) < 0) {
++            fprintf(stderr, "Failed to format CA PMT object\n");
++            exit(1);
++        }
++
++        // set it
++        if (en50221_app_ca_pmt(ca_resource, ca_session_number, capmt, size)) {
++            fprintf(stderr, "Failed to send CA PMT object\n");
++            exit(1);
++        }
++        pmtversion = pmt->head.version_number;
++    }
++    shutdown_pmtthread = 0;
++    return 0;
++}
++
++
++struct section_ext *read_section_ext(char *buf, int buflen, int adapter, int demux, int pid, int table_id)
++{
++    int demux_fd = -1;
++    uint8_t filter[18];
++    uint8_t mask[18];
++    int size;
++    struct section *section;
++    struct section_ext *result = NULL;
++
++    // open the demuxer
++    if ((demux_fd = dvbdemux_open_demux(adapter, demux, 0)) < 0) {
++        goto exit;
++    }
++
++    // create a section filter
++    memset(filter, 0, sizeof(filter));
++    memset(mask, 0, sizeof(mask));
++    filter[0] = table_id;
++    mask[0] = 0xFF;
++    if (dvbdemux_set_section_filter(demux_fd, pid, filter, mask, 1, 1)) {
++        goto exit;
++    }
++
++    // read the section
++    if ((size = read(demux_fd, buf, buflen)) < 0) {
++        goto exit;
++    }
++
++    // parse it as a section
++    section = section_codec((uint8_t*) buf, size);
++    if (section == NULL) {
++        goto exit;
++    }
++
++    // parse it as a section_ext
++    result = section_ext_decode(section, 0);
++
++exit:
++    if (demux_fd != -1)
++        close(demux_fd);
++    return result;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/libdvben50221/test-session.c dvb-apps/test/libdvben50221/test-session.c
+--- linuxtv-dvb-apps-1.1.1/test/libdvben50221/test-session.c   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/test/libdvben50221/test-session.c 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,171 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 transport layer
++
++    Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
++    Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
++    Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#include <stdio.h>
++#include <unistd.h>
++#include <libdvben50221/en50221_session.h>
++#include <libdvben50221/en50221_app_utils.h>
++#include <libdvbapi/dvbca.h>
++#include <pthread.h>
++
++void *stackthread_func(void* arg);
++int test_lookup_callback(void *arg, uint8_t slot_id, uint32_t requested_resource_id,
++                         en50221_sl_resource_callback *callback_out, void **arg_out, uint32_t *connected_resource_id);
++int test_session_callback(void *arg, int reason, uint8_t slot_id, uint16_t session_number, uint32_t resource_id);
++
++
++int shutdown_stackthread = 0;
++
++#define DEFAULT_SLOT 0
++
++int main(int argc, char * argv[])
++{
++    (void)argc;
++    (void)argv;
++
++    int i;
++    pthread_t stackthread;
++
++    // create transport layer
++    struct en50221_transport_layer *tl = en50221_tl_create(5, 32);
++    if (tl == NULL) {
++        fprintf(stderr, "Failed to create transport layer\n");
++        exit(1);
++    }
++
++    // find CAMs
++    int slot_count = 0;
++    int cafd= -1;
++    for(i=0; i<20; i++) {
++        if ((cafd = dvbca_open(i, 0)) > 0) {
++            if (dvbca_get_cam_state(cafd, DEFAULT_SLOT) == DVBCA_CAMSTATE_MISSING) {
++                close(cafd);
++                continue;
++            }
++
++            // reset it and wait
++            dvbca_reset(cafd, DEFAULT_SLOT);
++            printf("Found a CAM on adapter%i... waiting...\n", i);
++            while(dvbca_get_cam_state(cafd, DEFAULT_SLOT) != DVBCA_CAMSTATE_READY) {
++                usleep(1000);
++            }
++
++            // register it with the CA stack
++            int slot_id = 0;
++            if ((slot_id = en50221_tl_register_slot(tl, cafd, DEFAULT_SLOT, 1000, 100)) < 0) {
++                fprintf(stderr, "Slot registration failed\n");
++                exit(1);
++            }
++            printf("slotid: %i\n", slot_id);
++            slot_count++;
++        }
++    }
++
++    // create session layer
++    struct en50221_session_layer *sl = en50221_sl_create(tl, 256);
++    if (sl == NULL) {
++        fprintf(stderr, "Failed to create session layer\n");
++        exit(1);
++    }
++
++    // start another thread running the stack
++    pthread_create(&stackthread, NULL, stackthread_func, tl);
++
++    // register callbacks
++    en50221_sl_register_lookup_callback(sl, test_lookup_callback, sl);
++    en50221_sl_register_session_callback(sl, test_session_callback, sl);
++
++    // create a new connection
++    for(i=0; i<slot_count; i++) {
++        int tc = en50221_tl_new_tc(tl, i);
++        printf("tcid: %i\n", tc);
++    }
++
++    // wait
++    printf("Press a key to exit\n");
++    getchar();
++
++    // destroy slots
++    for(i=0; i<slot_count; i++) {
++        en50221_tl_destroy_slot(tl, i);
++    }
++    shutdown_stackthread = 1;
++    pthread_join(stackthread, NULL);
++
++    // destroy session layer
++    en50221_sl_destroy(sl);
++
++    // destroy transport layer
++    en50221_tl_destroy(tl);
++
++    return 0;
++}
++
++int test_lookup_callback(void *arg, uint8_t slot_id, uint32_t requested_resource_id,
++                         en50221_sl_resource_callback *callback_out, void **arg_out, uint32_t *connected_resource_id)
++{
++    (void)arg;
++    (void)callback_out;
++    (void)arg_out;
++    (void)connected_resource_id;
++
++    struct en50221_app_public_resource_id resid;
++
++    if (en50221_app_decode_public_resource_id(&resid, requested_resource_id)) {
++        printf("Public resource lookup callback %i %i %i %i\n", slot_id,
++               resid.resource_class, resid.resource_type, resid.resource_version);
++    } else {
++        printf("Private resource lookup callback %i %08x\n", slot_id, requested_resource_id);
++    }
++
++    return -1;
++}
++
++int test_session_callback(void *arg, int reason, uint8_t slot_id, uint16_t session_number, uint32_t resource_id)
++{
++   (void)arg;
++
++    printf("Session callback %i %i %i %04x\n", slot_id, session_number, reason, resource_id);
++
++    return -1;
++}
++
++void *stackthread_func(void* arg) {
++    struct en50221_transport_layer *tl = arg;
++    int lasterror = 0;
++
++    while(!shutdown_stackthread) {
++        int error;
++        if ((error = en50221_tl_poll(tl)) != 0) {
++            if (error != lasterror) {
++                fprintf(stderr, "Error reported by stack slot:%i error:%i\n",
++                        en50221_tl_get_error_slot(tl),
++                        en50221_tl_get_error(tl));
++            }
++            lasterror = error;
++        }
++    }
++
++    shutdown_stackthread = 0;
++    return 0;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/libdvben50221/test-transport.c dvb-apps/test/libdvben50221/test-transport.c
+--- linuxtv-dvb-apps-1.1.1/test/libdvben50221/test-transport.c 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/test/libdvben50221/test-transport.c       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,144 @@
++/*
++    en50221 encoder An implementation for libdvb
++    an implementation for the en50221 transport layer
++
++    Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
++    Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
++    Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++    This library is free software; you can redistribute it and/or modify
++    it under the terms of the GNU Lesser General Public License as
++    published by the Free Software Foundation; either version 2.1 of
++    the License, or (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#include <stdio.h>
++#include <unistd.h>
++#include <libdvben50221/en50221_transport.h>
++#include <libdvbapi/dvbca.h>
++#include <pthread.h>
++
++void *stackthread_func(void* arg);
++void test_callback(void *arg, int reason,
++                   uint8_t *data, uint32_t data_length,
++                   uint8_t slot_id, uint8_t connection_id);
++
++int shutdown_stackthread = 0;
++
++#define DEFAULT_SLOT 0
++
++int main(int argc, char * argv[])
++{
++    (void)argc;
++    (void)argv;
++
++    int i;
++    pthread_t stackthread;
++
++    // create transport layer
++    struct en50221_transport_layer *tl = en50221_tl_create(5, 32);
++    if (tl == NULL) {
++        fprintf(stderr, "Failed to create transport layer\n");
++        exit(1);
++    }
++
++    // find CAMs
++    int slot_count = 0;
++    int cafd= -1;
++    for(i=0; i<20; i++) {
++        if ((cafd = dvbca_open(i, 0)) > 0) {
++            if (dvbca_get_cam_state(cafd, DEFAULT_SLOT) == DVBCA_CAMSTATE_MISSING) {
++                close(cafd);
++                continue;
++            }
++
++            // reset it and wait
++            dvbca_reset(cafd, DEFAULT_SLOT);
++            printf("Found a CAM on adapter%i... waiting...\n", i);
++            while(dvbca_get_cam_state(cafd, DEFAULT_SLOT) != DVBCA_CAMSTATE_READY) {
++                usleep(1000);
++            }
++
++            // register it with the CA stack
++            int slot_id = 0;
++            if ((slot_id = en50221_tl_register_slot(tl, cafd, DEFAULT_SLOT, 1000, 100)) < 0) {
++                fprintf(stderr, "Slot registration failed\n");
++                exit(1);
++            }
++            printf("slotid: %i\n", slot_id);
++            slot_count++;
++        }
++    }
++
++    // start another thread to running the stack
++    pthread_create(&stackthread, NULL, stackthread_func, tl);
++
++    // register callback
++    en50221_tl_register_callback(tl, test_callback, tl);
++
++    // create a new connection
++    for(i=0; i<slot_count; i++) {
++        int tc = en50221_tl_new_tc(tl, i);
++        printf("tcid: %i\n", tc);
++    }
++
++    // wait
++    printf("Press a key to exit\n");
++    getchar();
++
++    // destroy slots
++    for(i=0; i<slot_count; i++) {
++        en50221_tl_destroy_slot(tl, i);
++    }
++    shutdown_stackthread = 1;
++    pthread_join(stackthread, NULL);
++
++    // destroy transport layer
++    en50221_tl_destroy(tl);
++
++    return 0;
++}
++
++void test_callback(void *arg, int reason,
++                   uint8_t *data, uint32_t data_length,
++                   uint8_t slot_id, uint8_t connection_id)
++{
++    (void) arg;
++
++    printf("-----------------------------------\n");
++    printf("CALLBACK SLOTID:%i %i %i\n", slot_id, connection_id, reason);
++
++    uint32_t i;
++    for(i=0; i< data_length; i++) {
++        printf("%02x %02x\n", i, data[i]);
++    }
++}
++
++void *stackthread_func(void* arg) {
++    struct en50221_transport_layer *tl = arg;
++    int lasterror = 0;
++
++    while(!shutdown_stackthread) {
++        int error;
++        if ((error = en50221_tl_poll(tl)) != 0) {
++            if (error != lasterror) {
++                fprintf(stderr, "Error reported by stack slot:%i error:%i\n",
++                        en50221_tl_get_error_slot(tl),
++                        en50221_tl_get_error(tl));
++            }
++            lasterror = error;
++        }
++    }
++
++    shutdown_stackthread = 0;
++    return 0;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/libdvbsec/dvbsec_test.c dvb-apps/test/libdvbsec/dvbsec_test.c
+--- linuxtv-dvb-apps-1.1.1/test/libdvbsec/dvbsec_test.c        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/test/libdvbsec/dvbsec_test.c      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,85 @@
++/**
++ * dvbsec testing.
++ *
++ * Copyright (c) 2005 by Andrew de Quincey <adq_dvb@lidskialf.net>
++ *
++ * This library is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU Lesser General Public License as
++ * published by the Free Software Foundation; either version 2.1 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++ */
++
++#include <stdlib.h>
++#include <stdio.h>
++#include <string.h>
++#include <libdvbsec/dvbsec_cfg.h>
++
++void syntax(void);
++
++struct dvbsec_config *secconfigs = NULL;
++int seccount = 0;
++
++int secload_callback(void *private, struct dvbsec_config *sec);
++
++int main(int argc, char *argv[])
++{
++        if (argc != 4) {
++                syntax();
++        }
++
++      if (!strcmp(argv[1], "-sec")) {
++
++              FILE *f = fopen(argv[2], "r");
++              if (!f) {
++                      fprintf(stderr, "Unable to load %s\n", argv[2]);
++                      exit(1);
++              }
++              dvbsec_cfg_load(f, NULL, secload_callback);
++              fclose(f);
++
++              f = fopen(argv[3], "w");
++              if (!f) {
++                      fprintf(stderr, "Unable to write %s\n", argv[3]);
++                      exit(1);
++              }
++              dvbsec_cfg_save(f, secconfigs, seccount);
++              fclose(f);
++
++      } else {
++                syntax();
++        }
++
++        exit(0);
++}
++
++int secload_callback(void *private, struct dvbsec_config *sec)
++{
++      (void) private;
++
++      struct dvbsec_config *tmp = realloc(secconfigs, (seccount+1) * sizeof(struct dvbsec_config));
++      if (tmp == NULL) {
++              fprintf(stderr, "Out of memory\n");
++              exit(1);
++      }
++      secconfigs = tmp;
++
++      memcpy(&secconfigs[seccount++], sec, sizeof(struct dvbsec_config));
++
++      return 0;
++}
++
++void syntax()
++{
++        fprintf(stderr,
++                "Syntax: dvbcfg_test <-zapchannel|-sec> <input filename> <output filename>\n");
++        exit(1);
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/libdvbsec/Makefile dvb-apps/test/libdvbsec/Makefile
+--- linuxtv-dvb-apps-1.1.1/test/libdvbsec/Makefile     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/test/libdvbsec/Makefile   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,12 @@
++# Makefile for linuxtv.org dvb-apps/test/libdvbsec
++
++binaries = dvbsec_test
++
++CPPFLAGS += -I../../lib
++LDLIBS   += ../../lib/libdvbsec/libdvbsec.a
++
++.PHONY: all
++
++all: $(binaries)
++
++include ../../Make.rules
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/libdvbsec/test_sec.txt dvb-apps/test/libdvbsec/test_sec.txt
+--- linuxtv-dvb-apps-1.1.1/test/libdvbsec/test_sec.txt 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/test/libdvbsec/test_sec.txt       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,28 @@
++[sec]
++name=test1
++switch-frequency=100000
++lof-lo-v=20
++lof-lo-h=30
++lof-lo-l=40
++lof-lo-r=50
++lof-hi-v=60
++lof-hi-h=70
++lof-hi-l=80
++lof-hi-r=90
++config-type=none
++
++[sec]
++name=test2
++switch-frequency=200
++lof-lo-v=40
++lof-hi-h=50
++config-type=simple
++
++[sec]
++name=test3
++switch-frequency=100000
++lof-lo-l=20
++lof-hi-r=30
++config-type=advanced
++cmd-lo-v=MOOVH
++cmd-lo-h=MOOLH
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/libesg/Makefile dvb-apps/test/libesg/Makefile
+--- linuxtv-dvb-apps-1.1.1/test/libesg/Makefile        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/test/libesg/Makefile      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,12 @@
++# Makefile for linuxtv.org dvb-apps/test/libucsi
++
++binaries = testesg
++
++CPPFLAGS += -I../../lib
++LDLIBS   += ../../lib/libesg/libesg.a
++
++.PHONY: all
++
++all: $(binaries)
++
++include ../../Make.rules
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/libesg/samples/ESGProviderDiscoveryDescriptor.xml dvb-apps/test/libesg/samples/ESGProviderDiscoveryDescriptor.xml
+--- linuxtv-dvb-apps-1.1.1/test/libesg/samples/ESGProviderDiscoveryDescriptor.xml      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/test/libesg/samples/ESGProviderDiscoveryDescriptor.xml    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,13 @@
++<?xml version="1.0"?>
++<ESGProviderDiscovery xmlns="urn:dvb:ipdc:esgbs:2005" xmlns:mpeg7="urn:mpeg:mpeg7:schema:2001">
++  <ServiceProvider>
++    <ProviderURI>http://www.sidsa.com</ProviderURI>
++    <ProviderName>SIDSA (Multiple Stream)</ProviderName>
++    <ProviderID>1</ProviderID>
++  </ServiceProvider>
++  <ServiceProvider>
++    <ProviderURI>http://www.sidsa.com</ProviderURI>
++    <ProviderName>SIDSA (Single Stream)</ProviderName>
++    <ProviderID>2</ProviderID>
++  </ServiceProvider>
++</ESGProviderDiscovery>
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/libesg/testesg.c dvb-apps/test/libesg/testesg.c
+--- linuxtv-dvb-apps-1.1.1/test/libesg/testesg.c       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/test/libesg/testesg.c     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,563 @@
++/*
++ * ESG parser
++ *
++ * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <stdio.h>
++#include <unistd.h>
++#include <stdlib.h>
++#include <string.h>
++#include <fcntl.h>
++#include <sys/stat.h>
++
++#include <libesg/bootstrap/access_descriptor.h>
++#include <libesg/encapsulation/container.h>
++#include <libesg/encapsulation/fragment_management_information.h>
++#include <libesg/encapsulation/data_repository.h>
++#include <libesg/encapsulation/string_repository.h>
++#include <libesg/representation/encapsulated_textual_esg_xml_fragment.h>
++#include <libesg/representation/init_message.h>
++#include <libesg/representation/textual_decoder_init.h>
++#include <libesg/representation/bim_decoder_init.h>
++#include <libesg/transport/session_partition_declaration.h>
++
++#define MAX_FILENAME 256
++
++void usage(void) {
++  static const char *_usage =
++    "Usage: testesg [-a <ESGAccessDescriptor>]\n"
++    "               [-c <ESGContainer with Textual ESG XML Fragment>]\n"
++    "               [-X XXXX]\n";
++
++  fprintf(stderr, "%s", _usage);
++  exit(1);
++}
++
++void read_from_file(const char *filename, char **buffer, int *size) {
++      int fd;
++      struct stat fs;
++
++      if ((fd = open(filename, O_RDONLY)) <= 0) {
++              fprintf(stderr, "File not found\n");
++              exit(1);
++      }
++
++      if (fstat(fd, &fs) < 0) {
++              fprintf(stderr, "File not readable\n");
++              exit(1);
++      }
++      *size = fs.st_size;
++
++      *buffer = (char *) malloc(*size);
++      if (read(fd, *buffer, *size) != *size) {
++              fprintf(stderr, "File read error\n");
++              exit(1);
++      }
++
++      close(fd);
++
++      return;
++}
++
++int main(int argc, char *argv[]) {
++      char access_descriptor_filename[MAX_FILENAME] = "";
++      char container_filename[MAX_FILENAME] = "";
++      int c;
++      char *buffer = NULL;
++      int size;
++
++      // Read command line options
++      while ((c = getopt(argc, argv, "a:c:")) != -1) {
++              switch (c) {
++                      case 'a':
++                              strncpy(access_descriptor_filename, optarg, MAX_FILENAME);
++                              break;
++                      case 'c':
++                              strncpy(container_filename, optarg, MAX_FILENAME);
++                              break;
++                      default:
++                              usage();
++              }
++      }
++
++      // ESGAccessDescriptor
++      if (strncmp(access_descriptor_filename, "", MAX_FILENAME) != 0) {
++              fprintf(stdout, "**************************************************\n");
++              fprintf(stdout, "Reading ESG Access Descriptor = %s\n", access_descriptor_filename);
++              fprintf(stdout, "**************************************************\n\n");
++
++              read_from_file(access_descriptor_filename, &buffer, &size);
++
++              struct esg_access_descriptor *access_descriptor = esg_access_descriptor_decode((uint8_t *) buffer, size);
++              free(buffer);
++              if (access_descriptor == NULL) {
++                      fprintf(stderr, "ESG Access Descriptor decode error\n");
++                      exit(1);
++              }
++              fprintf(stdout, "n_o_ESGEntries %d\n\n", access_descriptor->n_o_entries);
++
++              struct esg_entry *entry;
++              esg_access_descriptor_entry_list_for_each(access_descriptor, entry) {
++                      fprintf(stdout, "    ESGEntryVersion %d\n", entry->version);
++                      fprintf(stdout, "    MultipleStreamTransport %d\n", entry->multiple_stream_transport);
++                      fprintf(stdout, "    IPVersion6 %d\n", entry->ip_version_6);
++                      fprintf(stdout, "    ProviderID %d\n", entry->provider_id);
++                      if (entry->ip_version_6 == 0) {
++                              fprintf(stdout, "    SourceIPAddress %d.%d.%d.%d\n",
++                                      entry->source_ip.ipv4[0],
++                                      entry->source_ip.ipv4[1],
++                                      entry->source_ip.ipv4[2],
++                                      entry->source_ip.ipv4[3]);
++                              fprintf(stdout, "    DestinationIPAddress %d.%d.%d.%d\n",
++                                      entry->destination_ip.ipv4[0],
++                                      entry->destination_ip.ipv4[1],
++                                      entry->destination_ip.ipv4[2],
++                                      entry->destination_ip.ipv4[3]);
++                      } else if (entry->ip_version_6 == 1) {
++                              fprintf(stdout, "    SourceIPAddress %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x\n",
++                                      entry->source_ip.ipv6[0],
++                                      entry->source_ip.ipv6[1],
++                                      entry->source_ip.ipv6[2],
++                                      entry->source_ip.ipv6[3],
++                                      entry->source_ip.ipv6[4],
++                                      entry->source_ip.ipv6[5],
++                                      entry->source_ip.ipv6[6],
++                                      entry->source_ip.ipv6[7],
++                                      entry->source_ip.ipv6[8],
++                                      entry->source_ip.ipv6[9],
++                                      entry->source_ip.ipv6[10],
++                                      entry->source_ip.ipv6[11],
++                                      entry->source_ip.ipv6[12],
++                                      entry->source_ip.ipv6[13],
++                                      entry->source_ip.ipv6[14],
++                                      entry->source_ip.ipv6[15]);
++                              fprintf(stdout, "    DestinationIPAddress %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x\n",
++                                      entry->destination_ip.ipv6[0],
++                                      entry->destination_ip.ipv6[1],
++                                      entry->destination_ip.ipv6[2],
++                                      entry->destination_ip.ipv6[3],
++                                      entry->destination_ip.ipv6[4],
++                                      entry->destination_ip.ipv6[5],
++                                      entry->destination_ip.ipv6[6],
++                                      entry->destination_ip.ipv6[7],
++                                      entry->destination_ip.ipv6[8],
++                                      entry->destination_ip.ipv6[9],
++                                      entry->destination_ip.ipv6[10],
++                                      entry->destination_ip.ipv6[11],
++                                      entry->destination_ip.ipv6[12],
++                                      entry->destination_ip.ipv6[13],
++                                      entry->destination_ip.ipv6[14],
++                                      entry->destination_ip.ipv6[15]);
++                              }
++                      fprintf(stdout, "Port %d\n", entry->port);
++                      fprintf(stdout, "TSI %d\n", entry->tsi);
++                      fprintf(stdout, "\n");
++              }
++      }
++
++      // ESGContainer
++      if (strncmp(container_filename, "", MAX_FILENAME) != 0) {
++              fprintf(stdout, "**************************************************\n");
++              fprintf(stdout, "Reading ESG Container = %s\n", container_filename);
++              fprintf(stdout, "**************************************************\n\n");
++
++              read_from_file(container_filename, &buffer, &size);
++
++              struct esg_container *container = esg_container_decode((uint8_t *) buffer, size);
++              free(buffer);
++              if (container == NULL) {
++                      fprintf(stderr, "ESG Container decode error\n");
++                      exit(1);
++              }
++              if (container->header == NULL) {
++                      fprintf(stderr, "ESG Container no header found\n");
++                      exit(1);
++              }
++
++              struct esg_encapsulation_structure *fragment_management_information = NULL;
++              struct esg_data_repository *data_repository = NULL;
++              struct esg_string_repository *string_repository = NULL;
++              struct esg_container_structure *structure = NULL;
++              struct esg_init_message *init_message = NULL;
++              struct esg_textual_encoding_parameters *textual_encoding_parameters = NULL;
++              struct esg_textual_decoder_init *textual_decoder_init = NULL;
++              struct esg_namespace_prefix *namespace_prefix = NULL;
++              struct esg_xml_fragment_type *xml_fragment_type = NULL;
++              struct esg_bim_encoding_parameters *bim_encoding_parameters = NULL;
++              struct esg_bim_decoder_init *bim_decoder_init = NULL;
++              struct esg_session_partition_declaration *partition = NULL;
++              struct esg_session_field *field = NULL;
++              struct esg_session_ip_stream *ip_stream = NULL;
++              struct esg_session_ip_stream_field *ip_stream_field = NULL;
++              esg_container_header_structure_list_for_each(container->header, structure) {
++                      fprintf(stdout, "    structure_type %d [0x%02x]\n", structure->type, structure->type);
++                      fprintf(stdout, "    structure_id %d [0x%02x]\n", structure->id, structure->id);
++                      fprintf(stdout, "    structure_ptr %d\n", structure->ptr);
++                      fprintf(stdout, "    structure_length %d\n\n", structure->length);
++                              switch (structure->type) {
++                              case 0x01: {
++                                      switch (structure->id) {
++                                              case 0x00: {
++                                                      fprintf(stdout, "        ESG Fragment Management Information\n");
++
++                                                      fragment_management_information = (struct esg_encapsulation_structure *) structure->data;
++                                                      if (fragment_management_information == NULL) {
++                                                              fprintf(stderr, "ESG Fragment Management Information decode error\n");
++                                                              exit(1);
++                                                      }
++
++                                                      fprintf(stdout, "            fragment_reference_format %d [0x%02x]\n\n", fragment_management_information->header->fragment_reference_format, fragment_management_information->header->fragment_reference_format);
++
++                                                      struct esg_encapsulation_entry *entry;
++                                                      esg_encapsulation_structure_entry_list_for_each(fragment_management_information, entry) {
++                                                              fprintf(stdout, "                fragment_type %d [0x%02x]\n", entry->fragment_reference->fragment_type, entry->fragment_reference->fragment_type);
++                                                              fprintf(stdout, "                data_repository_offset %d\n", entry->fragment_reference->data_repository_offset);
++                                                              fprintf(stdout, "                fragment_version %d\n", entry->fragment_version);
++                                                              fprintf(stdout, "                fragment_id %d\n\n", entry->fragment_id);
++                                                      }
++
++                                                      break;
++                                              }
++                                              default: {
++                                                      fprintf(stdout, "        Unknown structure_id\n");
++                                              }
++                                      }
++                                      break;
++                              }
++                              case 0x02: {
++                                      switch (structure->id) {
++                                              case 0x00: {
++                                                      fprintf(stdout, "        ESG String Repository / ");
++
++                                                      string_repository = (struct esg_string_repository *) structure->data;
++                                                      if (string_repository == NULL) {
++                                                              fprintf(stderr, "ESG String Repository decode error\n");
++                                                              exit(1);
++                                                      }
++
++                                                      fprintf(stdout, "encoding_type %d / length %d\n\n", string_repository->encoding_type, string_repository->length);
++
++                                                      break;
++                                              }
++                                              default: {
++                                                      fprintf(stdout, "        Unknown structure_id\n");
++                                              }
++                                      }
++                                      break;
++                              }
++                              case 0x03: {
++                                      //TODO
++                                      break;
++                              }
++                              case 0x04: {
++                                      //TODO
++                                      break;
++                              }
++                              case 0x05: {
++                                      //TODO
++                                      break;
++                              }
++                              case 0xE0: {
++                                      switch (structure->id) {
++                                              case 0x00: {
++                                                      fprintf(stdout, "        ESG Data Repository / ");
++
++                                                      data_repository = (struct esg_data_repository *) structure->data;
++                                                      if (data_repository == NULL) {
++                                                              fprintf(stderr, "ESG Data Repository decode error\n");
++                                                              exit(1);
++                                                      }
++
++                                                      fprintf(stdout, "length %d\n\n", data_repository->length);
++
++                                                      break;
++                                              }
++                                              default: {
++                                                      fprintf(stdout, "        Unknown structure_id\n");
++                                              }
++                                      }
++                                      break;
++                              }
++                              case 0xE1: {
++                                      switch (structure->id) {
++                                              case 0xFF: {
++                                                      fprintf(stdout, "        ESG Session Partition Declaration\n");
++
++                                                      partition = (struct esg_session_partition_declaration *) structure->data;
++                                                      fprintf(stdout, "            num_fields %d\n", partition->num_fields);
++                                                      fprintf(stdout, "            overlapping %d\n\n", partition->overlapping);
++                                                      esg_session_partition_declaration_field_list_for_each(partition, field) {
++                                                              fprintf(stdout, "                identifier %d\n", field->identifier);
++                                                              fprintf(stdout, "                encoding %d\n",field->encoding);
++                                                              fprintf(stdout, "                length %d\n\n",field->length);
++                                                      }
++                                                      fprintf(stdout, "            n_o_IPStreams %d\n", partition->n_o_ip_streams);
++                                                      fprintf(stdout, "            IPVersion6 %d\n\n", partition->ip_version_6);
++                                                      esg_session_partition_declaration_ip_stream_list_for_each(partition, ip_stream) {
++                                                              fprintf(stdout, "                IPStreamID %d\n", ip_stream->id);
++                                                              if (partition->ip_version_6 == 0) {
++                                                                      fprintf(stdout, "                SourceIPAddress %d.%d.%d.%d\n",
++                                                                              ip_stream->source_ip.ipv4[0],
++                                                                              ip_stream->source_ip.ipv4[1],
++                                                                              ip_stream->source_ip.ipv4[2],
++                                                                              ip_stream->source_ip.ipv4[3]);
++                                                                      fprintf(stdout, "                DestinationIPAddress %d.%d.%d.%d\n",
++                                                                              ip_stream->destination_ip.ipv4[0],
++                                                                              ip_stream->destination_ip.ipv4[1],
++                                                                              ip_stream->destination_ip.ipv4[2],
++                                                                              ip_stream->destination_ip.ipv4[3]);
++                                                              } else if (partition->ip_version_6 == 1) {
++                                                                      fprintf(stdout, "                SourceIPAddress %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x\n",
++                                                                              ip_stream->source_ip.ipv6[0],
++                                                                              ip_stream->source_ip.ipv6[1],
++                                                                              ip_stream->source_ip.ipv6[2],
++                                                                              ip_stream->source_ip.ipv6[3],
++                                                                              ip_stream->source_ip.ipv6[4],
++                                                                              ip_stream->source_ip.ipv6[5],
++                                                                              ip_stream->source_ip.ipv6[6],
++                                                                              ip_stream->source_ip.ipv6[7],
++                                                                              ip_stream->source_ip.ipv6[8],
++                                                                              ip_stream->source_ip.ipv6[9],
++                                                                              ip_stream->source_ip.ipv6[10],
++                                                                              ip_stream->source_ip.ipv6[11],
++                                                                              ip_stream->source_ip.ipv6[12],
++                                                                              ip_stream->source_ip.ipv6[13],
++                                                                              ip_stream->source_ip.ipv6[14],
++                                                                              ip_stream->source_ip.ipv6[15]);
++                                                                      fprintf(stdout, "                DestinationIPAddress %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x\n",
++                                                                              ip_stream->destination_ip.ipv6[0],
++                                                                              ip_stream->destination_ip.ipv6[1],
++                                                                              ip_stream->destination_ip.ipv6[2],
++                                                                              ip_stream->destination_ip.ipv6[3],
++                                                                              ip_stream->destination_ip.ipv6[4],
++                                                                              ip_stream->destination_ip.ipv6[5],
++                                                                              ip_stream->destination_ip.ipv6[6],
++                                                                              ip_stream->destination_ip.ipv6[7],
++                                                                              ip_stream->destination_ip.ipv6[8],
++                                                                              ip_stream->destination_ip.ipv6[9],
++                                                                              ip_stream->destination_ip.ipv6[10],
++                                                                              ip_stream->destination_ip.ipv6[11],
++                                                                              ip_stream->destination_ip.ipv6[12],
++                                                                              ip_stream->destination_ip.ipv6[13],
++                                                                              ip_stream->destination_ip.ipv6[14],
++                                                                              ip_stream->destination_ip.ipv6[15]);
++                                                              }
++                                                              fprintf(stdout, "                Port %d\n", ip_stream->port);
++                                                              fprintf(stdout, "                SessionID %d\n", ip_stream->session_id);
++
++                                                              field = partition->field_list;
++                                                              esg_session_ip_stream_field_list_for_each(ip_stream, ip_stream_field) {
++                                                                      switch (field->encoding) {
++                                                                              case 0x0000: {
++                                                                                      if (ip_stream_field->start_field_value != NULL) {
++                                                                                              fprintf(stdout, "                start_field_value %s\n", ip_stream_field->start_field_value->string);
++                                                                                      }
++                                                                                      fprintf(stdout, "                end_field_value %s\n", ip_stream_field->end_field_value->string);
++                                                                                      break;
++                                                                              }
++                                                                              case 0x0101: {
++                                                                                      if (ip_stream_field->start_field_value != NULL) {
++                                                                                              fprintf(stdout, "                start_field_value %d\n", ip_stream_field->start_field_value->unsigned_short);
++                                                                                      }
++                                                                                      fprintf(stdout, "                end_field_value %d\n", ip_stream_field->end_field_value->unsigned_short);
++                                                                                      break;
++                                                                              }
++                                                                      }
++
++                                                                      field = field->_next;
++                                                              }
++                                                              fprintf(stdout, "\n");
++                                                      }
++                                                      break;
++                                              }
++                                              default: {
++                                                      fprintf(stdout, "        Unknown structure_id\n");
++                                              }
++                                      }
++                                      break;
++                              }
++                              case 0xE2: {
++                                      switch (structure->id) {
++                                              case 0x00: {
++                                                      fprintf(stdout, "        ESG Init Message\n");
++
++                                                      init_message = (struct esg_init_message *) structure->data;
++                                                      if (init_message == NULL) {
++                                                              fprintf(stderr, "ESG Init Message decode error\n");
++                                                              exit(1);
++                                                      }
++
++                                                      fprintf(stdout, "            EncodingVersion %d [0x%02x]\n", init_message->encoding_version, init_message->encoding_version);
++                                                      fprintf(stdout, "            IndexingFlag %d\n", init_message->indexing_flag);
++                                                      fprintf(stdout, "            DecoderInitptr %d\n", init_message->decoder_init_ptr);
++                                                      if (init_message->indexing_flag) {
++                                                              fprintf(stdout, "            IndexingVersion %d\n", init_message->indexing_version);
++                                                      }
++
++                                                      switch (init_message->encoding_version) {
++                                                              case 0xF1: {
++                                                                      bim_encoding_parameters = (struct esg_bim_encoding_parameters *) init_message->encoding_parameters;
++                                                                      if (bim_encoding_parameters == NULL) {
++                                                                              fprintf(stderr, "ESG Init Message decode error / bim_encoding_parameters\n");
++                                                                              exit(1);
++                                                                      }
++                                                                      fprintf(stdout, "            BufferSizeFlag %d\n", bim_encoding_parameters->buffer_size_flag);
++                                                                      fprintf(stdout, "            PositionCodeFlag %d\n", bim_encoding_parameters->position_code_flag);
++                                                                      fprintf(stdout, "            CharacterEncoding %d\n", bim_encoding_parameters->character_encoding);
++                                                                      if (bim_encoding_parameters->buffer_size_flag) {
++                                                                              fprintf(stdout, "            BufferSize %d\n", bim_encoding_parameters->buffer_size);
++                                                                      }
++
++                                                                      // TODO BimDecoderInit
++                                                                      break;
++                                                              }
++                                                              case 0xF2:
++                                                              case 0xF3: {
++                                                                      textual_encoding_parameters = (struct esg_textual_encoding_parameters *) init_message->encoding_parameters;
++                                                                      if (textual_encoding_parameters == NULL) {
++                                                                              fprintf(stderr, "ESG Init Message decode error / textual_encoding_parameters\n");
++                                                                              exit(1);
++                                                                      }
++                                                                      fprintf(stdout, "            CharacterEncoding %d\n\n", textual_encoding_parameters->character_encoding);
++
++                                                                      // TextualDecoderInit
++                                                                      textual_decoder_init = (struct esg_textual_decoder_init *) init_message->decoder_init;
++                                                                      if (textual_decoder_init == NULL) {
++                                                                              fprintf(stderr, "ESG Init Message decode error / textual_decoder_init\n");
++                                                                              exit(1);
++                                                                      }
++                                                                      fprintf(stdout, "            Textual DecoderInit\n");
++                                                                      fprintf(stdout, "                num_namespaces_prefixes %d\n\n", textual_decoder_init->num_namespace_prefixes);
++                                                                      esg_textual_decoder_namespace_prefix_list_for_each(textual_decoder_init, namespace_prefix) {
++                                                                              fprintf(stdout, "                    prefix_string_ptr %d\n", namespace_prefix->prefix_string_ptr);
++                                                                              fprintf(stdout, "                    namespace_URI_ptr %d\n\n", namespace_prefix->namespace_uri_ptr);
++                                                                      }
++                                                                      fprintf(stdout, "                num_fragment_types %d\n\n", textual_decoder_init->num_fragment_types);
++                                                                      esg_textual_decoder_xml_fragment_type_list_for_each(textual_decoder_init, xml_fragment_type) {
++                                                                              fprintf(stdout, "                    xpath_ptr %d\n", xml_fragment_type->xpath_ptr);
++                                                                              fprintf(stdout, "                    ESG_XML_fragment_type %d\n\n", xml_fragment_type->xml_fragment_type);
++                                                                      }
++                                                                      break;
++                                                              }
++                                                              default: {
++                                                                      fprintf(stdout, "            Unknown EncodingVersion\n");
++                                                              }
++                                                      }
++
++                                                      break;
++                                              }
++                                              default: {
++                                                      fprintf(stdout, "        Unknown structure_id\n");
++                                              }
++                                      }
++                                      break;
++                              }
++                              default: {
++                                      fprintf(stdout, "        Unknown structure_type\n");
++                              }
++                      }
++              }
++              fprintf(stdout, "\n");
++
++              fprintf(stdout, "structure_body_ptr %d\n", container->structure_body_ptr);
++              fprintf(stdout, "structure_body_length %d\n\n", container->structure_body_length);
++
++              // ESG XML Fragment
++              if (fragment_management_information) {
++                      fprintf(stdout, "**************************************************\n");
++                      fprintf(stdout, "ESG XML Fragment\n");
++                      fprintf(stdout, "**************************************************\n\n");
++
++                      struct esg_encapsulation_entry *entry;
++                      esg_encapsulation_structure_entry_list_for_each(fragment_management_information, entry) {
++                              switch (entry->fragment_reference->fragment_type) {
++                                      case 0x00: {
++                                              if (data_repository) {
++                                                      struct esg_encapsulated_textual_esg_xml_fragment *esg_xml_fragment = esg_encapsulated_textual_esg_xml_fragment_decode(data_repository->data + entry->fragment_reference->data_repository_offset, data_repository->length);
++
++                                                      fprintf(stdout, "ESG_XML_fragment_type %d\n", esg_xml_fragment->esg_xml_fragment_type);
++                                                      fprintf(stdout, "data_length %d\n", esg_xml_fragment->data_length);
++                                                      fprintf(stdout, "fragment_version %d\n", entry->fragment_version);
++                                                      fprintf(stdout, "fragment_id %d\n\n", entry->fragment_id);
++                                                      char *string = (char *) malloc(esg_xml_fragment->data_length + 1);
++                                                      memcpy(string, esg_xml_fragment->data, esg_xml_fragment->data_length);
++                                                      string[esg_xml_fragment->data_length] = 0;
++                                                      fprintf(stdout, "%s\n", string);
++
++                                              } else {
++                                                      fprintf(stderr, "ESG Data Repository not found");
++                                              }
++                                              break;
++                                      }
++                                      case 0x01: {
++                                              // TODO
++                                              break;
++                                      }
++                                      case 0x02: {
++                                              // TODO
++                                              break;
++                                      }
++                                      default: {
++                                      }
++                              }
++                      }
++              }
++
++              // String
++              if (init_message) {
++                      fprintf(stdout, "**************************************************\n");
++                      fprintf(stdout, "String\n");
++                      fprintf(stdout, "**************************************************\n\n");
++
++                      switch (init_message->encoding_version) {
++                              case 0xF1: {
++                                      // TODO Bim
++                                      break;
++                              }
++                              case 0xF2: {
++                                      // TODO GZIP
++                                      break;
++                              }
++                              case 0xF3: {
++                                      // RAW
++                                      if (string_repository) {
++                                              textual_decoder_init = (struct esg_textual_decoder_init *) init_message->decoder_init;
++                                              esg_textual_decoder_namespace_prefix_list_for_each(textual_decoder_init, namespace_prefix) {
++                                                      fprintf(stdout, "prefix_string_ptr %d\n", namespace_prefix->prefix_string_ptr);
++                                                      fprintf(stdout, "%s\n", string_repository->data + namespace_prefix->prefix_string_ptr);
++                                                      fprintf(stdout, "namespace_URI_ptr %d\n", namespace_prefix->namespace_uri_ptr);
++                                                      fprintf(stdout, "%s\n\n", string_repository->data + namespace_prefix->namespace_uri_ptr - 1); // TODO -1
++                                              }
++
++                                              esg_textual_decoder_xml_fragment_type_list_for_each(textual_decoder_init, xml_fragment_type) {
++                                                      fprintf(stdout, "xpath_ptr %d\n", xml_fragment_type->xpath_ptr);
++                                                      fprintf(stdout, "ESG_XML_fragment_type %d\n", xml_fragment_type->xml_fragment_type);
++                                                      fprintf(stdout, "%s\n\n", string_repository->data + xml_fragment_type->xpath_ptr - 1); // TODO -1
++                                              }
++                                      }
++                                      break;
++                              }
++                              default: {
++                                      fprintf(stdout, "            Unknown EncodingVersion\n");
++                              }
++                      }
++              }
++      }
++
++      return 0;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/libucsi/Makefile dvb-apps/test/libucsi/Makefile
+--- linuxtv-dvb-apps-1.1.1/test/libucsi/Makefile       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/test/libucsi/Makefile     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,13 @@
++# Makefile for linuxtv.org dvb-apps/test/libucsi
++
++binaries = testucsi
++
++CPPFLAGS += -I../../lib
++LDLIBS   += ../../lib/libdvbapi/libdvbapi.a ../../lib/libdvbcfg/libdvbcfg.a \
++          ../../lib/libdvbsec/libdvbsec.a  ../../lib/libucsi/libucsi.a
++
++.PHONY: all
++
++all: $(binaries)
++
++include ../../Make.rules
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/libucsi/testucsi.c dvb-apps/test/libucsi/testucsi.c
+--- linuxtv-dvb-apps-1.1.1/test/libucsi/testucsi.c     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/test/libucsi/testucsi.c   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3528 @@
++/*
++ * section and descriptor parser test/sample application.
++ *
++ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
++ */
++
++#include <libucsi/mpeg/descriptor.h>
++#include <libucsi/mpeg/section.h>
++#include <libucsi/dvb/descriptor.h>
++#include <libucsi/dvb/section.h>
++#include <libucsi/atsc/descriptor.h>
++#include <libucsi/atsc/section.h>
++#include <libucsi/transport_packet.h>
++#include <libucsi/section_buf.h>
++#include <libucsi/dvb/types.h>
++#include <libdvbapi/dvbdemux.h>
++#include <libdvbapi/dvbfe.h>
++#include <libdvbcfg/dvbcfg_zapchannel.h>
++#include <libdvbsec/dvbsec_api.h>
++#include <libdvbsec/dvbsec_cfg.h>
++#include <stdio.h>
++#include <unistd.h>
++#include <errno.h>
++#include <stdarg.h>
++#include <fcntl.h>
++
++void receive_data(int dvrfd, int timeout, int data_type);
++void parse_section(uint8_t *buf, int len, int pid, int data_type);
++void parse_dvb_section(uint8_t *buf, int len, int pid, int data_type, struct section *section);
++void parse_atsc_section(uint8_t *buf, int len, int pid, int data_type, struct section *section);
++void parse_descriptor(struct descriptor *d, int indent, int data_type);
++void parse_dvb_descriptor(struct descriptor *d, int indent, int data_type);
++void parse_atsc_descriptor(struct descriptor *d, int indent, int data_type);
++void iprintf(int indent, char *fmt, ...);
++void hexdump(int indent, char *prefix, uint8_t *buf, int buflen);
++void atsctextdump(char *header, int indent, struct atsc_text *atext, int len);
++int channels_cb(struct dvbcfg_zapchannel *channel, void *private);
++void ts_from_file(char *filename, int data_type);
++
++#define TIME_CHECK_VAL 1131835761
++#define DURATION_CHECK_VAL 5643
++
++#define MAX_TUNE_TIME 3000
++#define MAX_DUMP_TIME 60
++
++#define DATA_TYPE_MPEG 0
++#define DATA_TYPE_DVB 1
++#define DATA_TYPE_ATSC 2
++
++
++struct dvbfe_handle *fe;
++struct dvbfe_info feinfo;
++int demuxfd;
++int dvrfd;
++
++int main(int argc, char *argv[])
++{
++      int adapter;
++      char *channelsfile;
++      int pidlimit = -1;
++      dvbdate_t dvbdate;
++      dvbduration_t dvbduration;
++
++      // process arguments
++      if ((argc < 3) || (argc > 4)) {
++              fprintf(stderr, "Syntax: testucsi <adapter id>|-atscfile <filename> <zapchannels file> [<pid to limit to>]\n");
++              exit(1);
++      }
++      if (!strcmp(argv[1], "-atscfile")) {
++              ts_from_file(argv[2], DATA_TYPE_ATSC);
++              exit(0);
++      }
++      adapter = atoi(argv[1]);
++      channelsfile = argv[2];
++      if (argc == 4)
++              sscanf(argv[3], "%i", &pidlimit);
++      printf("Using adapter %i\n", adapter);
++
++      // check the dvbdate conversion functions
++      unixtime_to_dvbdate(TIME_CHECK_VAL, dvbdate);
++      if (dvbdate_to_unixtime(dvbdate) != TIME_CHECK_VAL) {
++              fprintf(stderr, "XXXX dvbdate function check failed (%i!=%i)\n",
++                      TIME_CHECK_VAL, (int) dvbdate_to_unixtime(dvbdate));
++              exit(1);
++      }
++      seconds_to_dvbduration(DURATION_CHECK_VAL, dvbduration);
++      if (dvbduration_to_seconds(dvbduration) != DURATION_CHECK_VAL) {
++              fprintf(stderr, "XXXX dvbduration function check failed (%i!=%i)\n",
++                      DURATION_CHECK_VAL, (int) dvbduration_to_seconds(dvbduration));
++              exit(1);
++      }
++
++      // open the frontend
++      if ((fe = dvbfe_open(adapter, 0, 0)) == NULL) {
++              perror("open frontend");
++              exit(1);
++      }
++      dvbfe_get_info(fe, 0, &feinfo, DVBFE_INFO_QUERYTYPE_IMMEDIATE, 0);
++      int data_type = DATA_TYPE_MPEG;
++      switch(feinfo.type) {
++      case DVBFE_TYPE_DVBS:
++      case DVBFE_TYPE_DVBC:
++      case DVBFE_TYPE_DVBT:
++              data_type = DATA_TYPE_DVB;
++              break;
++
++      case DVBFE_TYPE_ATSC:
++              data_type = DATA_TYPE_ATSC;
++              break;
++      }
++
++      // open demux devices
++      if ((demuxfd = dvbdemux_open_demux(adapter, 0, 0)) < 0) {
++              perror("demux");
++              exit(1);
++      }
++      if ((dvrfd = dvbdemux_open_dvr(adapter, 0, 1, 1)) < 0) {
++              perror("dvr");
++              exit(1);
++      }
++
++      // make the demux buffer a bit larger
++      if (dvbdemux_set_buffer(demuxfd, 1024*1024)) {
++              perror("set buffer");
++              exit(1);
++      }
++
++      // setup filter to capture stuff
++      if (dvbdemux_set_pid_filter(demuxfd, pidlimit, DVBDEMUX_INPUT_FRONTEND, DVBDEMUX_OUTPUT_DVR, 1)) {
++              perror("set pid filter");
++              exit(1);
++      }
++
++      // process all the channels
++      FILE *channels = fopen(channelsfile, "r");
++      if (channels == NULL) {
++              fprintf(stderr, "Unable to open %s\n", channelsfile);
++              exit(1);
++      }
++      dvbcfg_zapchannel_parse(channels, channels_cb, (void*) (long) data_type);
++        return 0;
++}
++
++void ts_from_file(char *filename, int data_type) {
++      int fd = open(filename, O_RDONLY);
++      if (fd < 0) {
++              fprintf(stderr, "Unable to open file %s\n", filename);
++              exit(1);
++      }
++      receive_data(fd, 1000000000, data_type);
++}
++
++int channels_cb(struct dvbcfg_zapchannel *channel, void *private)
++{
++      long data_type = (long) private;
++      struct dvbsec_config sec;
++
++      if (dvbsec_cfg_find(NULL, "UNIVERSAL", &sec)) {
++              fprintf(stderr, "Unable to find SEC id\n");
++              exit(1);
++      }
++
++      if (dvbsec_set(fe,
++                      &sec,
++                      channel->polarization,
++                      DISEQC_SWITCH_UNCHANGED,
++                      DISEQC_SWITCH_UNCHANGED,
++                      &channel->fe_params,
++                      MAX_TUNE_TIME)) {
++                fprintf(stderr, "Failed to lock!\n");
++        } else {
++                printf("Tuned successfully!\n");
++                receive_data(dvrfd, MAX_DUMP_TIME, data_type);
++        }
++
++      return 0;
++}
++
++void receive_data(int _dvrfd, int timeout, int data_type)
++{
++      unsigned char databuf[TRANSPORT_PACKET_LENGTH*20];
++      int sz;
++      int pid;
++      int i;
++      int used;
++      int section_status;
++      time_t starttime;
++      unsigned char continuities[TRANSPORT_MAX_PIDS];
++      struct section_buf *section_bufs[TRANSPORT_MAX_PIDS];
++      struct transport_packet *tspkt;
++      struct transport_values tsvals;
++
++      // process the data
++      starttime = time(NULL);
++      memset(continuities, 0, sizeof(continuities));
++      memset(section_bufs, 0, sizeof(section_bufs));
++      while((time(NULL) - starttime) < timeout) {
++              // got some!
++              if ((sz = read(_dvrfd, databuf, sizeof(databuf))) < 0) {
++                      if (errno == EOVERFLOW) {
++                              fprintf(stderr, "data overflow!\n");
++                              continue;
++                      } else if (errno == EAGAIN) {
++                              usleep(100);
++                              continue;
++                      } else {
++                              perror("read error");
++                              exit(1);
++                      }
++              }
++              for(i=0; i < sz; i+=TRANSPORT_PACKET_LENGTH) {
++                      // parse the transport packet
++                      tspkt = transport_packet_init(databuf + i);
++                      if (tspkt == NULL) {
++                              fprintf(stderr, "XXXX Bad sync byte\n");
++                              continue;
++                      }
++                      pid = transport_packet_pid(tspkt);
++
++                      // extract all TS packet values even though we don't need them (to check for
++                      // library segfaults etc)
++                      if (transport_packet_values_extract(tspkt, &tsvals, 0xffff) < 0) {
++                              fprintf(stderr, "XXXX Bad packet received (pid:%04x)\n", pid);
++                              continue;
++                      }
++
++                      // check continuity
++                      if (transport_packet_continuity_check(tspkt,
++                          tsvals.flags & transport_adaptation_flag_discontinuity,
++                          continuities + pid)) {
++                              fprintf(stderr, "XXXX Continuity error (pid:%04x)\n", pid);
++                              continuities[pid] = 0;
++                              if (section_bufs[pid] != NULL) {
++                                      section_buf_reset(section_bufs[pid]);
++                              }
++                              continue;
++                      }
++
++                      // allocate section buf if we don't have one already
++                      if (section_bufs[pid] == NULL) {
++                              section_bufs[pid] = (struct section_buf*)
++                                      malloc(sizeof(struct section_buf) + DVB_MAX_SECTION_BYTES);
++                              if (section_bufs[pid] == NULL) {
++                                      fprintf(stderr, "Failed to allocate section buf (pid:%04x)\n", pid);
++                                      exit(1);
++                              }
++                              section_buf_init(section_bufs[pid], DVB_MAX_SECTION_BYTES);
++                      }
++
++                      // process the payload data as a section
++                      while(tsvals.payload_length) {
++                              used = section_buf_add_transport_payload(section_bufs[pid],
++                                                                       tsvals.payload,
++                                                                       tsvals.payload_length,
++                                                                       tspkt->payload_unit_start_indicator,
++                                                                       &section_status);
++                              tspkt->payload_unit_start_indicator = 0;
++                              tsvals.payload_length -= used;
++                              tsvals.payload += used;
++
++                              if (section_status == 1) {
++                                      parse_section(section_buf_data(section_bufs[pid]),
++                                                    section_bufs[pid]->len, pid, data_type);
++                                      section_buf_reset(section_bufs[pid]);
++                              } else if (section_status < 0) {
++                                      // some kind of error - just discard
++                                      fprintf(stderr, "XXXX bad section %04x %i\n",pid, section_status);
++                                      section_buf_reset(section_bufs[pid]);
++                              }
++                      }
++              }
++      }
++}
++
++void parse_section(uint8_t *buf, int len, int pid, int data_type)
++{
++      struct section *section;
++      struct section_ext *section_ext = NULL;
++
++      if ((section = section_codec(buf, len)) == NULL) {
++              return;
++      }
++
++      switch(section->table_id) {
++      case stag_mpeg_program_association:
++      {
++              struct mpeg_pat_section *pat;
++              struct mpeg_pat_program *cur;
++
++              if ((section_ext = section_ext_decode(section, 1)) == NULL) {
++                      return;
++              }
++              printf("SCT Decode PAT (pid:0x%04x) (table:0x%02x)\n", pid, section->table_id);
++              if ((pat = mpeg_pat_section_codec(section_ext)) == NULL) {
++                      fprintf(stderr, "SCT XXXX PAT section decode error\n");
++                      return;
++              }
++              printf("SCT transport_stream_id:0x%04x\n", mpeg_pat_section_transport_stream_id(pat));
++              mpeg_pat_section_programs_for_each(pat, cur) {
++                      printf("\tSCT program_number:0x%04x pid:0x%04x\n", cur->program_number, cur->pid);
++              }
++              break;
++      }
++
++      case stag_mpeg_conditional_access:
++      {
++              struct mpeg_cat_section *cat;
++              struct descriptor *curd;
++
++              if ((section_ext = section_ext_decode(section, 1)) == NULL) {
++                      return;
++              }
++              printf("SCT Decode CAT (pid:0x%04x) (table:0x%02x)\n", pid, section->table_id);
++              if ((cat = mpeg_cat_section_codec(section_ext)) == NULL) {
++                      fprintf(stderr, "SCT XXXX CAT section decode error\n");
++                      return;
++              }
++              mpeg_cat_section_descriptors_for_each(cat, curd) {
++                      parse_descriptor(curd, 1, data_type);
++              }
++              break;
++      }
++
++      case stag_mpeg_program_map:
++      {
++              struct mpeg_pmt_section *pmt;
++              struct descriptor *curd;
++              struct mpeg_pmt_stream *cur_stream;
++
++              if ((section_ext = section_ext_decode(section, 1)) == NULL) {
++                      return;
++              }
++              printf("SCT Decode PMT (pid:0x%04x) (table:0x%02x)\n", pid, section->table_id);
++              if ((pmt = mpeg_pmt_section_codec(section_ext)) == NULL) {
++                      fprintf(stderr, "SCT XXXX PMT section decode error\n");
++                      return;
++              }
++              printf("SCT program_number:0x%04x pcr_pid:0x%02x\n", mpeg_pmt_section_program_number(pmt), pmt->pcr_pid);
++              mpeg_pmt_section_descriptors_for_each(pmt, curd) {
++                      parse_descriptor(curd, 1, data_type);
++              }
++              mpeg_pmt_section_streams_for_each(pmt, cur_stream) {
++                      printf("\tSCT stream_type:0x%02x pid:0x%04x\n", cur_stream->stream_type, cur_stream->pid);
++                      mpeg_pmt_stream_descriptors_for_each(cur_stream, curd) {
++                              parse_descriptor(curd, 2, data_type);
++                      }
++              }
++              break;
++      }
++
++      case stag_mpeg_transport_stream_description:
++      {
++              struct mpeg_tsdt_section *tsdt;
++              struct descriptor *curd;
++
++              if ((section_ext = section_ext_decode(section, 1)) == NULL) {
++                      return;
++              }
++              printf("SCT Decode TSDT (pid:0x%04x) (table:0x%02x)\n", pid, section->table_id);
++              if ((tsdt = mpeg_tsdt_section_codec(section_ext)) == NULL) {
++                      fprintf(stderr, "SCT XXXX TSDT section decode error\n");
++                      return;
++              }
++              mpeg_tsdt_section_descriptors_for_each(tsdt, curd) {
++                      parse_descriptor(curd, 1, data_type);
++              }
++
++              hexdump(0, "SCT ", buf, len);
++              getchar();
++              break;
++      }
++
++      case stag_mpeg_metadata:
++      {
++              struct mpeg_metadata_section *metadata;
++
++              if ((section_ext = section_ext_decode(section, 1)) == NULL) {
++                      return;
++              }
++              printf("SCT Decode metadata (pid:0x%04x) (table:0x%02x)\n", pid, section->table_id);
++              if ((metadata = mpeg_metadata_section_codec(section_ext)) == NULL) {
++                      fprintf(stderr, "SCT XXXX metadata section decode error\n");
++                      return;
++              }
++              printf("SCT random_access_indicator:%i decoder_config_flag:%i fragment_indicator:%i service_id:%02x\n",
++                     mpeg_metadata_section_random_access_indicator(metadata),
++                     mpeg_metadata_section_decoder_config_flag(metadata),
++                     mpeg_metadata_section_fragment_indicator(metadata),
++                     mpeg_metadata_section_service_id(metadata));
++              hexdump(0, "SCT ", mpeg_metadata_section_data(metadata), mpeg_metadata_section_data_length(metadata));
++
++              hexdump(0, "SCT ", buf, len);
++              getchar();
++              break;
++      }
++
++      case stag_mpeg_iso14496_scene_description:
++      case stag_mpeg_iso14496_object_description:
++      {
++              struct mpeg_odsmt_section *odsmt;
++              struct mpeg_odsmt_stream *cur_stream;
++              struct descriptor *curd;
++              int _index;
++              uint8_t *objects;
++              size_t objects_length;
++
++              if ((section_ext = section_ext_decode(section, 1)) == NULL) {
++                      return;
++              }
++              printf("SCT Decode ISO14496 (pid:0x%04x) (table:0x%02x)\n", pid, section->table_id);
++              if ((odsmt = mpeg_odsmt_section_codec(section_ext)) == NULL) {
++                      fprintf(stderr, "XXXX ISO14496 section decode error\n");
++                      return;
++              }
++              printf("SCT PID:0x%04x\n", mpeg_odsmt_section_pid(odsmt));
++              mpeg_odsmt_section_streams_for_each(osdmt, cur_stream, _index) {
++                      if (odsmt->stream_count == 0) {
++                              printf("\tSCT SINGLE 0x%04x\n", cur_stream->u.single.esid);
++                      } else {
++                              printf("\tSCT MULTI 0x%04x 0x%02x\n", cur_stream->u.multi.esid, cur_stream->u.multi.fmc);
++                      }
++                      mpeg_odsmt_stream_descriptors_for_each(osdmt, cur_stream, curd) {
++                              parse_descriptor(curd, 2, data_type);
++                      }
++              }
++              objects = mpeg_odsmt_section_object_descriptors(odsmt, &objects_length);
++              if (objects == NULL) {
++                      printf("SCT XXXX OSDMT parse error\n");
++                      break;
++              }
++              hexdump(1, "SCT ", objects, objects_length);
++
++              hexdump(0, "SCT ", buf, len);
++              getchar();
++              break;
++      }
++
++      default:
++              switch(data_type) {
++              case DATA_TYPE_DVB:
++                      parse_dvb_section(buf, len, pid, data_type, section);
++                      break;
++
++              case DATA_TYPE_ATSC:
++                      parse_atsc_section(buf, len, pid, data_type, section);
++                      break;
++
++              default:
++                      fprintf(stderr, "SCT XXXX Unknown table_id:0x%02x (pid:0x%04x)\n",
++                              section->table_id, pid);
++//                    hexdump(0, "SCT ", buf, len);
++                      return;
++              }
++      }
++
++      printf("\n");
++}
++
++void parse_dvb_section(uint8_t *buf, int len, int pid, int data_type, struct section *section)
++{
++      struct section_ext *section_ext = NULL;
++
++      switch(section->table_id) {
++      case stag_dvb_network_information_actual:
++      case stag_dvb_network_information_other:
++      {
++              struct dvb_nit_section *nit;
++              struct descriptor *curd;
++              struct dvb_nit_section_part2 *part2;
++              struct dvb_nit_transport *cur_transport;
++
++              if ((section_ext = section_ext_decode(section, 1)) == NULL) {
++                      return;
++              }
++              printf("SCT Decode NIT (pid:0x%04x) (table:0x%02x)\n", pid, section->table_id);
++              if ((nit = dvb_nit_section_codec(section_ext)) == NULL) {
++                      fprintf(stderr, "SCT XXXX NIT section decode error\n");
++                      return;
++              }
++              printf("SCT network_id:0x%04x\n", dvb_nit_section_network_id(nit));
++              dvb_nit_section_descriptors_for_each(nit, curd) {
++                      parse_descriptor(curd, 1, data_type);
++              }
++              part2 = dvb_nit_section_part2(nit);
++              dvb_nit_section_transports_for_each(nit, part2, cur_transport) {
++                      printf("\tSCT transport_stream_id:0x%04x original_network_id:0x%04x\n", cur_transport->transport_stream_id, cur_transport->original_network_id);
++                      dvb_nit_transport_descriptors_for_each(cur_transport, curd) {
++                              parse_descriptor(curd, 2, data_type);
++                      }
++              }
++              break;
++      }
++
++      case stag_dvb_service_description_actual:
++      case stag_dvb_service_description_other:
++      {
++              struct dvb_sdt_section *sdt;
++              struct dvb_sdt_service *cur_service;
++              struct descriptor *curd;
++
++              if ((section_ext = section_ext_decode(section, 1)) == NULL) {
++                      return;
++              }
++              printf("SCT Decode SDT (pid:0x%04x) (table:0x%02x)\n", pid, section->table_id);
++              if ((sdt = dvb_sdt_section_codec(section_ext)) == NULL) {
++                      fprintf(stderr, "XXXX SDT section decode error\n");
++                      return;
++              }
++              printf("SCT transport_stream_id:0x%04x original_network_id:0x%04x\n", dvb_sdt_section_transport_stream_id(sdt), sdt->original_network_id);
++              dvb_sdt_section_services_for_each(sdt, cur_service) {
++                      printf("\tSCT service_id:0x%04x eit_schedule_flag:%i eit_present_following_flag:%i running_status:%i free_ca_mode:%i\n",
++                             cur_service->service_id,
++                             cur_service->eit_schedule_flag,
++                             cur_service->eit_present_following_flag,
++                             cur_service->running_status,
++                             cur_service->free_ca_mode);
++                      dvb_sdt_service_descriptors_for_each(cur_service, curd) {
++                              parse_descriptor(curd, 2, data_type);
++                      }
++              }
++              break;
++      }
++
++      case stag_dvb_bouquet_association:
++      {
++              struct dvb_bat_section *bat;
++              struct descriptor *curd;
++              struct dvb_bat_section_part2 *part2;
++              struct dvb_bat_transport *cur_transport;
++
++              if ((section_ext = section_ext_decode(section, 1)) == NULL) {
++                      return;
++              }
++              printf("SCT Decode BAT (pid:0x%04x) (table:0x%02x)\n", pid, section->table_id);
++              if ((bat = dvb_bat_section_codec(section_ext)) == NULL) {
++                      fprintf(stderr, "SCT XXXX BAT section decode error\n");
++                      return;
++              }
++              printf("SCT bouquet_id:0x%04x\n", dvb_bat_section_bouquet_id(bat));
++              dvb_bat_section_descriptors_for_each(bat, curd) {
++                      parse_descriptor(curd, 1, data_type);
++              }
++              part2 = dvb_bat_section_part2(bat);
++              dvb_bat_section_transports_for_each(part2, cur_transport) {
++                      printf("\tSCT transport_stream_id:0x%04x original_network_id:0x%04x\n",
++                             cur_transport->transport_stream_id,
++                             cur_transport->original_network_id);
++                      dvb_bat_transport_descriptors_for_each(cur_transport, curd) {
++                              parse_descriptor(curd, 2, data_type);
++                      }
++              }
++              break;
++      }
++
++      case stag_dvb_update_notification:
++      case stag_dvb_ip_mac_notification:
++      {
++              struct dvb_int_section *_int;
++              struct descriptor *curd;
++              struct dvb_int_target *cur_target;
++              struct dvb_int_operational_loop *operational_loop;
++
++              if ((section_ext = section_ext_decode(section, 1)) == NULL) {
++                      return;
++              }
++              printf("SCT Decode INT (pid:0x%04x) (table:0x%02x)\n", pid, section->table_id);
++              if ((_int = dvb_int_section_codec(section_ext)) == NULL) {
++                      fprintf(stderr, "XXXX INT section decode error\n");
++                      return;
++              }
++              printf("SCT action_type:0x%02x platform_id_hash:0x%02x platform_id:0x%06x processing_order:0x%02x\n",
++                     dvb_int_section_action_type(_int),
++                     dvb_int_section_platform_id_hash(_int),
++                     _int->platform_id,
++                     _int->processing_order);
++              dvb_int_section_platform_descriptors_for_each(_int, curd) {
++                      parse_descriptor(curd, 1, data_type);
++              }
++              dvb_int_section_target_loop_for_each(_int, cur_target) {
++                      dvb_int_target_target_descriptors_for_each(cur_target, curd) {
++                              parse_descriptor(curd, 2, data_type);
++                      }
++                      operational_loop = dvb_int_target_operational_loop(cur_target);
++                      dvb_int_operational_loop_operational_descriptors_for_each(operational_loop, curd) {
++                              parse_descriptor(curd, 3, data_type);
++                      }
++              }
++
++              hexdump(0, "SCT ", buf, len);
++              getchar();
++              break;
++      }
++
++      case stag_dvb_event_information_nownext_actual:
++      case stag_dvb_event_information_nownext_other:
++      case 0x50: case 0x51: case 0x52: case 0x53: case 0x54: case 0x55: case 0x56: case 0x57:
++      case 0x58: case 0x59: case 0x5a: case 0x5b: case 0x5c: case 0x5d: case 0x5e: case 0x5f:
++      case 0x60: case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: case 0x66: case 0x67:
++      case 0x68: case 0x69: case 0x6a: case 0x6b: case 0x6c: case 0x6d: case 0x6e: case 0x6f:
++      {
++              struct dvb_eit_section *eit;
++              struct dvb_eit_event *cur_event;
++              struct descriptor *curd;
++              time_t start_time;
++
++              if ((section_ext = section_ext_decode(section, 1)) == NULL) {
++                      return;
++              }
++              printf("SCT Decode EIT (pid:0x%04x) (table:0x%02x)\n", pid, section->table_id);
++              if ((eit = dvb_eit_section_codec(section_ext)) == NULL) {
++                      fprintf(stderr, "XXXX EIT section decode error\n");
++                      return;
++              }
++              printf("SCT service_id:0x%04x transport_stream_id:0x%04x original_network_id:0x%04x segment_last_section_number:0x%02x last_table_id:0x%02x\n",
++                     dvb_eit_section_service_id(eit),
++                     eit->transport_stream_id,
++                     eit->original_network_id,
++                     eit->segment_last_section_number,
++                     eit->last_table_id);
++              dvb_eit_section_events_for_each(eit, cur_event) {
++                      start_time = dvbdate_to_unixtime(cur_event->start_time);
++                      printf("\tSCT event_id:0x%04x duration:%i running_status:%i free_ca_mode:%i start_time:%i -- %s",
++                             cur_event->event_id,
++                             dvbduration_to_seconds(cur_event->duration),
++                             cur_event->running_status,
++                             cur_event->free_ca_mode,
++                             (int) start_time,
++                             ctime(&start_time));
++                      dvb_eit_event_descriptors_for_each(cur_event, curd) {
++                              parse_descriptor(curd, 2, data_type);
++                      }
++              }
++              break;
++      }
++
++      case stag_dvb_time_date:
++      {
++              struct dvb_tdt_section *tdt;
++              time_t dvbtime;
++
++              printf("SCT Decode TDT (pid:0x%04x) (table:0x%02x)\n", pid, section->table_id);
++              if ((tdt = dvb_tdt_section_codec(section)) == NULL) {
++                      fprintf(stderr, "XXXX TDT section decode error\n");
++                      return;
++              }
++              dvbtime = dvbdate_to_unixtime(tdt->utc_time);
++              printf("SCT Time: %i -- %s", (int) dvbtime, ctime(&dvbtime));
++              break;
++      }
++
++      case stag_dvb_running_status:
++      {
++              struct dvb_rst_section *rst;
++              struct dvb_rst_status *cur_status;
++
++              printf("SCT Decode RST (pid:0x%04x) (table:0x%02x)\n", pid, section->table_id);
++              if ((rst = dvb_rst_section_codec(section)) == NULL) {
++                      fprintf(stderr, "SCT XXXX RST section decode error\n");
++                      return;
++              }
++              dvb_rst_section_statuses_for_each(rst, cur_status) {
++                      printf("\tSCT transport_stream_id:0x%04x original_network_id:0x%04x service_id:0x%04x event_id:0x%04x running_status:%i\n",
++                             cur_status->transport_stream_id,
++                             cur_status->original_network_id,
++                             cur_status->service_id,
++                             cur_status->event_id,
++                             cur_status->running_status);
++              }
++
++//            hexdump(0, "SCT ", buf, len);
++//            getchar();
++              break;
++      }
++
++      case stag_dvb_stuffing:
++      {
++              struct dvb_st_section *st;
++
++              printf("SCT Decode ST (pid:0x%04x) (table:0x%02x)\n", pid, section->table_id);
++              if ((st = dvb_st_section_codec(section)) == NULL) {
++                      fprintf(stderr, "SCT XXXX ST section decode error\n");
++                      return;
++              }
++              printf("SCT Length: %i\n", dvb_st_section_data_length(st));
++              break;
++      }
++
++      case stag_dvb_time_offset:
++      {
++              struct dvb_tot_section *tot;
++              struct descriptor *curd;
++              time_t dvbtime;
++
++              if (section_check_crc(section))
++                      return;
++              printf("SCT Decode TOT (pid:0x%04x) (table:0x%02x)\n", pid, section->table_id);
++              if ((tot = dvb_tot_section_codec(section)) == NULL) {
++                      fprintf(stderr, "SCT XXXX TOT section decode error\n");
++                      return;
++              }
++              dvbtime = dvbdate_to_unixtime(tot->utc_time);
++              printf("SCT utc_time: %i -- %s", (int) dvbtime, ctime(&dvbtime));
++              dvb_tot_section_descriptors_for_each(tot, curd) {
++                      parse_descriptor(curd, 1, data_type);
++              }
++              break;
++      }
++
++      case stag_dvb_tva_container:
++      {
++              struct dvb_tva_container_section *tva;
++
++              if ((section_ext = section_ext_decode(section, 1)) == NULL) {
++                      return;
++              }
++              printf("SCT Decode tva (pid:0x%04x) (table:0x%02x)\n", pid, section->table_id);
++              if ((tva = dvb_tva_container_section_codec(section_ext)) == NULL) {
++                      fprintf(stderr, "SCT XXXX tva section decode error\n");
++                      return;
++              }
++              printf("SCT container_id:%04x\n",
++                     dvb_tva_container_section_container_id(tva));
++              hexdump(0, "SCT ", dvb_tva_container_section_data(tva), dvb_tva_container_section_data_length(tva));
++
++              hexdump(0, "SCT ", buf, len);
++              getchar();
++              break;
++      }
++
++      case stag_dvb_discontinuity_information:
++      {
++              struct dvb_dit_section *dit;
++
++              printf("SCT Decode DIT (pid:0x%04x) (table:0x%02x)\n", pid, section->table_id);
++              if ((dit = dvb_dit_section_codec(section)) == NULL) {
++                      fprintf(stderr, "SCT XXXX DIT section decode error\n");
++                      return;
++              }
++              printf("SCT transition_flag:%i\n", dit->transition_flag);
++
++//            hexdump(0, "SCT ", buf, len);
++//            getchar();
++              break;
++      }
++
++      case stag_dvb_selection_information:
++      {
++              struct dvb_sit_section *sit;
++              struct descriptor *curd;
++              struct dvb_sit_service *cur_service;
++
++              if ((section_ext = section_ext_decode(section, 1)) == NULL) {
++                      return;
++              }
++              printf("SCT Decode SIT (pid:0x%04x) (table:0x%02x)\n", pid, section->table_id);
++              if ((sit = dvb_sit_section_codec(section_ext)) == NULL) {
++                      fprintf(stderr, "SCT XXXX SIT section decode error\n");
++                      return;
++              }
++              dvb_sit_section_descriptors_for_each(sit, curd) {
++                      parse_descriptor(curd, 1, data_type);
++              }
++              dvb_sit_section_services_for_each(sit, cur_service) {
++                      printf("\tSCT service_id:0x%04x running_status:%i\n", cur_service->service_id, cur_service->running_status);
++                      dvb_sit_service_descriptors_for_each(cur_service, curd) {
++                              parse_descriptor(curd, 2, data_type);
++                      }
++              }
++
++              hexdump(0, "SCT ", buf, len);
++              getchar();
++              break;
++      }
++
++      default:
++              fprintf(stderr, "SCT XXXX Unknown table_id:0x%02x (pid:0x%04x)\n", section->table_id, pid);
++//            hexdump(0, "SCT ", buf, len);
++              return;
++      }
++}
++
++void parse_atsc_section(uint8_t *buf, int len, int pid, int data_type, struct section *section)
++{
++      struct section_ext *section_ext = NULL;
++      struct atsc_section_psip *section_psip = NULL;
++      if ((section_ext = section_ext_decode(section, 1)) == NULL) {
++              return;
++      }
++      if ((section_psip = atsc_section_psip_decode(section_ext)) == NULL) {
++              return;
++      }
++
++      printf("SCT protocol_version:%i\n", section_psip->protocol_version);
++
++      switch(section->table_id) {
++      case stag_atsc_master_guide:
++      {
++              struct atsc_mgt_section *mgt;
++              struct atsc_mgt_table *cur_table;
++              struct atsc_mgt_section_part2 *part2;
++              struct descriptor *curd;
++              int idx;
++
++              printf("SCT Decode MGT (pid:0x%04x) (table:0x%02x)\n", pid, section->table_id);
++              if ((mgt = atsc_mgt_section_codec(section_psip)) == NULL) {
++                      fprintf(stderr, "SCT XXXX MGT section decode error\n");
++                      return;
++              }
++              atsc_mgt_section_tables_for_each(mgt, cur_table, idx) {
++                      printf("\tSCT table_type:0x%04x table_type_PID:%04x table_type_version_number:%i number_bytes:%i\n",
++                             cur_table->table_type,
++                             cur_table->table_type_PID,
++                             cur_table->table_type_version_number,
++                             cur_table->number_bytes);
++                      atsc_mgt_table_descriptors_for_each(cur_table, curd) {
++                              parse_descriptor(curd, 2, data_type);
++                      }
++              }
++
++              part2 = atsc_mgt_section_part2(mgt);
++              atsc_mgt_section_part2_descriptors_for_each(part2, curd) {
++                      parse_descriptor(curd, 1, data_type);
++              }
++              break;
++      }
++
++      case stag_atsc_terrestrial_virtual_channel:
++      {
++              struct atsc_tvct_section *tvct;
++              struct atsc_tvct_channel *cur_channel;
++              struct atsc_tvct_section_part2 *part2;
++              struct descriptor *curd;
++              int idx;
++
++              printf("SCT Decode TVCT (pid:0x%04x) (table:0x%02x)\n", pid, section->table_id);
++              if ((tvct = atsc_tvct_section_codec(section_psip)) == NULL) {
++                      fprintf(stderr, "SCT XXXX TVCT section decode error\n");
++                      return;
++              }
++              printf("\tSCT tranport_stream_id:0x%04x\n",
++                     atsc_tvct_section_transport_stream_id(tvct));
++
++              atsc_tvct_section_channels_for_each(tvct, cur_channel, idx) {
++                      hexdump(0, "SCT short_name ", (uint8_t*) cur_channel->short_name, 7*2);
++
++                      printf("\tSCT major_channel_number:%04x minor_channel_number:%04x modulation_mode:%02x carrier_frequency:%i channel_TSID:%04x program_number:%04x ETM_location:%i access_controlled:%i hidden:%i hide_guide:%i service_type:%02x source_id:%04x\n",
++                             cur_channel->major_channel_number,
++                             cur_channel->minor_channel_number,
++                             cur_channel->modulation_mode,
++                             cur_channel->carrier_frequency,
++                             cur_channel->channel_TSID,
++                             cur_channel->program_number,
++                             cur_channel->ETM_location,
++                             cur_channel->access_controlled,
++                             cur_channel->hidden,
++                             cur_channel->hide_guide,
++                             cur_channel->service_type,
++                             cur_channel->source_id);
++                      atsc_tvct_channel_descriptors_for_each(cur_channel, curd) {
++                              parse_descriptor(curd, 2, data_type);
++                      }
++              }
++
++              part2 = atsc_tvct_section_part2(tvct);
++              atsc_tvct_section_part2_descriptors_for_each(part2, curd) {
++                      parse_descriptor(curd, 1, data_type);
++              }
++              break;
++      }
++
++      case stag_atsc_cable_virtual_channel:
++      {
++              struct atsc_cvct_section *cvct;
++              struct atsc_cvct_channel *cur_channel;
++              struct atsc_cvct_section_part2 *part2;
++              struct descriptor *curd;
++              int idx;
++
++              printf("SCT Decode CVCT (pid:0x%04x) (table:0x%02x)\n", pid, section->table_id);
++              if ((cvct = atsc_cvct_section_codec(section_psip)) == NULL) {
++                      fprintf(stderr, "SCT XXXX CVCT section decode error\n");
++                      return;
++              }
++              printf("\tSCT tranport_stream_id:0x%04x\n",
++                     atsc_cvct_section_transport_stream_id(cvct));
++
++              atsc_cvct_section_channels_for_each(cvct, cur_channel, idx) {
++                      hexdump(0, "SCT short_name ", (uint8_t*) cur_channel->short_name, 7*2);
++
++                      printf("\tSCT major_channel_number:%04x minor_channel_number:%04x modulation_mode:%02x carrier_frequency:%i channel_TSID:%04x program_number:%04x ETM_location:%i access_controlled:%i hidden:%i path_select:%i out_of_band:%i hide_guide:%i service_type:%02x source_id:%04x\n",
++                             cur_channel->major_channel_number,
++                             cur_channel->minor_channel_number,
++                             cur_channel->modulation_mode,
++                             cur_channel->carrier_frequency,
++                             cur_channel->channel_TSID,
++                             cur_channel->program_number,
++                             cur_channel->ETM_location,
++                             cur_channel->access_controlled,
++                             cur_channel->hidden,
++                             cur_channel->path_select,
++                             cur_channel->out_of_band,
++                             cur_channel->hide_guide,
++                             cur_channel->service_type,
++                             cur_channel->source_id);
++                      atsc_cvct_channel_descriptors_for_each(cur_channel, curd) {
++                              parse_descriptor(curd, 2, data_type);
++                      }
++              }
++
++              part2 = atsc_cvct_section_part2(cvct);
++              atsc_cvct_section_part2_descriptors_for_each(part2, curd) {
++                      parse_descriptor(curd, 1, data_type);
++              }
++              break;
++      }
++
++      case stag_atsc_rating_region:
++      {
++              struct atsc_rrt_section *rrt;
++              struct atsc_rrt_section_part2 *part2;
++              struct atsc_rrt_dimension *cur_dimension;
++              struct atsc_rrt_dimension_part2 *dpart2;
++              struct atsc_rrt_dimension_value *cur_value;
++              struct atsc_rrt_dimension_value_part2 *vpart2;
++              struct atsc_rrt_section_part3 *part3;
++              struct descriptor *curd;
++              int didx;
++              int vidx;
++
++              printf("SCT Decode RRT (pid:0x%04x) (table:0x%02x)\n", pid, section->table_id);
++              if ((rrt = atsc_rrt_section_codec(section_psip)) == NULL) {
++                      fprintf(stderr, "SCT XXXX RRT section decode error\n");
++                      return;
++              }
++              printf("\tSCT rating_region:0x%02x\n",
++                     atsc_rrt_section_rating_region(rrt));
++              atsctextdump("SCT region_name:", 1,
++                           atsc_rrt_section_rating_region_name_text(rrt),
++                           rrt->rating_region_name_length);
++
++              part2 = atsc_rrt_section_part2(rrt);
++              atsc_rrt_section_dimensions_for_each(part2, cur_dimension, didx) {
++                      atsctextdump("SCT dimension_name:", 2,
++                                   atsc_rrt_dimension_name_text(cur_dimension),
++                                   cur_dimension->dimension_name_length);
++
++                      dpart2 = atsc_rrt_dimension_part2(cur_dimension);
++                      printf("\tSCT graduated_scale:%i\n",
++                             dpart2->graduated_scale);
++
++                      atsc_rrt_dimension_part2_values_for_each(dpart2, cur_value, vidx) {
++                              atsctextdump("SCT value_abbrev_name:", 3,
++                                           atsc_rrt_dimension_value_abbrev_rating_value_text(cur_value),
++                                           cur_value->abbrev_rating_value_length);
++
++                              vpart2 = atsc_rrt_dimension_value_part2(cur_value);
++                              atsctextdump("SCT value_text:", 3,
++                                           atsc_rrt_dimension_value_part2_rating_value_text(vpart2),
++                                           vpart2->rating_value_length);
++                      }
++              }
++
++              part3 = atsc_rrt_section_part3(part2);
++              atsc_rrt_section_part3_descriptors_for_each(part3, curd) {
++                      parse_descriptor(curd, 1, data_type);
++              }
++
++              hexdump(0, "SCT ", buf, len);
++              getchar();
++              break;
++      }
++
++      case stag_atsc_event_information:
++      {
++              struct atsc_eit_section *eit;
++              struct atsc_eit_event *cur_event;
++              struct atsc_eit_event_part2 *part2;
++              struct descriptor *curd;
++              int idx;
++
++              printf("SCT Decode EIT (pid:0x%04x) (table:0x%02x)\n", pid, section->table_id);
++              if ((eit = atsc_eit_section_codec(section_psip)) == NULL) {
++                      fprintf(stderr, "SCT XXXX EIT section decode error\n");
++                      return;
++              }
++              printf("\tSCT source_id:0x%04x\n",
++                     atsc_eit_section_source_id(eit));
++
++              atsc_eit_section_events_for_each(eit, cur_event, idx) {
++                      printf("\t\tSCT event_id:%04x start_time:%i ETM_location:%i length_in_secs:%i\n",
++                             cur_event->event_id,
++                             cur_event->start_time,
++                             cur_event->ETM_location,
++                             cur_event->length_in_seconds);
++
++                      atsctextdump("SCT title:", 2,
++                                   atsc_eit_event_name_title_text(cur_event),
++                                   cur_event->title_length);
++
++                      part2 = atsc_eit_event_part2(cur_event);
++
++                      atsc_eit_event_part2_descriptors_for_each(part2, curd) {
++                              parse_descriptor(curd, 2, data_type);
++                      }
++              }
++              break;
++      }
++
++      case stag_atsc_extended_text:
++      {
++              struct atsc_ett_section *ett;
++
++              printf("SCT Decode ETT (pid:0x%04x) (table:0x%02x)\n", pid, section->table_id);
++              if ((ett = atsc_ett_section_codec(section_psip)) == NULL) {
++                      fprintf(stderr, "SCT XXXX ETT section decode error\n");
++                      return;
++              }
++              printf("\tSCT ETM_source_id:0x%04x ETM_sub_id:%04x ETM_type:%02x\n",
++                     ett->ETM_source_id,
++                     ett->ETM_sub_id,
++                     ett->ETM_type);
++              atsctextdump("SCT text:", 1,
++                           atsc_ett_section_extended_text_message(ett),
++                           atsc_ett_section_extended_text_message_length(ett));
++              break;
++      }
++
++      case stag_atsc_system_time:
++      {
++              struct atsc_stt_section *stt;
++              struct descriptor *curd;
++
++              printf("SCT Decode STT (pid:0x%04x) (table:0x%02x)\n", pid, section->table_id);
++              if ((stt = atsc_stt_section_codec(section_psip)) == NULL) {
++                      fprintf(stderr, "SCT XXXX STT section decode error\n");
++                      return;
++              }
++              printf("\tSCT system_time:%i gps_utc_offset:%i DS_status:%i DS_day_of_month:%i DS_hour:%i\n",
++                     stt->system_time,
++                     stt->gps_utc_offset,
++                     stt->DS_status,
++                     stt->DS_day_of_month,
++                     stt->DS_hour);
++              atsc_stt_section_descriptors_for_each(stt, curd) {
++                      parse_descriptor(curd, 2, data_type);
++              }
++              break;
++      }
++
++      default:
++              fprintf(stderr, "SCT XXXX Unknown table_id:0x%02x (pid:0x%04x)\n", section->table_id, pid);
++              hexdump(0, "SCT ", buf, len);
++              return;
++      }
++}
++
++void parse_descriptor(struct descriptor *d, int indent, int data_type)
++{
++      switch(d->tag) {
++      case dtag_mpeg_video_stream:
++      {
++              struct mpeg_video_stream_descriptor *dx;
++
++              iprintf(indent, "DSC Decode mpeg_video_stream_descriptor\n");
++              dx = mpeg_video_stream_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX mpeg_video_stream_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC multiple_frame_rate_flag:%i frame_rate_code:%i mpeg_1_only_flag:%i constrained_parameter_flag:%i still_picture_flag:%i\n",
++                      dx->multiple_frame_rate_flag,
++                      dx->frame_rate_code,
++                      dx->mpeg_1_only_flag,
++                      dx->constrained_parameter_flag,
++                      dx->still_picture_flag);
++              if (!dx->mpeg_1_only_flag) {
++                      struct mpeg_video_stream_extra *extra = mpeg_video_stream_descriptor_extra(dx);
++                      iprintf(indent, "DSC profile_and_level_indication:0x%02x chroma_format:%i frame_rate_extension:%i\n",
++                              extra->profile_and_level_indication,
++                              extra->chroma_format,
++                              extra->frame_rate_extension);
++              }
++              break;
++      }
++
++      case dtag_mpeg_audio_stream:
++      {
++              struct mpeg_audio_stream_descriptor *dx;
++
++              iprintf(indent, "DSC Decode mpeg_audio_stream_descriptor\n");
++              dx = mpeg_audio_stream_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX mpeg_audio_stream_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC free_format_flag:%i id:%i layer:%i variable_rate_audio_indicator:%i\n",
++                      dx->free_format_flag,
++                      dx->id,
++                      dx->layer,
++                      dx->variable_rate_audio_indicator);
++              break;
++      }
++
++      case dtag_mpeg_hierarchy:
++      {
++              struct mpeg_hierarchy_descriptor *dx;
++
++              iprintf(indent, "DSC Decode mpeg_hierarchy_descriptor\n");
++              dx = mpeg_hierarchy_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX mpeg_hierarchy_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC hierarchy_type:%i hierarchy_layer_index:%i hierarchy_embedded_layer_index:%i hierarchy_channel:%i\n",
++                      dx->hierarchy_type,
++                      dx->hierarchy_layer_index,
++                      dx->hierarchy_embedded_layer_index,
++                      dx->hierarchy_channel);
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_mpeg_registration:
++      {
++              struct mpeg_registration_descriptor *dx;
++
++              iprintf(indent, "DSC Decode mpeg_registration_descriptor\n");
++              dx = mpeg_registration_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX mpeg_registration_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC format_identifier:0x%x\n",
++                      dx->format_identifier);
++              iprintf(indent, "DSC additional_id_info:\n");
++              hexdump(indent, "DSC ",
++                      mpeg_registration_descriptor_additional_id_info(dx),
++                      mpeg_registration_descriptor_additional_id_info_length(dx));
++              break;
++      }
++
++      case dtag_mpeg_data_stream_alignment:
++      {
++              struct mpeg_data_stream_alignment_descriptor *dx;
++
++              iprintf(indent, "DSC Decode mpeg_data_stream_alignment_descriptor\n");
++              dx = mpeg_data_stream_alignment_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX mpeg_data_stream_alignment_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC alignment_type:%i\n",
++                      dx->alignment_type);
++              break;
++      }
++
++      case dtag_mpeg_target_background_grid:
++      {
++              struct mpeg_target_background_grid_descriptor *dx;
++
++              iprintf(indent, "DSC Decode mpeg_target_background_grid_descriptor\n");
++              dx = mpeg_target_background_grid_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX mpeg_target_background_grid_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC horizontal_size:%i vertical_size:%i aspect_ratio_information:%i\n",
++                      dx->horizontal_size,
++                      dx->vertical_size,
++                      dx->aspect_ratio_information);
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_mpeg_video_window:
++      {
++              struct mpeg_video_window_descriptor *dx;
++
++              iprintf(indent, "DSC Decode mpeg_video_window_descriptor\n");
++              dx = mpeg_video_window_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX mpeg_video_window_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC horizontal_offset:%i vertical_offset:%i window_priority:%i\n",
++                      dx->horizontal_offset,
++                      dx->vertical_offset,
++                      dx->window_priority);
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_mpeg_ca:
++      {
++              struct mpeg_ca_descriptor *dx;
++
++              iprintf(indent, "DSC Decode mpeg_ca_descriptor\n");
++              dx = mpeg_ca_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX mpeg_ca_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC ca_system_id:0x%04x ca_pid:0x%04x\n",
++                      dx->ca_system_id,
++                      dx->ca_pid);
++              iprintf(indent, "DSC data:\n");
++              hexdump(indent, "DSC ", mpeg_ca_descriptor_data(dx), mpeg_ca_descriptor_data_length(dx));
++              break;
++      }
++
++      case dtag_mpeg_iso_639_language:
++      {
++              struct mpeg_iso_639_language_descriptor *dx;
++              struct mpeg_iso_639_language_code *cur_lang;
++
++              iprintf(indent, "DSC Decode mpeg_iso_639_language_descriptor\n");
++              dx = mpeg_iso_639_language_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX mpeg_iso_639_language_descriptor decode error\n");
++                      return;
++              }
++              mpeg_iso_639_language_descriptor_languages_for_each(dx, cur_lang) {
++                      iprintf(indent+1, "DSC language_code:%.3s audio_type:0x%02x\n",
++                              cur_lang->language_code,
++                              cur_lang->audio_type);
++              }
++              break;
++      }
++
++      case dtag_mpeg_system_clock:
++      {
++              struct mpeg_system_clock_descriptor *dx;
++
++              iprintf(indent, "DSC Decode mpeg_system_clock_descriptor\n");
++              dx = mpeg_system_clock_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX mpeg_system_clock_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC external_clock_reference_indicator:%i clock_accuracy_integer:%i clock_accuracy_exponent:%i\n",
++                      dx->external_clock_reference_indicator,
++                      dx->clock_accuracy_integer,
++                      dx->clock_accuracy_exponent);
++              break;
++      }
++
++      case dtag_mpeg_multiplex_buffer_utilization:
++      {
++              struct mpeg_multiplex_buffer_utilization_descriptor *dx;
++
++              iprintf(indent, "DSC Decode mpeg_multiplex_buffer_utilization_descriptor\n");
++              dx = mpeg_multiplex_buffer_utilization_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX mpeg_multiplex_buffer_utilization_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC bound_valid_flag:%i ltw_offset_lower_bound:%i ltw_offset_upper_bound:%i\n",
++                      dx->bound_valid_flag,
++                      dx->ltw_offset_lower_bound,
++                      dx->ltw_offset_upper_bound);
++              break;
++      }
++
++      case dtag_mpeg_copyright:
++      {
++              struct mpeg_copyright_descriptor *dx;
++
++              iprintf(indent, "DSC Decode mpeg_copyright_descriptor\n");
++              dx = mpeg_copyright_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX mpeg_copyright_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC copyright_identifier:0x%08x\n",
++                      dx->copyright_identifier);
++              iprintf(indent, "DSC data:\n");
++              hexdump(indent, "DSC ", mpeg_copyright_descriptor_data(dx), mpeg_copyright_descriptor_data_length(dx));
++              break;
++      }
++
++      case dtag_mpeg_maximum_bitrate:
++      {
++              struct mpeg_maximum_bitrate_descriptor *dx;
++
++              iprintf(indent, "DSC Decode mpeg_maximum_bitrate_descriptor\n");
++              dx = mpeg_maximum_bitrate_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX mpeg_maximum_bitrate_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC maximum_bitrate:%i\n",
++                      dx->maximum_bitrate);
++              break;
++      }
++
++      case dtag_mpeg_private_data_indicator:
++      {
++              struct mpeg_private_data_indicator_descriptor *dx;
++
++              iprintf(indent, "DSC Decode mpeg_private_data_indicator_descriptor\n");
++              dx = mpeg_private_data_indicator_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX mpeg_private_data_indicator_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC private_data_indicator:0x%x\n",
++                      dx->private_data_indicator);
++              break;
++      }
++
++      case dtag_mpeg_smoothing_buffer:
++      {
++              struct mpeg_smoothing_buffer_descriptor *dx;
++
++              iprintf(indent, "DSC Decode mpeg_smoothing_buffer_descriptor\n");
++              dx = mpeg_smoothing_buffer_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX mpeg_smoothing_buffer_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC sb_leak_rate:%i sb_size:%i\n",
++                      dx->sb_leak_rate,
++                      dx->sb_size);
++              break;
++      }
++
++      case dtag_mpeg_std:
++      {
++              struct mpeg_std_descriptor *dx;
++
++              iprintf(indent, "DSC Decode mpeg_std_descriptor\n");
++              dx = mpeg_std_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX mpeg_std_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC leak_valid_flag:%i\n",
++                      dx->leak_valid_flag);
++              break;
++      }
++
++      case dtag_mpeg_ibp:
++      {
++              struct mpeg_ibp_descriptor *dx;
++
++              iprintf(indent, "DSC Decode mpeg_ibp_descriptor\n");
++              dx = mpeg_ibp_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX mpeg_ibp_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC closed_gop_flag:%i identical_gop_flag:%i max_gop_length:%i\n",
++                      dx->closed_gop_flag, dx->identical_gop_flag, dx->max_gop_length);
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_mpeg_4_video:
++      {
++              struct mpeg4_video_descriptor *dx;
++
++              iprintf(indent, "DSC Decode mpeg4_video_descriptor\n");
++              dx = mpeg4_video_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX mpeg4_video_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC mpeg4_visual_profile_and_level:0x%02x\n",
++                      dx->mpeg4_visual_profile_and_level);
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_mpeg_4_audio:
++      {
++              struct mpeg4_audio_descriptor *dx;
++
++              iprintf(indent, "DSC Decode mpeg4_audio_descriptor\n");
++              dx = mpeg4_audio_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX mpeg4_audio_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC mpeg4_audio_profile_and_level:0x%02x\n",
++                      dx->mpeg4_audio_profile_and_level);
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_mpeg_iod:
++      {
++              struct mpeg_iod_descriptor *dx;
++
++              iprintf(indent, "DSC Decode mpeg_iod_descriptor\n");
++              dx = mpeg_iod_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX mpeg_iod_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC scope_of_iod_label:0x%08x iod_label:0x%02x\n",
++                      dx->scope_of_iod_label, dx->iod_label);
++              iprintf(indent, "DSC iod:\n");
++              hexdump(indent, "DSC ", mpeg_iod_descriptor_iod(dx), mpeg_iod_descriptor_iod_length(dx));
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_mpeg_sl:
++      {
++              struct mpeg_sl_descriptor *dx;
++
++              iprintf(indent, "DSC Decode mpeg_sl_descriptor\n");
++              dx = mpeg_sl_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX mpeg_sl_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC es_id:0x%04x\n",
++                      dx->es_id);
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_mpeg_fmc:
++      {
++              struct mpeg_fmc_descriptor *dx;
++              struct mpeg_flex_mux *cur_fm;
++
++              iprintf(indent, "DSC Decode mpeg_fmc_descriptor\n");
++              dx = mpeg_fmc_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX mpeg_fmc_descriptor_descriptor decode error\n");
++                      return;
++              }
++              mpeg_fmc_descriptor_muxes_for_each(dx, cur_fm) {
++                      iprintf(indent+1, "DSC es_id:0x%04x flex_mux_channel:0x%02x\n",
++                              cur_fm->es_id,
++                              cur_fm->flex_mux_channel);
++              }
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_mpeg_external_es_id:
++      {
++              struct mpeg_external_es_id_descriptor *dx;
++
++              iprintf(indent, "DSC Decode mpeg_external_es_id_descriptor\n");
++              dx = mpeg_external_es_id_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX mpeg_external_es_id_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC external_es_id:0x%04x\n",
++                      dx->external_es_id);
++              break;
++      }
++
++      case dtag_mpeg_muxcode:
++      {
++              struct mpeg_muxcode_descriptor *dx;
++
++              iprintf(indent, "DSC Decode mpeg_muxcode_descriptor\n");
++              dx = mpeg_muxcode_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX mpeg_muxcode_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC entries:\n");
++              hexdump(indent, "DSC ", mpeg_muxcode_descriptor_entries(dx), mpeg_muxcode_descriptor_entries_length(dx));
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_mpeg_fmxbuffer_size:
++      {
++              struct mpeg_fmxbuffer_size_descriptor *dx;
++
++              iprintf(indent, "DSC Decode mpeg_fmxbuffer_size_descriptor\n");
++              dx = mpeg_fmxbuffer_size_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX mpeg_fmxbuffer_size_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC descriptors:\n");
++              hexdump(indent, "DSC ", mpeg_fmxbuffer_size_descriptor_descriptors(dx), mpeg_fmxbuffer_size_descriptor_descriptors_length(dx));
++              break;
++      }
++
++      case dtag_mpeg_multiplex_buffer:
++      {
++              struct mpeg_multiplex_buffer_descriptor *dx;
++
++              iprintf(indent, "DSC Decode mpeg_multiplex_buffer_descriptor\n");
++              dx = mpeg_multiplex_buffer_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX mpeg_multiplex_buffer_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC mb_buffer_size:%i tb_leak_rate:%i\n",
++                      dx->mb_buffer_size, dx->tb_leak_rate);
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_mpeg_content_labelling:
++      {
++              struct mpeg_content_labelling_descriptor *dx;
++
++              iprintf(indent, "DSC Decode mpeg_content_labelling_descriptor\n");
++              dx = mpeg_content_labelling_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX mpeg_content_labelling_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC metadata_application_format:%04x\n",
++                      dx->metadata_application_format);
++              struct mpeg_content_labelling_descriptor_application_format_identifier *id =
++                      mpeg_content_labelling_descriptor_id(dx);
++              if (id != NULL) {
++                      iprintf(indent, "DSC application_format_id:%04x\n",
++                              id->id);
++              }
++              struct mpeg_content_labelling_descriptor_flags *flags =
++                      mpeg_content_labelling_descriptor_flags(dx);
++              if (flags != NULL) {
++                      iprintf(indent, "DSC content_reference_id_record_flag:%i content_time_base_indicator:%02x\n",
++                              flags->content_reference_id_record_flag,
++                              flags->content_time_base_indicator);
++
++                      struct mpeg_content_labelling_descriptor_reference_id *reference_id =
++                              mpeg_content_labelling_descriptor_reference_id(flags);
++                      if (reference_id != NULL) {
++                              hexdump(indent, "DSC reference_id " ,
++                                      mpeg_content_reference_id_data(reference_id),
++                                      reference_id->content_reference_id_record_length);
++                      }
++
++                      struct mpeg_content_labelling_descriptor_time_base *time_base =
++                              mpeg_content_labelling_descriptor_time_base(flags);
++                      if (time_base != NULL) {
++                              iprintf(indent, "DSC time_base content_time_base_value:%lli metadata_time_base_value:%lli\n",
++                                      time_base->content_time_base_value,
++                                      time_base->metadata_time_base_value);
++                      }
++
++                      struct mpeg_content_labelling_descriptor_content_id *content_id =
++                              mpeg_content_labelling_descriptor_content_id(flags);
++                      if (content_id != NULL) {
++                              iprintf(indent, "DSC content_id contentId:%i\n",
++                                      content_id->contentId);
++                      }
++
++                      struct mpeg_content_labelling_descriptor_time_base_association *time_base_assoc =
++                              mpeg_content_labelling_descriptor_time_base_assoc(flags);
++                      if (time_base_assoc != NULL) {
++                              hexdump(indent, "DSC time_base_assoc" ,
++                                      mpeg_time_base_association_data(time_base_assoc),
++                                      time_base_assoc->time_base_association_data_length);
++                      }
++
++                      uint8_t *priv;
++                      int priv_length;
++                      priv = mpeg_content_labelling_descriptor_data(dx, flags, &priv_length);
++                      hexdump(indent, "DSC private_data", priv, priv_length);
++              }
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_mpeg_metadata_pointer:
++      {
++              struct mpeg_metadata_pointer_descriptor *dx;
++
++              iprintf(indent, "DSC Decode mpeg_metadata_pointer_descriptor\n");
++              dx = mpeg_metadata_pointer_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX mpeg_metadata_pointer_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC metadata_application_format:%04x\n",
++                      dx->metadata_application_format);
++
++              struct mpeg_metadata_pointer_descriptor_application_format_identifier *id =
++                      mpeg_metadata_pointer_descriptor_appid(dx);
++              if (id != NULL) {
++                      iprintf(indent, "DSC application_format_id:%04x\n",
++                              id->id);
++              }
++
++              struct mpeg_metadata_pointer_descriptor_format_identifier *did =
++                      mpeg_metadata_pointer_descriptor_formid(dx);
++              if (did != NULL) {
++                      iprintf(indent, "DSC mpeg_metadata_pointer_descriptor_format_id:%04x\n",
++                              did->id);
++              }
++
++              struct mpeg_metadata_pointer_descriptor_flags *flags =
++                      mpeg_metadata_pointer_descriptor_flags(dx);
++              if (flags != NULL) {
++                      iprintf(indent, "DSC metadata_service_id:%i metadata_locator_record_flag:%i mpeg_carriage_flags:%x\n",
++                              flags->metadata_service_id,
++                              flags->metadata_locator_record_flag,
++                              flags->mpeg_carriage_flags);
++
++                      struct mpeg_metadata_pointer_descriptor_locator *locator =
++                              mpeg_metadata_pointer_descriptor_locator(flags);
++                      if (locator != NULL) {
++                              hexdump(indent, "DSC locator" ,
++                                      mpeg_metadata_pointer_descriptor_locator_data(locator),
++                                      locator->metadata_locator_record_length);
++                      }
++
++                      struct mpeg_metadata_pointer_descriptor_program_number *pnum=
++                              mpeg_metadata_pointer_descriptor_program_number(flags);
++                      if (pnum != NULL) {
++                              iprintf(indent, "DSC program_number number:%04x\n",
++                                      pnum->number);
++                      }
++
++                      struct mpeg_metadata_pointer_descriptor_carriage *carriage =
++                              mpeg_metadata_pointer_descriptor_carriage(flags);
++                      if (carriage != NULL) {
++                              iprintf(indent, "DSC carriage transport_stream_location:%04x transport_stream_id:%04x\n",
++                                      carriage->transport_stream_location,
++                                      carriage->transport_stream_id);
++                      }
++
++                      uint8_t *priv;
++                      int priv_length;
++                      priv = mpeg_metadata_pointer_descriptor_private_data(dx, flags, &priv_length);
++                      hexdump(indent, "DSC private_data" , priv, priv_length);
++              }
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_mpeg_metadata:
++      {
++              struct mpeg_metadata_descriptor *dx;
++
++              iprintf(indent, "DSC Decode mpeg_metadata_descriptor\n");
++              dx = mpeg_metadata_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX mpeg_metadata_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC metadata_application_format:%04x\n",
++                      dx->metadata_application_format);
++
++              struct mpeg_metadata_descriptor_application_format_identifier *id =
++                      mpeg_metadata_descriptor_appid(dx);
++              if (id != NULL) {
++                      iprintf(indent, "DSC application_format_id:%04x\n",
++                              id->id);
++              }
++
++              struct mpeg_metadata_descriptor_format_identifier *did =
++                      mpeg_metadata_descriptor_formid(dx);
++              if (did != NULL) {
++                      iprintf(indent, "DSC mpeg_metadata_descriptor_format_id:%04x\n",
++                              did->id);
++              }
++
++              struct mpeg_metadata_descriptor_flags *flags =
++                      mpeg_metadata_descriptor_flags(dx);
++              if (flags != NULL) {
++                      iprintf(indent, "DSC metadata_service_id:%i decoder_config_flags:%i dsm_cc_flag:%x\n",
++                              flags->metadata_service_id,
++                              flags->decoder_config_flags,
++                              flags->dsm_cc_flag);
++
++                      struct mpeg_metadata_descriptor_service_identifier *serviceid=
++                              mpeg_metadata_descriptor_sevice_identifier(flags);
++                      if (serviceid != NULL) {
++                              hexdump(indent, "DSC service_id" ,
++                                      mpeg_metadata_descriptor_service_identifier_data(serviceid),
++                                      serviceid->service_identification_length);
++                      }
++
++                      struct mpeg_metadata_descriptor_decoder_config *dconfig=
++                              mpeg_metadata_descriptor_decoder_config(flags);
++                      if (dconfig != NULL) {
++                              hexdump(indent, "DSC decoder_config" ,
++                                      mpeg_metadata_descriptor_decoder_config_data(dconfig),
++                                      dconfig->decoder_config_length);
++                      }
++
++                      struct mpeg_metadata_descriptor_decoder_config_id_record *dconfigid=
++                              mpeg_metadata_descriptor_decoder_config_id_record(flags);
++                      if (dconfigid != NULL) {
++                              hexdump(indent, "DSC decoder_config" ,
++                                      mpeg_metadata_descriptor_decoder_config_id_record_data(dconfigid),
++                                      dconfigid->decoder_config_id_record_length);
++                      }
++
++                      struct mpeg_metadata_descriptor_decoder_config_service_id *dserviceid=
++                              mpeg_metadata_descriptor_decoder_config_service_id(flags);
++                      if (dserviceid != NULL) {
++                              iprintf(indent, "DSC decoder config service_id:%04x\n",
++                                      dserviceid->decoder_config_metadata_service_id);
++                      }
++
++                      struct mpeg_metadata_descriptor_decoder_config_reserved *reserved=
++                              mpeg_metadata_descriptor_decoder_config_reserved(flags);
++                      if (reserved != NULL) {
++                              hexdump(indent, "DSC reserved" ,
++                                      mpeg_metadata_descriptor_decoder_config_reserved_data(reserved),
++                                      reserved->reserved_data_length);
++                      }
++
++                      uint8_t *priv;
++                      int priv_length;
++                      priv = mpeg_metadata_descriptor_private_data(dx, flags, &priv_length);
++                      hexdump(indent, "DSC private_data" , priv, priv_length);
++              }
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_mpeg_metadata_std:
++      {
++              struct mpeg_metadata_std_descriptor *dx;
++
++              iprintf(indent, "DSC Decode mpeg_metadata_std_descriptor\n");
++              dx = mpeg_metadata_std_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX mpeg_metadata_std_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC metadata_input_leak_rate:%i metadata_buffer_size:%i metadata_output_leak_rate:%i\n",
++                      dx->metadata_input_leak_rate,
++                      dx->metadata_buffer_size,
++                      dx->metadata_output_leak_rate);
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      default:
++              switch(data_type) {
++              case DATA_TYPE_DVB:
++                      parse_dvb_descriptor(d, indent, data_type);
++                      return;
++
++              case DATA_TYPE_ATSC:
++                      parse_atsc_descriptor(d, indent, data_type);
++                      return;
++
++              default:
++                      fprintf(stderr, "DSC XXXX Unknown descriptor_tag:0x%02x\n", d->tag);
++                      hexdump(0, "DSC ", (uint8_t*) d, d->len+2);
++                      return;
++              }
++      }
++}
++
++void parse_dvb_descriptor(struct descriptor *d, int indent, int data_type)
++{
++      (void) data_type;
++
++      switch(d->tag) {
++      case dtag_dvb_network_name:
++      {
++              struct dvb_network_name_descriptor *dx;
++
++              iprintf(indent, "DSC Decode dvb_network_name_descriptor\n");
++              dx = dvb_network_name_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_network_name_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC name:%.*s\n",
++                      dvb_network_name_descriptor_name_length(dx),
++                      dvb_network_name_descriptor_name(dx));
++              break;
++      }
++
++      case dtag_dvb_service_list:
++      {
++              struct dvb_service_list_descriptor *dx;
++              struct dvb_service_list_service *curs;
++
++              iprintf(indent, "DSC Decode dvb_service_list_descriptor\n");
++              dx = dvb_service_list_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_service_list_descriptor decode error\n");
++                      return;
++              }
++              dvb_service_list_descriptor_services_for_each(dx, curs) {
++                      iprintf(indent+1, "DSC service_id:0x%04x service_type:0x%02x\n",
++                              curs->service_id, curs->service_type);
++              }
++              break;
++      }
++
++      case dtag_dvb_stuffing:
++      {
++              struct dvb_stuffing_descriptor *dx;
++
++              iprintf(indent, "DSC Decode dvb_stuffing_descriptor\n");
++              dx = dvb_stuffing_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_stuffing_descriptor decode error\n");
++                      return;
++              }
++              hexdump(indent, "DSC",
++                      dvb_stuffing_descriptor_data(dx),
++                      dvb_stuffing_descriptor_data_length(dx));
++              break;
++      }
++
++      case dtag_dvb_satellite_delivery_system:
++      {
++              struct dvb_satellite_delivery_descriptor *dx;
++
++              iprintf(indent, "DSC Decode dvb_satellite_delivery_descriptor\n");
++              dx = dvb_satellite_delivery_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_satellite_delivery_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC frequency:%i orbital_position:%i west_east:%i polarization:%i roll_off:%i modulation_system:%i modulation_type: %i symbol_rate:%i fec_inner:%i\n",
++                      dx->frequency,
++                      dx->orbital_position,
++                      dx->west_east_flag,
++                      dx->polarization,
++                      dx->roll_off,
++                      dx->modulation_system,
++                      dx->modulation_type,
++                      dx->symbol_rate,
++                      dx->fec_inner);
++              break;
++      }
++
++      case dtag_dvb_cable_delivery_system:
++      {
++              struct dvb_cable_delivery_descriptor *dx;
++
++              iprintf(indent, "DSC Decode dvb_cable_delivery_descriptor\n");
++              dx = dvb_cable_delivery_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_cable_delivery_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC frequency:%i fec_outer:%i modulation:%i symbol_rate:%i fec_inner:%i\n",
++                      dx->frequency, dx->fec_outer, dx->modulation,
++                      dx->symbol_rate, dx->fec_inner);
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_vbi_data:
++      {
++              struct dvb_vbi_data_descriptor *dx;
++              struct dvb_vbi_data_entry *cur;
++              struct dvb_vbi_data_x *curx;
++
++              iprintf(indent, "DSC Decode dvb_vbi_data_descriptor\n");
++              dx = dvb_vbi_data_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_vbi_data_descriptor decode error\n");
++                      return;
++              }
++              dvb_vbi_data_descriptor_entries_for_each(dx, cur) {
++                      curx = dvb_vbi_data_entry_data_x(cur);
++                      iprintf(indent+1, "DSC data_service_id:0x%04x\n", cur->data_service_id);
++                      if (cur == NULL) {
++                              hexdump(indent+1, "DSC", dvb_vbi_data_entry_data(cur), cur->data_length);
++                      } else {
++                              iprintf(indent+1, "DSC field_parity:%i line_offset:%i\n",
++                                      curx->field_parity, curx->line_offset);
++                      }
++              }
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_vbi_teletext:
++      {
++              struct dvb_vbi_teletext_descriptor *dx;
++              struct dvb_vbi_teletext_entry *cur;
++
++              iprintf(indent, "DSC Decode dvb_vbi_teletext_descriptor\n");
++              dx = dvb_vbi_teletext_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_vbi_teletext_descriptor decode error\n");
++                      return;
++              }
++              dvb_vbi_teletext_descriptor_entries_for_each(dx, cur) {
++                      iprintf(indent+1, "DSC language_code:%.3s type:%i magazine_number:%i page_number:%i\n",
++                              cur->language_code,
++                              cur->type, cur->magazine_number, cur->page_number);
++              }
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_bouquet_name:
++      {
++              struct dvb_bouquet_name_descriptor *dx;
++
++              iprintf(indent, "DSC Decode dvb_bouquet_name_descriptor\n");
++              dx = dvb_bouquet_name_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_bouquet_name_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC name:%.*s\n",
++                      dvb_bouquet_name_descriptor_name_length(dx),
++                      dvb_bouquet_name_descriptor_name(dx));
++              break;
++      }
++
++      case dtag_dvb_service:
++      {
++              struct dvb_service_descriptor *dx;
++              struct dvb_service_descriptor_part2 *part2;
++
++              iprintf(indent, "DSC Decode dvb_service_descriptor\n");
++              dx = dvb_service_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_service_descriptor decode error\n");
++                      return;
++              }
++              part2 = dvb_service_descriptor_part2(dx);
++              iprintf(indent, "DSC service_type:%02x provider_name:%.*s service_name:%.*s\n",
++                      dx->service_type,
++                      dx->service_provider_name_length,
++                      dvb_service_descriptor_service_provider_name(dx),
++                      part2->service_name_length,
++                      dvb_service_descriptor_service_name(part2));
++              break;
++      }
++
++      case dtag_dvb_country_availability:
++      {
++              struct dvb_country_availability_descriptor *dx;
++              struct dvb_country_availability_entry *cur;
++
++              iprintf(indent, "DSC Decode dvb_country_availability_descriptor\n");
++              dx = dvb_country_availability_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_country_availability_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC country_availability_flag:%i\n", dx->country_availability_flag);
++              dvb_country_availability_descriptor_countries_for_each(dx, cur) {
++                      iprintf(indent+1, "DSC country_code:%.3s\n", cur->country_code);
++              }
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_linkage:
++      {
++              struct dvb_linkage_descriptor *dx;
++
++              iprintf(indent, "DSC Decode dvb_linkage_descriptor\n");
++              dx = dvb_linkage_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_linkage_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC transport_stream_id:0x%04x original_network_id:0x%04x service_id:0x%04x linkage_type:0x%02x\n",
++                      dx->transport_stream_id, dx->original_network_id, dx->service_id, dx->linkage_type);
++              switch(dx->linkage_type) {
++              case 0x08:
++              {
++                      struct dvb_linkage_data_08 *d08 = dvb_linkage_data_08(dx);
++                      int network_id = dvb_linkage_data_08_network_id(dx, d08);
++                      int initial_service_id = dvb_linkage_data_08_initial_service_id(dx, d08);
++                      int length = 0;
++                      uint8_t *data;
++
++                      data = dvb_linkage_data_08_data(dx, d08, &length);
++                      iprintf(indent, "DSC hand_over_type:%i origin_type:%i\n",
++                              d08->hand_over_type, d08->origin_type);
++                      if (network_id != -1) {
++                              iprintf(indent, "DSC network_id:0x%04x\n", network_id);
++                      }
++                      if (initial_service_id != -1) {
++                              iprintf(indent, "DSC initial_service_id:0x%04x\n", initial_service_id);
++                      }
++              }
++
++              case 0x0b:
++              {
++                      struct dvb_linkage_data_0b *data = dvb_linkage_data_0b(dx);
++                      struct dvb_platform_id *platid;
++                      struct dvb_platform_name *curplatname;
++
++                      dvb_linkage_data_0b_platform_id_for_each(data, platid) {
++                              iprintf(indent+1, "DSC platform_id:0x%06x\n", platid->platform_id);
++                              dvb_platform_id_platform_name_for_each(platid, curplatname) {
++                                      iprintf(indent+2, "DSC language_code:%.3s platform_name:%.*s\n",
++                                              curplatname->language_code,
++                                              curplatname->platform_name_length, dvb_platform_name_text(curplatname));
++                              }
++                      }
++                      break;
++              }
++
++              case 0x0c:
++              {
++                      struct dvb_linkage_data_0c *data = dvb_linkage_data_0c(dx);
++
++                      iprintf(indent, "DSC table_type:0x%02x\n", data->table_type);
++                      if (dvb_linkage_data_0c_bouquet_id(data)) {
++                              iprintf(indent, "DSC bouquet_id:0x%04x\n",
++                                      dvb_linkage_data_0c_bouquet_id(data));
++                      }
++                      break;
++              }
++
++              default:
++                      hexdump(indent+1, "DSC", dvb_linkage_descriptor_data(dx), dvb_linkage_descriptor_data_length(dx));
++                      break;
++              }
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_nvod_reference:
++      {
++              struct dvb_nvod_reference_descriptor *dx;
++              struct dvb_nvod_reference *cur;
++
++              iprintf(indent, "DSC Decode dvb_nvod_reference_descriptor\n");
++              dx = dvb_nvod_reference_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_nvod_reference_descriptor decode error\n");
++                      return;
++              }
++              dvb_nvod_reference_descriptor_references_for_each(dx, cur) {
++                      iprintf(indent+1, "DSC transport_stream_id:0x%04x original_network_id:0x%04x service_id:0x%04x\n",
++                              cur->transport_stream_id, cur->original_network_id,
++                              cur->service_id);
++              }
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_time_shifted_service:
++      {
++              struct dvb_time_shifted_service_descriptor *dx;
++
++              iprintf(indent, "DSC Decode dvb_time_shifted_service_descriptor\n");
++              dx = dvb_time_shifted_service_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_time_shifted_service_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC reference_service_id:0x%04x\n", dx->reference_service_id);
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_short_event:
++      {
++              struct dvb_short_event_descriptor *dx;
++              struct dvb_short_event_descriptor_part2 *part2;
++
++              iprintf(indent, "DSC Decode dvb_short_event_descriptor\n");
++              dx = dvb_short_event_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_short_event_descriptor decode error\n");
++                      return;
++              }
++              part2 = dvb_short_event_descriptor_part2(dx);
++              iprintf(indent, "DSC language_code:%.3s event_name:%.*s text:%.*s\n",
++                      dx->language_code,
++                      dx->event_name_length, dvb_short_event_descriptor_event_name(dx),
++                      part2->text_length, dvb_short_event_descriptor_text(part2));
++              break;
++      }
++
++      case dtag_dvb_extended_event:
++      {
++              struct dvb_extended_event_descriptor *dx;
++              struct dvb_extended_event_descriptor_part2 *part2;
++              struct dvb_extended_event_item *cur;
++
++              iprintf(indent, "DSC Decode dvb_extended_event_descriptor\n");
++              dx = dvb_extended_event_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_extended_event_descriptor decode error\n");
++                      return;
++              }
++              part2 = dvb_extended_event_descriptor_part2(dx);
++              iprintf(indent, "DSC descriptor_number:%i last_descriptor_number:%i language_code:%.3s text:%.*s\n",
++                      dx->descriptor_number, dx->last_descriptor_number,
++                      dx->language_code,
++                      part2->text_length, dvb_extended_event_descriptor_part2_text(part2));
++              dvb_extended_event_descriptor_items_for_each(dx, cur) {
++                      struct dvb_extended_event_item_part2 *ipart2 =
++                              dvb_extended_event_item_part2(cur);
++                      iprintf(indent+1, "DSC description:%.*s item:%.*s\n",
++                              cur->item_description_length, dvb_extended_event_item_description(cur),
++                              ipart2->item_length, dvb_extended_event_item_part2_item(ipart2));
++              }
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_time_shifted_event:
++      {
++              struct dvb_time_shifted_event_descriptor *dx;
++
++              iprintf(indent, "DSC Decode dvb_time_shifted_event_descriptor\n");
++              dx = dvb_time_shifted_event_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_time_shifted_event_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC reference_service_id:0x%04x reference_event_id:0x%04x\n",
++                      dx->reference_service_id, dx->reference_event_id);
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_component:
++      {
++              struct dvb_component_descriptor *dx;
++
++              iprintf(indent, "DSC Decode dvb_component_descriptor\n");
++              dx = dvb_component_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_component_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC stream_content:%i component_type:%i component_tag: %i language_code:%.3s, text:%.*s\n",
++                      dx->stream_content,
++                      dx->component_type,
++                      dx->component_tag,
++                      dx->language_code,
++                      dvb_component_descriptor_text_length(dx),
++                      dvb_component_descriptor_text(dx));
++              break;
++      }
++
++      case dtag_dvb_mosaic:
++      {
++              struct dvb_mosaic_descriptor *dx;
++              struct dvb_mosaic_info *curinfo;
++
++              iprintf(indent, "DSC Decode dvb_mosaic_descriptor\n");
++              dx = dvb_mosaic_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_mosaic_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC mosaic_entry_point:%i number_of_horiz_elementary_cells:%i number_of_vert_elementary_cells:%i\n",
++                      dx->mosaic_entry_point, dx->number_of_horiz_elementary_cells,
++                      dx->number_of_vert_elementary_cells);
++              dvb_mosaic_descriptor_infos_for_each(dx, curinfo) {
++                      struct dvb_mosaic_info_part2 *part2;
++                      struct dvb_mosaic_linkage *linkage;
++                      struct dvb_mosaic_elementary_cell_field *curfield;
++
++                      part2 = dvb_mosaic_info_part2(curinfo);
++                      linkage = dvb_mosaic_linkage(part2);
++                      iprintf(indent+1, "DSC logical_cell_id:%i logical_cell_presentation_info:%i cell_linkage_info:0x%02x\n",
++                              curinfo->logical_cell_id, curinfo->logical_cell_presentation_info,
++                              part2->cell_linkage_info);
++                      if (linkage) {
++                              switch(part2->cell_linkage_info) {
++                              case 0x01:
++                                      iprintf(indent+1, "DSC bouquet_id:0x%04x\n",
++                                                      linkage->u.linkage_01.bouquet_id);
++                                      break;
++
++                              case 0x02:
++                                      iprintf(indent+1, "DSC original_network_id:0x%04x transport_stream_id:0x%04x service_id:0x%04x\n",
++                                                      linkage->u.linkage_02.original_network_id,
++                                                      linkage->u.linkage_02.transport_stream_id,
++                                                      linkage->u.linkage_02.service_id);
++                                      break;
++
++                              case 0x03:
++                                      iprintf(indent+1, "DSC original_network_id:0x%04x transport_stream_id:0x%04x service_id:0x%04x\n",
++                                                      linkage->u.linkage_03.original_network_id,
++                                                      linkage->u.linkage_03.transport_stream_id,
++                                                      linkage->u.linkage_03.service_id);
++                                      break;
++
++                              case 0x04:
++                                      iprintf(indent+1, "DSC original_network_id:0x%04x transport_stream_id:0x%04x service_id:0x%04x event_id:0x%04x\n",
++                                                      linkage->u.linkage_04.original_network_id,
++                                                      linkage->u.linkage_04.transport_stream_id,
++                                                      linkage->u.linkage_04.service_id,
++                                                      linkage->u.linkage_04.event_id);
++                                      break;
++                              }
++                      }
++
++                      dvb_mosaic_info_fields_for_each(curinfo, curfield) {
++                              iprintf(indent+2, "DSC elementary_cell_id:0x%02x\n",
++                                      curfield->elementary_cell_id);
++                      }
++              }
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_stream_identifier:
++      {
++              struct dvb_stream_identifier_descriptor *dx;
++
++              iprintf(indent, "DSC Decode dvb_stream_identifier_descriptor\n");
++              dx = dvb_stream_identifier_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_stream_identifier_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC component_tag:%i\n",
++                      dx->component_tag);
++              break;
++      }
++
++      case dtag_dvb_ca_identifier:
++      {
++              struct dvb_ca_identifier_descriptor *dx;
++              int i;
++              uint16_t *ids;
++
++              iprintf(indent, "DSC Decode dvb_ca_identifier_descriptor\n");
++              dx = dvb_ca_identifier_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_ca_identifier_descriptor decode error\n");
++                      return;
++              }
++              ids = dvb_ca_identifier_descriptor_ca_system_ids(dx);
++              for(i=0; i< dvb_ca_identifier_descriptor_ca_system_ids_count(dx); i++) {
++                      iprintf(indent+i, "DSC system_id:0x%04x\n", ids[i]);
++              }
++              break;
++      }
++
++      case dtag_dvb_content:
++      {
++              struct dvb_content_descriptor *dx;
++              struct dvb_content_nibble *cur;
++
++              iprintf(indent, "DSC Decode dvb_content_descriptor\n");
++              dx = dvb_content_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_content_descriptor decode error\n");
++                      return;
++              }
++              dvb_content_descriptor_nibbles_for_each(dx, cur) {
++                      iprintf(indent+1, "DSC content_nibble_level_1:%i content_nibble_level_2:%i user_nibble_1:%i user_nibble_2:%i\n",
++                              cur->content_nibble_level_1, cur->content_nibble_level_2,
++                              cur->user_nibble_1, cur->user_nibble_2);
++              }
++              break;
++      }
++
++      case dtag_dvb_parental_rating:
++      {
++              struct dvb_parental_rating_descriptor *dx;
++              struct dvb_parental_rating *cur;
++
++              iprintf(indent, "DSC Decode dvb_parental_rating_descriptor\n");
++              dx = dvb_parental_rating_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_parental_rating_descriptor decode error\n");
++                      return;
++              }
++              dvb_parental_rating_descriptor_ratings_for_each(dx, cur) {
++                      iprintf(indent+1, "DSC country_code:%.3s rating:%i\n",
++                              cur->country_code, cur->rating);
++              }
++              break;
++      }
++
++      case dtag_dvb_teletext:
++      {
++              struct dvb_teletext_descriptor *dx;
++              struct dvb_teletext_entry *cur;
++
++              iprintf(indent, "DSC Decode dvb_teletext_descriptor\n");
++              dx = dvb_teletext_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_teletext_descriptor decode error\n");
++                      return;
++              }
++              dvb_teletext_descriptor_entries_for_each(dx, cur) {
++                      iprintf(indent+1, "DSC language_code:%.3s type:%i magazine_number:%i page_number:%i\n",
++                              cur->language_code,
++                              cur->type, cur->magazine_number, cur->page_number);
++              }
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_telephone:
++      {
++              struct dvb_telephone_descriptor *dx;
++
++              iprintf(indent, "DSC Decode dvb_telephone_descriptor\n");
++              dx = dvb_telephone_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_telephone_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent,
++                      "DSC foreign_availability:%i connection_type:%i country_prefix:%.*s "
++                      "international_area_code:%.*s operator_code:%.*s national_area_code:%.*s core_number:%.*s\n",
++                      dx->foreign_availability, dx->connection_type,
++                      dx->country_prefix_length, dvb_telephone_descriptor_country_prefix(dx),
++                      dx->international_area_code_length, dvb_telephone_descriptor_international_area_code(dx),
++                      dx->operator_code_length, dvb_telephone_descriptor_operator_code(dx),
++                      dx->national_area_code_length, dvb_telephone_descriptor_national_area_code(dx),
++                      dx->core_number_length, dvb_telephone_descriptor_core_number(dx));
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_local_time_offset:
++      {
++              struct dvb_local_time_offset_descriptor *dx;
++              struct dvb_local_time_offset *cur;
++
++              iprintf(indent, "DSC Decode dvb_local_time_offset_descriptor\n");
++              dx = dvb_local_time_offset_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_local_time_offset_descriptor decode error\n");
++                      return;
++              }
++              dvb_local_time_offset_descriptor_offsets_for_each(dx, cur) {
++                      iprintf(indent+1,
++                              "DSC country_code:%.3s country_region_id:%i "
++                              "local_time_offset_polarity:%i local_time_offset:%i "
++                              "time_of_change:%i next_time_offset:%i\n",
++                              cur->country_code, cur->country_region_id,
++                              cur->local_time_offset_polarity,
++                              dvbhhmm_to_seconds(cur->local_time_offset),
++                              dvbdate_to_unixtime(cur->time_of_change),
++                              dvbhhmm_to_seconds(cur->next_time_offset));
++              }
++              break;
++      }
++
++      case dtag_dvb_subtitling:
++      {
++              struct dvb_subtitling_descriptor *dx;
++              struct dvb_subtitling_entry *cur;
++
++              iprintf(indent, "DSC Decode dvb_subtitling_descriptor\n");
++              dx = dvb_subtitling_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_subtitling_descriptor decode error\n");
++                      return;
++              }
++              dvb_subtitling_descriptor_subtitles_for_each(dx, cur) {
++                      iprintf(indent+1,
++                              "DSC language_code:%.3s subtitling_type:0x%02x composition_page_id:0x%04x ancillary_page_id:0x%04x\n",
++                              cur->language_code, cur->subtitling_type,
++                              cur->composition_page_id, cur->ancillary_page_id);
++              }
++              break;
++      }
++
++      case dtag_dvb_terrestial_delivery_system:
++      {
++              struct dvb_terrestrial_delivery_descriptor *dx;
++
++              iprintf(indent, "DSC Decode dvb_terrestrial_delivery_descriptor\n");
++              dx = dvb_terrestrial_delivery_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_terrestrial_delivery_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC centre_frequency:%i bandwidth:%i priority:%i "
++                              "time_slicing_indicator:%i mpe_fec_indicator:%i constellation:%i "
++                              "hierarchy_information:%i code_rate_hp_stream:%i "
++                              "code_rate_lp_stream:%i guard_interval:%i transmission_mode:%i "
++                              "other_frequency_flag:%i\n",
++                      dx->centre_frequency, dx->bandwidth, dx->priority,
++                      dx->time_slicing_indicator, dx->mpe_fec_indicator,
++                      dx->constellation,
++                      dx->hierarchy_information, dx->code_rate_hp_stream,
++                      dx->code_rate_lp_stream, dx->guard_interval,
++                      dx->transmission_mode, dx->other_frequency_flag);
++              break;
++      }
++
++      case dtag_dvb_multilingual_network_name:
++      {
++              struct dvb_multilingual_network_name_descriptor *dx;
++              struct dvb_multilingual_network_name *cur;
++
++              iprintf(indent, "DSC Decode dvb_multilingual_network_name_descriptor\n");
++              dx = dvb_multilingual_network_name_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_multilingual_network_name_descriptor decode error\n");
++                      return;
++              }
++              dvb_multilingual_network_name_descriptor_names_for_each(dx, cur) {
++                      iprintf(indent+1,
++                              "DSC language_code:%.3s network_name:%.*s\n",
++                              cur->language_code,
++                              cur->network_name_length,
++                              dvb_multilingual_network_name_name(cur));
++              }
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_multilingual_bouquet_name:
++      {
++              struct dvb_multilingual_bouquet_name_descriptor *dx;
++              struct dvb_multilingual_bouquet_name *cur;
++
++              iprintf(indent, "DSC Decode dvb_multilingual_bouquet_name_descriptor\n");
++              dx = dvb_multilingual_bouquet_name_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_multilingual_bouquet_name_descriptor decode error\n");
++                      return;
++              }
++              dvb_multilingual_bouquet_name_descriptor_names_for_each(dx, cur) {
++                      iprintf(indent+1,
++                              "DSC language_code:%.3s bouquet_name:%.*s\n",
++                              cur->language_code,
++                              cur->bouquet_name_length,
++                              dvb_multilingual_bouquet_name_name(cur));
++              }
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_multilingual_service_name:
++      {
++              struct dvb_multilingual_service_name_descriptor *dx;
++              struct dvb_multilingual_service_name *cur;
++
++              iprintf(indent, "DSC Decode dvb_multilingual_service_name_descriptor\n");
++              dx = dvb_multilingual_service_name_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_multilingual_service_name_descriptor decode error\n");
++                      return;
++              }
++              dvb_multilingual_service_name_descriptor_names_for_each(dx, cur) {
++                      struct dvb_multilingual_service_name_part2 *part2;
++                      part2 = dvb_multilingual_service_name_part2(cur);
++
++                      iprintf(indent+1,
++                              "DSC language_code:%.3s provider_name:%.*s service_name:%.*s\n",
++                              cur->language_code,
++                              cur->service_provider_name_length,
++                              dvb_multilingual_service_name_service_provider_name(cur),
++                              part2->service_name_length,
++                              dvb_multilingual_service_name_service_name(part2));
++              }
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_multilingual_component:
++      {
++              struct dvb_multilingual_component_descriptor *dx;
++              struct dvb_multilingual_component *cur;
++
++              iprintf(indent, "DSC Decode dvb_multilingual_component_descriptor\n");
++              dx = dvb_multilingual_component_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_multilingual_component_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC component_tag:%02x\n", dx->component_tag);
++              dvb_multilingual_component_descriptor_components_for_each(dx, cur) {
++                      iprintf(indent+1,
++                              "DSC language_code:%.3s description:%.*s\n",
++                              cur->language_code,
++                              cur->text_description_length,
++                              dvb_multilingual_component_text_char(cur));
++              }
++              break;
++      }
++
++      case dtag_dvb_private_data_specifier:
++      {
++              struct dvb_private_data_specifier_descriptor *dx;
++
++              iprintf(indent, "DSC Decode dvb_private_data_specifier_descriptor\n");
++              dx = dvb_private_data_specifier_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_private_data_specifier_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC private_data_specifier:0x%08x\n",
++                      dx->private_data_specifier);
++              break;
++      }
++
++      case dtag_dvb_service_move:
++      {
++              struct dvb_service_move_descriptor *dx;
++
++              iprintf(indent, "DSC Decode dvb_service_move_descriptor\n");
++              dx = dvb_service_move_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_service_move_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC new_original_network_id:0x%04x new_transport_stream_id:0x%04x new_service_id:0x%04x\n",
++                      dx->new_original_network_id, dx->new_transport_stream_id, dx->new_service_id);
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_short_smoothing_buffer:
++      {
++              struct dvb_short_smoothing_buffer_descriptor *dx;
++
++              iprintf(indent, "DSC Decode dvb_short_smoothing_buffer_descriptor\n");
++              dx = dvb_short_smoothing_buffer_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_short_smoothing_buffer_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC sb_size:%i sb_leak_rate:%i\n",
++                      dx->sb_size, dx->sb_leak_rate);
++              hexdump(indent, "DSC",
++                      dvb_short_smoothing_buffer_descriptor_reserved(dx),
++                      dvb_short_smoothing_buffer_descriptor_reserved_length(dx));
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_frequency_list:
++      {
++              struct dvb_frequency_list_descriptor *dx;
++              uint32_t *freqs;
++              int count;
++              int i;
++
++              iprintf(indent, "DSC Decode dvb_frequency_list_descriptor\n");
++              dx = dvb_frequency_list_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_frequency_list_descriptor decode error\n");
++                      return;
++              }
++              iprintf(0, "DSC coding_type=%i\n", dx->coding_type);
++
++              freqs = dvb_frequency_list_descriptor_centre_frequencies(dx);
++              count = dvb_frequency_list_descriptor_centre_frequencies_count(dx);
++              for(i=0; i< count; i++) {
++                      iprintf(indent+1, "DSC %i\n", freqs[i]);
++              }
++              break;
++      }
++
++      case dtag_dvb_partial_transport_stream:
++      {
++              struct dvb_partial_transport_stream_descriptor *dx;
++
++              iprintf(indent, "DSC Decode dvb_partial_transport_stream_descriptor\n");
++              dx = dvb_partial_transport_stream_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_partial_transport_stream_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC peak_rate:%i minimum_overall_smoothing_rate:%i maximum_overall_smoothing_rate:%i\n",
++                      dx->peak_rate, dx->minimum_overall_smoothing_rate, dx->maximum_overall_smoothing_rate);
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_data_broadcast:
++      {
++              struct dvb_data_broadcast_descriptor *dx;
++              struct dvb_data_broadcast_descriptor_part2 *part2;
++
++              iprintf(indent, "DSC Decode dvb_data_broadcast_descriptor\n");
++              dx = dvb_data_broadcast_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_data_broadcast_descriptor decode error\n");
++                      return;
++              }
++              part2 = dvb_data_broadcast_descriptor_part2(dx);
++
++              iprintf(indent, "DSC data_broadcast_id:0x%04x component_tag:0x%02x selector:%.*s language_code:%.3s text:%.*s\n",
++                      dx->data_broadcast_id, dx->component_tag,
++                      dx->selector_length, dvb_data_broadcast_descriptor_selector(dx),
++                      part2->language_code,
++                      part2->text_length, dvb_data_broadcast_descriptor_part2_text(part2));
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_scrambling:
++      {
++              struct dvb_scrambling_descriptor *dx;
++
++              iprintf(indent, "DSC Decode dvb_scrambling_descriptor\n");
++              dx = dvb_scrambling_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_scrambling_descriptor decode error\n");
++                      return;
++              }
++
++              iprintf(indent, "DSC scrambling_mode:0x%02x\n",
++                      dx->scrambling_mode);
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_data_broadcast_id:
++      {
++              struct dvb_data_broadcast_id_descriptor *dx;
++
++              iprintf(indent, "DSC Decode dvb_data_broadcast_id_descriptor\n");
++              dx = dvb_data_broadcast_id_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_data_broadcast_id_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC data_broadcast_id:0x%04x\n",
++                      dx->data_broadcast_id);
++              hexdump(indent+1, "DSC",
++                      dvb_data_broadcast_id_descriptor_id_selector_byte(dx),
++                      dvb_data_broadcast_id_descriptor_id_selector_byte_length(dx));
++              break;
++      }
++
++      case dtag_dvb_transport_stream:
++      {
++              struct dvb_transport_stream_descriptor *dx;
++
++              iprintf(indent, "DSC Decode dvb_transport_stream_descriptor\n");
++              dx = dvb_transport_stream_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_transport_stream_descriptor decode error\n");
++                      return;
++              }
++              hexdump(indent, "DSC",
++                      dvb_transport_stream_descriptor_data(dx),
++                      dvb_transport_stream_descriptor_data_length(dx));
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_dsng:
++      {
++              struct dvb_dsng_descriptor *dx;
++
++              iprintf(indent, "DSC Decode dvb_dsng_descriptor\n");
++              dx = dvb_dsng_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_dsng_descriptor decode error\n");
++                      return;
++              }
++              hexdump(indent, "DSC",
++                      dvb_dsng_descriptor_data(dx),
++                      dvb_dsng_descriptor_data_length(dx));
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_pdc:
++      {
++              struct dvb_pdc_descriptor *dx;
++
++              iprintf(indent, "DSC Decode dvb_pdc_descriptor\n");
++              dx = dvb_pdc_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_pdc_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC programme_id_label:0x%06x\n",
++                      dx->programme_id_label);
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_ac3:
++      {
++              struct dvb_ac3_descriptor *dx;
++
++              iprintf(indent, "DSC Decode dvb_ac3_descriptor\n");
++              dx = dvb_ac3_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_ac3_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC ac3_type_flag:%i bsid_flag:%i mainid_flag:%i asvc_flag:%i\n",
++                      dx->ac3_type_flag, dx->bsid_flag, dx->mainid_flag, dx->asvc_flag);
++              hexdump(indent+1, "DSC",
++                      dvb_ac3_descriptor_additional_info(dx),
++                      dvb_ac3_descriptor_additional_info_length(dx));
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_ancillary_data:
++      {
++              struct dvb_ancillary_data_descriptor *dx;
++
++              iprintf(indent, "DSC Decode dvb_ancillary_data_descriptor\n");
++              dx = dvb_ancillary_data_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_ancillary_data_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent, "DSC scale_factor_error_check:%i dab_ancillary_data:%i announcement_switching_data:%i extended_ancillary_data:%i dvd_video_ancillary_data:%i\n",
++                      dx->scale_factor_error_check,
++                      dx->dab_ancillary_data,
++                      dx->announcement_switching_data,
++                      dx->extended_ancillary_data,
++                      dx->dvd_video_ancillary_data);
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_cell_list:
++      {
++              struct dvb_cell_list_descriptor *dx;
++              struct dvb_cell_list_entry *cur;
++              struct dvb_subcell_list_entry *cur_subcell;
++
++              iprintf(indent, "DSC Decode dvb_cell_list_descriptor\n");
++              dx = dvb_cell_list_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_cell_list_descriptor decode error\n");
++                      return;
++              }
++              dvb_cell_list_descriptor_cells_for_each(dx, cur) {
++                      iprintf(indent+1,
++                              "DSC cell_id:%04x cell_latitude:%i cell_longitude:%i cell_extend_of_latitude:%i cell_extend_of_longitude:%i\n",
++                              cur->cell_id,
++                              cur->cell_latitude,
++                              cur->cell_longitude,
++                              cur->cell_extend_of_latitude,
++                              cur->cell_extend_of_longitude);
++
++                      dvb_cell_list_entry_subcells_for_each(cur, cur_subcell) {
++                              iprintf(indent+2,
++                                      "DSC cell_id_extension:%04x subcell_latitude:%i subcell_longitude:%i subcell_extend_of_latitude:%i subcell_extend_of_longitude:%i\n",
++                                      cur_subcell->cell_id_extension,
++                                      cur_subcell->subcell_latitude,
++                                      cur_subcell->subcell_longitude,
++                                      cur_subcell->subcell_extend_of_latitude,
++                                      cur_subcell->subcell_extend_of_longitude);
++                      }
++              }
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_cell_frequency_link:
++      {
++              struct dvb_cell_frequency_link_descriptor *dx;
++              struct dvb_cell_frequency_link_cell *cur;
++              struct dvb_cell_frequency_link_cell_subcell *cur_subcell;
++
++              iprintf(indent, "DSC Decode dvb_cell_frequency_link_descriptor\n");
++              dx = dvb_cell_frequency_link_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_cell_frequency_link_descriptor decode error\n");
++                      return;
++              }
++              dvb_cell_frequency_link_descriptor_cells_for_each(dx, cur) {
++                      iprintf(indent+1,
++                              "DSC cell_id:%04x frequency:%i\n",
++                              cur->cell_id,
++                              cur->frequency);
++
++                      dvb_cell_frequency_link_cell_subcells_for_each(cur, cur_subcell) {
++                              iprintf(indent+2,
++                                      "DSC cell_id_extension:%04x transposer_frequency:%i\n",
++                                      cur_subcell->cell_id_extension,
++                                      cur_subcell->transposer_frequency);
++                      }
++              }
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_announcement_support:
++      {
++              struct dvb_announcement_support_descriptor *dx;
++              struct dvb_announcement_support_entry *cur;
++              struct dvb_announcement_support_reference *ref;
++
++              iprintf(indent, "DSC Decode dvb_announcement_support_descriptor\n");
++              dx = dvb_announcement_support_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_announcement_support_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent,
++                      "DSC announcement_support_indicator:%04x\n",
++                      dx->announcement_support_indicator);
++
++              dvb_announcement_support_descriptor_entries_for_each(dx, cur) {
++                      iprintf(indent+1,
++                              "DSC announcement_type:%i reference_type:%i\n",
++                              cur->announcement_type,
++                              cur->reference_type);
++
++                      ref = dvb_announcement_support_entry_reference(cur);
++                      if (ref) {
++                              iprintf(indent+1,
++                                      "DSC original_network_id:%04x transport_stream_id:%04x service_id:%04x component_tag:%02x\n",
++                                      ref->original_network_id,
++                                      ref->transport_stream_id,
++                                      ref->service_id,
++                                      ref->component_tag);
++                      }
++              }
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_application_signalling:
++      {
++              struct dvb_application_signalling_descriptor *dx;
++              struct dvb_application_signalling_entry *cur;
++
++              iprintf(indent, "DSC Decode dvb_application_signalling_descriptor\n");
++              dx = dvb_application_signalling_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_application_signalling_descriptor decode error\n");
++                      return;
++              }
++
++              dvb_application_signalling_descriptor_entries_for_each(dx, cur) {
++                      iprintf(indent+1,
++                              "DSC application_type:%i AIT_version_number:%i\n",
++                              cur->application_type,
++                              cur->AIT_version_number);
++              }
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_adaptation_field_data:
++      {
++              struct dvb_adaptation_field_data_descriptor *dx;
++
++              iprintf(indent, "DSC Decode dvb_adaptation_field_data_descriptor\n");
++              dx = dvb_adaptation_field_data_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_adaptation_field_data_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent,
++                      "DSC announcement_switching_data:%i\n",
++                      dx->announcement_switching_data);
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_service_identifier:
++      {
++              struct dvb_service_identifier_descriptor *dx;
++
++              iprintf(indent, "DSC Decode dvb_service_identifier_descriptor\n");
++              dx = dvb_service_identifier_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_service_identifier_descriptor decode error\n");
++                      return;
++              }
++              hexdump(indent, "DSC",
++                      dvb_service_identifier_descriptor_identifier(dx),
++                      dvb_service_identifier_descriptor_identifier_length(dx));
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_service_availability:
++      {
++              struct dvb_service_availability_descriptor *dx;
++              uint16_t *cellids;
++              int count;
++              int i;
++
++              iprintf(indent, "DSC Decode dvb_service_availability_descriptor\n");
++              dx = dvb_service_availability_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_service_availability_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent,
++                      "DSC availability_flag:%i\n",
++                      dx->availability_flag);
++
++              cellids = dvb_service_availability_descriptor_cell_ids(dx);
++              count = dvb_service_availability_descriptor_cell_ids_count(dx);
++              for(i=0; i< count; i++) {
++                      iprintf(indent+1, "DSC", "%04x\n", cellids[i]);
++              }
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_default_authority:
++      {
++              struct dvb_default_authority_descriptor *dx;
++
++              iprintf(indent, "DSC Decode dvb_default_authority_descriptor\n");
++              dx = dvb_default_authority_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_default_authority_descriptor decode error\n");
++                      return;
++              }
++              hexdump(indent, "DSC",
++                      dvb_default_authority_descriptor_name(dx),
++                      dvb_default_authority_descriptor_name_length(dx));
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_related_content:
++      {
++              struct dvb_related_content_descriptor *dx;
++
++              iprintf(indent, "DSC Decode dvb_related_content_descriptor\n");
++              dx = dvb_related_content_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_related_content_descriptor decode error\n");
++                      return;
++              }
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_tva_id:
++      {
++              struct dvb_tva_id_descriptor *dx;
++              struct dvb_tva_id_entry *cur;
++
++              iprintf(indent, "DSC Decode dvb_tva_id_descriptor\n");
++              dx = dvb_tva_id_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_tva_id_descriptor decode error\n");
++                      return;
++              }
++
++              dvb_tva_id_descriptor_entries_for_each(dx, cur) {
++                      iprintf(indent+1,
++                              "DSC tva_id:%04x running_status:%i\n",
++                              cur->tva_id,
++                              cur->running_status);
++              }
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_content_identifier:
++      {
++              struct dvb_content_identifier_descriptor *dx;
++              struct dvb_content_identifier_entry *cur;
++              struct dvb_content_identifier_entry_data_0 *data0;
++              struct dvb_content_identifier_entry_data_1 *data1;
++
++              iprintf(indent, "DSC Decode dvb_tva_id_descriptor\n");
++              dx = dvb_content_identifier_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_content_identifier_descriptor decode error\n");
++                      return;
++              }
++
++              dvb_content_identifier_descriptor_entries_for_each(dx, cur) {
++                      iprintf(indent+1,
++                              "DSC crid_type:%i crid_location:%i\n",
++                              cur->crid_type,
++                              cur->crid_location);
++
++                      data0 = dvb_content_identifier_entry_data_0(cur);
++                      if (data0) {
++                              hexdump(indent, "DSC data0",
++                                      dvb_content_identifier_entry_data_0_data(data0),
++                                      data0->crid_length);
++                      }
++
++                      data1 = dvb_content_identifier_entry_data_1(cur);
++                      if (data1) {
++                              iprintf(indent+1,
++                                      "DSC crid_ref:%04x\n",
++                                      data1->crid_ref);
++                      }
++              }
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_dvb_s2_satellite_delivery_descriptor:
++      {
++              struct dvb_s2_satellite_delivery_descriptor *dx;
++
++              iprintf(indent, "DSC Decode dvb_s2_satellite_delivery_descriptor\n");
++              dx = dvb_s2_satellite_delivery_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX dvb_s2_satellite_delivery_descriptor decode error\n");
++                      return;
++              }
++
++              iprintf(indent,
++                      "DSC scrambling_sequence_selector:%i multiple_input_stream:%i backwards_compatability:%i\n",
++                      dx->scrambling_sequence_selector,
++                      dx->multiple_input_stream,
++                      dx->backwards_compatability);
++              if (dx->scrambling_sequence_selector) {
++                      iprintf(indent,
++                              "DSC scrambling_sequence_index:%i\n",
++                              dvb_s2_satellite_delivery_descriptor_scrambling_sequence_index(dx));
++              }
++              if (dx->multiple_input_stream) {
++                      iprintf(indent,
++                              "DSC input_stream_id:%i\n",
++                              dvb_s2_satellite_delivery_descriptor_input_stream_id(dx));
++              }
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      default:
++              fprintf(stderr, "DSC XXXX Unknown descriptor_tag:0x%02x\n", d->tag);
++              hexdump(0, "DSC ", (uint8_t*) d, d->len+2);
++              return;
++      }
++}
++
++void parse_atsc_descriptor(struct descriptor *d, int indent, int data_type)
++{
++      (void) data_type;
++
++      switch(d->tag) {
++      case dtag_atsc_stuffing:
++      {
++              struct atsc_stuffing_descriptor *dx;
++
++              iprintf(indent, "DSC Decode atsc_stuffing_descriptor\n");
++              dx = atsc_stuffing_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX atsc_stuffing_descriptor decode error\n");
++                      return;
++              }
++              hexdump(indent, "DSC",
++                      atsc_stuffing_descriptor_data(dx),
++                      atsc_stuffing_descriptor_data_length(dx));
++              break;
++      }
++
++      case dtag_atsc_ac3_audio:
++      {
++              struct atsc_ac3_descriptor *dx;
++
++              iprintf(indent, "DSC Decode atsc_ac3_descriptor\n");
++              dx = atsc_ac3_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX atsc_ac3_descriptor decode error\n");
++                      return;
++              }
++
++              iprintf(indent,
++                      "DSC sample_rate_code:%i bsid:%i bit_rate_code:%i surround_mode:%i bsmod:%i num_channels:%i full_svc:%i\n",
++                      dx->sample_rate_code,
++                      dx->bsid,
++                      dx->bit_rate_code,
++                      dx->surround_mode,
++                      dx->bsmod,
++                      dx->num_channels,
++                      dx->full_svc);
++
++              hexdump(indent+1, "DSC additional_info",
++                      atsc_ac3_descriptor_additional_info(dx),
++                      atsc_ac3_descriptor_additional_info_length(dx));
++              break;
++      }
++
++      case dtag_atsc_caption_service:
++      {
++              struct atsc_caption_service_descriptor *dx;
++              struct atsc_caption_service_entry *cur;
++              int idx;
++
++              iprintf(indent, "DSC Decode atsc_caption_service_descriptor\n");
++              dx = atsc_caption_service_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX atsc_caption_service_descriptor decode error\n");
++                      return;
++              }
++
++              atsc_caption_service_descriptor_entries_for_each(dx, cur, idx) {
++                      iprintf(indent+1,
++                              "DSC language_code:%.3s digital_cc:%i value:%i easy_reader:%i wide_aspect_ratio:%i\n",
++                              cur->language_code,
++                              cur->digital_cc,
++                              cur->value,
++                              cur->easy_reader,
++                              cur->wide_aspect_ratio);
++              }
++              break;
++      }
++
++      case dtag_atsc_content_advisory:
++      {
++              struct atsc_content_advisory_descriptor *dx;
++              struct atsc_content_advisory_entry *cure;
++              struct atsc_content_advisory_entry_dimension *curd;
++              struct atsc_content_advisory_entry_part2 *part2;
++              int eidx;
++              int didx;
++
++              iprintf(indent, "DSC Decode atsc_content_advisory_descriptor\n");
++              dx = atsc_content_advisory_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX atsc_content_advisory_descriptor decode error\n");
++                      return;
++              }
++
++              atsc_content_advisory_descriptor_entries_for_each(dx, cure, eidx) {
++                      iprintf(indent+1,
++                              "DSC rating_region:%i\n",
++                              cure->rating_region);
++
++                      atsc_content_advisory_entry_dimensions_for_each(cure, curd, didx) {
++                              iprintf(indent+2,
++                                      "DSC rating_dimension_j:%i rating_value:%i\n",
++                                      curd->rating_dimension_j,
++                                      curd->rating_value);
++                      }
++
++                      part2 = atsc_content_advisory_entry_part2(cure);
++
++                      atsctextdump("DSC description:",
++                                      indent,
++                                      atsc_content_advisory_entry_part2_description(part2),
++                                      part2->rating_description_length);
++              }
++
++              break;
++      }
++
++      case dtag_atsc_extended_channel_name:
++      {
++              struct atsc_extended_channel_name_descriptor *dx;
++
++              iprintf(indent, "DSC Decode atsc_extended_channel_name_descriptor\n");
++              dx = atsc_extended_channel_name_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX atsc_extended_channel_name_descriptor decode error\n");
++                      return;
++              }
++
++              atsctextdump("SCT text:", 1,
++                              atsc_extended_channel_name_descriptor_text(dx),
++                              atsc_extended_channel_name_descriptor_text_length(dx));
++              break;
++      }
++
++      case dtag_atsc_service_location:
++      {
++              struct atsc_service_location_descriptor *dx;
++              struct atsc_caption_service_location_element *cur;
++              int idx;
++
++              iprintf(indent, "DSC Decode atsc_service_location_descriptor\n");
++              dx = atsc_service_location_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX atsc_service_location_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent+1, "DSC PCR_PID:%04x\n", dx->PCR_PID);
++
++              atsc_service_location_descriptor_elements_for_each(dx, cur, idx) {
++                      iprintf(indent+1, "DSC stream_type:%02x elementary_PID:%04x language_code:%.3s\n",
++                              cur->stream_type,
++                              cur->elementary_PID,
++                              cur->language_code);
++              }
++              break;
++      }
++
++      case dtag_atsc_time_shifted_service:
++      {
++              struct atsc_time_shifted_service_descriptor *dx;
++              struct atsc_time_shifted_service *cur;
++              int idx;
++
++              iprintf(indent, "DSC Decode atsc_time_shifted_service_descriptor\n");
++              dx = atsc_time_shifted_service_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX atsc_time_shifted_service_descriptor decode error\n");
++                      return;
++              }
++
++              atsc_time_shifted_service_descriptor_services_for_each(dx, cur, idx) {
++                      iprintf(indent+1, "DSC time_shift:%i major_channel_number:%04x minor_channel_number:%04x\n",
++                              cur->time_shift,
++                              cur->major_channel_number,
++                              cur->minor_channel_number);
++              }
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_atsc_component_name:
++      {
++              struct atsc_component_name_descriptor *dx;
++
++              iprintf(indent, "DSC Decode atsc_component_name_descriptor\n");
++              dx = atsc_component_name_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX atsc_component_name_descriptor decode error\n");
++                      return;
++              }
++
++              atsctextdump("SCT name:", 1,
++                           atsc_component_name_descriptor_text(dx),
++                           atsc_component_name_descriptor_text_length(dx));
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_atsc_dcc_departing_request:
++      {
++              struct atsc_dcc_departing_request_descriptor *dx;
++
++              iprintf(indent, "DSC Decode atsc_dcc_departing_request_descriptor\n");
++              dx = atsc_dcc_departing_request_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX atsc_dcc_departing_request_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent+1, "DSC dcc_departing_request_type:%02x\n",
++                      dx->dcc_departing_request_type);
++
++              atsctextdump("SCT text:", 1,
++                              atsc_dcc_departing_request_descriptor_text(dx),
++                              atsc_dcc_departing_request_descriptor_text_length(dx));
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_atsc_dcc_arriving_request:
++      {
++              struct atsc_dcc_arriving_request_descriptor *dx;
++
++              iprintf(indent, "DSC Decode atsc_dcc_arriving_request_descriptor\n");
++              dx = atsc_dcc_arriving_request_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX atsc_dcc_arriving_request_descriptor decode error\n");
++                      return;
++              }
++              iprintf(indent+1, "DSC dcc_arriving_request_type:%02x\n",
++                      dx->dcc_arriving_request_type);
++
++              atsctextdump("SCT text:", 1,
++                           atsc_dcc_arriving_request_descriptor_text(dx),
++                           atsc_dcc_arriving_request_descriptor_text_length(dx));
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_atsc_redistribution_control:
++      {
++              struct atsc_rc_descriptor *dx;
++
++              iprintf(indent, "DSC Decode atsc_rc_descriptor\n");
++              dx = atsc_rc_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX atsc_rc_descriptor decode error\n");
++                      return;
++              }
++              hexdump(indent, "DSC",
++                      atsc_rc_descriptor_info(dx),
++                      atsc_rc_descriptor_info_length(dx));
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_atsc_genre:
++      {
++              struct atsc_genre_descriptor *dx;
++
++              iprintf(indent, "DSC Decode atsc_genre_descriptor\n");
++              dx = atsc_genre_descriptor_codec(d);
++              if (dx == NULL) {
++                      fprintf(stderr, "DSC XXXX atsc_genre_descriptor decode error\n");
++                      return;
++              }
++              hexdump(indent, "DSC",
++                      atsc_genre_descriptor_attributes(dx),
++                      dx->attribute_count);
++
++              hexdump(0, "XXX", (uint8_t*) d, d->len + 2);
++              getchar();
++              break;
++      }
++
++      case dtag_atsc_private_information:
++              // FIXME: whats the format?
++
++      case dtag_atsc_content_identifier:
++              // FIXME: whats the format?
++
++      default:
++              fprintf(stderr, "DSC XXXX Unknown descriptor_tag:0x%02x\n", d->tag);
++              hexdump(0, "DSC ", (uint8_t*) d, d->len+2);
++              return;
++      }
++}
++
++void iprintf(int indent, char *fmt, ...)
++{
++      va_list ap;
++
++      while(indent--) {
++              printf("\t");
++      }
++
++      va_start(ap, fmt);
++      vprintf(fmt, ap);
++      va_end(ap);
++}
++
++void hexdump(int indent, char *prefix, uint8_t *buf, int buflen)
++{
++      int i;
++      int j;
++      int max;
++      char line[512];
++
++      for(i=0; i< buflen; i+=16) {
++              max = 16;
++              if ((i + max) > buflen)
++                              max = buflen - i;
++
++              memset(line, 0, sizeof(line));
++              memset(line + 4 + 48 + 1, ' ', 16);
++              sprintf(line, "%02x: ", i);
++              for(j=0; j<max; j++) {
++                      sprintf(line + 4 + (j*3), "%02x", buf[i+j]);
++                      if ((buf[i+j] > 31) && (buf[i+j] < 127))
++                              line[4 + 48 + 1 + j] = buf[i+j];
++                      else
++                              line[4 + 48 + 1 + j] = '.';
++              }
++
++              for(j=0; j< 4 + 48;  j++) {
++                      if (!line[j])
++                              line[j] = ' ';
++              }
++              line[4+48] = '|';
++
++              for(j=0; j < indent; j++) {
++                      printf("\t");
++              }
++              printf("%s%s|\n", prefix, line);
++      }
++}
++
++void atsctextdump(char *header, int indent, struct atsc_text *atext, int len)
++{
++      struct atsc_text_string *cur_string;
++      struct atsc_text_string_segment *cur_segment;
++      int str_idx;
++      int seg_idx;
++
++      if (len == 0)
++              return;
++
++      atsc_text_strings_for_each(atext, cur_string, str_idx) {
++              iprintf(indent+1, "%s String %i language:%.3s\n", header, str_idx, cur_string->language_code);
++
++              atsc_text_string_segments_for_each(cur_string, cur_segment, seg_idx) {
++                      iprintf(indent+2, "Segment %i compression_type:%i mode:%i\n",
++                              seg_idx,
++                              cur_segment->compression_type,
++                              cur_segment->mode);
++
++                      hexdump(indent+2, "rawbytes ",
++                              atsc_text_string_segment_bytes(cur_segment),
++                              cur_segment->number_bytes);
++
++                      if (cur_segment->compression_type < 0x3e) {
++                              uint8_t *decoded = NULL;
++                              size_t decodedlen = 0;
++                              size_t decodedpos = 0;
++
++                              if (atsc_text_segment_decode(cur_segment,
++                                                           &decoded,
++                                                           &decodedlen,
++                                                           &decodedpos) < 0) {
++                                      iprintf(indent+2, "Decode error\n");
++                              } else {
++                                      hexdump(indent+2, "decoded  ", decoded, decodedpos);
++                              }
++                              if (decoded)
++                                      free(decoded);
++                      }
++              }
++      }
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/lnb.c dvb-apps/test/lnb.c
+--- linuxtv-dvb-apps-1.1.1/test/lnb.c  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/test/lnb.c        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,101 @@
++#include <stdlib.h>
++#include <string.h>
++#include <ctype.h>
++#include "lnb.h"
++
++static char *univ_desc[] = {
++              "Europe",
++              "10800 to 11800 MHz and 11600 to 12700 Mhz",
++              "Dual LO, loband 9750, hiband 10600 MHz",
++              (char *)NULL };
++
++static char *dbs_desc[] = {
++              "Expressvu, North America",
++              "12200 to 12700 MHz",
++              "Single LO, 11250 MHz",
++              (char *)NULL };
++
++static char *standard_desc[] = {
++              "10945 to 11450 Mhz",
++              "Single LO, 10000 Mhz",
++              (char *)NULL };
++
++static char *enhan_desc[] = {
++              "Astra",
++              "10700 to 11700 MHz",
++              "Single LO, 9750 MHz",
++              (char *)NULL };
++
++static char *cband_desc[] = {
++              "Big Dish",
++              "3700 to 4200 MHz",
++              "Single LO, 5150 Mhz",
++              (char *)NULL };
++
++static struct lnb_types_st lnbs[] = {
++      {"UNIVERSAL",   univ_desc,              9750, 10600, 11700 },
++      {"DBS",         dbs_desc,               11250, 0, 0 },
++      {"STANDARD",    standard_desc,          10000, 0, 0 },
++      {"ENHANCED",    enhan_desc,             9750, 0, 0 },
++      {"C-BAND",      cband_desc,             5150, 0, 0 }
++};
++
++/* Enumerate through standard types of LNB's until NULL returned.
++ * Increment curno each time
++ */
++
++struct lnb_types_st *
++lnb_enum(int curno)
++{
++      if (curno >= (int) (sizeof(lnbs) / sizeof(lnbs[0])))
++              return (struct lnb_types_st *)NULL;
++      return &lnbs[curno];
++}
++
++/* Decode an lnb type, for example given on a command line
++ * If alpha and standard type, e.g. "Universal" then match that
++ * otherwise low[,high[,switch]]
++ */
++
++int
++lnb_decode(char *str, struct lnb_types_st *lnbp)
++{
++int i;
++char *cp, *np;
++
++      memset(lnbp, 0, sizeof(*lnbp));
++      cp = str;
++      while(*cp && isspace(*cp))
++              cp++;
++      if (isalpha(*cp)) {
++              for (i = 0; i < (int)(sizeof(lnbs) / sizeof(lnbs[0])); i++) {
++                      if (!strcasecmp(lnbs[i].name, cp)) {
++                              *lnbp = lnbs[i];
++                              return 1;
++                      }
++              }
++              return -1;
++      }
++      if (*cp == '\0' || !isdigit(*cp))
++              return -1;
++      lnbp->low_val = strtoul(cp, &np, 0);
++      if (lnbp->low_val == 0)
++              return -1;
++      cp = np;
++      while(*cp && (isspace(*cp) || *cp == ','))
++              cp++;
++      if (*cp == '\0')
++              return 1;
++      if (!isdigit(*cp))
++              return -1;
++      lnbp->high_val = strtoul(cp, &np, 0);
++      cp = np;
++      while(*cp && (isspace(*cp) || *cp == ','))
++              cp++;
++      if (*cp == '\0')
++              return 1;
++      if (!isdigit(*cp))
++              return -1;
++      lnbp->switch_val = strtoul(cp, NULL, 0);
++      return 1;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/lnb.h dvb-apps/test/lnb.h
+--- linuxtv-dvb-apps-1.1.1/test/lnb.h  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/test/lnb.h        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,22 @@
++struct lnb_types_st {
++      char    *name;
++      char    **desc;
++      unsigned long   low_val;
++      unsigned long   high_val;       /* zero indicates no hiband */
++      unsigned long   switch_val;     /* zero indicates no hiband */
++};
++
++/* Enumerate through standard types of LNB's until NULL returned.
++ * Increment curno each time
++ */
++
++struct lnb_types_st *
++lnb_enum(int curno);
++
++/* Decode an lnb type, for example given on a command line
++ * If alpha and standard type, e.g. "Universal" then match that
++ * otherwise low[,high[,switch]]
++ */
++
++int
++lnb_decode(char *str, struct lnb_types_st *lnbp);
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/Makefile dvb-apps/test/Makefile
+--- linuxtv-dvb-apps-1.1.1/test/Makefile       2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/test/Makefile     2009-06-21 13:29:06.000000000 +0200
+@@ -1,37 +1,41 @@
+-# Makefile for Linux DVB API Version 3 test programs
++# Makefile for linuxtv.org dvb-apps/test
+-CC = gcc
+-CFLAGS = -g -O2 -W -Wall -I../include
++objects  = hex_dump.o lnb.o
+-TARGETS = \
+-      diseqc          \
+-      set22k          \
+-      sendburst       \
+-      setvoltage      \
+-      setpid          \
+-      video           \
+-      test_sections   \
+-      test_sec_ne     \
+-      test_pes        \
+-      test_dvr        \
+-      test_dvr_play   \
+-      test_tt         \
+-      test_av         \
+-      test_av_play    \
+-      test_vevent     \
+-      test_stc        \
+-      test_stillimage
++binaries = diseqc          \
++           sendburst       \
++           set22k          \
++           setpid          \
++           setvoltage      \
++           test_av         \
++           test_av_play    \
++           test_dvr        \
++           test_dvr_play   \
++           test_pes        \
++           test_sec_ne     \
++           test_sections   \
++           test_stc        \
++           test_stillimage \
++           test_tt         \
++           test_vevent     \
++         evtest          \
++         video           \
++         szap2
+-#     test            \
+-#     test_audio      \
+-#     test_front      \
+-#     test_switch     \
+-#     test_video      \
++.PHONY: all
+-all: $(TARGETS)
++all: $(binaries)
++      make -C libdvbcfg $@
++      make -C libdvben50221 $@
++      make -C libesg $@
++      make -C libucsi $@
+-test_sections test_sec_ne test_pes test_tt: hex_dump.o
++$(binaries): $(objects)
+-clean:
+-      rm -f $(TARGETS) *.o
++clean::
++      make -C libdvbcfg $@
++      make -C libdvben50221 $@
++      make -C libesg $@
++      make -C libucsi $@
++include ../Make.rules
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/README dvb-apps/test/README
+--- linuxtv-dvb-apps-1.1.1/test/README 2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/test/README       2009-06-21 13:29:06.000000000 +0200
+@@ -1,4 +1,4 @@
+-Various small test/sample programs for the Linux DVB API Version 2
++Various small test/sample programs for the Linux DVB API Version 2/3
+ The default devices used by the test programs are generally
+ /dev/dvb/adapter0/*0, and can be overridden using environment
+@@ -33,13 +33,13 @@
+ test_stc      : Test DMX_GET_STC.
+ test_stillimage : Display single iframes as stillimages
+-                iframes can be created with the 'convert' tool from 
+-                imagemagick and mpeg2encode from ftp.mpeg.org, and must 
++                iframes can be created with the 'convert' tool from
++                imagemagick and mpeg2encode from ftp.mpeg.org, and must
+                 have a supported size, e.g. 702x576
+                 ($ convert -sample 702x576\! test.jpg test.mpg)
+-(test_av_play : Test playing MPEG TS from a file (apparently broken))
+-
++test_av_play  : Test playing MPEG PES (VDR format) from a file
++test_dvr_play : Test playing MPEG TS from a file (don't try, driver is broken)
+ test          :
+ test_audio    :
+@@ -48,4 +48,3 @@
+ test_front    :
+ test_switch   :
+ test_video    :
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/sendburst.c dvb-apps/test/sendburst.c
+--- linuxtv-dvb-apps-1.1.1/test/sendburst.c    2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/test/sendburst.c  2009-06-21 13:29:06.000000000 +0200
+@@ -1,8 +1,9 @@
+-/*
+- * Test sending the burst mini command A/B on a SAT frontend.
+- *
+- * usage: FRONTEND=/dev/dvb/adapterX/frontendX sendburst {a|b}
+- */
++#define USAGE \
++"\n" \
++"\nTest sending the burst mini command A/B on a SAT frontend." \
++"\n" \
++"\nusage: FRONTEND=/dev/dvb/adapterX/frontendX sendburst {a|b}" \
++"\n"
+ #include <stdlib.h>
+ #include <stdio.h>
+@@ -22,7 +23,7 @@
+    int fd, r;
+    if (argc != 2 || (strcmp(argv[1], "a") && strcmp(argv[1], "b"))) {
+-      fprintf (stderr, "usage: %s <a|b>\n", argv[0]);
++      fprintf (stderr, "usage: %s <a|b>\n" USAGE, argv[0]);
+       return 1;
+    }
+@@ -52,4 +53,3 @@
+    return 0;
+ }
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/set22k.c dvb-apps/test/set22k.c
+--- linuxtv-dvb-apps-1.1.1/test/set22k.c       2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/test/set22k.c     2009-06-21 13:29:06.000000000 +0200
+@@ -1,10 +1,11 @@
+-/*
+- * Test switching the 22kHz tone signal on and off on a SAT frontend.
+- * (Note: DiSEqC equipment ignores this after it has once seen a diseqc
+- *  sequence; reload the driver or unplug/replug the SAT cable to reset.)
+- *
+- * usage: FRONTEND=/dev/dvb/adapterX/frontendX set22k {on|off}
+- */
++#define USAGE \
++"\n" \
++"\nTest switching the 22kHz tone signal on and off on a SAT frontend." \
++"\n(Note: DiSEqC equipment ignores this after it has once seen a diseqc" \
++"\n sequence; reload the driver or unplug/replug the SAT cable to reset.)" \
++"\n" \
++"\nusage: FRONTEND=/dev/dvb/adapterX/frontendX set22k {on|off}" \
++"\n"
+ #include <stdlib.h>
+ #include <stdio.h>
+@@ -24,7 +25,7 @@
+    int fd, r;
+    if (argc != 2 || (strcmp(argv[1], "on") && strcmp(argv[1], "off"))) {
+-      fprintf (stderr, "usage: %s <on|off>\n", argv[0]);
++      fprintf (stderr, "usage: %s <on|off>\n" USAGE, argv[0]);
+       return 1;
+    }
+    if (getenv("FRONTEND"))
+@@ -47,4 +48,3 @@
+    return 0;
+ }
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/setpid.c dvb-apps/test/setpid.c
+--- linuxtv-dvb-apps-1.1.1/test/setpid.c       2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/test/setpid.c     2009-06-21 13:29:06.000000000 +0200
+@@ -1,9 +1,10 @@
+-/*
+- * Set video and audio PIDs in the demux; useful only if you have
+- * a hardware MPEG decoder and you're tuned to a transport stream.
+- *
+- * usage: DEMUX=/dev/dvb/adapterX/demuxX setpid video_pid audio_pid
+- */
++#define USAGE \
++"\n" \
++"\nSet video and audio PIDs in the demux; useful only if you have" \
++"\na hardware MPEG decoder and you're tuned to a transport stream." \
++"\n" \
++"\nusage: DEMUX=/dev/dvb/adapterX/demuxX setpid video_pid audio_pid" \
++"\n"
+ #include <unistd.h>
+ #include <stdlib.h>
+@@ -69,7 +70,7 @@
+    int video_pid, audio_pid;
+    if (argc != 3) {
+-      printf ("\nusage: %s <video pid> <audio pid>\n\n", argv[0]);
++      printf ("\nusage: %s <video pid> <audio pid>\n\n" USAGE, argv[0]);
+       exit (1);
+    }
+    if (getenv("DEMUX"))
+@@ -83,5 +84,3 @@
+    return 0;
+ }
+-
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/setvoltage.c dvb-apps/test/setvoltage.c
+--- linuxtv-dvb-apps-1.1.1/test/setvoltage.c   2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/test/setvoltage.c 2009-06-21 13:29:06.000000000 +0200
+@@ -1,10 +1,11 @@
+-/*
+- * Test switching the voltage signal high and low on a SAT frontend.
+- * (Note: DiSEqC equipment ignores this after it has once seen a diseqc
+- *  sequence; reload the driver or unplug/replug the SAT cable to reset.)
+- *
+- * usage: FRONTEND=/dev/dvb/adapterX/frontendX setvoltage {13|18}
+- */
++#define USAGE \
++"\n" \
++"\nTest switching the voltage signal high and low on a SAT frontend." \
++"\n(Note: DiSEqC equipment ignores this after it has once seen a diseqc" \
++"\n sequence; reload the driver or unplug/replug the SAT cable to reset.)" \
++"\n" \
++"\nusage: FRONTEND=/dev/dvb/adapterX/frontendX setvoltage {13|18}" \
++"\n"
+ #include <stdlib.h>
+ #include <stdio.h>
+@@ -23,7 +24,7 @@
+    int fd, r;
+    if (argc != 2 || (strcmp(argv[1], "13") && strcmp(argv[1], "18"))) {
+-      fprintf (stderr, "usage: %s <13|18>\n", argv[0]);
++      fprintf (stderr, "usage: %s <13|18>\n" USAGE, argv[0]);
+       return -1;
+    }
+    if (getenv("FRONTEND"))
+@@ -44,4 +45,3 @@
+    return 0;
+ }
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/szap2.c dvb-apps/test/szap2.c
+--- linuxtv-dvb-apps-1.1.1/test/szap2.c        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/test/szap2.c      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,767 @@
++/* szap -- simple zapping tool for the Linux DVB API
++ *
++ * szap operates on VDR (http://www.cadsoft.de/people/kls/vdr/index.htm)
++ * satellite channel lists (e.g. from http://www.dxandy.de/cgi-bin/dvbchan.pl).
++ * szap assumes you have a "Universal LNB" (i.e. with LOFs 9750/10600 MHz).
++ *
++ * Compilation: `gcc -Wall -I../../ost/include -O2 szap.c -o szap`
++ *  or, if your DVB driver is in the kernel source tree:
++ *              `gcc -Wall -DDVB_IN_KERNEL -O2 szap.c -o szap`
++ *
++ * Copyright (C) 2001 Johannes Stezenbach (js@convergence.de)
++ * for convergence integrated media
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <limits.h>
++#include <string.h>
++#include <errno.h>
++#include <sys/ioctl.h>
++#include <sys/types.h>
++#include <sys/stat.h>
++#include <sys/poll.h>
++#include <sys/param.h>
++#include <fcntl.h>
++#include <time.h>
++#include <unistd.h>
++
++#include <stdint.h>
++#include <sys/time.h>
++
++#include "../include/frontend.h"
++#include "../include/dmx.h"
++#include "../include/audio.h"
++#include "../include/version.h"
++#include "lnb.h"
++
++#ifndef TRUE
++#define TRUE (1==1)
++#endif
++#ifndef FALSE
++#define FALSE (1==0)
++#endif
++
++/* location of channel list file */
++#define CHANNEL_FILE "channels.conf"
++
++/* one line of the VDR channel file has the following format:
++ * ^name:frequency_MHz:polarization:sat_no:symbolrate:vpid:apid:?:service_id$
++ */
++
++
++#define FRONTENDDEVICE "/dev/dvb/adapter%d/frontend%d"
++#define DEMUXDEVICE "/dev/dvb/adapter%d/demux%d"
++#define AUDIODEVICE "/dev/dvb/adapter%d/audio%d"
++
++static struct lnb_types_st lnb_type;
++
++static int exit_after_tuning;
++static int interactive;
++
++static char *usage_str =
++    "\nusage: szap -q\n"
++    "         list known channels\n"
++    "       szap [options] {-n channel-number|channel_name}\n"
++    "         zap to channel via number or full name (case insensitive)\n"
++    "     -a number : use given adapter (default 0)\n"
++    "     -f number : use given frontend (default 0)\n"
++    "     -d number : use given demux (default 0)\n"
++    "     -c file   : read channels list from 'file'\n"
++    "     -b        : enable Audio Bypass (default no)\n"
++    "     -x        : exit after tuning\n"
++    "     -r        : set up /dev/dvb/adapterX/dvr0 for TS recording\n"
++    "     -l lnb-type (DVB-S Only) (use -l help to print types) or \n"
++    "     -l low[,high[,switch]] in Mhz\n"
++    "     -i        : run interactively, allowing you to type in channel names\n"
++    "     -p        : add pat and pmt to TS recording (implies -r)\n"
++    "                 or -n numbers for zapping\n"
++    "   -t        : delivery system type DVB-S=0, DSS=1, DVB-S2=2\n";
++
++static int set_demux(int dmxfd, int pid, int pes_type, int dvr)
++{
++      struct dmx_pes_filter_params pesfilter;
++
++      if (pid < 0 || pid >= 0x1fff) /* ignore this pid to allow radio services */
++              return TRUE;
++
++      if (dvr) {
++              int buffersize = 64 * 1024;
++              if (ioctl(dmxfd, DMX_SET_BUFFER_SIZE, buffersize) == -1)
++                      perror("DMX_SET_BUFFER_SIZE failed");
++      }
++
++      pesfilter.pid = pid;
++      pesfilter.input = DMX_IN_FRONTEND;
++      pesfilter.output = dvr ? DMX_OUT_TS_TAP : DMX_OUT_DECODER;
++      pesfilter.pes_type = pes_type;
++      pesfilter.flags = DMX_IMMEDIATE_START;
++
++      if (ioctl(dmxfd, DMX_SET_PES_FILTER, &pesfilter) == -1) {
++              fprintf(stderr, "DMX_SET_PES_FILTER failed "
++                      "(PID = 0x%04x): %d %m\n", pid, errno);
++
++              return FALSE;
++      }
++
++      return TRUE;
++}
++
++int get_pmt_pid(char *dmxdev, int sid)
++{
++      int patfd, count;
++      int pmt_pid = 0;
++      int patread = 0;
++      int section_length;
++      unsigned char buft[4096];
++      unsigned char *buf = buft;
++      struct dmx_sct_filter_params f;
++
++      memset(&f, 0, sizeof(f));
++      f.pid = 0;
++      f.filter.filter[0] = 0x00;
++      f.filter.mask[0] = 0xff;
++      f.timeout = 0;
++      f.flags = DMX_IMMEDIATE_START | DMX_CHECK_CRC;
++
++      if ((patfd = open(dmxdev, O_RDWR)) < 0) {
++              perror("openening pat demux failed");
++              return -1;
++      }
++
++      if (ioctl(patfd, DMX_SET_FILTER, &f) == -1) {
++              perror("ioctl DMX_SET_FILTER failed");
++              close(patfd);
++              return -1;
++      }
++
++      while (!patread) {
++              if (((count = read(patfd, buf, sizeof(buft))) < 0) && errno == EOVERFLOW)
++                      count = read(patfd, buf, sizeof(buft));
++              if (count < 0) {
++                      perror("read_sections: read error");
++                      close(patfd);
++                      return -1;
++              }
++
++              section_length = ((buf[1] & 0x0f) << 8) | buf[2];
++              if (count != section_length + 3)
++                      continue;
++
++              buf += 8;
++              section_length -= 8;
++
++              patread = 1; /* assumes one section contains the whole pat */
++              while (section_length > 0) {
++                      int service_id = (buf[0] << 8) | buf[1];
++                      if (service_id == sid) {
++                              pmt_pid = ((buf[2] & 0x1f) << 8) | buf[3];
++                              section_length = 0;
++                      }
++                      buf += 4;
++                      section_length -= 4;
++              }
++      }
++      close(patfd);
++      return pmt_pid;
++}
++
++struct diseqc_cmd {
++      struct dvb_diseqc_master_cmd cmd;
++      uint32_t wait;
++};
++
++void diseqc_send_msg(int fd, fe_sec_voltage_t v, struct diseqc_cmd *cmd,
++                   fe_sec_tone_mode_t t, fe_sec_mini_cmd_t b)
++{
++      if (ioctl(fd, FE_SET_TONE, SEC_TONE_OFF) == -1)
++              perror("FE_SET_TONE failed");
++      if (ioctl(fd, FE_SET_VOLTAGE, v) == -1)
++              perror("FE_SET_VOLTAGE failed");
++              usleep(15 * 1000);
++      if (ioctl(fd, FE_DISEQC_SEND_MASTER_CMD, &cmd->cmd) == -1)
++              perror("FE_DISEQC_SEND_MASTER_CMD failed");
++              usleep(cmd->wait * 1000);
++              usleep(15 * 1000);
++      if (ioctl(fd, FE_DISEQC_SEND_BURST, b) == -1)
++              perror("FE_DISEQC_SEND_BURST failed");
++              usleep(15 * 1000);
++      if (ioctl(fd, FE_SET_TONE, t) == -1)
++              perror("FE_SET_TONE failed");
++}
++
++
++
++
++/* digital satellite equipment control,
++ * specification is available from http://www.eutelsat.com/
++ */
++static int diseqc(int secfd, int sat_no, int pol_vert, int hi_band)
++{
++      struct diseqc_cmd cmd =
++              { {{0xe0, 0x10, 0x38, 0xf0, 0x00, 0x00}, 4}, 0 };
++
++      /**
++       * param: high nibble: reset bits, low nibble set bits,
++       * bits are: option, position, polarizaion, band
++       */
++      cmd.cmd.msg[3] =
++              0xf0 | (((sat_no * 4) & 0x0f) | (hi_band ? 1 : 0) | (pol_vert ? 0 : 2));
++
++      diseqc_send_msg(secfd, pol_vert ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18,
++                      &cmd, hi_band ? SEC_TONE_ON : SEC_TONE_OFF,
++                      (sat_no / 4) % 2 ? SEC_MINI_B : SEC_MINI_A);
++
++      return TRUE;
++}
++
++#define DVBS  0
++#define DSS   1
++#define DVBS2 2
++
++static int do_tune(int fefd, unsigned int ifreq, unsigned int sr, unsigned int delsys)
++{
++      /*      API Major=3, Minor=1    */
++      struct dvb_frontend_parameters tuneto;
++      struct dvb_frontend_event ev;
++      /*      API Major=3, Minor=2    */
++      struct dvbfe_params fe_params;
++
++      /* discard stale QPSK events */
++      while (1) {
++              if (ioctl(fefd, FE_GET_EVENT, &ev) == -1)
++              break;
++      }
++
++      if ((DVB_API_VERSION == 3) && (DVB_API_VERSION_MINOR == 3)) {
++              printf("\n%s: API version=%d, delivery system = %d\n", __func__, DVB_API_VERSION_MINOR, delsys);
++
++              fe_params.frequency = ifreq;
++              fe_params.inversion = INVERSION_AUTO;
++              
++              switch (delsys) {
++              case DVBS:
++                      fe_params.delsys.dvbs.symbol_rate = sr;
++                      fe_params.delsys.dvbs.fec = FEC_AUTO;
++                      printf("%s: Frequency = %d, Srate = %d\n",
++                              __func__, fe_params.frequency, fe_params.delsys.dvbs.symbol_rate);
++                      break;
++              case DSS:
++                      fe_params.delsys.dss.symbol_rate = sr;
++                      fe_params.delsys.dss.fec = FEC_AUTO;
++                      printf("%s: Frequency = %d, Srate = %d\n",
++                              __func__, fe_params.frequency, fe_params.delsys.dss.symbol_rate);
++                      break;
++              case DVBS2:
++                      fe_params.delsys.dvbs2.symbol_rate = sr;
++                      fe_params.delsys.dvbs2.fec = FEC_AUTO;
++                      printf("%s: Frequency = %d, Srate = %d\n",
++                              __func__, fe_params.frequency, fe_params.delsys.dvbs2.symbol_rate);
++                      break;
++              default:
++                      return -EINVAL;
++              }
++              printf("%s: Frequency = %d, Srate = %d\n\n\n",
++                      __func__, fe_params.frequency, fe_params.delsys.dvbs.symbol_rate);
++
++              if (ioctl(fefd, DVBFE_SET_PARAMS, &fe_params) == -1) {
++                      perror("DVBFE_SET_PARAMS failed");
++                      return FALSE;
++              }
++
++      } else if ((DVB_API_VERSION == 3) && (DVB_API_VERSION_MINOR == 1)){
++              tuneto.frequency = ifreq;
++              tuneto.inversion = INVERSION_AUTO;
++              tuneto.u.qpsk.symbol_rate = sr;
++              tuneto.u.qpsk.fec_inner = FEC_AUTO;
++              if (ioctl(fefd, FE_SET_FRONTEND, &tuneto) == -1) {
++                      perror("FE_SET_FRONTEND failed");
++                      return FALSE;
++              }
++      }
++      return TRUE;
++}
++
++
++static
++int check_frontend (int fe_fd, int dvr)
++{
++      (void)dvr;
++      fe_status_t status;
++      uint16_t snr, signal;
++      uint32_t ber, uncorrected_blocks;
++      int timeout = 0;
++
++      do {
++              if (ioctl(fe_fd, FE_READ_STATUS, &status) == -1)
++                      perror("FE_READ_STATUS failed");
++              /* some frontends might not support all these ioctls, thus we
++               * avoid printing errors
++               */
++              if (ioctl(fe_fd, FE_READ_SIGNAL_STRENGTH, &signal) == -1)
++                      signal = -2;
++              if (ioctl(fe_fd, FE_READ_SNR, &snr) == -1)
++                      snr = -2;
++              if (ioctl(fe_fd, FE_READ_BER, &ber) == -1)
++                      ber = -2;
++              if (ioctl(fe_fd, FE_READ_UNCORRECTED_BLOCKS, &uncorrected_blocks) == -1)
++                      uncorrected_blocks = -2;
++
++              printf ("status %02x | signal %04x | snr %04x | ber %08x | unc %08x | ",
++                      status, signal, snr, ber, uncorrected_blocks);
++
++              if (status & FE_HAS_LOCK)
++                      printf("FE_HAS_LOCK");
++              printf("\n");
++
++              if (exit_after_tuning && ((status & FE_HAS_LOCK) || (++timeout >= 10)))
++                      break;
++
++              usleep(1000000);
++      } while (1);
++
++      return 0;
++}
++
++
++static
++int zap_to(unsigned int adapter, unsigned int frontend, unsigned int demux,
++         unsigned int sat_no, unsigned int freq, unsigned int pol,
++         unsigned int sr, unsigned int vpid, unsigned int apid, int sid,
++         int dvr, int rec_psi, int bypass, unsigned int delsys)
++{
++      char fedev[128], dmxdev[128], auddev[128];
++      static int fefd, dmxfda, dmxfdv, audiofd = -1, patfd, pmtfd;
++      int pmtpid;
++      uint32_t ifreq;
++      int hiband, result;
++      enum dvbfe_delsys delivery;
++      
++      switch (delsys) {
++      case DVBS:
++              printf("Delivery system=DVB-S\n");
++              delivery = DVBFE_DELSYS_DVBS;   
++              break;
++      case DSS:
++              printf("Delivery system=DSS\n");
++              delivery = DVBFE_DELSYS_DSS;
++              break;
++      case DVBS2:
++              printf("Delivery system=DVB-S2\n");
++              delivery = DVBFE_DELSYS_DVBS2;
++              break;
++      default:
++              printf("Unsupported delivery system\n");
++              return -EINVAL;
++      }
++
++      if (!fefd) {
++              snprintf(fedev, sizeof(fedev), FRONTENDDEVICE, adapter, frontend);
++              snprintf(dmxdev, sizeof(dmxdev), DEMUXDEVICE, adapter, demux);
++              snprintf(auddev, sizeof(auddev), AUDIODEVICE, adapter, demux);
++              printf("using '%s' and '%s'\n", fedev, dmxdev);
++
++              if ((fefd = open(fedev, O_RDWR | O_NONBLOCK)) < 0) {
++                      perror("opening frontend failed");
++                      return FALSE;
++              }
++              result = ioctl(fefd, DVBFE_SET_DELSYS, &delivery);
++              if (result < 0) {
++                      perror("ioctl DVBFE_SET_DELSYS failed");
++                      close(fefd);
++                      return FALSE;
++              }
++
++              if ((dmxfdv = open(dmxdev, O_RDWR)) < 0) {
++                      perror("opening video demux failed");
++                      close(fefd);
++                      return FALSE;
++              }
++
++              if ((dmxfda = open(dmxdev, O_RDWR)) < 0) {
++                      perror("opening audio demux failed");
++                      close(fefd);
++                      return FALSE;
++              }
++
++              if (dvr == 0)   /* DMX_OUT_DECODER */
++                      audiofd = open(auddev, O_RDWR);
++
++              if (rec_psi){
++                      if ((patfd = open(dmxdev, O_RDWR)) < 0) {
++                              perror("opening pat demux failed");
++                              close(audiofd);
++                              close(dmxfda);
++                              close(dmxfdv);
++                              close(fefd);
++                              return FALSE;
++                      }
++
++                      if ((pmtfd = open(dmxdev, O_RDWR)) < 0) {
++                              perror("opening pmt demux failed");
++                              close(patfd);
++                              close(audiofd);
++                              close(dmxfda);
++                              close(dmxfdv);
++                              close(fefd);
++                              return FALSE;
++                      }
++              }
++      }
++
++      hiband = 0;
++      if (lnb_type.switch_val && lnb_type.high_val &&
++              freq >= lnb_type.switch_val)
++              hiband = 1;
++
++      if (hiband)
++              ifreq = freq - lnb_type.high_val;
++      else {
++              if (freq < lnb_type.low_val)
++                      ifreq = lnb_type.low_val - freq;
++      else
++              ifreq = freq - lnb_type.low_val;
++      }
++      result = FALSE;
++
++      if (diseqc(fefd, sat_no, pol, hiband))
++              if (do_tune(fefd, ifreq, sr, delsys))
++                      if (set_demux(dmxfdv, vpid, DMX_PES_VIDEO, dvr))
++                              if (audiofd >= 0)
++                                      (void)ioctl(audiofd, AUDIO_SET_BYPASS_MODE, bypass);
++      if (set_demux(dmxfda, apid, DMX_PES_AUDIO, dvr)) {
++              if (rec_psi) {
++                      pmtpid = get_pmt_pid(dmxdev, sid);
++                      if (pmtpid < 0) {
++                              result = FALSE;
++                      }
++                      if (pmtpid == 0) {
++                              fprintf(stderr,"couldn't find pmt-pid for sid %04x\n",sid);
++                              result = FALSE;
++                      }
++                      if (set_demux(patfd, 0, DMX_PES_OTHER, dvr))
++                              if (set_demux(pmtfd, pmtpid, DMX_PES_OTHER, dvr))
++                                      result = TRUE;
++              } else {
++                      result = TRUE;
++              }
++      }
++
++      check_frontend (fefd, dvr);
++
++      if (!interactive) {
++              close(patfd);
++              close(pmtfd);
++              if (audiofd >= 0)
++                      close(audiofd);
++              close(dmxfda);
++              close(dmxfdv);
++              close(fefd);
++      }
++
++      return result;
++}
++
++
++static int read_channels(const char *filename, int list_channels,
++                       uint32_t chan_no, const char *chan_name,
++                       unsigned int adapter, unsigned int frontend,
++                       unsigned int demux, int dvr, int rec_psi,
++                       int bypass, unsigned int delsys)
++{
++      FILE *cfp;
++      char buf[4096];
++      char inp[256];
++      char *field, *tmp, *p;
++      unsigned int line;
++      unsigned int freq, pol, sat_no, sr, vpid, apid, sid;
++      int ret;
++
++again:
++      line = 0;
++      if (!(cfp = fopen(filename, "r"))) {
++              fprintf(stderr, "error opening channel list '%s': %d %m\n",
++                      filename, errno);
++              return FALSE;
++      }
++
++      if (interactive) {
++              fprintf(stderr, "\n>>> ");
++              if (!fgets(inp, sizeof(inp), stdin)) {
++                      printf("\n");
++                      return -1;
++              }
++              if (inp[0] == '-' && inp[1] == 'n') {
++                      chan_no = strtoul(inp+2, NULL, 0);
++                      chan_name = NULL;
++                      if (!chan_no) {
++                              fprintf(stderr, "bad channel number\n");
++                              goto again;
++                      }
++              } else {
++                      p = strchr(inp, '\n');
++                      if (p)
++                      *p = '\0';
++                      chan_name = inp;
++                      chan_no = 0;
++              }
++      }
++
++      while (!feof(cfp)) {
++              if (fgets(buf, sizeof(buf), cfp)) {
++                      line++;
++
++              if (chan_no && chan_no != line)
++                      continue;
++
++              tmp = buf;
++              field = strsep(&tmp, ":");
++
++              if (!field)
++                      goto syntax_err;
++
++              if (list_channels) {
++                      printf("%03u %s\n", line, field);
++                      continue;
++              }
++
++              if (chan_name && strcasecmp(chan_name, field) != 0)
++                      continue;
++
++              printf("zapping to %d '%s':\n", line, field);
++
++              if (!(field = strsep(&tmp, ":")))
++                      goto syntax_err;
++
++              freq = strtoul(field, NULL, 0);
++
++              if (!(field = strsep(&tmp, ":")))
++                      goto syntax_err;
++
++              pol = (field[0] == 'h' ? 0 : 1);
++
++              if (!(field = strsep(&tmp, ":")))
++                      goto syntax_err;
++
++              sat_no = strtoul(field, NULL, 0);
++
++              if (!(field = strsep(&tmp, ":")))
++                      goto syntax_err;
++
++              sr = strtoul(field, NULL, 0) * 1000;
++
++              if (!(field = strsep(&tmp, ":")))
++                      goto syntax_err;
++
++              vpid = strtoul(field, NULL, 0);
++              if (!vpid)
++                      vpid = 0x1fff;
++
++              if (!(field = strsep(&tmp, ":")))
++                      goto syntax_err;
++
++              p = strchr(field, ';');
++
++              if (p) {
++                      *p = '\0';
++                      p++;
++                      if (bypass) {
++                              if (!p || !*p)
++                                      goto syntax_err;
++                              field = p;
++                      }
++              }
++
++              apid = strtoul(field, NULL, 0);
++              if (!apid)
++                      apid = 0x1fff;
++
++              if (!(field = strsep(&tmp, ":")))
++                      goto syntax_err;
++
++              sid = strtoul(field, NULL, 0);
++
++              printf("sat %u, frequency = %u MHz %c, symbolrate %u, "
++                     "vpid = 0x%04x, apid = 0x%04x sid = 0x%04x\n",
++                      sat_no, freq, pol ? 'V' : 'H', sr, vpid, apid, sid);
++
++              fclose(cfp);
++
++              ret = zap_to(adapter, frontend, demux, sat_no, freq * 1000,
++                           pol, sr, vpid, apid, sid, dvr, rec_psi, bypass, delsys);
++              if (interactive)
++                      goto again;
++
++              if (ret)
++                      return TRUE;
++
++              return FALSE;
++
++syntax_err:
++              fprintf(stderr, "syntax error in line %u: '%s'\n", line, buf);
++      } else if (ferror(cfp)) {
++              fprintf(stderr, "error reading channel list '%s': %d %m\n",
++              filename, errno);
++              fclose(cfp);
++              return FALSE;
++      } else
++              break;
++      }
++
++      fclose(cfp);
++
++      if (!list_channels) {
++              fprintf(stderr, "channel not found\n");
++
++      if (!interactive)
++              return FALSE;
++      }
++      if (interactive)
++              goto again;
++
++      return TRUE;
++}
++
++
++void
++bad_usage(char *pname, int prlnb)
++{
++      int i;
++      struct lnb_types_st *lnbp;
++      char **cp;
++
++      if (!prlnb) {
++              fprintf (stderr, usage_str, pname);
++      } else {
++              i = 0;
++              fprintf(stderr, "-l <lnb-type> or -l low[,high[,switch]] in Mhz\nwhere <lnb-type> is:\n");
++              while(NULL != (lnbp = lnb_enum(i))) {
++                      fprintf (stderr, "%s\n", lnbp->name);
++                      for (cp = lnbp->desc; *cp ; cp++) {
++                              fprintf (stderr, "   %s\n", *cp);
++                      }
++                      i++;
++              }
++      }
++}
++
++int main(int argc, char *argv[])
++{
++      const char *home;
++      char chanfile[2 * PATH_MAX];
++      int list_channels = 0;
++      unsigned int chan_no = 0;
++      const char *chan_name = NULL;
++      unsigned int adapter = 0, frontend = 0, demux = 0, dvr = 0, rec_psi = 0, delsys = 0;
++      int bypass = 0;
++      int opt, copt = 0;
++
++      lnb_type = *lnb_enum(0);
++      while ((opt = getopt(argc, argv, "hqrpn:a:f:d:t:c:l:xib")) != -1) {
++              switch (opt) {
++              case '?':
++              case 'h':
++              default:
++                      bad_usage(argv[0], 0);
++              case 'b':
++                      bypass = 1;
++                      break;
++              case 'q':
++                      list_channels = 1;
++                      break;
++              case 'r':
++                      dvr = 1;
++                      break;
++              case 'n':
++                      chan_no = strtoul(optarg, NULL, 0);
++                      break;
++              case 'a':
++                      adapter = strtoul(optarg, NULL, 0);
++                      break;
++              case 'f':
++                      frontend = strtoul(optarg, NULL, 0);
++                      break;
++              case 'p':
++                      rec_psi = 1;
++                      break;
++              case 'd':
++                      demux = strtoul(optarg, NULL, 0);
++                      break;
++              case 't':
++                      delsys = strtoul(optarg, NULL, 0);
++                      break;
++              case 'c':
++                      copt = 1;
++                      strncpy(chanfile, optarg, sizeof(chanfile));
++                      break;
++              case 'l':
++                      if (lnb_decode(optarg, &lnb_type) < 0) {
++                              bad_usage(argv[0], 1);
++                              return -1;
++                      }
++                      break;
++              case 'x':
++                      exit_after_tuning = 1;
++                      break;
++              case 'i':
++                      interactive = 1;
++                      exit_after_tuning = 1;
++              }
++      }
++      lnb_type.low_val *= 1000;       /* convert to kiloherz */
++      lnb_type.high_val *= 1000;      /* convert to kiloherz */
++      lnb_type.switch_val *= 1000;    /* convert to kiloherz */
++      if (optind < argc)
++              chan_name = argv[optind];
++      if (chan_name && chan_no) {
++              bad_usage(argv[0], 0);
++              return -1;
++      }
++      if (list_channels && (chan_name || chan_no)) {
++              bad_usage(argv[0], 0);
++              return -1;
++      }
++      if (!list_channels && !chan_name && !chan_no && !interactive) {
++              bad_usage(argv[0], 0);
++              return -1;
++      }
++
++      if (!copt) {
++              if (!(home = getenv("HOME"))) {
++                      fprintf(stderr, "error: $HOME not set\n");
++              return TRUE;
++      }
++      snprintf(chanfile, sizeof(chanfile),
++              "%s/.szap/%i/%s", home, adapter, CHANNEL_FILE);
++      if (access(chanfile, R_OK))
++              snprintf(chanfile, sizeof(chanfile),
++                       "%s/.szap/%s", home, CHANNEL_FILE);
++      }
++
++      printf("reading channels from file '%s'\n", chanfile);
++
++      if (rec_psi)
++              dvr=1;
++
++      if (!read_channels(chanfile, list_channels, chan_no, chan_name,
++          adapter, frontend, demux, dvr, rec_psi, bypass, delsys))
++
++              return TRUE;
++
++      return FALSE;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/test_audio.c dvb-apps/test/test_audio.c
+--- linuxtv-dvb-apps-1.1.1/test/test_audio.c   2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/test/test_audio.c 2009-06-21 13:29:06.000000000 +0200
+@@ -1,4 +1,4 @@
+-/* 
++/*
+  * test_audio.c - Test program for new API
+  *
+  * Copyright (C) 2000 Ralph  Metzler <ralph@convergence.de>
+@@ -40,7 +40,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,AUDIO_STOP,0) < 0)){
++      if ((ans = ioctl(fd,AUDIO_STOP,0)) < 0) {
+               perror("AUDIO STOP: ");
+               return -1;
+       }
+@@ -52,7 +52,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,AUDIO_PLAY) < 0)){
++      if ((ans = ioctl(fd,AUDIO_PLAY)) < 0) {
+               perror("AUDIO PLAY: ");
+               return -1;
+       }
+@@ -65,7 +65,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,AUDIO_PAUSE) < 0)){
++      if ((ans = ioctl(fd,AUDIO_PAUSE)) < 0) {
+               perror("AUDIO PAUSE: ");
+               return -1;
+       }
+@@ -78,7 +78,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,AUDIO_CONTINUE) < 0)){
++      if ((ans = ioctl(fd,AUDIO_CONTINUE)) < 0) {
+               perror("AUDIO CONTINUE: ");
+               return -1;
+       }
+@@ -90,7 +90,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,AUDIO_SELECT_SOURCE, source) < 0)){
++      if ((ans = ioctl(fd,AUDIO_SELECT_SOURCE, source)) < 0) {
+               perror("AUDIO SELECT SOURCE: ");
+               return -1;
+       }
+@@ -104,7 +104,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,AUDIO_SET_MUTE, state) < 0)){
++      if ((ans = ioctl(fd,AUDIO_SET_MUTE, state)) < 0) {
+               perror("AUDIO SET MUTE: ");
+               return -1;
+       }
+@@ -116,7 +116,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,AUDIO_SET_AV_SYNC, state) < 0)){
++      if ((ans = ioctl(fd,AUDIO_SET_AV_SYNC, state)) < 0) {
+               perror("AUDIO SET AV SYNC: ");
+               return -1;
+       }
+@@ -128,8 +128,8 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,AUDIO_SET_BYPASS_MODE, mode) < 0)){
+-              perror("AUDIO SET BYPASS MODE: ");
++      if ((ans = ioctl(fd,AUDIO_SET_BYPASS_MODE, mode)) < 0) {
++              printf("AUDIO SET BYPASS MODE not implemented?\n");
+               return -1;
+       }
+@@ -141,7 +141,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,AUDIO_CHANNEL_SELECT, select) < 0)){
++      if ((ans = ioctl(fd,AUDIO_CHANNEL_SELECT, select)) < 0) {
+               perror("AUDIO CHANNEL SELECT: ");
+               return -1;
+       }
+@@ -154,7 +154,7 @@
+       struct audio_status stat;
+       int ans;
+-      if ( (ans = ioctl(fd,AUDIO_GET_STATUS, &stat) < 0)){
++      if ((ans = ioctl(fd,AUDIO_GET_STATUS, &stat)) < 0) {
+               perror("AUDIO GET STATUS: ");
+               return -1;
+       }
+@@ -179,7 +179,7 @@
+               printf("unknown (%d)\n",stat.play_state);
+               break;
+       }
+-      
++
+       printf("  Stream Source       : ");
+       switch((int)stat.stream_source){
+       case AUDIO_SOURCE_DEMUX:
+@@ -227,7 +227,7 @@
+       int stopped = 0;
+       boolean mute = false;
+       boolean sync = false;
+-      
++
+       pfd[0].fd = STDIN_FILENO;
+       pfd[0].events = POLLIN;
+@@ -257,7 +257,7 @@
+                                               printf("playback stopped\n");
+                                               stopped = 1;
+                                               break;
+-                                              
++
+                                       case 'c':
+                                               audioContinue(fd);
+                                               printf("playback continued\n");
+@@ -291,7 +291,7 @@
+                                               break;
+                                       }
+                               }
+-                              
++
+                       }
+               }
+       }
+@@ -312,8 +312,8 @@
+               perror("File open:");
+               return -1;
+       }
+-          
+-      if((fd = open("/dev/ost/audio",O_RDWR|O_NONBLOCK)) < 0){
++
++      if ((fd = open("/dev/ost/audio",O_RDWR|O_NONBLOCK)) < 0){
+               perror("AUDIO DEVICE: ");
+               return -1;
+       }
+@@ -321,7 +321,7 @@
+       audioSetMute(fd,mute);
+-      //      audioSetBypassMode(fd,false); // not implemented
++      audioSetBypassMode(fd,false);
+       //audioContinue(fd);
+       audioSelectSource(fd,AUDIO_SOURCE_MEMORY);
+       audioPlay(fd);
+@@ -334,7 +334,7 @@
+       //audioChannelSelect(fd,AUDIO_STEREO);
+       //audioSetAVSync(fd,sync);
+       audioGetStatus(fd);
+-      
++
+       play_file_audio(filefd,fd);
+       close(fd);
+@@ -342,4 +342,3 @@
+ }
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/test_av.c dvb-apps/test/test_av.c
+--- linuxtv-dvb-apps-1.1.1/test/test_av.c      2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/test/test_av.c    2009-06-21 13:29:06.000000000 +0200
+@@ -1,4 +1,4 @@
+-/* 
++/*
+  * test_av.c - Test for audio and video MPEG decoder API.
+  *
+  * Copyright (C) 2000 - 2002 convergence GmbH
+@@ -30,6 +30,7 @@
+ #include <time.h>
+ #include <unistd.h>
++#include <linux/types.h>
+ #include <linux/dvb/audio.h>
+ #include <linux/dvb/video.h>
+@@ -94,11 +95,11 @@
+ int audioSetAVSync(int fd, char *arg)
+ {
+-      int sync;
++      int _sync;
+       if (!arg)
+               return -1;
+-      sync = atoi(arg);
+-      if (ioctl(fd, AUDIO_SET_AV_SYNC, sync) == -1)
++      _sync = atoi(arg);
++      if (ioctl(fd, AUDIO_SET_AV_SYNC, _sync) == -1)
+               perror("AUDIO_SET_AV_SYNC");
+       return 0;
+ }
+@@ -127,66 +128,66 @@
+ int audioGetStatus(int fd, char *arg)
+ {
+-      struct audio_status stat;
++      struct audio_status _stat;
+       if (arg)
+               return -1;
+-      if (ioctl(fd, AUDIO_GET_STATUS, &stat) == -1) {
++      if (ioctl(fd, AUDIO_GET_STATUS, &_stat) == -1) {
+               perror("AUDIO_GET_STATUS");
+               return 0;
+       }
+       printf("Audio Status:\n");
+       printf("  Sync State          : %s\n",
+-             (stat.AV_sync_state ? "SYNC" : "NO SYNC"));
++             (_stat.AV_sync_state ? "SYNC" : "NO SYNC"));
+       printf("  Mute State          : %s\n",
+-             (stat.mute_state ? "muted" : "not muted"));
++             (_stat.mute_state ? "muted" : "not muted"));
+       printf("  Play State          : ");
+-      switch ((int)stat.play_state){
++      switch ((int)_stat.play_state){
+       case AUDIO_STOPPED:
+-              printf("STOPPED (%d)\n",stat.play_state);
++              printf("STOPPED (%d)\n",_stat.play_state);
+               break;
+       case AUDIO_PLAYING:
+-              printf("PLAYING (%d)\n",stat.play_state);
++              printf("PLAYING (%d)\n",_stat.play_state);
+               break;
+       case AUDIO_PAUSED:
+-              printf("PAUSED (%d)\n",stat.play_state);
++              printf("PAUSED (%d)\n",_stat.play_state);
+               break;
+       default:
+-              printf("unknown (%d)\n",stat.play_state);
++              printf("unknown (%d)\n",_stat.play_state);
+               break;
+       }
+       printf("  Stream Source       : ");
+-      switch((int)stat.stream_source){
++      switch((int)_stat.stream_source){
+       case AUDIO_SOURCE_DEMUX:
+-              printf("DEMUX (%d)\n",stat.stream_source);
++              printf("DEMUX (%d)\n",_stat.stream_source);
+               break;
+       case AUDIO_SOURCE_MEMORY:
+-              printf("MEMORY (%d)\n",stat.stream_source);
++              printf("MEMORY (%d)\n",_stat.stream_source);
+               break;
+       default:
+-              printf("unknown (%d)\n",stat.stream_source);
++              printf("unknown (%d)\n",_stat.stream_source);
+               break;
+       }
+       printf("  Channel Select      : ");
+-      switch((int)stat.channel_select){
++      switch((int)_stat.channel_select){
+       case AUDIO_STEREO:
+-              printf("Stereo (%d)\n",stat.channel_select);
++              printf("Stereo (%d)\n",_stat.channel_select);
+               break;
+       case AUDIO_MONO_LEFT:
+-              printf("Mono left(%d)\n",stat.channel_select);
++              printf("Mono left(%d)\n",_stat.channel_select);
+               break;
+       case AUDIO_MONO_RIGHT:
+-              printf("Mono right (%d)\n",stat.channel_select);
++              printf("Mono right (%d)\n",_stat.channel_select);
+               break;
+       default:
+-              printf("unknown (%d)\n",stat.channel_select);
++              printf("unknown (%d)\n",_stat.channel_select);
+               break;
+       }
+       printf("  Bypass Mode         : %s\n",
+-             (stat.bypass_mode ? "ON" : "OFF"));
++             (_stat.bypass_mode ? "ON" : "OFF"));
+       return 0;
+@@ -300,76 +301,76 @@
+ int videoGetStatus(int fd, char *arg)
+ {
+-      struct video_status stat;
++      struct video_status _stat;
+       if (arg)
+               return -1;
+-      if (ioctl(fd, VIDEO_GET_STATUS, &stat) == -1){
++      if (ioctl(fd, VIDEO_GET_STATUS, &_stat) == -1){
+               perror("VIDEO_GET_STATUS");
+               return 0;
+       }
+       printf("Video Status:\n");
+       printf("  Blank State          : %s\n",
+-             (stat.video_blank ? "BLANK" : "STILL"));
++             (_stat.video_blank ? "BLANK" : "STILL"));
+       printf("  Play State           : ");
+-      switch ((int)stat.play_state){
++      switch ((int)_stat.play_state){
+       case VIDEO_STOPPED:
+-              printf("STOPPED (%d)\n",stat.play_state);
++              printf("STOPPED (%d)\n",_stat.play_state);
+               break;
+       case VIDEO_PLAYING:
+-              printf("PLAYING (%d)\n",stat.play_state);
++              printf("PLAYING (%d)\n",_stat.play_state);
+               break;
+       case VIDEO_FREEZED:
+-              printf("FREEZED (%d)\n",stat.play_state);
++              printf("FREEZED (%d)\n",_stat.play_state);
+               break;
+       default:
+-              printf("unknown (%d)\n",stat.play_state);
++              printf("unknown (%d)\n",_stat.play_state);
+               break;
+       }
+       printf("  Stream Source        : ");
+-      switch((int)stat.stream_source){
++      switch((int)_stat.stream_source){
+       case VIDEO_SOURCE_DEMUX:
+-              printf("DEMUX (%d)\n",stat.stream_source);
++              printf("DEMUX (%d)\n",_stat.stream_source);
+               break;
+       case VIDEO_SOURCE_MEMORY:
+-              printf("MEMORY (%d)\n",stat.stream_source);
++              printf("MEMORY (%d)\n",_stat.stream_source);
+               break;
+       default:
+-              printf("unknown (%d)\n",stat.stream_source);
++              printf("unknown (%d)\n",_stat.stream_source);
+               break;
+       }
+       printf("  Format (Aspect Ratio): ");
+-      switch((int)stat.video_format){
++      switch((int)_stat.video_format){
+       case VIDEO_FORMAT_4_3:
+-              printf("4:3 (%d)\n",stat.video_format);
++              printf("4:3 (%d)\n",_stat.video_format);
+               break;
+       case VIDEO_FORMAT_16_9:
+-              printf("16:9 (%d)\n",stat.video_format);
++              printf("16:9 (%d)\n",_stat.video_format);
+               break;
+       case VIDEO_FORMAT_221_1:
+-              printf("2.21:1 (%d)\n",stat.video_format);
++              printf("2.21:1 (%d)\n",_stat.video_format);
+               break;
+       default:
+-              printf("unknown (%d)\n",stat.video_format);
++              printf("unknown (%d)\n",_stat.video_format);
+               break;
+       }
+       printf("  Display Format       : ");
+-      switch((int)stat.display_format){
++      switch((int)_stat.display_format){
+       case VIDEO_PAN_SCAN:
+-              printf("Pan&Scan (%d)\n",stat.display_format);
++              printf("Pan&Scan (%d)\n",_stat.display_format);
+               break;
+       case VIDEO_LETTER_BOX:
+-              printf("Letterbox (%d)\n",stat.display_format);
++              printf("Letterbox (%d)\n",_stat.display_format);
+               break;
+       case VIDEO_CENTER_CUT_OUT:
+-              printf("Center cutout (%d)\n",stat.display_format);
++              printf("Center cutout (%d)\n",_stat.display_format);
+               break;
+       default:
+-              printf("unknown (%d)\n",stat.display_format);
++              printf("unknown (%d)\n",_stat.display_format);
+               break;
+       }
+       return 0;
+@@ -424,12 +425,12 @@
+       sp.size = st.st_size;
+       printf("I-frame size: %d\n", sp.size);
+-      if(!sp.iFrame) {
++      if (!sp.iFrame) {
+               printf("No memory for I-Frame\n");
+               return 0;
+       }
+-      printf("read: %d bytes\n",read(sifd,sp.iFrame,sp.size));
++      printf("read: %d bytes\n", (int) read(sifd,sp.iFrame,sp.size));
+       if (ioctl(fd, VIDEO_STILLPICTURE, &sp) == -1)
+               perror("VIDEO_STILLPICTURE");
+       return 0;
+@@ -555,11 +556,11 @@
+       printf("using audio device '%s'\n", audiodev);
+       printf("enter command or h + enter for help\n");
+-      if((vfd = open(videodev, O_RDWR | O_NONBLOCK)) < 0) {
++      if ((vfd = open(videodev, O_RDWR | O_NONBLOCK)) < 0) {
+               perror("open video device");
+               return 1;
+       }
+-      if((afd = open(audiodev, O_RDWR | O_NONBLOCK)) < 0) {
++      if ((afd = open(audiodev, O_RDWR | O_NONBLOCK)) < 0) {
+               perror("open audio device");
+               return 1;
+       }
+@@ -571,4 +572,3 @@
+       close(afd);
+       return 0;
+ }
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/test_av_play.c dvb-apps/test/test_av_play.c
+--- linuxtv-dvb-apps-1.1.1/test/test_av_play.c 2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/test/test_av_play.c       2009-06-21 13:29:06.000000000 +0200
+@@ -19,27 +19,44 @@
+  * along with this program; if not, write to the Free Software
+  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+  *
++ * Thu Jun 24 09:18:44 CEST 2004
++ *   Add scan_file_av() and copy_to_dvb() for AV
++ *   filtering to be able to use AC3 audio streams
++ *   Copyright (C) 2004 Werner Fink <werner@suse.de>
+  */
++#ifndef _GNU_SOURCE
++# define _GNU_SOURCE
++#endif
++
+ #include <sys/ioctl.h>
+ #include <stdio.h>
++#include <string.h>
+ #include <stdlib.h>
+ #include <sys/types.h>
+ #include <sys/stat.h>
++#include <netinet/in.h>
+ #include <fcntl.h>
+ #include <time.h>
++#include <termios.h>
+ #include <unistd.h>
++#include <errno.h>
+ #include <linux/dvb/dmx.h>
+ #include <linux/dvb/video.h>
+ #include <linux/dvb/audio.h>
+ #include <sys/poll.h>
++static char dolby;
++static char audio;
++static char black;
++static char volset;
++
+ static int audioPlay(int fd)
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,AUDIO_PLAY) < 0)){
++      if ((ans = ioctl(fd,AUDIO_PLAY)) < 0) {
+               perror("AUDIO PLAY: ");
+               return -1;
+       }
+@@ -47,12 +64,11 @@
+       return 0;
+ }
+-
+ static int audioSelectSource(int fd, audio_stream_source_t source)
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,AUDIO_SELECT_SOURCE, source) < 0)){
++      if ((ans = ioctl(fd,AUDIO_SELECT_SOURCE, source)) < 0) {
+               perror("AUDIO SELECT SOURCE: ");
+               return -1;
+       }
+@@ -60,13 +76,11 @@
+       return 0;
+ }
+-
+-
+ static int audioSetMute(int fd, int state)
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,AUDIO_SET_MUTE, state) < 0)){
++      if ((ans = ioctl(fd,AUDIO_SET_MUTE, state)) < 0) {
+               perror("AUDIO SET MUTE: ");
+               return -1;
+       }
+@@ -78,7 +92,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,AUDIO_SET_AV_SYNC, state) < 0)){
++      if ((ans = ioctl(fd,AUDIO_SET_AV_SYNC, state)) < 0) {
+               perror("AUDIO SET AV SYNC: ");
+               return -1;
+       }
+@@ -86,11 +100,55 @@
+       return 0;
+ }
++static int audioSetVolume(int fd, int level)
++{
++      int ans;
++      audio_mixer_t mix;
++
++      mix.volume_left = mix.volume_right = level;
++      if ((ans = ioctl(fd, AUDIO_SET_MIXER, &mix)) < 0) {
++              perror("AUDIO SET VOLUME: ");
++              return -1;
++      }
++      return 0;
++}
++
++static int audioStop(int fd)
++{
++      int ans;
++
++      if ((ans = ioctl(fd,AUDIO_STOP,0)) < 0) {
++              perror("AUDIO STOP: ");
++              return -1;
++      }
++      return 0;
++}
++
++static int deviceClear(int afd, int vfd)
++{
++      int ans;
++
++      if (vfd >= 0) {
++              if ((ans = ioctl(vfd, VIDEO_CLEAR_BUFFER, 0)) < 0) {
++                      perror("VIDEO CLEAR BUFFER: ");
++                      return -1;
++              }
++      }
++      if (afd >= 0) {
++              if ((ans = ioctl(afd, AUDIO_CLEAR_BUFFER, 0)) < 0) {
++                      perror("AUDIO CLEAR BUFFER: ");
++                      return -1;
++              }
++      }
++
++      return 0;
++}
++
+ static int videoStop(int fd)
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,VIDEO_STOP,0) < 0)){
++      if ((ans = ioctl(fd,VIDEO_STOP,0)) < 0) {
+               perror("VIDEO STOP: ");
+               return -1;
+       }
+@@ -102,7 +160,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,VIDEO_PLAY) < 0)){
++      if ((ans = ioctl(fd,VIDEO_PLAY)) < 0) {
+               perror("VIDEO PLAY: ");
+               return -1;
+       }
+@@ -110,12 +168,11 @@
+       return 0;
+ }
+-
+ static int videoFreeze(int fd)
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,VIDEO_FREEZE) < 0)){
++      if ((ans = ioctl(fd,VIDEO_FREEZE)) < 0) {
+               perror("VIDEO FREEZE: ");
+               return -1;
+       }
+@@ -123,12 +180,22 @@
+       return 0;
+ }
++static int videoBlank(int fd, int state)
++{
++      int ans;
++
++      if ((ans = ioctl(fd, VIDEO_SET_BLANK, state)) < 0) {
++              perror("VIDEO BLANK: ");
++              return -1;
++      }
++      return 0;
++}
+ static int videoContinue(int fd)
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,VIDEO_CONTINUE) < 0)){
++      if ((ans = ioctl(fd,VIDEO_CONTINUE)) < 0) {
+               perror("VIDEO CONTINUE: ");
+               return -1;
+       }
+@@ -140,7 +207,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,VIDEO_SELECT_SOURCE, source) < 0)){
++      if ((ans = ioctl(fd,VIDEO_SELECT_SOURCE, source)) < 0) {
+               perror("VIDEO SELECT SOURCE: ");
+               return -1;
+       }
+@@ -153,7 +220,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,VIDEO_FAST_FORWARD, nframes) < 0)){
++      if ((ans = ioctl(fd,VIDEO_FAST_FORWARD, nframes)) < 0) {
+               perror("VIDEO FAST FORWARD: ");
+               return -1;
+       }
+@@ -165,7 +232,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,VIDEO_SLOWMOTION, nframes) < 0)){
++      if ((ans = ioctl(fd,VIDEO_SLOWMOTION, nframes)) < 0) {
+               perror("VIDEO SLOWMOTION: ");
+               return -1;
+       }
+@@ -173,14 +240,11 @@
+       return 0;
+ }
+-#define BUFFY 32768
+-#define NFD   2
+-static void play_file_av(int filefd, int vfd, int afd)
++#define NFD   3
++static void copy_to_dvb(int vfd, int afd, int cfd, const uint8_t* ptr, const unsigned short len)
+ {
+-      char buf[BUFFY];
+-      int count;
+-      int written;
+       struct pollfd pfd[NFD];
++      unsigned short pos = 0;
+       int stopped = 0;
+       pfd[0].fd = STDIN_FILENO;
+@@ -192,119 +256,399 @@
+       pfd[2].fd = afd;
+       pfd[2].events = POLLOUT;
+-      videoSelectSource(vfd,VIDEO_SOURCE_MEMORY);
+-      audioSelectSource(afd,AUDIO_SOURCE_MEMORY);
+-
+-      // FIXME: only seems to work if starting audio first!
+-      audioPlay(afd);
+-      videoPlay(vfd);
+-
+-      count = read(filefd,buf,BUFFY);
+-      write(vfd,buf,count);
+-
+-      while ( (count = read(filefd,buf,BUFFY)) >= 0  ){
+-              written = 0;
+-              while(written < count){
+-                      if (poll(pfd,NFD,1)){
+-                              if (pfd[1].revents & POLLOUT){
+-                                      written += write(vfd,buf+written,
+-                                                      count-written);
++      while (pos < len) {
++              int ret;
++              if ((ret = poll(pfd,NFD,1)) > 0) {
++                      if (pfd[1].revents & POLLOUT) {
++                              int cnt = write(cfd, ptr + pos, len - pos);
++                              if (cnt > 0)
++                                      pos += cnt;
++                              else if (cnt < 0) {
++                                      if (errno != EAGAIN && errno != EINTR) {
++                                              perror("Write:");
++                                              exit(-1);
++                                      }
++                                      if (errno == EAGAIN)
++                                              usleep(1000);
++                                      continue;
+                               }
+-                              if (pfd[0].revents & POLLIN){
+-                                      int c = getchar();
+-                                      switch(c){
+-                                      case 'z':
++                      }
++                      if (pfd[0].revents & POLLIN) {
++                              int c = getchar();
++                              switch(c) {
++                              case 'z':
++                                      if (audio && !black) {
++                                              audioSetMute(afd, 1);
++                                      } else {
+                                               videoFreeze(vfd);
+-                                              printf("playback frozen\n");
+-                                              stopped = 1;
+-                                              break;
++                                      }
++                                      deviceClear(afd, -1);
++                                      printf("playback frozen\n");
++                                      stopped = 1;
++                                      break;
+-                                      case 's':
++                              case 's':
++                                      if (audio) {
++                                              audioStop(afd);
++                                              deviceClear(afd, -1);
++                                      } else {
+                                               videoStop(vfd);
+-                                              printf("playback stopped\n");
+-                                              stopped = 1;
+-                                              break;
++                                              deviceClear(afd, vfd);
++                                      }
++                                      printf("playback stopped\n");
++                                      stopped = 1;
++                                      break;
+-                                      case 'c':
++                              case 'c':
++                                      if (audio && !black) {
++                                              audioSetAVSync(afd, 0);
++                                              deviceClear(afd, -1);
++                                              audioSetMute(afd, 0);
++                                      } else {
++                                              audioSetAVSync(afd, 1);
++                                              deviceClear(afd, vfd);
+                                               videoContinue(vfd);
+-                                              printf("playback continued\n");
+-                                              stopped = 0;
+-                                              break;
++                                      }
++                                      printf("playback continued\n");
++                                      stopped = 0;
++                                      break;
+-                                      case 'p':
+-                                              videoPlay(vfd);
++                              case 'p':
++                                      if (audio) {
++                                              deviceClear(afd, -1);
++                                              audioSetAVSync(afd, 0);
+                                               audioPlay(afd);
+-                                              audioSetAVSync(afd, 1);
+-                                              audioSetMute(afd, 0);
+-                                              printf("playback started\n");
+-                                              stopped = 0;
+-                                              break;
++                                      } else {
++                                              deviceClear(afd, vfd);
++                                              audioSetAVSync(afd, 1);
++                                              audioPlay(afd);
++                                              videoPlay(vfd);
++                                      }
++                                      audioSetMute(afd, 0);
++                                      printf("playback started\n");
++                                      stopped = 0;
++                                      break;
+-                                      case 'f':
+-                                              audioSetAVSync(afd, 0);
++                              case 'f':
++                                      audioSetAVSync(afd, 0);
++                                      if (!audio) {
+                                               audioSetMute(afd, 1);
+                                               videoFastForward(vfd,0);
+-                                              printf("fastforward\n");
+-                                              stopped = 0;
+-                                              break;
++                                      }
++                                      printf("fastforward\n");
++                                      stopped = 0;
++                                      break;
+-                                      case 'm':
+-                                              audioSetAVSync(afd, 0);
++                              case 'm':
++                                      audioSetAVSync(afd, 0);
++                                      audioSetMute(afd, 1);
++                                      printf("mute\n");
++                                      stopped = 0;
++                                      break;
++
++                              case 'u':
++                                      audioSetAVSync(afd, 1);
++                                      audioSetMute(afd, 0);
++                                      printf("unmute\n");
++                                      stopped = 0;
++                                      break;
++
++                              case 'd':
++                                      if (dolby)
++                                              dolby = 0;
++                                      else
++                                              dolby++;
++                                      break;
++
++                              case 'l':
++                                      audioSetAVSync(afd, 0);
++                                      if (!audio) {
+                                               audioSetMute(afd, 1);
+                                               videoSlowMotion(vfd,2);
+-                                              printf("slowmotion\n");
+-                                              stopped = 0;
+-                                              break;
++                                      }
++                                      printf("slowmotion\n");
++                                      stopped = 0;
++                                      break;
+-                                      case 'q':
+-                                              videoContinue(vfd);
+-                                              exit(0);
++                              case 'q':
++                                      videoContinue(vfd);
++                                      exit(0);
++                                      break;
++
++                              default:
++                                      break;
++                              }
++                      }
++              } else if (ret < 0) {
++                      if (errno != EAGAIN && errno != EINTR) {
++                              perror("Write:");
++                              exit(-1);
++                      }
++                      if (errno == EAGAIN)
++                              usleep(1000);
++              }
++      }
++}
++
++static unsigned char play[6] = {0x00, 0x00, 0x01, 0xff, 0xff, 0xff};
++static unsigned char except[2];
++
++static int scan_file_av(int vfd, int afd, const unsigned char *buf, int buflen)
++{
++      const unsigned char *const start = buf;
++      const unsigned char *const   end = buf + buflen;
++
++      static unsigned int magic = 0xffffffff;
++      static unsigned short count, len;
++      static int fdc = -1;
++      int m;
++
++      while (buf < end) {
++              if (count < 6) {
++                      switch (count) {
++                      case 0:
++                              m = 0;
++                              while ((magic & 0xffffff00) != 0x00000100) {
++                                      if (buf >= end) goto out;
++                                      magic = (magic << 8) | *buf++;
++                                      m++;
++                              }
++                              if (m > 4)
++                                      printf("Broken Frame found\n");
++                              play[3] = (unsigned char)(magic & 0x000000ff);
++                              switch (play[3]) {
++                              case 0xE0 ... 0xEF:
++                                      fdc = vfd;
++                                      if (except[0] != play[3]) {
++                                              if (except[0] == 0)
++                                                      except[0] = play[3];
++                                              else
++                                                      fdc = -1;
++                                      }
++                                      if (audio)
++                                              fdc = -1;
++                                      break;
++                              case 0xC0 ... 0xDF:
++                                      fdc = afd;
++                                      if (dolby) {
++                                              fdc = -1;
+                                               break;
+                                       }
++                                      if (except[1] != play[3]) {
++                                              if (except[1] == 0)
++                                                      except[1] = play[3];
++                                              else
++                                                      fdc = -1;
++                                      }
++                                      if (!volset) {
++                                              audioSetVolume(afd, 255);
++                                              volset = 1;
++                                      }
++                                      break;
++                              case 0xBD:
++                                      /*
++                                       * TODO: sub filter to through out e.g. ub pictures
++                                       * in Private Streams 1 _and_ get sub audio header
++                                       * to set an except(ion) audio stream.
++                                       * The later one requires some changes within the VDR
++                                       * remux part!  2004/07/01 Werner
++                                       */
++                                      fdc = afd;
++                                      if (!dolby) {
++                                              fdc = -1;
++                                              break;
++                                      }
++                                      if (volset) {
++                                              audioSetVolume(afd, 0);
++                                              volset = 0;
++                                      }
++                                      break;
++                              default:
++                                      fdc = -1;
++                                      break;
+                               }
++                              count = 4;
++                      case 4:
++                              if (buf >= end) goto out;
++                              len = ((*buf) << 8);
++                              play[4] = (*buf);
++                              buf++;
++                              count++;
++                      case 5:
++                              if (buf >= end) goto out;
++                              len |= (*buf);
++                              len += 6;
++                              play[5] = (*buf);
++                              buf++;
++                              count++;
++                              if (fdc != -1)
++                                      copy_to_dvb(vfd, afd, fdc, &play[0], count);
++                      default:
++                              break;
+                       }
+               }
++
++              while (count < len) {
++                      int rest = end - buf;
++                      if (rest <= 0) goto out;
++
++                      if (rest + count > len)
++                              rest = len - count;
++
++                      if (fdc != -1)
++                              copy_to_dvb(vfd, afd, fdc, buf, rest);
++                      count += rest;
++                      buf   += rest;
++              }
++
++              /* Reset for next scan */
++              magic = 0xffffffff;
++              count = len = 0;
++              fdc = -1;
++              play[3] = 0xff;
+       }
++out:
++      return buf - start;
++}
++
++#define BUFFY 32768
++static void play_file_av(int filefd, int vfd, int afd)
++{
++      unsigned char buf[BUFFY];
++      int count;
++
++      audioSetMute(afd, 1);
++      videoBlank(vfd, 1);
++      if (audio && !black) {
++              audioStop(afd);
++              deviceClear(afd, -1);
++              audioSetAVSync(afd, 0);
++              audioSelectSource(afd, AUDIO_SOURCE_MEMORY);
++              audioPlay(afd);
++              videoBlank(vfd, 0);
++      } else if (audio && black) {
++              deviceClear(afd, vfd);
++              videoBlank(vfd, 1);
++              audioSetAVSync(afd, 0);
++              audioSelectSource(afd, AUDIO_SOURCE_MEMORY);
++              videoSelectSource(vfd, VIDEO_SOURCE_MEMORY);
++              audioPlay(afd);
++              videoPlay(vfd);
++      } else {
++              deviceClear(afd, vfd);
++              audioSetAVSync(afd, 1);
++              audioSelectSource(afd, AUDIO_SOURCE_MEMORY);
++              videoSelectSource(vfd, VIDEO_SOURCE_MEMORY);
++              audioPlay(afd);
++              videoPlay(vfd);
++              videoBlank(vfd, 0);
++      }
++
++      if (dolby) {
++              audioSetVolume(afd, 0);
++              volset = 0;
++      } else {
++              audioSetVolume(afd, 255);
++              volset = 1;
++      }
++
++#ifndef __stub_posix_fadvise
++      posix_fadvise(filefd, 0, 0, POSIX_FADV_SEQUENTIAL);
++#endif
++
++      while ((count = read(filefd,buf,BUFFY)) > 0)
++              scan_file_av(vfd,afd,buf,count);
++}
++
++static struct termios term;
++
++static void restore(void)
++{
++      tcsetattr(STDIN_FILENO, TCSANOW, &term);
+ }
+ int main(int argc, char **argv)
+ {
+-      int vfd, afd;
++      int vfd, afd, c;
+       int filefd;
+-      char *videodev = "/dev/dvb/adapter0/video0";
+-      char *audiodev = "/dev/dvb/adapter0/audio0";
++      const char *videodev = "/dev/dvb/adapter0/video0";
++      const char *audiodev = "/dev/dvb/adapter0/audio0";
+-      if (argc < 2) {
+-              fprintf(stderr, "usage: test_av_play mpeg_A+V_PES_file\n");
+-              return 1;
++      if (((tcgetpgrp(STDIN_FILENO) == getpid()) || (getppid() != (pid_t)1))
++          && (tcgetattr(STDIN_FILENO, &term) == 0)) {
++              struct termios newterm;
++              memcpy(&newterm, &term, sizeof(struct termios));
++              newterm.c_iflag = 0;
++              newterm.c_lflag &= ~(ICANON | ECHO);
++              newterm.c_cc[VMIN] = 0;
++              newterm.c_cc[VTIME] = 0;
++              atexit(restore);
++              tcsetattr(STDIN_FILENO, TCSANOW, &newterm);
++      }
++
++      opterr = 0;
++      while ((c = getopt(argc, argv, "+daA")) != -1) {
++              switch (c) {
++              case 'd':
++                      dolby++;
++                      break;
++              case 'a':
++                      audio++;
++                      break;
++              case 'A':
++                      audio++;
++                      black++;
++                      break;
++              case '?':
++                      fprintf(stderr, "usage: test_av_play [-d] [-a] [-A] mpeg_A+V_PES_file\n");
++                      return 1;
++              default:
++                      break;
++              }
+       }
++      argv += optind;
++      argc -= optind;
+       if (getenv("VIDEO"))
+               videodev = getenv("VIDEO");
+       if (getenv("AUDIO"))
+-              videodev = getenv("AUDIO");
++              audiodev = getenv("AUDIO");
+       printf("using video device '%s'\n", videodev);
+       printf("using audio device '%s'\n", audiodev);
+-      if ( (filefd = open(argv[1],O_RDONLY)) < 0){
++      putchar('\n');
++
++      printf("Freeze       by pressing `z'\n");
++      printf("Stop         by pressing `s'\n");
++      printf("Continue     by pressing `c'\n");
++      printf("Start        by pressing `p'\n");
++      printf("FastForward  by pressing `f'\n");
++      printf("Mute         by pressing `m'\n");
++      printf("UnMute       by pressing `u'\n");
++      printf("MP2/AC3      by pressing `d'\n");
++      printf("SlowMotion   by pressing `l'\n");
++      printf("Quit         by pressing `q'\n");
++
++      putchar('\n');
++
++      errno = ENOENT;
++      if (!argv[0] || (filefd = open(argv[0], O_RDONLY)) < 0) {
+               perror("File open:");
+               return -1;
+       }
+-      if((vfd = open(videodev,O_RDWR|O_NONBLOCK)) < 0){
++      if ((vfd = open(videodev,O_RDWR|O_NONBLOCK)) < 0) {
+               perror("VIDEO DEVICE: ");
+               return -1;
+       }
+-      if((afd = open(audiodev,O_RDWR|O_NONBLOCK)) < 0){
++      if ((afd = open(audiodev,O_RDWR|O_NONBLOCK)) < 0) {
+               perror("AUDIO DEVICE: ");
+               return -1;
+       }
++
+       play_file_av(filefd, vfd, afd);
+       close(vfd);
+       close(afd);
+       close(filefd);
+       return 0;
+-
+-
+ }
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/test.c dvb-apps/test/test.c
+--- linuxtv-dvb-apps-1.1.1/test/test.c 2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/test/test.c       2009-06-21 13:29:06.000000000 +0200
+@@ -1,4 +1,4 @@
+-/* 
++/*
+  * test.c - Test program for new API
+  *
+  * Copyright (C) 2000 Ralph  Metzler <ralph@convergence.de>
+@@ -58,7 +58,7 @@
+   c=reverse[c]&0x7f;
+   if (c<0x20)
+     c=0x20;
+- 
++
+   return c;
+ }
+@@ -68,16 +68,16 @@
+       int i,j;
+       int len;
+       int fd=open("/dev/ost/demux1", O_RDWR);
+-      struct dmx_pes_filter_params pesFilterParams; 
+-      
+-      pesFilterParams.input = DMX_IN_FRONTEND; 
+-      pesFilterParams.output = DMX_OUT_TS_TAP; 
+-      pesFilterParams.pes_type = DMX_PES_TELETEXT; 
++      struct dmx_pes_filter_params pesFilterParams;
++
++      pesFilterParams.input = DMX_IN_FRONTEND;
++      pesFilterParams.output = DMX_OUT_TS_TAP;
++      pesFilterParams.pes_type = DMX_PES_TELETEXT;
+       pesFilterParams.flags = DMX_IMMEDIATE_START;
+-  
++
+       pesFilterParams.pid = 0x2c ;
+       if (ioctl(fd, DMX_SET_PES_FILTER, &pesFilterParams) < 0) {
+-              printf("Could not set PES filter\n"); 
++              printf("Could not set PES filter\n");
+               close(fd);
+               return;
+       }
+@@ -85,7 +85,7 @@
+ /*
+       pesFilterParams.pid = 54;
+       if (ioctl(fd, DMX_SET_PES_FILTER, &pesFilterParams) < 0) {
+-              printf("Could not set PES filter\n"); 
++              printf("Could not set PES filter\n");
+               close(fd);
+               return;
+       }
+@@ -93,7 +93,7 @@
+       pesFilterParams.pid = 55;
+       if (ioctl(fd, DMX_SET_PES_FILTER, &pesFilterParams) < 0) {
+-              printf("Could not set PES filter\n"); 
++              printf("Could not set PES filter\n");
+               close(fd);
+               return;
+       }
+@@ -103,7 +103,7 @@
+               if (len>0) write(1, buf, len);
+       }
+-      do { 
++      do {
+               read(fd, buf, 4);
+               if (htonl(*(uint32_t *)buf)!=0x00001bd)
+                       continue;
+@@ -112,10 +112,10 @@
+               read(fd, buf+6, len);
+               fprintf(stderr,"read %d bytes PES\n", len);
+               write (1, buf, len+6);
+-              
++
+               id=buf[45];
+               fprintf(stderr,"id=%02x\n", id);
+-              
++
+               for (i=0; i<(len+6-46)/46; i++) {
+                 for (j=6; j<46; j++) {
+                   fprintf(stderr,"%c", t2a(buf[i*46+46+j]));
+@@ -128,11 +128,11 @@
+       /*
+       pesFilterParams.pid = 55;
+-      pesFilterParams.input = DMX_IN_FRONTEND; 
+-      pesFilterParams.output = DMX_OUT_DECODER; 
+-      pesFilterParams.pes_type = DMX_PES_TELETEXT; 
++      pesFilterParams.input = DMX_IN_FRONTEND;
++      pesFilterParams.output = DMX_OUT_DECODER;
++      pesFilterParams.pes_type = DMX_PES_TELETEXT;
+       pesFilterParams.flags = DMX_IMMEDIATE_START;
+-  
++
+       ioctl(fd, DMX_SET_PES_FILTER, &pesFilterParams);
+       close(fd);
+       */
+@@ -145,8 +145,8 @@
+   int len;
+   struct secCommand scmd;
+   struct secCmdSequence scmds;
+-  struct dmx_pes_filter_params pesFilterParams; 
+-  struct dmx_sct_filter_params secFilterParams; 
++  struct dmx_pes_filter_params pesFilterParams;
++  struct dmx_sct_filter_params secFilterParams;
+   FrontendParameters frp;
+   uint8_t buf[4096];
+@@ -173,7 +173,7 @@
+   scmd.u.diseqc.cmd=0x38;
+   scmd.u.diseqc.numParams=1;
+   scmd.u.diseqc.params[0]=0xf0;
+-  
++
+   scmds.voltage=SEC_VOLTAGE_13;
+   scmds.miniCommand=SEC_MINI_NONE;
+   scmds.continuousTone=SEC_TONE_ON;
+@@ -195,31 +195,31 @@
+     if (ret<0)
+       perror("DMX_SET_BUFFER_SIZE\n");
+   printf("Audio filter size OK\n");
+-  pesFilterParams.pid = 0x60; 
+-  pesFilterParams.input = DMX_IN_FRONTEND; 
+-  pesFilterParams.output = DMX_OUT_DECODER; 
+-  pesFilterParams.pes_type = DMX_PES_AUDIO; 
++  pesFilterParams.pid = 0x60;
++  pesFilterParams.input = DMX_IN_FRONTEND;
++  pesFilterParams.output = DMX_OUT_DECODER;
++  pesFilterParams.pes_type = DMX_PES_AUDIO;
+   pesFilterParams.flags = DMX_IMMEDIATE_START;
+-  
+-  if (ioctl(fd_demux2, DMX_SET_PES_FILTER, &pesFilterParams) < 0)   return(1); 
++
++  if (ioctl(fd_demux2, DMX_SET_PES_FILTER, &pesFilterParams) < 0)   return(1);
+   printf("Audio filter OK\n");
+-  
+-  if (ioctl(fd_demux, DMX_SET_BUFFER_SIZE, 64*1024) < 0)  return(1); 
++
++  if (ioctl(fd_demux, DMX_SET_BUFFER_SIZE, 64*1024) < 0)  return(1);
+   pesFilterParams.pid = 0xa2;
+-  pesFilterParams.input = DMX_IN_FRONTEND; 
+-  pesFilterParams.output = DMX_OUT_DECODER; 
+-  pesFilterParams.pes_type = DMX_PES_VIDEO; 
++  pesFilterParams.input = DMX_IN_FRONTEND;
++  pesFilterParams.output = DMX_OUT_DECODER;
++  pesFilterParams.pes_type = DMX_PES_VIDEO;
+   pesFilterParams.flags = DMX_IMMEDIATE_START;
+-  if (ioctl(fd_demux, DMX_SET_PES_FILTER, &pesFilterParams) < 0)  return(1); 
++  if (ioctl(fd_demux, DMX_SET_PES_FILTER, &pesFilterParams) < 0)  return(1);
+   printf("Video filter OK\n");
+ #endif
+   /*
+   pesFilterParams.pid = 56;
+-  pesFilterParams.input = DMX_IN_FRONTEND; 
+-  pesFilterParams.output = DMX_OUT_DECODER; 
+-  pesFilterParams.pes_type = DMX_PES_TELETEXT; 
++  pesFilterParams.input = DMX_IN_FRONTEND;
++  pesFilterParams.output = DMX_OUT_DECODER;
++  pesFilterParams.pes_type = DMX_PES_TELETEXT;
+   pesFilterParams.flags = DMX_IMMEDIATE_START;
+-  if (ioctl(fd_tt, DMX_SET_PES_FILTER, &pesFilterParams) < 0)  return(1); 
++  if (ioctl(fd_tt, DMX_SET_PES_FILTER, &pesFilterParams) < 0)  return(1);
+   printf("TT filter OK\n");
+   */
+   //while (1);
+@@ -250,7 +250,7 @@
+     int32_t snr, str;
+     ioctl(fd_frontend, FE_READ_SNR, &snr);
+     ioctl(fd_frontend, FE_READ_SIGNAL_STRENGTH, &str);
+-    
++
+     printf("snr=%d, str=%d\n", snr, str);
+   }
+   */
+@@ -260,7 +260,7 @@
+   if (ioctl(fd_section, DMX_SET_FILTER, &secFilterParams) < 0)  return;
+   //if (ioctl(fd_section2, DMX_SET_FILTER, &secFilterParams) < 0)  return;
+   //close(fd_section2);
+-  //while (1) 
++  //while (1)
+ {
+     len=read(fd_section, buf, 4096);
+     if (len>0) write(1, buf, len);
+@@ -270,7 +270,7 @@
+     //if (len>0) write(1,buf,len);
+     //printf("read section with length %d\n", len);
+   }
+-  
++
+ }
+ main()
+@@ -278,4 +278,3 @@
+       //senf();
+   testpesfilter();
+ }
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/test_dvr.c dvb-apps/test/test_dvr.c
+--- linuxtv-dvb-apps-1.1.1/test/test_dvr.c     2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/test/test_dvr.c   2009-06-21 13:29:06.000000000 +0200
+@@ -82,7 +82,7 @@
+               fprintf(stderr, "got %d bytes (%llu total)\n", bytes, total_bytes);
+ }
+-static int add_filter(unsigned int pid, const unsigned char* dmxdev)
++static int add_filter(unsigned int pid, const char* dmxdev)
+ {
+       int fd;
+       struct dmx_pes_filter_params f;
+@@ -161,4 +161,3 @@
+       close(dvrfd);
+       return 0;
+ }
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/test_dvr_play.c dvb-apps/test/test_dvr_play.c
+--- linuxtv-dvb-apps-1.1.1/test/test_dvr_play.c        2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/test/test_dvr_play.c      2009-06-21 13:29:06.000000000 +0200
+@@ -141,4 +141,3 @@
+       close(filefd);
+       return 0;
+ }
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/test_front.c dvb-apps/test/test_front.c
+--- linuxtv-dvb-apps-1.1.1/test/test_front.c   2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/test/test_front.c 2009-06-21 13:29:06.000000000 +0200
+@@ -1,4 +1,4 @@
+-/* 
++/*
+  * test_front.c - Test program for new API
+  *
+  * Copyright (C) 2000 Ralph  Metzler <ralph@convergence.de>
+@@ -40,7 +40,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,OST_SELFTEST,0) < 0)){
++      if ((ans = ioctl(fd,OST_SELFTEST,0)) < 0) {
+               perror("OST SELF TEST: ");
+               return -1;
+       }
+@@ -52,7 +52,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,OST_SET_POWER_STATE,state) < 0)){
++      if ((ans = ioctl(fd,OST_SET_POWER_STATE,state)) < 0) {
+               perror("OST SET POWER STATE: ");
+               return -1;
+       }
+@@ -64,7 +64,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,OST_GET_POWER_STATE,state) < 0)){
++      if ((ans = ioctl(fd,OST_GET_POWER_STATE,state)) < 0) {
+               perror("OST GET POWER STATE: ");
+               return -1;
+       }
+@@ -95,7 +95,7 @@
+       int ans;
+       feStatus stat;
+-      if ( (ans = ioctl(fd,FE_READ_STATUS,&stat) < 0)){
++      if ((ans = ioctl(fd,FE_READ_STATUS,&stat)) < 0) {
+               perror("FE READ STATUS: ");
+               return -1;
+       }
+@@ -116,7 +116,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,FE_READ_BER, ber) < 0)){
++      if ((ans = ioctl(fd,FE_READ_BER, ber)) < 0) {
+               perror("FE READ_BER: ");
+               return -1;
+       }
+@@ -129,7 +129,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,FE_READ_SIGNAL_STRENGTH, strength) < 0)){
++      if ((ans = ioctl(fd,FE_READ_SIGNAL_STRENGTH, strength)) < 0) {
+               perror("FE READ SIGNAL STRENGTH: ");
+               return -1;
+       }
+@@ -142,7 +142,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,FE_READ_SNR, snr) < 0)){
++      if ((ans = ioctl(fd,FE_READ_SNR, snr)) < 0) {
+               perror("FE READ_SNR: ");
+               return -1;
+       }
+@@ -156,7 +156,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,FE_READ_UNCORRECTED_BLOCKS, ucb) < 0)){
++      if ((ans = ioctl(fd,FE_READ_UNCORRECTED_BLOCKS, ucb)) < 0) {
+               perror("FE READ UNCORRECTED BLOCKS: ");
+               return -1;
+       }
+@@ -169,7 +169,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,FE_GET_NEXT_FREQUENCY, nfr) < 0)){
++      if ((ans = ioctl(fd,FE_GET_NEXT_FREQUENCY, nfr)) < 0) {
+               perror("FE GET NEXT FREQUENCY: ");
+               return -1;
+       }
+@@ -182,7 +182,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,FE_GET_NEXT_SYMBOL_RATE, nsr) < 0)){
++      if ((ans = ioctl(fd,FE_GET_NEXT_SYMBOL_RATE, nsr)) < 0) {
+               perror("FE GET NEXT SYMBOL RATE: ");
+               return -1;
+       }
+@@ -195,7 +195,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,QPSK_TUNE, param) < 0)){
++      if ((ans = ioctl(fd,QPSK_TUNE, param)) < 0) {
+               perror("QPSK TUNE: ");
+               return -1;
+       }
+@@ -207,7 +207,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,QPSK_GET_EVENT, event) < 0)){
++      if ((ans = ioctl(fd,QPSK_GET_EVENT, event)) < 0) {
+               perror("QPSK GET EVENT: ");
+               return -1;
+       }
+@@ -219,7 +219,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,QPSK_FE_INFO, info) < 0)){
++      if ((ans = ioctl(fd,QPSK_FE_INFO, info)) < 0) {
+               perror("QPSK FE INFO: ");
+               return -1;
+       }
+@@ -238,7 +238,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,SEC_GET_STATUS, state) < 0)){
++      if ((ans = ioctl(fd,SEC_GET_STATUS, state)) < 0) {
+               perror("QPSK GET EVENT: ");
+               return -1;
+       }
+@@ -261,7 +261,7 @@
+               break;
+       }
+-      
++
+       switch (state->selVolt){
+       case SEC_VOLTAGE_OFF:
+               printf("SEC VOLTAGE:  OFF (%d)\n",state->selVolt);
+@@ -299,11 +299,11 @@
+       struct qpskFrontendInfo info;
+       struct secStatus sec_state;
+-      if((fd = open("/dev/ost/qpskfe",O_RDWR)) < 0){
++      if ((fd = open("/dev/ost/qpskfe",O_RDWR)) < 0){
+               perror("FRONTEND DEVICE: ");
+               return -1;
+       }
+-      if((fd_sec = open("/dev/ost/sec",O_RDWR)) < 0){
++      if ((fd_sec = open("/dev/ost/sec",O_RDWR)) < 0){
+               perror("SEC DEVICE: ");
+               return -1;
+       }
+@@ -325,4 +325,3 @@
+       close(fd);
+       close(fd_sec);
+ }
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/test_sec_ne.c dvb-apps/test/test_sec_ne.c
+--- linuxtv-dvb-apps-1.1.1/test/test_sec_ne.c  2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/test/test_sec_ne.c        2009-06-21 13:29:06.000000000 +0200
+@@ -65,7 +65,7 @@
+ }
+ int set_filter(int fd, unsigned int pid, unsigned int tid,
+-              unsigned int tid_ext, unsigned int version_number)
++              unsigned int tid_ext, unsigned int _version_number)
+ {
+       struct dmx_sct_filter_params f;
+       unsigned long bufsz;
+@@ -92,8 +92,8 @@
+               f.filter.mask[1]   = 0xff;
+               f.filter.mask[2]   = 0xff;
+       }
+-      if (version_number < 0x20) {
+-              f.filter.filter[3] = (uint8_t) (version_number << 1);
++      if (_version_number < 0x20) {
++              f.filter.filter[3] = (uint8_t) (_version_number << 1);
+               f.filter.mask[3]   = 0x3e;
+               f.filter.mode[3]   = 0x3e;
+       }
+@@ -162,4 +162,3 @@
+       close(dmxfd);
+       return 0;
+ }
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/test_sections.c dvb-apps/test/test_sections.c
+--- linuxtv-dvb-apps-1.1.1/test/test_sections.c        2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/test/test_sections.c      2009-06-21 13:29:06.000000000 +0200
+@@ -178,7 +178,7 @@
+                 fprintf(stderr, "0x%.2x ", mask[filter_idx]);
+         fprintf(stderr, "\n");
+-        
++
+       if ((dmxfd = open(dmxdev, O_RDWR)) < 0){
+               perror("open");
+               return 1;
+@@ -194,4 +194,3 @@
+       close(dmxfd);
+       return 0;
+ }
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/test_stc.c dvb-apps/test/test_stc.c
+--- linuxtv-dvb-apps-1.1.1/test/test_stc.c     2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/test/test_stc.c   2009-06-21 13:29:06.000000000 +0200
+@@ -71,4 +71,3 @@
+       close(dmxfd);
+       return 0;
+ }
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/test_stillimage.c dvb-apps/test/test_stillimage.c
+--- linuxtv-dvb-apps-1.1.1/test/test_stillimage.c      2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/test/test_stillimage.c    2009-06-21 13:29:06.000000000 +0200
+@@ -6,7 +6,7 @@
+  *
+  * or more advanced using netpbm and mpeg2enc (not mpeg2encode) :
+  *   $ cat image.jpg | jpegtopnm | pnmscale -xsize=704 -ysize=576 |\
+- *      ppmntsc --pal | ppmtoy4m  -F 25:1 -A 4:3 |\
++ *      ppmntsc --pal | ppmtoy4m  -F 25:1 -A 4:3 -S 420mpeg2 |\
+  *      mpeg2enc -f 7 -T 90 -F 3 -np -a 2 -o "image.mpg"
+  *
+  */
+@@ -21,6 +21,7 @@
+ #include <time.h>
+ #include <unistd.h>
++#include <linux/types.h>
+ #include <linux/dvb/video.h>
+@@ -82,7 +83,7 @@
+               return -1;
+       }
+-      printf ("read: %d bytes\n", read(filefd, sp.iFrame, sp.size));
++      printf ("read: %d bytes\n", (int) read(filefd, sp.iFrame, sp.size));
+       close(filefd);
+       if ((ioctl(fd, VIDEO_STILLPICTURE, &sp) < 0)) {
+@@ -99,5 +100,3 @@
+       return 0;
+ }
+-
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/test_switch.c dvb-apps/test/test_switch.c
+--- linuxtv-dvb-apps-1.1.1/test/test_switch.c  2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/test/test_switch.c        2009-06-21 13:29:06.000000000 +0200
+@@ -1,4 +1,4 @@
+-/* 
++/*
+  * test_switch.c - Test program for new API
+  *
+  * Copyright (C) 2001 Ralph  Metzler <ralph@convergence.de>
+@@ -42,97 +42,97 @@
+ int fd_demuxtt;
+ struct dmx_sct_filter_params sctFilterParams;
+-      
++
+ struct secCommand scmd;
+ struct secCmdSequence scmds;
+-struct dmx_pes_filter_params pesFilterParams; 
+-struct dmx_pes_filter_params pesFilterParamsV; 
+-struct dmx_pes_filter_params pesFilterParamsA; 
+-struct dmx_pes_filter_params pesFilterParamsTT; 
++struct dmx_pes_filter_params pesFilterParams;
++struct dmx_pes_filter_params pesFilterParamsV;
++struct dmx_pes_filter_params pesFilterParamsA;
++struct dmx_pes_filter_params pesFilterParamsTT;
+ FrontendParameters frp;
+ int front_type;
+-set_front(void) 
++set_front(void)
+ {
+       fe_status_t stat = 0;
+       int i, freq;
+       uint32_t soff;
+-        
++
+       scmds.miniCommand = SEC_MINI_NONE;
+       scmds.numCommands = 1;
+       scmds.commands = &scmd;
+-      
++
+       soff = frp.u.qpsk.SymbolRate/16000;
+       if (ioctl(fd_sec, SEC_SEND_SEQUENCE, &scmds) < 0)
+               perror("setfront sec");
+       usleep(100000);
+-              
++
+       freq = frp.Frequency;
+-              
++
+       while(tune_it(&frp));
+-}             
++}
+-set_diseqc_nb(int nr) 
++set_diseqc_nb(int nr)
+ {
+       scmd.type=0;
+       scmd.u.diseqc.addr = 0x10;
+       scmd.u.diseqc.cmd = 0x38;
+       scmd.u.diseqc.numParams = 1;
+-      scmd.u.diseqc.params[0] = 0xF0 | ((nr * 4) & 0x0F) | 
++      scmd.u.diseqc.params[0] = 0xF0 | ((nr * 4) & 0x0F) |
+         (scmds.continuousTone == SEC_TONE_ON ? 1 : 0) |
+         (scmds.voltage==SEC_VOLTAGE_18 ? 2 : 0);
+ }
+-set_ttpid(ushort ttpid) 
+-{  
++set_ttpid(ushort ttpid)
++{
+         if (ttpid==0 || ttpid==0xffff || ttpid==0x1fff) {
+               ioctl(fd_demuxtt, DMX_STOP, 0);
+               return;
+       }
+       pesFilterParamsTT.pid     = ttpid;
+-      pesFilterParamsTT.input   = DMX_IN_FRONTEND; 
+-      pesFilterParamsTT.output  = DMX_OUT_DECODER; 
+-      pesFilterParamsTT.pes_type = DMX_PES_TELETEXT; 
++      pesFilterParamsTT.input   = DMX_IN_FRONTEND;
++      pesFilterParamsTT.output  = DMX_OUT_DECODER;
++      pesFilterParamsTT.pes_type = DMX_PES_TELETEXT;
+       pesFilterParamsTT.flags   = DMX_IMMEDIATE_START;
+-      if (ioctl(fd_demuxtt, DMX_SET_PES_FILTER, 
++      if (ioctl(fd_demuxtt, DMX_SET_PES_FILTER,
+                 &pesFilterParamsTT) < 0) {
+         printf("PID=%04x\n", ttpid);
+               perror("set_ttpid");
+       }
+ }
+-set_vpid(ushort vpid) 
+-{  
++set_vpid(ushort vpid)
++{
+         if (vpid==0 || vpid==0xffff || vpid==0x1fff) {
+               ioctl(fd_demuxv, DMX_STOP, 0);
+               return;
+       }
+       pesFilterParamsV.pid     = vpid;
+-      pesFilterParamsV.input   = DMX_IN_FRONTEND; 
+-      pesFilterParamsV.output  = DMX_OUT_DECODER; 
+-      pesFilterParamsV.pes_type = DMX_PES_VIDEO; 
++      pesFilterParamsV.input   = DMX_IN_FRONTEND;
++      pesFilterParamsV.output  = DMX_OUT_DECODER;
++      pesFilterParamsV.pes_type = DMX_PES_VIDEO;
+       pesFilterParamsV.flags   = DMX_IMMEDIATE_START;
+-      if (ioctl(fd_demuxv, DMX_SET_PES_FILTER, 
++      if (ioctl(fd_demuxv, DMX_SET_PES_FILTER,
+                 &pesFilterParamsV) < 0)
+               perror("set_vpid");
+ }
+-set_apid(ushort apid) 
+-{  
++set_apid(ushort apid)
++{
+         if (apid==0 || apid==0xffff || apid==0x1fff) {
+               ioctl(fd_demuxa, DMX_STOP, apid);
+               return;
+       }
+       pesFilterParamsA.pid = apid;
+-      pesFilterParamsA.input = DMX_IN_FRONTEND; 
+-      pesFilterParamsA.output = DMX_OUT_DECODER; 
+-      pesFilterParamsA.pes_type = DMX_PES_AUDIO; 
++      pesFilterParamsA.input = DMX_IN_FRONTEND;
++      pesFilterParamsA.output = DMX_OUT_DECODER;
++      pesFilterParamsA.pes_type = DMX_PES_AUDIO;
+       pesFilterParamsA.flags = DMX_IMMEDIATE_START;
+-      if (ioctl(fd_demuxa, DMX_SET_PES_FILTER, 
++      if (ioctl(fd_demuxa, DMX_SET_PES_FILTER,
+                 &pesFilterParamsA) < 0)
+               perror("set_apid");
+ }
+@@ -156,7 +156,7 @@
+       if (poll(pfd,1,3000)){
+               if (pfd[0].revents & POLLIN){
+                       printf("Getting QPSK event\n");
+-                      if ( ioctl(fd_frontend, FE_GET_EVENT, &event)  
++                      if ( ioctl(fd_frontend, FE_GET_EVENT, &event)
+                            == -EOVERFLOW){
+                               perror("qpsk get event");
+@@ -170,7 +170,7 @@
+                       case FE_FAILURE_EV:
+                               printf("failure event\n");
+                               return -1;
+-                              
++
+                       case FE_COMPLETION_EV:
+                               printf("completion event\n");
+                       }
+@@ -179,7 +179,7 @@
+       return 0;
+ }
+-set_tp(uint *freq, int ttk, int pol, uint srate, int dis) 
++set_tp(uint *freq, int ttk, int pol, uint srate, int dis)
+ {
+       if (*freq < 11700000) {
+               frp.Frequency = (*freq - 9750000);
+@@ -195,22 +195,22 @@
+       frp.u.qpsk.FEC_inner = 0;
+ }
+-get_front(void) 
++get_front(void)
+ {
+       set_vpid(0);
+       set_apid(0);
+       set_ttpid(0);
+-      scmds.voltage = SEC_VOLTAGE_18; 
++      scmds.voltage = SEC_VOLTAGE_18;
+       scmds.miniCommand = SEC_MINI_NONE;
+       scmds.continuousTone = SEC_TONE_OFF;
+       scmds.numCommands=1;
+       scmds.commands=&scmd;
+-      
++
+       frp.Frequency=(12073000-10600000);
+       frp.u.qpsk.SymbolRate=25378000;
+       frp.u.qpsk.FEC_inner=(fe_code_rate_t)5;
+-}             
+-  
++}
++
+ void get_sect(int fd)
+ {
+@@ -219,10 +219,10 @@
+         uint16_t cpid = 0;
+         uint16_t length;
+         struct pollfd pfd;
+-       
++
+         pfd.fd = fd;
+         pfd.events = POLLIN;
+-       
++
+       while (1){
+               if (poll(&pfd, 1, 5000) != POLLIN) {
+                       printf("not found\n");
+@@ -232,7 +232,7 @@
+                       length  = (sec[1]& 0x0F)<<8;
+                       length |= (sec[2]& 0xFF);
+-        
++
+                       for (i= 0; i < length+3; i++) {
+                               printf("0x%02x ",sec[i]);
+@@ -248,7 +248,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,FE_READ_STATUS,stat) < 0)){
++      if ((ans = ioctl(fd,FE_READ_STATUS,stat)) < 0) {
+               perror("FE READ STATUS: ");
+               return -1;
+       }
+@@ -268,7 +268,7 @@
+ int has_signal()
+ {
+       fe_status_t stat;
+-      
++
+       FEReadStatus(fd_frontend, &stat);
+       if (stat & FE_HAS_SIGNAL)
+               return 1;
+@@ -304,7 +304,7 @@
+       scmds.commands=&scmd;
+       frp.Frequency = (12073000 - 10600000);
+ //    frp.Frequency = (11975000 - 10600000);
+-      scmds.continuousTone = SEC_TONE_ON; 
++      scmds.continuousTone = SEC_TONE_ON;
+       frp.u.qpsk.SymbolRate = 25378000;
+ //    frp.u.qpsk.SymbolRate = 27500000;
+ //    frp.u.qpsk.FEC_inner = FEC_AUTO;
+@@ -313,7 +313,7 @@
+       scmd.u.diseqc.addr = 0x10;
+       scmd.u.diseqc.cmd = 0x38;
+       scmd.u.diseqc.numParams = 1;
+-      scmd.u.diseqc.params[0] = 0xF0 | ((3 * 4) & 0x0F) | 
++      scmd.u.diseqc.params[0] = 0xF0 | ((3 * 4) & 0x0F) |
+         (scmds.continuousTone == SEC_TONE_ON ? 1 : 0) |
+         (scmds.voltage==SEC_VOLTAGE_18 ? 2 : 0);
+@@ -324,7 +324,7 @@
+ /*
+-      if ((fd_demuxa=open("/dev/ost/demux", O_RDWR|O_NONBLOCK)) 
++      if ((fd_demuxa=open("/dev/ost/demux", O_RDWR|O_NONBLOCK))
+           < 0){
+               perror("DEMUX DEVICE: ");
+               return -1;
+@@ -336,18 +336,18 @@
+         sctFilterParams.timeout                   = 0;
+         sctFilterParams.flags                     = DMX_IMMEDIATE_START;
+-        if (ioctl(fd_demuxa, DMX_SET_FILTER, &sctFilterParams) < 0)  
++        if (ioctl(fd_demuxa, DMX_SET_FILTER, &sctFilterParams) < 0)
+                 perror("DMX SET FILTER:");
+       get_sect(fd_demuxa);
+ */
+       pesFilterParamsA.pid = 0x1fff;
+-      pesFilterParamsA.input = DMX_IN_FRONTEND; 
+-      pesFilterParamsA.output = DMX_OUT_TS_TAP; 
+-      pesFilterParamsA.pes_type = DMX_PES_OTHER; 
++      pesFilterParamsA.input = DMX_IN_FRONTEND;
++      pesFilterParamsA.output = DMX_OUT_TS_TAP;
++      pesFilterParamsA.pes_type = DMX_PES_OTHER;
+       pesFilterParamsA.flags = DMX_IMMEDIATE_START;
+-      if (ioctl(fd_demuxa, DMX_SET_PES_FILTER, 
++      if (ioctl(fd_demuxa, DMX_SET_PES_FILTER,
+                 &pesFilterParamsA) < 0)
+               perror("set_apid");
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/test_tt.c dvb-apps/test/test_tt.c
+--- linuxtv-dvb-apps-1.1.1/test/test_tt.c      2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/test/test_tt.c    2009-06-21 13:29:06.000000000 +0200
+@@ -202,4 +202,3 @@
+       close(dmxfd);
+       return 0;
+ }
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/test_vevent.c dvb-apps/test/test_vevent.c
+--- linuxtv-dvb-apps-1.1.1/test/test_vevent.c  2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/test/test_vevent.c        2009-06-21 13:29:06.000000000 +0200
+@@ -1,4 +1,4 @@
+-/* 
++/*
+  * test_vevent.c - Test VIDEO_GET_EVENT and poll(9 for video events
+  *
+  * Copyright (C) 2003 convergence GmbH
+@@ -29,6 +29,7 @@
+ #include <time.h>
+ #include <unistd.h>
++#include <linux/types.h>
+ #include <linux/dvb/video.h>
+@@ -73,7 +74,7 @@
+       printf("using video device '%s'\n", videodev);
+-      if((vfd = open(videodev, O_RDONLY | O_NONBLOCK)) < 0) {
++      if ((vfd = open(videodev, O_RDONLY | O_NONBLOCK)) < 0) {
+               perror("open video device");
+               return 1;
+       }
+@@ -122,4 +123,3 @@
+       close(vfd);
+       return 0;
+ }
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/test_video.c dvb-apps/test/test_video.c
+--- linuxtv-dvb-apps-1.1.1/test/test_video.c   2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/test/test_video.c 2009-06-21 13:29:06.000000000 +0200
+@@ -1,4 +1,4 @@
+-/* 
++/*
+  * test_video.c - Test program for new API
+  *
+  * Copyright (C) 2000 Ralph  Metzler <ralph@convergence.de>
+@@ -40,7 +40,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,VIDEO_STOP,0) < 0)){
++      if ((ans = ioctl(fd,VIDEO_STOP,0)) < 0) {
+               perror("VIDEO STOP: ");
+               return -1;
+       }
+@@ -52,7 +52,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,VIDEO_PLAY) < 0)){
++      if ((ans = ioctl(fd,VIDEO_PLAY)) < 0) {
+               perror("VIDEO PLAY: ");
+               return -1;
+       }
+@@ -65,7 +65,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,VIDEO_FREEZE) < 0)){
++      if ((ans = ioctl(fd,VIDEO_FREEZE)) < 0) {
+               perror("VIDEO FREEZE: ");
+               return -1;
+       }
+@@ -78,7 +78,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,VIDEO_CONTINUE) < 0)){
++      if ((ans = ioctl(fd,VIDEO_CONTINUE)) < 0) {
+               perror("VIDEO CONTINUE: ");
+               return -1;
+       }
+@@ -90,7 +90,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,VIDEO_SELECT_SOURCE, source) < 0)){
++      if ((ans = ioctl(fd,VIDEO_SELECT_SOURCE, source)) < 0) {
+               perror("VIDEO SELECT SOURCE: ");
+               return -1;
+       }
+@@ -104,7 +104,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,VIDEO_SET_BLANK, state) < 0)){
++      if ((ans = ioctl(fd,VIDEO_SET_BLANK, state)) < 0) {
+               perror("VIDEO SET BLANK: ");
+               return -1;
+       }
+@@ -116,7 +116,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,VIDEO_FAST_FORWARD, nframes) < 0)){
++      if ((ans = ioctl(fd,VIDEO_FAST_FORWARD, nframes)) < 0) {
+               perror("VIDEO FAST FORWARD: ");
+               return -1;
+       }
+@@ -128,7 +128,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,VIDEO_SLOWMOTION, nframes) < 0)){
++      if ((ans = ioctl(fd,VIDEO_SLOWMOTION, nframes)) < 0) {
+               perror("VIDEO SLOWMOTION: ");
+               return -1;
+       }
+@@ -141,7 +141,7 @@
+       struct video_status stat;
+       int ans;
+-      if ( (ans = ioctl(fd,VIDEO_GET_STATUS, &stat) < 0)){
++      if ((ans = ioctl(fd,VIDEO_GET_STATUS, &stat)) < 0) {
+               perror("VIDEO GET STATUS: ");
+               return -1;
+       }
+@@ -164,7 +164,7 @@
+               printf("unknown (%d)\n",stat.play_state);
+               break;
+       }
+-      
++
+       printf("  Stream Source        : ");
+       switch((int)stat.stream_source){
+       case VIDEO_SOURCE_DEMUX:
+@@ -213,7 +213,7 @@
+ {
+       int ans;
+-      if ( (ans = ioctl(fd,VIDEO_STILLPICTURE, sp) < 0)){
++      if ((ans = ioctl(fd,VIDEO_STILLPICTURE, sp)) < 0) {
+               perror("VIDEO STILLPICTURE: ");
+               return -1;
+       }
+@@ -234,17 +234,17 @@
+       pfd[0].fd = STDIN_FILENO;
+       pfd[0].events = POLLIN;
+-      
++
+       pfd[1].fd = fd;
+       pfd[1].events = POLLOUT;
+-      
++
+       videoSelectSource(fd,VIDEO_SOURCE_MEMORY);
+       videoPlay(fd);
+-      
+-      
++
++
+       count = read(filefd,buf,BUFFY);
+       write(fd,buf,count);
+-      
++
+       while ( (count = read(filefd,buf,BUFFY)) >= 0  ){
+               written = 0;
+               while(written < count){
+@@ -267,7 +267,7 @@
+                                               printf("playback stopped\n");
+                                               stopped = 1;
+                                               break;
+-                                              
++
+                                       case 'c':
+                                               videoContinue(fd);
+                                               printf("playback continued\n");
+@@ -298,7 +298,7 @@
+                                               break;
+                                       }
+                               }
+-                              
++
+                       }
+               }
+       }
+@@ -310,12 +310,12 @@
+       struct video_still_picture sp;
+       fstat(filefd, &st);
+-      
++
+       sp.iFrame = (char *) malloc(st.st_size);
+       sp.size = st.st_size;
+       printf("I-frame size: %d\n", sp.size);
+-      
+-      if(!sp.iFrame) {
++
++      if (!sp.iFrame) {
+               printf("No memory for I-Frame\n");
+               return;
+       }
+@@ -338,12 +338,12 @@
+               perror("File open:");
+               return -1;
+       }
+-      if((fd = open("/dev/ost/video1",O_RDWR|O_NONBLOCK)) < 0){
++      if ((fd = open("/dev/ost/video1",O_RDWR|O_NONBLOCK)) < 0){
+               perror("VIDEO DEVICE: ");
+               return -1;
+       }
+-          
+-      
++
++
+ //    videoSetBlank(fd,false);
+@@ -365,4 +365,3 @@
+ }
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/test/video.c dvb-apps/test/video.c
+--- linuxtv-dvb-apps-1.1.1/test/video.c        2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/test/video.c      2009-06-21 13:29:06.000000000 +0200
+@@ -1,13 +1,14 @@
+- /**
+- *  A tiny video watching application, just starts capturing /dev/video
+- *  into /dev/fb0.
+- *  Be shure to have >8Bit/pixel color resolution and r/w access for 
+- *  /dev/video0, /dev/fb0 and /dev/tty0 to let this work...
+- *
+- *   compile with
+- *
+- *   $ gcc -g -Wall -O2 -o video video.c -I../../ost/include
+- */
++#define USAGE \
++"\n" \
++"\n A tiny video watching application, just starts capturing /dev/video" \
++"\n into /dev/fb0." \
++"\n Be shure to have >8Bit/pixel color resolution and r/w access for " \
++"\n /dev/video0, /dev/fb0 and /dev/tty0 to let this work..." \
++"\n" \
++"\n  compile with" \
++"\n" \
++"\n  $ gcc -g -Wall -O2 -o video video.c -I../../ost/include" \
++"\n"
+ #include <sys/mman.h>
+ #include <sys/ioctl.h>
+@@ -55,7 +56,7 @@
+       }
+       write( vt_fd, blankoff_str, strlen(blankoff_str) );
+-      
++
+       if (ioctl (fd, FBIOGET_VSCREENINFO, &fb_var) < 0) {
+               perror("Could not get variable screen information (fb_var)\n");
+               return 1;
+@@ -77,14 +78,14 @@
+       struct video_capability vcap;
+       if ((fd = open (video_devname, O_RDWR)) < 0) {
+-              fprintf (stderr, 
++              fprintf (stderr,
+                        "%s: Could not open %s, please check permissions\n",
+                        __FUNCTION__, video_devname);
+               return -1;
+       }
+       ioctl(fd, VIDIOCGCAP, &vcap);
+-      
++
+       if (ioctl(fd, VIDIOCCAPTURE, &zero) < 0) {
+               perror("Could not stop capturing (VIDIOCCAPTURE failed)\n");
+               return -2;
+@@ -92,7 +93,7 @@
+       if (stop)
+               return 0;
+-      
++
+       {
+               struct video_buffer b;
+               b.base = (void*) fb_fix.smem_start;
+@@ -105,7 +106,7 @@
+                       return -3;
+               }
+       }
+-      
++
+       {
+               struct video_picture p;
+               if (ioctl(fd, VIDIOCGPICT, &p) < 0) {
+@@ -131,7 +132,7 @@
+                       return -5;
+               }
+       }
+-      
++
+       {
+               struct video_window win;
+               win.width = min((__u32) vcap.maxwidth, fb_var.xres);
+@@ -147,14 +148,14 @@
+                       return -6;
+               }
+       }
+-      
++
+       if (ioctl(fd, VIDIOCCAPTURE, &one) < 0) {
+               perror("Could not start capturing (VIDIOCCAPTURE failed)\n");
+               return -7;
+       }
+-      
++
+       close (fd);
+-      
++
+       return 0;
+ }
+@@ -173,10 +174,9 @@
+               video_devname = argv[1];
+       if (argc != 1 && argc != 2 && !(argc == 3 && stop)) {
+-              fprintf (stderr, "usage: %s <devname> <stop>\n", argv[0]);
++              fprintf(stderr, "usage: %s <devname> <stop>\n" USAGE, argv[0]);
+               exit (-1);
+       }
+       return init_video (stop);
+ }
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/TODO dvb-apps/TODO
+--- linuxtv-dvb-apps-1.1.1/TODO        2004-02-04 19:51:58.000000000 +0100
++++ dvb-apps/TODO      1970-01-01 01:00:00.000000000 +0100
+@@ -1 +0,0 @@
+-- create libdvb2, possibly merging util/lib/*
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/atsc_epg/atsc_epg.c dvb-apps/util/atsc_epg/atsc_epg.c
+--- linuxtv-dvb-apps-1.1.1/util/atsc_epg/atsc_epg.c    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/atsc_epg/atsc_epg.c  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,1249 @@
++/*
++ * atsc_epg utility
++ *
++ * Copyright (C) 2009 Yufei Yuan <yfyuan@gmail.com>
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <unistd.h>
++#include <string.h>
++#include <time.h>
++#include <signal.h>
++#include <sys/types.h>
++#include <sys/stat.h>
++#include <fcntl.h>
++#include <sys/ioctl.h>
++#include <sys/poll.h>
++#include <errno.h>
++#include <getopt.h>
++#include <stdarg.h>
++#include <libdvbapi/dvbfe.h>
++#include <libdvbapi/dvbdemux.h>
++#include <libucsi/dvb/section.h>
++#include <libucsi/atsc/section.h>
++#include <libucsi/atsc/types.h>
++
++#define TIMEOUT                               60
++#define RRT_TIMEOUT                   60
++#define MAX_NUM_EVENT_TABLES          128
++#define TITLE_BUFFER_LEN              4096
++#define MESSAGE_BUFFER_LEN            (16 * 1024)
++#define MAX_NUM_CHANNELS              16
++#define MAX_NUM_EVENTS_PER_CHANNEL    (4 * 24 * 7)
++
++static int atsc_scan_table(int dmxfd, uint16_t pid, enum atsc_section_tag tag,
++      void **table_section);
++
++static const char *program;
++static int adapter = 0;
++static int period = 12; /* hours */
++static int frequency;
++static int enable_ett = 0;
++static int ctrl_c = 0;
++static const char *modulation = NULL;
++static char separator[80];
++void (*old_handler)(int);
++
++struct atsc_string_buffer {
++      int buf_len;
++      int buf_pos;
++      char *string;
++};
++
++struct atsc_event_info {
++      uint16_t id;
++      struct tm start;
++      struct tm end;
++      int title_pos;
++      int title_len;
++      int msg_pos;
++      int msg_len;
++};
++
++struct atsc_eit_section_info {
++      uint8_t section_num;
++      uint8_t num_events;
++      uint8_t num_etms;
++      uint8_t num_received_etms;
++      struct atsc_event_info **events;
++};
++
++struct atsc_eit_info {
++      int num_eit_sections;
++      struct atsc_eit_section_info *section;
++};
++
++struct atsc_channel_info {
++      uint8_t num_eits;
++      uint8_t service_type;
++      char short_name[8];
++      uint16_t major_num;
++      uint16_t minor_num;
++      uint16_t tsid;
++      uint16_t prog_num;
++      uint16_t src_id;
++      struct atsc_eit_info *eit;
++      struct atsc_event_info *last_event;
++      int event_info_index;
++      struct atsc_event_info e[MAX_NUM_EVENTS_PER_CHANNEL];
++      struct atsc_string_buffer title_buf;
++      struct atsc_string_buffer msg_buf;
++};
++
++struct atsc_virtual_channels_info {
++      int num_channels;
++      uint16_t eit_pid[MAX_NUM_EVENT_TABLES];
++      uint16_t ett_pid[MAX_NUM_EVENT_TABLES];
++      struct atsc_channel_info ch[MAX_NUM_CHANNELS];
++} guide;
++
++struct mgt_table_name {
++      uint16_t range;
++      const char *string;
++};
++
++struct mgt_table_name mgt_tab_name_array[] = {
++      {0x0000, "terrestrial VCT with current_next_indictor=1"},
++      {0x0001, "terrestrial VCT with current_next_indictor=0"},
++      {0x0002, "cable VCT with current_next_indictor=1"},
++      {0x0003, "cable VCT with current_next_indictor=0"},
++      {0x0004, "channel ETT"},
++      {0x0005, "DCCSCT"},
++      {0x00FF, "reserved for future ATSC use"},
++      {0x017F, "EIT"},
++      {0x01FF, "reserved for future ATSC use"},
++      {0x027F, "event ETT"},
++      {0x02FF, "reserved for future ATSC use"}, /* FIXME */
++      {0x03FF, "RRT with rating region"},
++      {0x0FFF, "user private"},
++      {0x13FF, "reserved for future ATSC use"},
++      {0x14FF, "DCCT with dcc_id"},
++      {0xFFFF, "reserved for future ATSC use"}
++};
++
++const char *channel_modulation_mode[] = {
++      "",
++      "analog",
++      "SCTE mode 1",
++      "SCTE mode 2",
++      "ATSC 8VSB",
++      "ATSC 16VSB"
++};
++
++const char *channel_service_type[] = {
++      "",
++      "analog TV",
++      "ATSC digital TV",
++      "ATSC audio",
++      "ATSC data-only"
++};
++
++void *(*table_callback[16])(struct atsc_section_psip *) =
++{
++      NULL, NULL, NULL, NULL, NULL, NULL, NULL,
++      (void *(*)(struct atsc_section_psip *))atsc_mgt_section_codec,
++      (void *(*)(struct atsc_section_psip *))atsc_tvct_section_codec,
++      (void *(*)(struct atsc_section_psip *))atsc_cvct_section_codec,
++      (void *(*)(struct atsc_section_psip *))atsc_rrt_section_codec,
++      (void *(*)(struct atsc_section_psip *))atsc_eit_section_codec,
++      (void *(*)(struct atsc_section_psip *))atsc_ett_section_codec,
++      (void *(*)(struct atsc_section_psip *))atsc_stt_section_codec,
++      NULL, NULL
++};
++
++static void int_handler(int sig_num)
++{
++      if(SIGINT != sig_num) {
++              return;
++      }
++      ctrl_c = 1;
++}
++
++/* shamelessly stolen from dvbsnoop, but almost not modified */
++static uint32_t get_bits(const uint8_t *buf, int startbit, int bitlen)
++{
++      const uint8_t *b;
++      uint32_t mask,tmp_long;
++      int bitHigh,i;
++
++      b = &buf[startbit / 8];
++      startbit %= 8;
++
++      bitHigh = 8;
++      tmp_long = b[0];
++      for (i = 0; i < ((bitlen-1) >> 3); i++) {
++              tmp_long <<= 8;
++              tmp_long  |= b[i+1];
++              bitHigh   += 8;
++      }
++
++      startbit = bitHigh - startbit - bitlen;
++      tmp_long = tmp_long >> startbit;
++      mask     = (1ULL << bitlen) - 1;
++      return tmp_long & mask;
++}
++
++static void usage(void)
++{
++      fprintf(stderr, "usage: %s [-a <n>] -f <frequency> [-p <period>]"
++              " [-m <modulation>] [-t] [-h]\n", program);
++}
++
++static void help(void)
++{
++      fprintf(stderr,
++      "\nhelp:\n"
++      "%s [-a <n>] -f <frequency> [-p <period>] [-m <modulation>] [-t] [-h]\n"
++      "  -a: adapter index to use, (default 0)\n"
++      "  -f: tuning frequency\n"
++      "  -p: period in hours, (default 12)\n"
++      "  -m: modulation ATSC vsb_8|vsb_16 (default vsb_8)\n"
++      "  -t: enable ETT to receive program details, if available\n"
++      "  -h: display this message\n", program);
++}
++
++static int close_frontend(struct dvbfe_handle *fe)
++{
++      if(NULL == fe) {
++              fprintf(stderr, "%s(): NULL pointer detected\n", __FUNCTION__);
++      }
++
++      dvbfe_close(fe);
++
++      return 0;
++}
++
++static int open_frontend(struct dvbfe_handle **fe)
++{
++      struct dvbfe_info fe_info;
++
++      if(NULL == (*fe = dvbfe_open(adapter, 0, 0))) {
++              fprintf(stderr, "%s(): error calling dvbfe_open()\n",
++                      __FUNCTION__);
++              return -1;
++      }
++      dvbfe_get_info(*fe, 0, &fe_info, DVBFE_INFO_QUERYTYPE_IMMEDIATE, 0);
++      if(DVBFE_TYPE_ATSC != fe_info.type) {
++              fprintf(stderr, "%s(): only ATSC frontend supported currently\n",
++                      __FUNCTION__);
++              return -1;
++      }
++      fe_info.feparams.frequency = frequency;
++      fe_info.feparams.inversion = DVBFE_INVERSION_AUTO;
++      fe_info.feparams.u.atsc.modulation = DVBFE_ATSC_MOD_VSB_8;
++      fprintf(stdout, "tuning to %d Hz, please wait...\n", frequency);
++      if(dvbfe_set(*fe, &fe_info.feparams, TIMEOUT * 1000)) {
++              fprintf(stderr, "%s(): cannot lock to %d Hz in %d seconds\n",
++                      __FUNCTION__, frequency, TIMEOUT);
++              return -1;
++      }
++      fprintf(stdout, "tuner locked.\n");
++
++      return 0;
++}
++
++#if ENABLE_RRT
++/* this is untested as since this part of the library is broken */
++static int parse_rrt(int dmxfd)
++{
++      const enum atsc_section_tag tag = stag_atsc_rating_region;
++      struct atsc_rrt_section *rrt;
++      struct atsc_text *region_name;
++      struct atsc_text_string *atsc_str;
++      int i, j, ret;
++
++      i = 0;
++      fprintf(stdout, "waiting for RRT: ");
++      fflush(stdout);
++      while(i < RRT_TIMEOUT) {
++              ret = atsc_scan_table(dmxfd, ATSC_BASE_PID, tag, (void **)&rrt);
++              if(0 > ret) {
++                      fprintf(stderr, "%s(): error calling atsc_scan_table()\n",
++                              __FUNCTION__);
++                      return -1;
++              }
++              if(0 == ret) {
++                      if(RRT_TIMEOUT > i) {
++                              fprintf(stdout, ".");
++                              fflush(stdout);
++                      } else {
++                              fprintf(stdout, "\nno RRT in %d seconds\n",
++                                      RRT_TIMEOUT);
++                              return 0;
++                      }
++                      i += TIMEOUT;
++              } else {
++                      fprintf(stdout, "\n");
++                      fflush(stdout);
++                      break;
++              }
++      }
++
++      region_name = atsc_rrt_section_rating_region_name_text(rrt);
++      atsc_text_strings_for_each(region_name, atsc_str, i) {
++              struct atsc_text_string_segment *seg;
++
++              atsc_text_string_segments_for_each(atsc_str, seg, j) {
++                      const char *c;
++                      int k;
++                      if(seg->mode < 0x3E) {
++                              fprintf(stderr, "%s(): text mode of 0x%02X "
++                                      "not supported yet\n",
++                                      __FUNCTION__, seg->mode);
++                              return -1;
++                      }
++                      c = (const char *)atsc_text_string_segment_bytes(seg);
++                      for(k = 0; k < seg->number_bytes; k++) {
++                              fprintf(stdout, "%c", c[k]);
++                      }
++              }
++      }
++
++      return 0;
++}
++#endif
++
++static int parse_stt(int dmxfd)
++{
++      const enum atsc_section_tag tag = stag_atsc_system_time;
++      const struct atsc_stt_section *stt;
++      time_t rx_time;
++      time_t sys_time;
++      int ret;
++
++      ret = atsc_scan_table(dmxfd, ATSC_BASE_PID, tag, (void **)&stt);
++      if(0 > ret) {
++              fprintf(stderr, "%s(): error calling atsc_scan_table()\n",
++                      __FUNCTION__);
++              return -1;
++      }
++      if(0 == ret) {
++              fprintf(stdout, "no STT in %d seconds\n", TIMEOUT);
++              return 0;
++      }
++
++      rx_time = atsctime_to_unixtime(stt->system_time);
++      time(&sys_time);
++      fprintf(stdout, "system time: %s", ctime(&sys_time));
++      fprintf(stdout, "TS STT time: %s", ctime(&rx_time));
++
++      return 0;
++}
++
++static int parse_tvct(int dmxfd)
++{
++      int num_sections;
++      uint32_t section_pattern;
++      const enum atsc_section_tag tag = stag_atsc_terrestrial_virtual_channel;
++      struct atsc_tvct_section *tvct;
++      struct atsc_tvct_channel *ch;
++      struct atsc_channel_info *curr_info;
++      int i, k, ret;
++
++      section_pattern = 0;
++      num_sections = -1;
++
++      do {
++              ret = atsc_scan_table(dmxfd, ATSC_BASE_PID, tag, (void **)&tvct);
++              if(0 > ret) {
++                      fprintf(stderr, "%s(): error calling atsc_scan_table()\n",
++                      __FUNCTION__);
++                      return -1;
++              }
++              if(0 == ret) {
++                      fprintf(stdout, "no TVCT in %d seconds\n", TIMEOUT);
++                      return 0;
++              }
++
++              if(-1 == num_sections) {
++                      num_sections = 1 + tvct->head.ext_head.last_section_number;
++                      if(32 < num_sections) {
++                              fprintf(stderr, "%s(): no support yet for "
++                                      "tables having more than 32 sections\n",
++                                      __FUNCTION__);
++                              return -1;
++                      }
++              } else {
++                      if(num_sections !=
++                              1 + tvct->head.ext_head.last_section_number) {
++                              fprintf(stderr,
++                                      "%s(): last section number does not match\n",
++                                      __FUNCTION__);
++                              return -1;
++                      }
++              }
++              if(section_pattern & (1 << tvct->head.ext_head.section_number)) {
++                      continue;
++              }
++              section_pattern |= 1 << tvct->head.ext_head.section_number;
++
++              if(MAX_NUM_CHANNELS < guide.num_channels +
++                      tvct->num_channels_in_section) {
++                      fprintf(stderr, "%s(): no support for more than %d "
++                              "virtual channels in a pyhsical channel\n",
++                              __FUNCTION__, MAX_NUM_CHANNELS);
++                      return -1;
++              }
++              curr_info = &guide.ch[guide.num_channels];
++              guide.num_channels += tvct->num_channels_in_section;
++
++      atsc_tvct_section_channels_for_each(tvct, ch, i) {
++              /* initialize the curr_info structure */
++              /* each EIT covers 3 hours */
++              curr_info->num_eits = (period / 3) + !!(period % 3);
++              while (curr_info->num_eits &&
++                      (0xFFFF == guide.eit_pid[curr_info->num_eits - 1])) {
++                      curr_info->num_eits -= 1;
++              }
++              if(curr_info->eit) {
++                      fprintf(stderr, "%s(): non-NULL pointer detected "
++                              "during initialization", __FUNCTION__);
++                      return -1;
++              }
++              if(NULL == (curr_info->eit = calloc(curr_info->num_eits,
++                      sizeof(struct atsc_eit_info)))) {
++                      fprintf(stderr, "%s(): error calling calloc()\n",
++                              __FUNCTION__);
++                      return -1;
++              }
++              if(NULL == (curr_info->title_buf.string = calloc(TITLE_BUFFER_LEN,
++                      sizeof(char)))) {
++                      fprintf(stderr, "%s(): error calling calloc()\n",
++                              __FUNCTION__);
++                      return -1;
++              }
++              curr_info->title_buf.buf_len = TITLE_BUFFER_LEN;
++              curr_info->title_buf.buf_pos = 0;
++
++              if(NULL == (curr_info->msg_buf.string = calloc(MESSAGE_BUFFER_LEN,
++                      sizeof(char)))) {
++                      fprintf(stderr, "%s(): error calling calloc()\n",
++                              __FUNCTION__);
++                      return -1;
++              }
++              curr_info->msg_buf.buf_len = MESSAGE_BUFFER_LEN;
++              curr_info->msg_buf.buf_pos = 0;
++
++              for(k = 0; k < 7; k++) {
++                      curr_info->short_name[k] =
++                              get_bits((const uint8_t *)ch->short_name,
++                              k * 16, 16);
++              }
++              curr_info->service_type = ch->service_type;
++              curr_info->major_num = ch->major_channel_number;
++              curr_info->minor_num = ch->minor_channel_number;
++              curr_info->tsid = ch->channel_TSID;
++              curr_info->prog_num = ch->program_number;
++              curr_info->src_id = ch->source_id;
++              curr_info++;
++              }
++      } while(section_pattern != (uint32_t)((1 << num_sections) - 1));
++
++      return 0;
++}
++
++static int match_event(struct atsc_eit_info *eit, uint16_t event_id,
++      struct atsc_event_info **event, uint8_t *curr_index)
++{
++      int j, k;
++      struct atsc_eit_section_info *section;
++
++      if(NULL == eit || NULL == event || NULL == curr_index) {
++              fprintf(stderr, "%s(): NULL pointer detected\n", __FUNCTION__);
++              return -1;
++      }
++
++      for(j = 0; j < eit->num_eit_sections; j++) {
++              section = &eit->section[j];
++
++              for(k = 0; k < section->num_events; k++) {
++                      if(section->events[k] && section->events[k]->id ==
++                              event_id) {
++                              *event = section->events[k];
++                              break;
++                      }
++              }
++              if(*event) {
++                      *curr_index = j;
++                      break;
++              }
++      }
++
++      return 0;
++}
++
++static int parse_message(struct atsc_channel_info *channel,
++      struct atsc_ett_section *ett, struct atsc_event_info *event)
++{
++      int i, j;
++      struct atsc_text *text;
++      struct atsc_text_string *str;
++
++      if(NULL == ett || NULL == event || NULL == channel) {
++              fprintf(stderr, "%s(): NULL pointer detected\n", __FUNCTION__);
++              return -1;
++      }
++
++      text = atsc_ett_section_extended_text_message(ett);
++      atsc_text_strings_for_each(text, str, i) {
++              struct atsc_text_string_segment *seg;
++
++              atsc_text_string_segments_for_each(str, seg, j) {
++                      event->msg_pos = channel->msg_buf.buf_pos;
++                      if(0 > atsc_text_segment_decode(seg,
++                              (uint8_t **)&channel->msg_buf.string,
++                              (size_t *)&channel->msg_buf.buf_len,
++                              (size_t *)&channel->msg_buf.buf_pos)) {
++                              fprintf(stderr, "%s(): error calling "
++                                      "atsc_text_segment_decode()\n",
++                                      __FUNCTION__);
++                              return -1;
++                      }
++                      event->msg_len = 1 + channel->msg_buf.buf_pos -
++                              event->msg_pos;
++              }
++      }
++
++      return 0;
++}
++
++static int parse_ett(int dmxfd, int index, uint16_t pid)
++{
++      uint8_t curr_index;
++      uint32_t section_pattern;
++      const enum atsc_section_tag tag = stag_atsc_extended_text;
++      struct atsc_eit_info *eit;
++      struct atsc_ett_section *ett;
++      struct atsc_channel_info *channel;
++      struct atsc_event_info *event;
++      struct atsc_eit_section_info *section;
++      uint16_t source_id, event_id;
++      int c, ret;
++
++      if(0xFFFF == guide.ett_pid[index]) {
++              return 0;
++      }
++
++      for(c = 0; c < guide.num_channels; c++) {
++              channel = &guide.ch[c];
++              eit = &channel->eit[index];
++
++              section_pattern = 0;
++              while(section_pattern !=
++                      (uint32_t)((1 << eit->num_eit_sections) - 1)) {
++                      if(ctrl_c) {
++                              return 0;
++                      }
++                      ret = atsc_scan_table(dmxfd, pid, tag, (void **)&ett);
++                      fprintf(stdout, ".");
++                      fflush(stdout);
++                      if(0 > ret) {
++                              fprintf(stderr, "%s(): error calling "
++                                      "atsc_scan_table()\n", __FUNCTION__);
++                              return -1;
++                      }
++                      if(0 == ret) {
++                              fprintf(stdout, "no ETT %d in %d seconds\n",
++                                      index, TIMEOUT);
++                              return 0;
++                      }
++
++                      source_id = ett->ETM_source_id;
++                      event_id = ett->ETM_sub_id;
++                      if(source_id != channel->src_id) {
++                              continue;
++                      }
++
++                      event = NULL;
++                      if(match_event(eit, event_id, &event, &curr_index)) {
++                              fprintf(stderr, "%s(): error calling "
++                                      "match_event()\n", __FUNCTION__);
++                              return -1;
++                      }
++                      if(NULL == event) {
++                              continue;
++                      }
++                      if(section_pattern & (1 << curr_index)) {
++                              /* the section has been filled, so skip,
++                               * not consider version yet
++                               */
++                              continue;
++                      }
++                      if(event->msg_len) {
++                              /* the message has been filled */
++                              continue;
++                      }
++
++                      if(parse_message(channel, ett, event)) {
++                              fprintf(stderr, "%s(): error calling "
++                                      "parse_message()\n", __FUNCTION__);
++                              return -1;
++                      }
++                      section = &eit->section[curr_index];
++                      if(++section->num_received_etms == section->num_etms) {
++                              section_pattern |= 1 << curr_index;
++                      }
++              }
++      }
++
++      return 0;
++}
++
++static int parse_events(struct atsc_channel_info *curr_info,
++      struct atsc_eit_section *eit, struct atsc_eit_section_info *section)
++{
++      int i, j, k;
++      struct atsc_eit_event *e;
++      time_t start_time, end_time;
++
++      if(NULL == curr_info || NULL == eit) {
++              fprintf(stderr, "%s(): NULL pointer detected\n", __FUNCTION__);
++              return -1;
++      }
++
++      atsc_eit_section_events_for_each(eit, e, i) {
++              struct atsc_text *title;
++              struct atsc_text_string *str;
++              struct atsc_event_info *e_info =
++                      &curr_info->e[curr_info->event_info_index];
++
++              if(0 == i && curr_info->last_event) {
++                      if(e->event_id == curr_info->last_event->id) {
++                              section->events[i] = NULL;
++                              /* skip if it's the same event spanning
++                               * over sections
++                               */
++                              continue;
++                      }
++              }
++              curr_info->event_info_index += 1;
++              section->events[i] = e_info;
++              e_info->id = e->event_id;
++              start_time = atsctime_to_unixtime(e->start_time);
++              end_time = start_time + e->length_in_seconds;
++              localtime_r(&start_time, &e_info->start);
++              localtime_r(&end_time, &e_info->end);
++              if(0 != e->ETM_location && 3 != e->ETM_location) {
++                      /* FIXME assume 1 and 2 is interchangable as of now */
++                      section->num_etms++;
++              }
++
++              title = atsc_eit_event_name_title_text(e);
++              atsc_text_strings_for_each(title, str, j) {
++                      struct atsc_text_string_segment *seg;
++
++                      atsc_text_string_segments_for_each(str, seg, k) {
++                              e_info->title_pos = curr_info->title_buf.buf_pos;
++                              if(0 > atsc_text_segment_decode(seg,
++                                      (uint8_t **)&curr_info->title_buf.string,
++                                      (size_t *)&curr_info->title_buf.buf_len,
++                                      (size_t *)&curr_info->title_buf.buf_pos)) {
++                                      fprintf(stderr, "%s(): error calling "
++                                              "atsc_text_segment_decode()\n",
++                                              __FUNCTION__);
++                                      return -1;
++                              }
++                              e_info->title_len = curr_info->title_buf.buf_pos -
++                                      e_info->title_pos + 1;
++                      }
++              }
++      }
++
++      return 0;
++}
++
++static int parse_eit(int dmxfd, int index, uint16_t pid)
++{
++      int num_sections;
++      uint8_t section_num;
++      uint8_t curr_channel_index;
++      uint32_t section_pattern;
++      const enum atsc_section_tag tag = stag_atsc_event_information;
++      struct atsc_eit_section *eit;
++      struct atsc_channel_info *curr_info;
++      struct atsc_eit_info *eit_info;
++      struct atsc_eit_section_info *section;
++      uint16_t source_id;
++      uint32_t eit_instance_pattern = 0;
++      int i, k, ret;
++
++      while(eit_instance_pattern !=
++              (uint32_t)((1 << guide.num_channels) - 1)) {
++              source_id = 0xFFFF;
++              section_pattern = 0;
++              num_sections = -1;
++
++              do {
++                      ret = atsc_scan_table(dmxfd, pid, tag, (void **)&eit);
++                      fprintf(stdout, ".");
++                      fflush(stdout);
++                      if(0 > ret) {
++                              fprintf(stderr, "%s(): error calling "
++                                      "atsc_scan_table()\n", __FUNCTION__);
++                              return -1;
++                      }
++                      if(0 == ret) {
++                              fprintf(stdout, "no EIT %d in %d seconds\n",
++                                      index, TIMEOUT);
++                              return 0;
++                      }
++
++                      if(0xFFFF == source_id) {
++                      source_id = atsc_eit_section_source_id(eit);
++                      for(k = 0; k < guide.num_channels; k++) {
++                              if(source_id == guide.ch[k].src_id) {
++                                      curr_info = &guide.ch[k];
++                                      curr_channel_index = k;
++                                      if(0 == index) {
++                                              curr_info->last_event = NULL;
++                                      }
++                                      break;
++                              }
++                      }
++                      if(k == guide.num_channels) {
++                              fprintf(stderr, "%s(): cannot find source_id "
++                                      "0x%04X in the EIT\n",
++                                      __FUNCTION__, source_id);
++                              return -1;
++                      }
++                      } else {
++                              if(source_id !=
++                                      atsc_eit_section_source_id(eit)) {
++                                      continue;
++                              }
++                      }
++                      if(eit_instance_pattern & (1 << curr_channel_index)) {
++                              /* we have received this instance,
++                               * so quit quick
++                               */
++                              break;
++                      }
++
++                      if(-1 == num_sections) {
++                              num_sections = 1 +
++                                      eit->head.ext_head.last_section_number;
++                              if(32 < num_sections) {
++                                      fprintf(stderr,
++                                              "%s(): no support yet for "
++                                              "tables having more than "
++                                              "32 sections\n", __FUNCTION__);
++                                      return -1;
++                              }
++                      } else {
++                              if(num_sections != 1 +
++                                      eit->head.ext_head.last_section_number) {
++                                      fprintf(stderr,
++                                              "%s(): last section number "
++                                              "does not match\n",
++                                              __FUNCTION__);
++                                      return -1;
++                              }
++                      }
++                      if(section_pattern &
++                              (1 << eit->head.ext_head.section_number)) {
++                              continue;
++                      }
++                      section_pattern |= 1 << eit->head.ext_head.section_number;
++
++                      eit_info = &curr_info->eit[index];
++                      if(NULL == (eit_info->section =
++                              realloc(eit_info->section,
++                              (eit_info->num_eit_sections + 1) *
++                              sizeof(struct atsc_eit_section_info)))) {
++                              fprintf(stderr,
++                                      "%s(): error calling realloc()\n",
++                                      __FUNCTION__);
++                              return -1;
++                      }
++                      section_num = eit->head.ext_head.section_number;
++                      if(0 == eit_info->num_eit_sections) {
++                              eit_info->num_eit_sections = 1;
++                              section = eit_info->section;
++                      } else {
++                              /* have to sort it into section order
++                               * (temporal order)
++                               */
++                              for(i = 0; i < eit_info->num_eit_sections; i++) {
++                                      if(eit_info->section[i].section_num >
++                                              section_num) {
++                                              break;
++                                      }
++                              }
++                              memmove(&eit_info->section[i + 1],
++                                      &eit_info->section[i],
++                                      (eit_info->num_eit_sections - i) *
++                                      sizeof(struct atsc_eit_section_info));
++                              section = &eit_info->section[i - 1];
++                              section = &eit_info->section[i];
++                              eit_info->num_eit_sections += 1;
++                      }
++
++                      section->section_num = section_num;
++                      section->num_events = eit->num_events_in_section;
++                      section->num_etms = 0;
++                      section->num_received_etms = 0;
++                      if(NULL == (section->events = calloc(section->num_events,
++                              sizeof(struct atsc_event_info *)))) {
++                              fprintf(stderr, "%s(): error calling calloc()\n",
++                                      __FUNCTION__);
++                              return -1;
++                      }
++                      if(parse_events(curr_info, eit, section)) {
++                              fprintf(stderr, "%s(): error calling "
++                                      "parse_events()\n", __FUNCTION__);
++                              return -1;
++                      }
++              } while(section_pattern != (uint32_t)((1 << num_sections) - 1));
++              eit_instance_pattern |= 1 << curr_channel_index;
++      }
++
++      for(i = 0; i < guide.num_channels; i++) {
++              struct atsc_channel_info *channel = &guide.ch[i];
++              struct atsc_eit_info *ei = &channel->eit[index];
++              struct atsc_eit_section_info *s;
++
++              if(0 == ei->num_eit_sections) {
++                      channel->last_event = NULL;
++                      continue;
++              }
++              s = &ei->section[ei->num_eit_sections - 1];
++              /* BUG: it's incorrect when last section has no event */
++              if(0 == s->num_events) {
++                      channel->last_event = NULL;
++                      continue;
++              }
++              channel->last_event = s->events[s->num_events - 1];
++      }
++
++      return 0;
++}
++
++static int parse_mgt(int dmxfd)
++{
++      const enum atsc_section_tag tag = stag_atsc_master_guide;
++      struct atsc_mgt_section *mgt;
++      struct atsc_mgt_table *t;
++      int i, j, ret;
++
++      ret = atsc_scan_table(dmxfd, ATSC_BASE_PID, tag, (void **)&mgt);
++      if(0 > ret) {
++              fprintf(stderr, "%s(): error calling atsc_scan_table()\n",
++                      __FUNCTION__);
++              return -1;
++      }
++      if(0 == ret) {
++              fprintf(stdout, "no MGT in %d seconds\n", TIMEOUT);
++              return 0;
++      }
++
++      fprintf(stdout, "MGT table:\n");
++      atsc_mgt_section_tables_for_each(mgt, t, i) {
++              struct mgt_table_name table;
++
++      for(j = 0; j < (int)(sizeof(mgt_tab_name_array) /
++              sizeof(struct mgt_table_name)); j++) {
++              if(t->table_type > mgt_tab_name_array[j].range) {
++                      continue;
++              }
++              table = mgt_tab_name_array[j];
++              if(0 == j || mgt_tab_name_array[j - 1].range + 1 ==
++                      mgt_tab_name_array[j].range) {
++                      j = -1;
++              } else {
++                      j = t->table_type - mgt_tab_name_array[j - 1].range - 1;
++                      if(0x017F == table.range) {
++                              guide.eit_pid[j] = t->table_type_PID;
++                      } else if (0x027F == table.range) {
++                              guide.ett_pid[j] = t->table_type_PID;
++                      }
++              }
++              break;
++      }
++
++              fprintf(stdout, "  %2d: type = 0x%04X, PID = 0x%04X, %s", i,
++                  t->table_type, t->table_type_PID, table.string);
++              if(-1 != j) {
++                  fprintf(stdout, " %d", j);
++              }
++              fprintf(stdout, "\n");
++      }
++
++      return 0;
++}
++
++static int cleanup_guide(void)
++{
++      int i, j, k;
++
++      for(i = 0; i < guide.num_channels; i++) {
++              struct atsc_channel_info *channel = &guide.ch[i];
++
++              if(channel->title_buf.string) {
++                      free(channel->title_buf.string);
++              }
++              if(channel->msg_buf.string) {
++                      free(channel->msg_buf.string);
++              }
++              for(j = 0; j < channel->num_eits; j++) {
++                      struct atsc_eit_info *eit = &channel->eit[j];
++
++                      for(k = 0; k < eit->num_eit_sections; k++) {
++                              struct atsc_eit_section_info *section =
++                                      &eit->section[k];
++                              if(section->num_events) {
++                                      free(section->events);
++                              }
++                      }
++                      if(k) {
++                              free(eit->section);
++                      }
++              }
++              if(j) {
++                      free(channel->eit);
++              }
++      }
++
++      return 0;
++}
++
++static int print_events(struct atsc_channel_info *channel,
++      struct atsc_eit_section_info *section)
++{
++      int m;
++      char line[256];
++
++      if(NULL == section) {
++              fprintf(stderr, "%s(): NULL pointer detected", __FUNCTION__);
++              return -1;
++      }
++      for(m = 0; m < section->num_events; m++) {
++              struct atsc_event_info *event =
++                      section->events[m];
++
++              if(NULL == event) {
++                      continue;
++              }
++              fprintf(stdout, "|%02d:%02d--%02d:%02d| ",
++                      event->start.tm_hour, event->start.tm_min,
++                      event->end.tm_hour, event->end.tm_min);
++              snprintf(line, event->title_len, "%s",
++                      &channel->title_buf.string[event->title_pos]);
++              line[event->title_len] = '\0';
++              fprintf(stdout, "%s\n", line);
++              if(event->msg_len) {
++                      int len = event->msg_len;
++                      int pos = event->msg_pos;
++                      size_t part;
++
++                      do {
++                              part = len > 255 ? 255 : len;
++                              snprintf(line, part, "%s",
++                                      &channel->msg_buf.string[pos]);
++                              line[part] = '\0';
++                              fprintf(stdout, "%s", line);
++                              len -= part;
++                              pos += part;
++                      } while(0 < len);
++                      fprintf(stdout, "\n");
++              }
++      }
++      return 0;
++}
++
++static int print_guide(void)
++{
++      int i, j, k;
++
++      fprintf(stdout, "%s\n", separator);
++      for(i = 0; i < guide.num_channels; i++) {
++              struct atsc_channel_info *channel = &guide.ch[i];
++
++              fprintf(stdout, "%d.%d  %s\n", channel->major_num,
++                      channel->minor_num, channel->short_name);
++              for(j = 0; j < channel->num_eits; j++) {
++                      struct atsc_eit_info *eit = &channel->eit[j];
++
++                      for(k = 0; k < eit->num_eit_sections; k++) {
++                              struct atsc_eit_section_info *section =
++                                      &eit->section[k];
++                              if(print_events(channel, section)) {
++                                      fprintf(stderr, "%s(): error calling "
++                                              "print_events()\n", __FUNCTION__);
++                                      return -1;
++                              }
++                      }
++              }
++              fprintf(stdout, "%s\n", separator);
++      }
++
++      return 0;
++}
++
++static int open_demux(int *dmxfd)
++{
++      if((*dmxfd = dvbdemux_open_demux(adapter, 0, 0)) < 0) {
++              fprintf(stderr, "%s(): error calling dvbdemux_open_demux()\n",
++                      __FUNCTION__);
++              return -1;
++      }
++      return 0;
++}
++
++static int close_demux(int dmxfd)
++{
++      if(dvbdemux_stop(dmxfd)) {
++              fprintf(stderr, "%s(): error calling dvbdemux_stop()\n",
++                      __FUNCTION__);
++              return -1;
++      }
++      return 0;
++}
++
++/* used other utilities as template and generalized here */
++static int atsc_scan_table(int dmxfd, uint16_t pid, enum atsc_section_tag tag,
++      void **table_section)
++{
++      uint8_t filter[18];
++      uint8_t mask[18];
++      unsigned char sibuf[4096];
++      int size;
++      int ret;
++      struct pollfd pollfd;
++      struct section *section;
++      struct section_ext *section_ext;
++      struct atsc_section_psip *psip;
++
++      /* create a section filter for the table */
++      memset(filter, 0, sizeof(filter));
++      memset(mask, 0, sizeof(mask));
++      filter[0] = tag;
++      mask[0] = 0xFF;
++      if(dvbdemux_set_section_filter(dmxfd, pid, filter, mask, 1, 1)) {
++              fprintf(stderr, "%s(): error calling atsc_scan_table()\n",
++                      __FUNCTION__);
++              return -1;
++      }
++
++      /* poll for data */
++      pollfd.fd = dmxfd;
++      pollfd.events = POLLIN | POLLERR |POLLPRI;
++      if((ret = poll(&pollfd, 1, TIMEOUT * 1000)) < 0) {
++              if(ctrl_c) {
++                      return 0;
++              }
++              fprintf(stderr, "%s(): error calling poll()\n", __FUNCTION__);
++              return -1;
++      }
++
++      if(0 == ret) {
++              return 0;
++      }
++
++      /* read it */
++      if((size = read(dmxfd, sibuf, sizeof(sibuf))) < 0) {
++              fprintf(stderr, "%s(): error calling read()\n", __FUNCTION__);
++              return -1;
++      }
++
++      /* parse section */
++      section = section_codec(sibuf, size);
++      if(NULL == section) {
++              fprintf(stderr, "%s(): error calling section_codec()\n",
++                      __FUNCTION__);
++              return -1;
++      }
++
++      section_ext = section_ext_decode(section, 0);
++      if(NULL == section_ext) {
++              fprintf(stderr, "%s(): error calling section_ext_decode()\n",
++                      __FUNCTION__);
++              return -1;
++      }
++
++      psip = atsc_section_psip_decode(section_ext);
++      if(NULL == psip) {
++              fprintf(stderr,
++                      "%s(): error calling atsc_section_psip_decode()\n",
++                      __FUNCTION__);
++              return -1;
++      }
++
++      *table_section = table_callback[tag & 0x0F](psip);
++      if(NULL == *table_section) {
++              fprintf(stderr, "%s(): error decode table section\n",
++                      __FUNCTION__);
++              return -1;
++      }
++
++      return 1;
++}
++
++int main(int argc, char *argv[])
++{
++      int i, dmxfd;
++      struct dvbfe_handle *fe;
++
++      program = argv[0];
++
++      if(1 == argc) {
++              usage();
++              exit(-1);
++      }
++
++      for( ; ; ) {
++              char c;
++
++              if(-1 == (c = getopt(argc, argv, "a:f:p:m:th"))) {
++                      break;
++              }
++
++              switch(c) {
++              case 'a':
++                      adapter = strtoll(optarg, NULL, 0);
++                      break;
++
++              case 'f':
++                      frequency = strtol(optarg, NULL, 0);
++                      break;
++
++              case 'p':
++                      period = strtol(optarg, NULL, 0);
++                      /* each table covers 3 hours */
++                      if((3 * MAX_NUM_EVENT_TABLES) < period) {
++                              period = 3 * MAX_NUM_EVENT_TABLES;
++                      }
++                      break;
++
++              case 'm':
++                      /* just stub, so far ATSC only has VSB_8 */
++                      modulation = optarg;
++                      break;
++
++              case 't':
++                      enable_ett = 1;
++                      break;
++
++              case 'h':
++                      help();
++                      exit(0);
++
++              default:
++                      usage();
++                      exit(-1);
++              }
++      }
++
++      memset(separator, '-', sizeof(separator));
++      separator[79] = '\0';
++      memset(&guide, 0, sizeof(struct atsc_virtual_channels_info));
++      memset(guide.eit_pid, 0xFF, MAX_NUM_EVENT_TABLES * sizeof(uint16_t));
++      memset(guide.ett_pid, 0xFF, MAX_NUM_EVENT_TABLES * sizeof(uint16_t));
++
++      if(open_frontend(&fe)) {
++              fprintf(stderr, "%s(): error calling open_frontend()\n",
++                      __FUNCTION__);
++              return -1;
++      }
++
++      if(open_demux(&dmxfd)) {
++              fprintf(stderr, "%s(): error calling open_demux()\n",
++                      __FUNCTION__);
++              return -1;
++      }
++
++      if(parse_stt(dmxfd)) {
++              fprintf(stderr, "%s(): error calling parse_stt()\n",
++                      __FUNCTION__);
++              return -1;
++      }
++
++      if(parse_mgt(dmxfd)) {
++              fprintf(stderr, "%s(): error calling parse_mgt()\n",
++                      __FUNCTION__);
++              return -1;
++      }
++
++      if(parse_tvct(dmxfd)) {
++              fprintf(stderr, "%s(): error calling parse_tvct()\n",
++                      __FUNCTION__);
++              return -1;
++      }
++
++#ifdef ENABLE_RRT
++      if(parse_rrt(dmxfd)) {
++              fprintf(stderr, "%s(): error calling parse_rrt()\n",
++                      __FUNCTION__);
++              return -1;
++      }
++#endif
++
++      fprintf(stdout, "receiving EIT ");
++      for(i = 0; i < guide.ch[0].num_eits; i++) {
++              if(parse_eit(dmxfd, i, guide.eit_pid[i])) {
++                      fprintf(stderr, "%s(): error calling parse_eit()\n",
++                              __FUNCTION__);
++                      return -1;
++              }
++      }
++      fprintf(stdout, "\n");
++
++      old_handler = signal(SIGINT, int_handler);
++      if(enable_ett) {
++              fprintf(stdout, "receiving ETT ");
++              for(i = 0; i < guide.ch[0].num_eits; i++) {
++                      if(0xFFFF != guide.ett_pid[i]) {
++                              if(parse_ett(dmxfd, i, guide.ett_pid[i])) {
++                                      fprintf(stderr, "%s(): error calling "
++                                              "parse_eit()\n", __FUNCTION__);
++                                      return -1;
++                              }
++                      }
++                      if(ctrl_c) {
++                              break;
++                      }
++              }
++              fprintf(stdout, "\n");
++      }
++      signal(SIGINT, old_handler);
++
++      if(print_guide()) {
++              fprintf(stderr, "%s(): error calling print_guide()\n",
++                      __FUNCTION__);
++              return -1;
++      }
++
++      if(cleanup_guide()) {
++              fprintf(stderr, "%s(): error calling cleanup_guide()\n",
++                      __FUNCTION__);
++              return -1;
++      }
++
++      if(close_demux(dmxfd)) {
++              fprintf(stderr, "%s(): error calling close_demux()\n",
++                      __FUNCTION__);
++              return -1;
++      }
++
++      if(close_frontend(fe)) {
++              fprintf(stderr, "%s(): error calling close_demux()\n",
++                      __FUNCTION__);
++              return -1;
++      }
++
++      return 0;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/atsc_epg/Makefile dvb-apps/util/atsc_epg/Makefile
+--- linuxtv-dvb-apps-1.1.1/util/atsc_epg/Makefile      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/atsc_epg/Makefile    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,16 @@
++# Makefile for linuxtv.org dvb-apps/util/atsc_epg
++
++binaries = atsc_epg
++
++inst_bin = $(binaries)
++
++CPPFLAGS += -I../../lib -std=c99 -D_POSIX_SOURCE
++#LDFLAGS  += -static -L../../lib/libdvbapi -L../../lib/libucsi
++LDFLAGS  += -L../../lib/libdvbapi -L../../lib/libucsi
++LDLIBS   += -ldvbapi -lucsi
++
++.PHONY: all
++
++all: $(binaries)
++
++include ../../Make.rules
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/atsc_epg/README dvb-apps/util/atsc_epg/README
+--- linuxtv-dvb-apps-1.1.1/util/atsc_epg/README        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/atsc_epg/README      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,12 @@
++Hi there,
++
++atsc_epg is a small utility for obtaining information such as programs, EPG 
++(electronic program guide) from an ATSC channel. 
++
++Pulling the detailed information, i.e., option '-t', may take fairly long 
++time, or never ending, which is a bug of the PSIP generator. Ctrl+C can be 
++used to abort and the received parts will be printed.
++
++Enjoy,
++Yufei
++
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/av7110_loadkeys/activy.rcmm dvb-apps/util/av7110_loadkeys/activy.rcmm
+--- linuxtv-dvb-apps-1.1.1/util/av7110_loadkeys/activy.rcmm    2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/av7110_loadkeys/activy.rcmm  2009-06-21 13:29:06.000000000 +0200
+@@ -51,4 +51,3 @@
+ 0x31 KEY_STOP
+ 0x20 KEY_NEXT
+ 0x42 KEY_EJECTCD
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/av7110_loadkeys/av7110_loadkeys.c dvb-apps/util/av7110_loadkeys/av7110_loadkeys.c
+--- linuxtv-dvb-apps-1.1.1/util/av7110_loadkeys/av7110_loadkeys.c      2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/av7110_loadkeys/av7110_loadkeys.c    2009-06-21 13:29:06.000000000 +0200
+@@ -33,9 +33,10 @@
+ static
+ int parse_keyname (char *pos, char **nend, int limit)
+ {
+-      int cmp, index;
++      int cmp, _index;
+       int l = 1;
+-      int r = sizeof (key_name) / sizeof (key_name[0]);
++      const struct input_key_name *kn;
++      int r;
+       if (limit < 5)
+               return -1;
+@@ -46,7 +47,18 @@
+               limit--;
+       }
+-      if (pos [0] != 'K' || pos[1] != 'E' || pos[2] != 'Y' || pos[3] != '_')
++      if (pos[3] != '_')
++              return -2;
++
++      if (pos[0] == 'K' && pos[1] == 'E' && pos[2] == 'Y') {
++              kn = key_name;
++              r = sizeof (key_name) / sizeof (key_name[0]);
++      }
++      else if (pos[0] == 'B' && pos[1] == 'T' && pos[2] == 'N') {
++              kn = btn_name;
++              r = sizeof (btn_name) / sizeof (btn_name[0]);
++      }
++      else
+               return -2;
+       (*nend) += 4;
+@@ -56,21 +68,21 @@
+       while (r >= l) {
+               int len0, len1 = 0;
+-              index = (l + r) / 2;
+-              
+-              len0 = strlen(key_name[index-1].name);
++              _index = (l + r) / 2;
++
++              len0 = strlen(kn[_index-1].name);
+               while (len1 < limit && isgraph(pos[len1]))
+                       len1++;
+-              cmp = strncmp (key_name[index-1].name, pos,
+-                             strlen(key_name[index-1].name));
+-      
++              cmp = strncmp (kn[_index-1].name, pos,
++                             strlen(kn[_index-1].name));
++
+               if (len0 < len1 && cmp == 0)
+                       cmp = -1;
+               if (cmp == 0) {
+-                      *nend = pos + strlen (key_name[index-1].name);
++                      *nend = pos + strlen (kn[_index-1].name);
+                       if (**nend != '\n' &&
+                           **nend != '\t' &&
+@@ -78,13 +90,13 @@
+                           *nend != pos)
+                               return -3;
+-                      return key_name[index-1].key;
++                      return kn[_index-1].key;
+               }
+               if (cmp < 0)
+-                      l = index + 1;
++                      l = _index + 1;
+               else
+-                      r = index - 1;
++                      r = _index - 1;
+               if (r < l) {
+                       static const char msg [] = "\nunknown key '";
+@@ -151,18 +163,18 @@
+       while (pos < buf + len) {
+               int key, keycode;
+-              
++
+               while (!isxdigit(*pos) && pos < buf + len)
+                       pos++;
+               if (pos == buf + len)
+                       break;
+-              
++
+               key = strtol (pos, &pos, 0);
+               keycode = parse_keyname (pos, &pos, buf + len - pos);
+               if (key < 0 || key > 0xff) {
+-                      const char msg [] = 
++                      const char msg [] =
+                               "\nERROR: key must be in range 0 ... 0xff!\n\n";
+                       write (0, msg, strlen(msg));
+@@ -174,7 +186,7 @@
+               setup.keytab[key] = keycode;
+       }
+-      
++
+       munmap (buf, len);
+       close (fd);
+@@ -182,5 +194,3 @@
+       return 0;
+ }
+-
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/av7110_loadkeys/evtest.c dvb-apps/util/av7110_loadkeys/evtest.c
+--- linuxtv-dvb-apps-1.1.1/util/av7110_loadkeys/evtest.c       2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/av7110_loadkeys/evtest.c     1970-01-01 01:00:00.000000000 +0100
+@@ -1,177 +0,0 @@
+-/*
+- * $Id: evtest.c,v 1.1 2004/01/17 16:59:46 js Exp $
+- *
+- *  Copyright (c) 1999-2000 Vojtech Pavlik
+- *
+- *  Event device test program
+- */
+-
+-/*
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or 
+- * (at your option) any later version.
+- * 
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU General Public License for more details.
+- * 
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- * 
+- * Should you need to contact me, the author, you can do so either by
+- * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
+- * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
+- */
+-
+-#include <linux/input.h>
+-
+-#include <string.h>
+-#include <fcntl.h>
+-#include <unistd.h>
+-#include <stdio.h>
+-#include <stdlib.h>
+-
+-char *events[EV_MAX + 1] = { "Reset", "Key", "Relative", "Absolute", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+-NULL, NULL, NULL, "LED", "Sound", NULL, "Repeat", "ForceFeedback", NULL, "ForceFeedbackStatus"};
+-char *keys[KEY_MAX + 1] = { "Reserved", "Esc", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "Minus", "Equal", "Backspace",
+-"Tab", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "LeftBrace", "RightBrace", "Enter", "LeftControl", "A", "S", "D", "F", "G",
+-"H", "J", "K", "L", "Semicolon", "Apostrophe", "Grave", "LeftShift", "BackSlash", "Z", "X", "C", "V", "B", "N", "M", "Comma", "Dot",
+-"Slash", "RightShift", "KPAsterisk", "LeftAlt", "Space", "CapsLock", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10",
+-"NumLock", "ScrollLock", "KP7", "KP8", "KP9", "KPMinus", "KP4", "KP5", "KP6", "KPPlus", "KP1", "KP2", "KP3", "KP0", "KPDot", "103rd",
+-"F13", "102nd", "F11", "F12", "F14", "F15", "F16", "F17", "F18", "F19", "F20", "KPEnter", "RightCtrl", "KPSlash", "SysRq",
+-"RightAlt", "LineFeed", "Home", "Up", "PageUp", "Left", "Right", "End", "Down", "PageDown", "Insert", "Delete", "Macro", "Mute",
+-"VolumeDown", "VolumeUp", "Power", "KPEqual", "KPPlusMinus", "Pause", "F21", "F22", "F23", "F24", "KPComma", "LeftMeta", "RightMeta",
+-"Compose", "Stop", "Again", "Props", "Undo", "Front", "Copy", "Open", "Paste", "Find", "Cut", "Help", "Menu", "Calc", "Setup",
+-"Sleep", "WakeUp", "File", "SendFile", "DeleteFile", "X-fer", "Prog1", "Prog2", "WWW", "MSDOS", "Coffee", "Direction",
+-"CycleWindows", "Mail", "Bookmarks", "Computer", "Back", "Forward", "CloseCD", "EjectCD", "EjectCloseCD", "NextSong", "PlayPause",
+-"PreviousSong", "StopCD", "Record", "Rewind", "Phone", "ISOKey", "Config", "HomePage", "Refresh", "Exit", "Move", "Edit", "ScrollUp",
+-"ScrollDown", "KPLeftParenthesis", "KPRightParenthesis",
+-"International1", "International2", "International3", "International4", "International5",
+-"International6", "International7", "International8", "International9",
+-"Language1", "Language2", "Language3", "Language4", "Language5", "Language6", "Language7", "Language8", "Language9",
+-NULL, 
+-"PlayCD", "PauseCD", "Prog3", "Prog4", "Suspend", "Close",
+-NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+-NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+-NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+-"Btn0", "Btn1", "Btn2", "Btn3", "Btn4", "Btn5", "Btn6", "Btn7", "Btn8", "Btn9",
+-NULL, NULL,  NULL, NULL, NULL, NULL,
+-"LeftBtn", "RightBtn", "MiddleBtn", "SideBtn", "ExtraBtn", "ForwardBtn", "BackBtn",
+-NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+-"Trigger", "ThumbBtn", "ThumbBtn2", "TopBtn", "TopBtn2", "PinkieBtn",
+-"BaseBtn", "BaseBtn2", "BaseBtn3", "BaseBtn4", "BaseBtn5", "BaseBtn6",
+-NULL, NULL, NULL, "BtnDead",
+-"BtnA", "BtnB", "BtnC", "BtnX", "BtnY", "BtnZ", "BtnTL", "BtnTR", "BtnTL2", "BtnTR2", "BtnSelect", "BtnStart", "BtnMode",
+-"BtnThumbL", "BtnThumbR", NULL,
+-"ToolPen", "ToolRubber", "ToolBrush", "ToolPencil", "ToolAirbrush", "ToolFinger", "ToolMouse", "ToolLens", NULL, NULL,
+-"Touch", "Stylus", "Stylus2", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
+-"Ok", "Select", "Goto", "Clear", "Power2", "Option", "Info", "Time", "Vendor",
+-"Archive", "Program", "Channel", "Favorites", "EPG", "PVR", "MHP", "Language",
+-"Title", "Subtitle", "Angle", "Zoom", "Mode", "Keyboard", "Screen", "PC", "TV",
+-"TV2", "VCR", "VCR2", "Sat", "Sat2", "CD", "Tape", "Radio", "Tuner", "Player", 
+-"Text", "DVD", "Aux", "MP3", "Audio", "Video", "Directory", "List", "Memo",
+-"Calendar", "Red", "Green", "Yellow", "Blue", "ChannelUp", "ChannelDown", 
+-"First", "Last", "AB", "Play", "Restart", "Slow", "Shuffle", "FastForward", 
+-"Previous", "Next", "Digits", "Teen", "Twen", "Break" };
+-
+-char *absval[5] = { "Value", "Min  ", "Max  ", "Fuzz ", "Flat " };
+-char *relatives[REL_MAX + 1] = { "X", "Y", "Z", NULL, NULL, NULL, "HWheel", "Dial", "Wheel" };
+-char *absolutes[ABS_MAX + 1] = { "X", "Y", "Z", "Rx", "Ry", "Rz", "Throttle", "Rudder", "Wheel", "Gas", "Brake",
+-NULL, NULL, NULL, NULL, NULL,
+-"Hat0X", "Hat0Y", "Hat1X", "Hat1Y", "Hat2X", "Hat2Y", "Hat3X", "Hat 3Y", "Pressure", "Distance", "XTilt", "YTilt"};
+-char *leds[LED_MAX + 1] = { "NumLock", "CapsLock", "ScrollLock", "Compose", "Kana", "Sleep", "Suspend", "Mute" };
+-char *repeats[REP_MAX + 1] = { "Delay", "Period" };
+-char *sounds[SND_MAX + 1] = { "Bell", "Click" };
+-
+-char **names[EV_MAX + 1] = { events, keys, relatives, absolutes, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+-NULL, NULL, leds, sounds, NULL, repeats, NULL, NULL, NULL };
+-
+-#define BITS_PER_LONG (sizeof(long) * 8)
+-#define NBITS(x) ((((x)-1)/BITS_PER_LONG)+1)
+-#define OFF(x)  ((x)%BITS_PER_LONG)
+-#define BIT(x)  (1UL<<OFF(x))
+-#define LONG(x) ((x)/BITS_PER_LONG)
+-#define test_bit(bit, array)  ((array[LONG(bit)] >> OFF(bit)) & 1)
+-
+-int main (int argc, char **argv)
+-{
+-      int fd, rd, i, j, k;
+-      struct input_event ev[64];
+-      int version;
+-      unsigned short id[4];
+-      unsigned long bit[EV_MAX][NBITS(KEY_MAX)];
+-      char name[256] = "Unknown";
+-      int abs[5];
+-
+-      if (argc < 2) {
+-              printf("Usage: evtest /dev/input/eventX\n");
+-              printf("Where X = input device number\n");
+-              exit(1);
+-      }
+-
+-      if ((fd = open(argv[argc - 1], O_RDONLY)) < 0) {
+-              perror("evtest");
+-              exit(1);
+-      }
+-
+-      if (ioctl(fd, EVIOCGVERSION, &version)) {
+-              perror("evtest: can't get version");
+-              exit(1);
+-      }
+-
+-      printf("Input driver version is %d.%d.%d\n",
+-              version >> 16, (version >> 8) & 0xff, version & 0xff);
+-
+-      ioctl(fd, EVIOCGID, id);
+-      printf("Input device ID: bus 0x%x vendor 0x%x product 0x%x version 0x%x\n",
+-              id[ID_BUS], id[ID_VENDOR], id[ID_PRODUCT], id[ID_VERSION]);
+-
+-      ioctl(fd, EVIOCGNAME(sizeof(name)), name);
+-      printf("Input device name: \"%s\"\n", name);
+-
+-      memset(bit, 0, sizeof(bit));
+-      ioctl(fd, EVIOCGBIT(0, EV_MAX), bit[0]);
+-      printf("Supported events:\n");
+-
+-      for (i = 0; i < EV_MAX; i++)
+-              if (test_bit(i, bit[0])) {
+-                      printf("  Event type %d (%s)\n", i, events[i] ? events[i] : "?");
+-                      ioctl(fd, EVIOCGBIT(i, KEY_MAX), bit[i]);
+-                      for (j = 0; j < KEY_MAX; j++) 
+-                              if (test_bit(j, bit[i])) {
+-                                      printf("    Event code %d (%s)\n", j, names[i] ? (names[i][j] ? names[i][j] : "?") : "?");
+-                                      if (i == EV_ABS) {
+-                                              ioctl(fd, EVIOCGABS(j), abs);
+-                                              for (k = 0; k < 5; k++)
+-                                                      if ((k < 3) || abs[k])
+-                                                              printf("      %s %6d\n", absval[k], abs[k]);
+-                                      }
+-                              }
+-              }
+-              
+-
+-      printf("Testing ... (interrupt to exit)\n");
+-
+-      while (1) {
+-              rd = read(fd, ev, sizeof(struct input_event) * 64);
+-
+-              if (rd < (int) sizeof(struct input_event)) {
+-                      printf("yyy\n");
+-                      perror("\nevtest: error reading");
+-                      exit (1);
+-              }
+-
+-              for (i = 0; i < rd / sizeof(struct input_event); i++)
+-                      printf("Event: time %ld.%06ld, type %d (%s), code %d (%s), value %d\n",
+-                              ev[i].time.tv_sec, ev[i].time.tv_usec, ev[i].type,
+-                              events[ev[i].type] ? events[ev[i].type] : "?",
+-                              ev[i].code,
+-                              names[ev[i].type] ? (names[ev[i].type][ev[i].code] ? names[ev[i].type][ev[i].code] : "?") : "?",
+-                              ev[i].value);
+-
+-      }
+-}
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/av7110_loadkeys/galaxis.rcmm dvb-apps/util/av7110_loadkeys/galaxis.rcmm
+--- linuxtv-dvb-apps-1.1.1/util/av7110_loadkeys/galaxis.rcmm   2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/av7110_loadkeys/galaxis.rcmm 2009-06-21 13:29:06.000000000 +0200
+@@ -37,7 +37,7 @@
+ 0x6e KEY_GREEN
+ 0x6f KEY_YELLOW
+ 0x70 KEY_BLUE
+-      
++
+ 0x78 KEY_MENU
+ 0x79 KEY_LIST
+ 0xcc KEY_EPG
+@@ -48,4 +48,3 @@
+ 0xc7 KEY_DOWN
+ 0xff KEY_VCR
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/av7110_loadkeys/generate-keynames.sh dvb-apps/util/av7110_loadkeys/generate-keynames.sh
+--- linuxtv-dvb-apps-1.1.1/util/av7110_loadkeys/generate-keynames.sh   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/av7110_loadkeys/generate-keynames.sh 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,37 @@
++# Makefile helper for linuxtv.org dvb-apps/util/av7110_loadkeys
++
++echo "generate $1..."
++echo "#ifndef INPUT_KEYNAMES_H" > $1
++echo "#define INPUT_KEYNAMES_H" >> $1
++echo >> $1
++echo "#include <linux/input.h>" >> $1
++echo >> $1
++echo "#if !defined(KEY_OK)" >> $1
++echo "#include \"input_fake.h\"" >> $1
++echo "#endif" >> $1
++echo >> $1
++echo >> $1
++echo "struct input_key_name {" >> $1
++echo "        const char *name;" >> $1
++echo "        int         key;" >> $1
++echo "};" >> $1
++echo >> $1
++echo >> $1
++echo "static struct input_key_name key_name [] = {" >> $1
++for x in $(cat /usr/include/linux/input.h input_fake.h | \
++           egrep "#define[ \t]+KEY_" | grep -v KEY_MAX | \
++           cut -f 1 | cut -f 2 -d " " | sort -u) ; do
++    echo "        { \"$(echo $x | cut -b 5-)\", $x }," >> $1
++done
++echo "};" >> $1
++echo >> $1
++echo "static struct input_key_name btn_name [] = {" >> $1
++for x in $(cat /usr/include/linux/input.h input_fake.h | \
++           egrep "#define[ \t]+BTN_" | \
++           cut -f 1 | cut -f 2 -d " " | sort -u) ; do
++     echo "        { \"$(echo $x | cut -b 5-)\", $x }," >> $1
++done
++echo "};" >> $1
++echo >> $1
++echo "#endif /* INPUT_KEYNAMES_H */" >> $1
++echo >> $1
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/av7110_loadkeys/hauppauge2.rc5 dvb-apps/util/av7110_loadkeys/hauppauge2.rc5
+--- linuxtv-dvb-apps-1.1.1/util/av7110_loadkeys/hauppauge2.rc5 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/av7110_loadkeys/hauppauge2.rc5       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,40 @@
++0x00 KEY_0
++0x01 KEY_1
++0x02 KEY_2
++0x03 KEY_3
++0x04 KEY_4
++0x05 KEY_5
++0x06 KEY_6
++0x07 KEY_7
++0x08 KEY_8
++0x09 KEY_9
++
++0x10 KEY_VOLUMEUP
++0x11 KEY_VOLUMEDOWN
++0x1e KEY_VENDOR
++
++0x20 KEY_CHANNELUP
++0x21 KEY_CHANNELDOWN
++0x22 KEY_SELECT
++0x26 KEY_CYCLEWINDOWS
++
++0x3d KEY_POWER
++0x3b KEY_GOTO
++0x1f KEY_BACK
++0x0d KEY_MENU
++0x0b KEY_RED
++0x2e KEY_GREEN
++0x38 KEY_YELLOW
++0x25 KEY_OK
++0x29 KEY_BLUE
++0x0f KEY_MUTE
++0x0c KEY_AUX
++0x3c KEY_SCREEN
++0x32 KEY_REWIND
++0x35 KEY_PLAY
++0x34 KEY_FORWARD
++0x37 KEY_RECORD
++0x36 KEY_STOP
++0x30 KEY_PAUSE
++0x24 KEY_LEFT
++0x1e KEY_RIGHT
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/av7110_loadkeys/hauppauge_grey.rc5 dvb-apps/util/av7110_loadkeys/hauppauge_grey.rc5
+--- linuxtv-dvb-apps-1.1.1/util/av7110_loadkeys/hauppauge_grey.rc5     2004-02-01 12:50:15.000000000 +0100
++++ dvb-apps/util/av7110_loadkeys/hauppauge_grey.rc5   2009-06-21 13:29:06.000000000 +0200
+@@ -1,4 +1,3 @@
+-
+ 0x3d KEY_POWER
+ 0x3b KEY_GOTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/av7110_loadkeys/hauppauge.rc5 dvb-apps/util/av7110_loadkeys/hauppauge.rc5
+--- linuxtv-dvb-apps-1.1.1/util/av7110_loadkeys/hauppauge.rc5  2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/av7110_loadkeys/hauppauge.rc5        2009-06-21 13:29:06.000000000 +0200
+@@ -22,4 +22,3 @@
+ 0x22 KEY_SELECT
+ 0x26 KEY_CYCLEWINDOWS
+ 0x2e KEY_SCREEN
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/av7110_loadkeys/input_fake.h dvb-apps/util/av7110_loadkeys/input_fake.h
+--- linuxtv-dvb-apps-1.1.1/util/av7110_loadkeys/input_fake.h   2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/av7110_loadkeys/input_fake.h 2009-06-21 13:29:06.000000000 +0200
+@@ -7,7 +7,7 @@
+ #if !defined(KEY_OK)
+ /**
+- *  define some additional remote control keys in case they 
++ *  define some additional remote control keys in case they
+  *  were not already defined above in <linux/input.h>
+  */
+@@ -66,19 +66,16 @@
+ #define KEY_FIRST        0x194
+ #define KEY_LAST         0x195
+ #define KEY_AB           0x196
+-#define KEY_PLAY         0x197
++#define KEY_NEXT         0x197
+ #define KEY_RESTART      0x198
+ #define KEY_SLOW         0x199
+ #define KEY_SHUFFLE      0x19a
+-#define KEY_FASTFORWARD  0x19b
++#define KEY_BREAK        0x19b
+ #define KEY_PREVIOUS     0x19c
+-#define KEY_NEXT         0x19d
+-#define KEY_DIGITS       0x19e
+-#define KEY_TEEN         0x19f
+-#define KEY_TWEN         0x1a0
+-#define KEY_BREAK        0x1a1
++#define KEY_DIGITS       0x19d
++#define KEY_TEEN         0x19e
++#define KEY_TWEN         0x19f
+ #endif  /* !defined(KEY_OK)  */
+ #endif  /* _INPUT_FAKE_H */
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/av7110_loadkeys/Makefile dvb-apps/util/av7110_loadkeys/Makefile
+--- linuxtv-dvb-apps-1.1.1/util/av7110_loadkeys/Makefile       2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/av7110_loadkeys/Makefile     2009-06-21 13:29:06.000000000 +0200
+@@ -1,48 +1,23 @@
+-CC = gcc
+-CFLAGS = -g -Wall -O2
+-
+-all: av7110_loadkeys evtest
++# Makefile for linuxtv.org dvb-apps/util/av7110_loadkeys
+-av7110_loadkeys: av7110_loadkeys.o
++binaries = av7110_loadkeys
+-evtest: evtest.o
++inst_bin = $(binaries)
+-av7110_loadkeys.o: av7110_loadkeys.c input_keynames.h
++removing = input_keynames.h
+-evtest.o: evtest.c input_keynames.h
++.PHONY: all
++all: $(binaries)
+-input_keynames.h: /usr/include/linux/input.h input_fake.h
+-      @echo 'generate $@...'
+-      @echo '#ifndef __INPUT_KEYNAMES_H__' > $@
+-      @echo '#define __INPUT_KEYNAMES_H__' >> $@
+-      @echo '' >> $@
+-      @echo '#include <linux/input.h>' >> $@
+-      @echo '' >> $@
+-      @echo '#if !defined(KEY_OK)' >> $@
+-      @echo '#include "input_fake.h"' >> $@
+-      @echo '#endif' >> $@
+-      @echo '' >> $@
+-      @echo '' >> $@
+-      @echo 'struct input_key_name {' >> $@
+-      @echo '        const char *name;' >> $@
+-      @echo '        int         key;' >> $@
+-      @echo '};' >> $@
+-      @echo '' >> $@
+-      @echo '' >> $@
+-      @echo 'static struct input_key_name key_name [] = {' >> $@
+-      @for x in `cat /usr/include/linux/input.h input_fake.h | \
+-                grep KEY_ | grep "#define" | grep -v KEY_MAX | \
+-                cut -f 1 | cut -f 2 -d ' ' | sort | uniq` ; do \
+-              echo "        { \"`echo $$x | cut -b 5-`\", $$x }," >> $@ \
+-              ; \
+-      done
+-      @echo '};' >> $@
+-      @echo '' >> $@
+-      @echo '#endif  /* __INPUT_KEYNAMES_H */' >> $@
+-      @echo '' >> $@
++$(binaries): input_keynames.h
++input_keynames.h:
++      $(SHELL) generate-keynames.sh $@
+-clean:
+-      $(RM) core* *.o input_keynames.h av7110_loadkeys evtest
++include ../../Make.rules
++install::
++      @echo installing av7110 keymaps
++      @mkdir -p $(DESTDIR)$(sharedir)/dvb/av7110_loadkeys
++      @install -m 644 *.rc5 *.rcmm $(DESTDIR)$(sharedir)/dvb/av7110_loadkeys/
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/av7110_loadkeys/philips1358.rc5 dvb-apps/util/av7110_loadkeys/philips1358.rc5
+--- linuxtv-dvb-apps-1.1.1/util/av7110_loadkeys/philips1358.rc5        2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/av7110_loadkeys/philips1358.rc5      2009-06-21 13:29:06.000000000 +0200
+@@ -26,12 +26,12 @@
+ 0x2B KEY_PAUSE
+ 0x2C KEY_REWIND
+ 0x2D KEY_F4
+-0x2E KEY_F3 
++0x2E KEY_F3
+ 0x32 KEY_YELLOW
+ 0x34 KEY_BLUE
+ 0x36 KEY_GREEN
+ 0x37 KEY_RED
+ 0x38 KEY_AUX
+-0x3C KEY_F2 
++0x3C KEY_F2
+ 0x3D KEY_SCREEN
+-0x3F KEY_F1 
+\ No newline at end of file
++0x3F KEY_F1
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/av7110_loadkeys/README dvb-apps/util/av7110_loadkeys/README
+--- linuxtv-dvb-apps-1.1.1/util/av7110_loadkeys/README 2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/av7110_loadkeys/README       2009-06-21 13:29:06.000000000 +0200
+@@ -1,13 +1,13 @@
+ Hi,
+-this is a utility to setup IR control keymaps using the /proc/av7110_ir 
++this is a utility to setup IR control keymaps using the /proc/av7110_ir
+ interface.
+-just call 
++just call
+    # ./av7110_loadkeys [-i|--invert] [-a|--address <num>] keymapname.(rc5|rcmm) > /proc/av7110_ir
+-If your IR receiver hardware inverts the signal, you should use the -i 
++If your IR receiver hardware inverts the signal, you should use the -i
+ or --invert command line option.
+ If you have two or more devices which use the same IR protocol, you should
+@@ -42,7 +42,7 @@
+ ------------------------------------------------------------------------
+-In order to write a new keymap you might want to see the raw key 
++In order to write a new keymap you might want to see the raw key
+ values in the kernel log. Use
+    # insmod dvb-ttpci.o av7110_ir_debug=1
+@@ -52,13 +52,12 @@
+ any messages in your kernel log you should check all electrical connections,
+ the selected protocol (RC5 or RCMM?) and the inversion setting.
+-You find a list of all linux input key identifiers in </usr/include/input.h> 
++You find a list of all linux input key identifiers in </usr/include/input.h>
+ and "./input_fake.h".
+-Please post new keymaps on the linux-dvb mailing list or send them to 
++Please post new keymaps on the linux-dvb mailing list or send them to
+ me <holger@convergence.de>.
+-have fun! 
++have fun!
+ Holger
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/av7110_loadkeys/technotrend.rc5 dvb-apps/util/av7110_loadkeys/technotrend.rc5
+--- linuxtv-dvb-apps-1.1.1/util/av7110_loadkeys/technotrend.rc5        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/av7110_loadkeys/technotrend.rc5      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,41 @@
++0x22 KEY_EPG
++0x1a KEY_RADIO
++0x19 KEY_TEXT
++
++0x0c KEY_0
++0x03 KEY_1
++0x04 KEY_2
++0x05 KEY_3
++0x06 KEY_4
++0x07 KEY_5
++0x08 KEY_6
++0x09 KEY_7
++0x0a KEY_8
++0x0b KEY_9
++
++0x0d KEY_UP
++0x11 KEY_DOWN
++0x25 KEY_VOLUMEUP
++0x26 KEY_VOLUMEDOWN
++
++0x23 KEY_CHANNELUP
++0x24 KEY_CHANNELDOWN
++
++0x01 KEY_POWER
++0x13 KEY_BACK
++0x02 KEY_MENU
++0x14 KEY_RED
++0x15 KEY_GREEN
++0x16 KEY_YELLOW
++0x0f KEY_OK
++0x17 KEY_BLUE
++0x18 KEY_MUTE
++0x3d KEY_REWIND
++0x3b KEY_PLAY
++0x3f KEY_FORWARD
++0x3a KEY_RECORD
++0x3c KEY_STOP
++0x3e KEY_PAUSE
++0x0e KEY_LEFT
++0x10 KEY_RIGHT
++0x12 KEY_INFO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/dib3000-watch/dib3000.h dvb-apps/util/dib3000-watch/dib3000.h
+--- linuxtv-dvb-apps-1.1.1/util/dib3000-watch/dib3000.h        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/dib3000-watch/dib3000.h      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,56 @@
++#ifndef __DIB3000_H__
++#define __DIB3000_H__
++
++/* most of this is taken from dib3000-common.h, dib3000mc_priv.h and dib3000mb_priv.h */
++
++#define DIB3000_REG_MANUFACTOR_ID       (  1025)
++#define DIB3000_I2C_ID_DIBCOM           (0x01b3)
++
++#define DIB3000_REG_DEVICE_ID           (  1026)
++#define DIB3000MB_DEVICE_ID             (0x3000)
++#define DIB3000MC_DEVICE_ID             (0x3001)
++#define DIB3000P_DEVICE_ID              (0x3002)
++
++/* dib3000mb_priv.h */
++
++#define DIB3000MB_REG_DDS_INV           (     5)
++#define DIB3000MB_REG_AGC_LOCK          (   324)
++#define DIB3000MB_REG_CARRIER_LOCK      (   355)
++#define DIB3000MB_REG_TPS_LOCK          (   394)
++#define DIB3000MB_REG_VIT_LCK           (   421)
++#define DIB3000MB_REG_TS_SYNC_LOCK      (   423)
++#define DIB3000MB_REG_TS_RS_LOCK        (   424)
++
++#define DIB3000MB_REG_DDS_FREQ_MSB      (     6)
++#define DIB3000MB_REG_DDS_FREQ_LSB      (     7)
++#define DIB3000MB_REG_DDS_VALUE_MSB     (   339)
++#define DIB3000MB_REG_DDS_VALUE_LSB     (   340)
++
++#define DIB3000MB_REG_BER_MSB           (   414)
++#define DIB3000MB_REG_BER_LSB           (   415)
++#define DIB3000MB_REG_PACKET_ERROR_RATE (   417)
++#define DIB3000MB_REG_UNC               (   420)
++
++#define DIB3000MB_REG_FFT_WINDOW_POS    (   353)
++#define DIB3000MB_REG_TPS_FFT                 (   404)
++
++#define DIB3000MB_REG_NOISE_POWER_MSB (   372)
++#define DIB3000MB_REG_NOISE_POWER_LSB (   373)
++
++#define DIB3000MB_REG_SIGNAL_POWER            (   380)
++
++#define DIB3000MB_REG_MER_MSB                 (   381)
++#define DIB3000MB_REG_MER_LSB                 (   382)
++
++#define DIB3000MB_REG_AGC_POWER                       (   325)
++#define DIB3000MB_REG_RF_POWER                        (   328)
++
++#define DIB3000MB_REG_TIMING_OFFSET_MSB (   341)
++#define DIB3000MB_REG_TIMING_OFFSET_LSB (   342)
++
++#define DEF_agc_ref_dB     -14
++#define DEF_gain_slope_dB  100
++#define DEF_gain_delta_dB  -2
++#define DEF_SampFreq_KHz     27700
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/dib3000-watch/dib3000-watch.c dvb-apps/util/dib3000-watch/dib3000-watch.c
+--- linuxtv-dvb-apps-1.1.1/util/dib3000-watch/dib3000-watch.c  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/dib3000-watch/dib3000-watch.c        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,296 @@
++/*
++ * Tool for watching the dib3000*-demodulators,
++ * with an extended output.
++ *
++ * Copyright (C) 2005 by Patrick Boettcher <patrick.boettcher@desy.de>
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * as published by the Free Software Foundation; either version 2
++ * of the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
++ * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
++ */
++#include <stdio.h>
++#include <string.h>
++#include <errno.h>
++#include <stdlib.h>
++#include <unistd.h>
++#include <ctype.h>
++
++#include <getopt.h>
++
++#include <signal.h>
++
++#include <math.h>
++
++#include <fcntl.h>
++
++#include <sys/types.h>
++#include <sys/stat.h>
++#include <sys/ioctl.h>
++
++#include <linux/types.h>
++
++#include "dib-i2c.h"
++#include "dib3000-watch.h"
++#include "dib3000.h"
++
++void usage (void)
++{
++      verb("usage: dib3000-watch -d <i2c-device> -a <i2c-address> [-o <type>] [-i <seconds>]\n"
++               "   -d    normally one of /dev/i2c-[0-255]\n"
++               "   -a    is 8 for DiB3000M-B and 9, 10, 11 or 12 for DiB3000M-C or DiB3000-P\n"
++               "   -o    output type (print|csv) (default: print)\n"
++               "   -i    query interval in seconds (default: 0.1)\n"
++               "\n"
++               "Don't forget to run tzap or any other dvb-tune program (vdr, kaxtv) in order to tune a channel,\n"
++               "tuning isn't done by this tool.\n"
++               "\n"
++               "A lot of thing have been taken for the dibusb, dib3000m[bc] driver from kernel and\n"
++               "from t_demod-test software created by DiBcom. Both is GPL, so is dib-demod-watch.\n"
++               "\n"
++               "Copyright (C) 2005 by Patrick Boettcher <patrick.boettcher@desy.de>\n"
++               "\n"
++               "The source of this tool is released under the GPL.\n"
++      );
++      exit(1);
++}
++
++__u16 dib_read_reg(struct dib_demod *dib,__u16 reg)
++{
++      int ret;
++      __u8 wb[] = { ((reg >> 8) | 0x80) & 0xff, reg & 0xff };
++      __u8 rb[2];
++      struct i2c_msg msg[] = {
++              { .addr = dib->i2c_addr, .flags = 0,        .buf = wb, .len = 2 },
++              { .addr = dib->i2c_addr, .flags = I2C_M_RD, .buf = rb, .len = 2 },
++      };
++      struct i2c_rdwr_ioctl_data i2c_data = {
++              .msgs  = msg,
++              .nmsgs = 2,
++      };
++
++      if ((ret = ioctl(dib->fd,I2C_RDWR,&i2c_data)) != 2) {
++              err("i2c_rdwr read failed. (%d)\n",ret);
++              return 0;
++      }
++      return (rb[0] << 8)| rb[1];
++};
++
++int dib_write_reg(struct dib_demod *dib, __u16 reg, __u16 val)
++{
++      int ret;
++      __u8 b[] = {
++              (reg >> 8) & 0xff, reg & 0xff,
++              (val >> 8) & 0xff, val & 0xff,
++      };
++      struct i2c_msg msg[] = {
++              { .addr = dib->i2c_addr, .flags = 0, .buf = b, .len = 4 }
++      };
++      struct i2c_rdwr_ioctl_data i2c_data = {
++              .msgs  = msg,
++              .nmsgs = 1,
++      };
++
++      if ((ret = ioctl(dib->fd,I2C_RDWR,&i2c_data)) != 1) {
++              err("i2c_rdwr write failed. (%d)\n",ret);
++              return -1;
++      }
++      return 0;
++}
++
++int dib3000mb_monitoring(struct dib_demod *dib,struct dib3000mb_monitoring *m)
++{
++      int dds_freq, p_dds_freq,
++              n_agc_power = dib_read_reg(dib,DIB3000MB_REG_AGC_POWER),
++              rf_power = dib_read_reg(dib,DIB3000MB_REG_RF_POWER),
++              timing_offset;
++      double ad_power_dB, minor_power;
++
++      m->invspec = dib_read_reg(dib,DIB3000MB_REG_DDS_INV);
++      m->nfft = dib_read_reg(dib,DIB3000MB_REG_TPS_FFT);
++
++      m->agc_lock = dib_read_reg(dib,DIB3000MB_REG_AGC_LOCK);
++      m->carrier_lock = dib_read_reg(dib,DIB3000MB_REG_CARRIER_LOCK);
++      m->tps_lock = dib_read_reg(dib,DIB3000MB_REG_TPS_LOCK);
++      m->vit_lock = dib_read_reg(dib,DIB3000MB_REG_VIT_LCK);
++      m->ts_sync_lock = dib_read_reg(dib,DIB3000MB_REG_TS_SYNC_LOCK);
++      m->ts_data_lock = dib_read_reg(dib,DIB3000MB_REG_TS_RS_LOCK);
++
++      p_dds_freq = ((dib_read_reg(dib,DIB3000MB_REG_DDS_FREQ_MSB) & 0xff) << 8) |
++                               ((dib_read_reg(dib,DIB3000MB_REG_DDS_FREQ_LSB) & 0xff00) >> 8);
++      dds_freq =   ((dib_read_reg(dib,DIB3000MB_REG_DDS_VALUE_MSB) & 0xff) << 8) |
++                               ((dib_read_reg(dib,DIB3000MB_REG_DDS_VALUE_LSB) & 0xff00) >> 8);
++      if (m->invspec)
++              dds_freq = (1 << 16) - dds_freq;
++      m->carrier_offset = (double)(dds_freq - p_dds_freq) / (double)(1 << 16) * DEF_SampFreq_KHz;
++
++      m->ber = (double)((dib_read_reg(dib,DIB3000MB_REG_BER_MSB) << 16) | dib_read_reg(dib,DIB3000MB_REG_BER_LSB)) / (double) 1e8;
++      m->per = dib_read_reg(dib,DIB3000MB_REG_PACKET_ERROR_RATE);
++      m->unc = dib_read_reg(dib,DIB3000MB_REG_UNC);
++      m->fft_pos = dib_read_reg(dib,DIB3000MB_REG_FFT_WINDOW_POS);
++      m->snr = 10.0 * log10( (double)(dib_read_reg(dib,DIB3000MB_REG_SIGNAL_POWER) << 8) /
++              (double)((dib_read_reg(dib,DIB3000MB_REG_NOISE_POWER_MSB) << 16) + dib_read_reg(dib,DIB3000MB_REG_NOISE_POWER_LSB)));
++
++      m->mer = (double) ((dib_read_reg(dib,DIB3000MB_REG_MER_MSB) << 16) + dib_read_reg(dib,DIB3000MB_REG_MER_LSB))
++              / (double) (1<<9) / (m->nfft ? 767.0 : 191.0);
++
++      if (n_agc_power == 0)
++              n_agc_power = 1;
++      ad_power_dB = 10 * log10( (double)(n_agc_power) / (double)(1<<16));
++      minor_power = ad_power_dB - DEF_agc_ref_dB ;
++      m->rf_power = -DEF_gain_slope_dB * (double)rf_power/(double)(1<<16) + DEF_gain_delta_dB + minor_power;
++
++      timing_offset =
++              (dib_read_reg(dib,DIB3000MB_REG_TIMING_OFFSET_MSB) << 16) + dib_read_reg(dib,DIB3000MB_REG_TIMING_OFFSET_LSB);
++      if (timing_offset >= 0x800000)
++              timing_offset |= 0xff000000;
++      m->timing_offset_ppm = -(double)timing_offset / (double)(m->nfft ? 8192 : 2048) * 1e6 / (double)(1<<20);
++
++      return 0;
++}
++
++int dib3000mb_print_monitoring(struct dib3000mb_monitoring *m)
++{
++      printf("DiB3000M-B status\n\n");
++      printf(" AGC lock:                 %10d\n",m->agc_lock);
++      printf(" carrier lock:             %10d\n",m->carrier_lock);
++      printf(" TPS synchronize lock:     %10d\n",m->tps_lock);
++      printf(" Viterbi lock:             %10d\n",m->vit_lock);
++      printf(" MPEG TS synchronize lock: %10d\n",m->ts_sync_lock);
++      printf(" MPEG TS data lock:        %10d\n",m->ts_data_lock);
++      printf("\n\n");
++      printf(" spectrum inversion:       %10d\n",m->invspec);
++      printf(" carrier offset:           %3.7g\n",m->carrier_offset);
++      printf("\n\n");
++      printf(" bit error rate:           %3.7g\n",m->ber);
++      printf(" packet error rate:        %10d\n",m->per);
++      printf(" packet error count:       %10d\n",m->unc);
++      printf("\n\n");
++      printf(" fft position:             %10d\n",m->fft_pos);
++      printf(" transmission mode:        %10s\n",m->nfft ? "8k" : "2k");
++      printf("\n\n");
++      printf(" C / (N + I) =             %3.7g\n",m->snr);
++      printf(" MER  =                    %3.7g dB\n",m->mer);
++      printf(" RF power =                %3.7g dBm\n",m->rf_power);
++      printf(" timing offset =           %3.7g ppm\n",m->timing_offset_ppm);
++      return 0;
++}
++
++int interrupted;
++
++void sighandler (int sig)
++{
++      (void)sig;
++      interrupted = 1;
++}
++
++typedef enum {
++      OUT_PRINT = 0,
++      OUT_CSV,
++} dib3000m_output_t;
++
++int main (int argc, char * const argv[])
++{
++      struct dib_demod dib;
++      struct dib3000mb_monitoring mon;
++      const char *dev = NULL;
++      float intervall = 0.1;
++      dib3000m_output_t out = OUT_PRINT;
++      int c;
++
++      while ((c = getopt(argc,argv,"d:a:o:i:")) != -1) {
++              switch (c) {
++                      case 'd':
++                              dev = optarg;
++                              break;
++                      case 'a':
++                              dib.i2c_addr = atoi(optarg); /* The I2C address */
++                              break;
++                      case 'o':
++                                   if (strcasecmp(optarg,"print") == 0) out = OUT_PRINT;
++                              else if (strcasecmp(optarg,"csv") == 0)   out = OUT_CSV;
++                              else usage();
++                              break;
++                      case 'i':
++                              intervall = atof(optarg);
++                              break;
++                      default:
++                              usage();
++              }
++      }
++
++      if (dev == NULL)
++              usage();
++
++      interrupted = 0;
++      signal(SIGINT, sighandler);
++      signal(SIGKILL, sighandler);
++      signal(SIGHUP, sighandler);
++
++      verb("will use '%s' as i2c-device and %d as i2c address.\n",dev,dib.i2c_addr);
++
++      if ((dib.fd = open(dev,O_RDWR)) < 0) {
++              err("could not open %s\n",dev);
++              exit(1);
++      }
++
++    if (ioctl(dib.fd,I2C_SLAVE,dib.i2c_addr) < 0) {
++              err("could not set i2c address\n");
++              exit(1);
++      }
++
++      if (dib_read_reg(&dib,DIB3000_REG_MANUFACTOR_ID) != DIB3000_I2C_ID_DIBCOM) {
++              err("could not find a dib3000 demodulator at i2c-address %d\n",dib.i2c_addr);
++              exit(1);
++      }
++
++      switch (dib_read_reg(&dib,DIB3000_REG_DEVICE_ID)) {
++              case DIB3000MB_DEVICE_ID:
++                      verb("found a DiB3000M-B demodulator.\n");
++                      dib.rev = DIB3000MB;
++                      break;
++              case DIB3000MC_DEVICE_ID:
++                      verb("found a DiB3000M-C demodulator.\n");
++                      dib.rev = DIB3000MC;
++                      break;
++              case DIB3000P_DEVICE_ID:
++                      verb("found a DiB3000-P demodulator.\n");
++                      dib.rev = DIB3000P;
++                      break;
++              default:
++                      err("unsupported demodulator found.\n");
++      }
++
++      while (!interrupted) {
++              switch (dib.rev) {
++                      case DIB3000MB:
++                              dib3000mb_monitoring(&dib,&mon);
++                              if (out == OUT_PRINT) {
++                                      printf("\E[H\E[2J");
++                                      dib3000mb_print_monitoring(&mon);
++                              } else if (out == OUT_CSV) {
++                                      printf("no csv output implemented yet.\n");
++                              }
++                              break;
++                      default:
++                              interrupted=1;
++                              err("no monitoring writting for this demod, yet.\n");
++              }
++              usleep((int) (intervall * 1000000));
++      }
++
++      close(dib.fd);
++
++      return 0;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/dib3000-watch/dib3000-watch.h dvb-apps/util/dib3000-watch/dib3000-watch.h
+--- linuxtv-dvb-apps-1.1.1/util/dib3000-watch/dib3000-watch.h  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/dib3000-watch/dib3000-watch.h        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,46 @@
++#ifndef __DIB_DEMOD_WATCH__
++#define __DIB_DEMOD_WATCH__
++
++#define err(args...)  fprintf(stderr,"error '%s': ",strerror(errno)); fprintf(stderr,args)
++#define verb(args...) fprintf(stderr,args)
++
++typedef enum {
++      DIB3000MB = 0,
++      DIB3000MC,
++      DIB3000P,
++} dib_demod_t;
++
++
++struct dib_demod {
++      int fd;
++      __u8 i2c_addr;
++
++      dib_demod_t rev;
++};
++
++struct dib3000mb_monitoring {
++      int agc_lock;
++      int carrier_lock;
++      int tps_lock;
++      int vit_lock;
++      int ts_sync_lock;
++      int ts_data_lock;
++
++      int invspec;
++
++      int per;
++      int unc;
++
++      int fft_pos;
++
++      int nfft;
++
++      double carrier_offset;
++      double ber;
++      double snr;
++      double mer;
++      double rf_power;
++      double timing_offset_ppm;
++};
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/dib3000-watch/dib-i2c.h dvb-apps/util/dib3000-watch/dib-i2c.h
+--- linuxtv-dvb-apps-1.1.1/util/dib3000-watch/dib-i2c.h        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/dib3000-watch/dib-i2c.h      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,43 @@
++/*
++ * adapted from different kernel headers
++ * "this is the current way of doing things."-Greg K-H
++ *
++ * everything copied from linux kernel 2.6.10 source
++ */
++
++#ifndef _DIB_I2C_H
++#define _DIB_I2C_H
++
++
++/* from <linux/i2c.h> */
++#define I2C_SLAVE       0x0703
++#define I2C_SLAVE_FORCE 0x0706
++#define I2C_TENBIT      0x0704
++#define I2C_PEC         0x0708
++#define I2C_RETRIES     0x0701
++#define I2C_TIMEOUT     0x0702
++
++#define I2C_FUNCS       0x0705
++#define I2C_RDWR        0x0707
++#define I2C_SMBUS       0x0720
++
++struct i2c_msg {
++      __u16 addr;
++      __u16 flags;
++#define I2C_M_RD            0x0001
++#define I2C_M_TEN           0x0010
++#define I2C_M_NOSTART       0x4000
++#define I2C_M_REV_DIR_ADDR  0x2000
++#define I2C_M_IGNORE_NAK    0x1000
++#define I2C_M_NO_RD_ACK     0x0800
++      __u16 len;
++      __u8 *buf;
++};
++
++/* from <linux/i2c-dev.h> */
++struct i2c_rdwr_ioctl_data {
++      struct i2c_msg *msgs;
++      __u32 nmsgs;
++};
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/dib3000-watch/Makefile dvb-apps/util/dib3000-watch/Makefile
+--- linuxtv-dvb-apps-1.1.1/util/dib3000-watch/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/dib3000-watch/Makefile       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,13 @@
++# Makefile for linuxtv.org dvb-apps/util/dib3000-watch
++
++binaries = dib3000-watch
++
++inst_bin = $(binaries)
++
++LDLIBS += -lm
++
++.PHONY: all
++
++all: $(binaries)
++
++include ../../Make.rules
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/dib3000-watch/make-i2c-dev dvb-apps/util/dib3000-watch/make-i2c-dev
+--- linuxtv-dvb-apps-1.1.1/util/dib3000-watch/make-i2c-dev     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/dib3000-watch/make-i2c-dev   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++for i in `seq 0 10`;
++do
++      mknod /dev/i2c-$i c 89 $i
++      chown root.video /dev/i2c-$i
++      chmod 664 /dev/i2c-$i
++done
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/dib3000-watch/README.dib3000-watch dvb-apps/util/dib3000-watch/README.dib3000-watch
+--- linuxtv-dvb-apps-1.1.1/util/dib3000-watch/README.dib3000-watch     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/dib3000-watch/README.dib3000-watch   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,29 @@
++This is a small tool for gathering and evaluating more reception-related data
++from the dib3000-demodulators, than the DVB-API currently makes use of.
++
++It uses the i2c-dev-interface. In order to use it, you have to enable i2c-dev
++in your kernel.  The module i2c-dev is loaded automatically, when you want to
++access the /dev/i2c-*-node.
++
++If your distribution hasn't create the /dev/i2c-*-nodes you can use the
++make-i2c-dev-script located its source directory.
++
++It is not yet completed, but works fine for all dib3000mb-demods (all of the
++USB1.1 dibusb-devices are equipped with it).
++Having a CSV output would certainly be useful, when you want to make range
++tests by driving around with your car and check the signal. Nevertheless,
++this isn't written yet, but should be easy-going. Each line then should
++have an timestamp.
++
++I cannot guarantee for the values this program calculates, I'm not a signal
++expert, thus I don't know if they are correct.
++
++Thanks to Amaury Demol from DiBcom, who provides source for showing me how to
++calculate frequencies from the demod values.
++
++Patrick Boettcher <patrick.boettcher@desy.de>
++
++PS: Please feel free to modify the source to fullfil your wishes. But please
++remember, it is released under the GPL, thus please send back patches to the
++author or to the linux-dvb mailing list, so other users can have benefit from
++it.
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/dst-utils/dst_test.c dvb-apps/util/dst-utils/dst_test.c
+--- linuxtv-dvb-apps-1.1.1/util/dst-utils/dst_test.c   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/dst-utils/dst_test.c 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,258 @@
++/*
++      DST-TEST utility
++      an implementation for the High Level Common Interface
++
++      Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++
++      This program is free software; you can redistribute it and/or modify
++      it under the terms of the GNU Lesser General Public License as
++      published by the Free Software Foundation; either version 2.1 of
++      the License, or (at your option) any later version.
++
++      This program is distributed in the hope that it will be useful,
++      but WITHOUT ANY WARRANTY; without even the implied warranty of
++      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++      GNU Lesser General Public License for more details.
++
++      You should have received a copy of the GNU Lesser General Public
++      License along with this library; if not, write to the Free Software
++      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <unistd.h>
++#include <sys/types.h>
++#include <sys/stat.h>
++#include <fcntl.h>
++#include <sys/ioctl.h>
++#include <errno.h>
++#include <stdint.h>
++
++#include <linux/dvb/dmx.h>
++#include <linux/dvb/ca.h>
++#include <libdvben50221/en50221_app_tags.h>
++
++#define CA_NODE "/dev/dvb/adapter0/ca0"
++
++static int dst_comms(int cafd, uint32_t tag, uint32_t function, struct ca_msg *msg)
++{
++      if (tag) {
++              msg->msg[2] = tag & 0xff;
++              msg->msg[1] = (tag & 0xff00) >> 8;
++              msg->msg[0] = (tag & 0xff0000) >> 16;
++
++              printf("%s: Msg=[%02x %02x %02x ]\n",__FUNCTION__, msg->msg[0], msg->msg[1], msg->msg[2]);
++      }
++
++      if ((ioctl(cafd, function, msg)) < 0) {
++              printf("%s: ioctl failed ..\n", __FUNCTION__);
++              return -1;
++      }
++
++      return 0;
++}
++
++
++static int dst_get_caps(int cafd, struct ca_caps *caps)
++{
++      if ((ioctl(cafd, CA_GET_CAP, caps)) < 0) {
++              printf("%s: ioctl failed ..\n", __FUNCTION__);
++              return -1;
++      }
++
++      if (caps->slot_num < 1) {
++              printf ("No CI Slots found\n");
++              return -1;
++      }
++
++      printf("APP: Slots=[%d]\n", caps->slot_num);
++      printf("APP: Type=[%d]\n", caps->slot_type);
++      printf("APP: Descrambler keys=[%d]\n", caps->descr_num);
++      printf("APP: Type=[%d]\n", caps->descr_type);
++
++      return 0;
++}
++
++static int dst_get_info(int cafd, struct ca_slot_info *info)
++{
++      if ((ioctl(cafd, CA_GET_SLOT_INFO, info)) < 0) {
++              printf("%s: ioctl failed ..\n", __FUNCTION__);
++              return -1;
++      }
++      if (info->num < 1) {
++              printf("No CI Slots found\n");
++              return -1;
++      }
++      printf("APP: Number=[%d]\n", info->num);
++      printf("APP: Type=[%d]\n", info->type);
++      printf("APP: flags=[%d]\n", info->flags);
++
++      if (info->flags == 1)
++              printf("APP: CI High level interface\n");
++      if (info->flags == 1)
++              printf("APP: CA/CI Module Present\n");
++      else if (info->flags == 2)
++              printf("APP: CA/CI Module Ready\n");
++      else if (info->flags == 0)
++              printf("APP: No CA/CI Module\n");
++
++      return 0;
++}
++
++static int dst_reset(int cafd)
++{
++      if ((ioctl(cafd, CA_RESET)) < 0) {
++              printf("%s: ioctl failed ..\n", __FUNCTION__);
++              return -1;
++      }
++
++      return 0;
++}
++
++static int dst_set_pid(int cafd)
++{
++      if ((ioctl(cafd, CA_SET_PID)) < 0) {
++              printf("%s: ioctl failed ..\n", __FUNCTION__);
++              return -1;
++      }
++
++      return 0;
++}
++
++static int dst_get_descr(int cafd)
++{
++      if ((ioctl(cafd, CA_GET_DESCR_INFO)) < 0) {
++              printf("%s: ioctl failed ..\n", __FUNCTION__);
++              return -1;
++      }
++
++      return 0;
++}
++
++static int dst_set_descr(int cafd)
++{
++      if ((ioctl(cafd, CA_SET_DESCR)) < 0) {
++              printf("%s: ioctl failed ..\n", __FUNCTION__);
++              return -1;
++      }
++      return 0;
++}
++
++static int dst_get_app_info(int cafd, struct ca_msg *msg)
++{
++      uint32_t tag = 0;
++
++      /*      Enquire         */
++      tag = TAG_CA_INFO_ENQUIRY;
++      if ((dst_comms(cafd, tag, CA_SEND_MSG, msg)) < 0) {
++              printf("%s: Dst communication failed\n", __FUNCTION__);
++              return -1;
++      }
++
++      /*      Receive         */
++      tag = TAG_CA_INFO;
++      if ((dst_comms(cafd, tag, CA_GET_MSG, msg)) < 0) {
++              printf("%s: Dst communication failed\n", __FUNCTION__);
++              return -1;
++      }
++
++      /*      Process         */
++      printf("%s: ================================ CI Module Application Info ======================================\n", __FUNCTION__);
++      printf("%s: Application Type=[%d], Application Vendor=[%d], Vendor Code=[%d]\n%s: Application info=[%s]\n",
++                      __FUNCTION__, msg->msg[7], (msg->msg[8] << 8) | msg->msg[9], (msg->msg[10] << 8) | msg->msg[11], __FUNCTION__,
++                      ((char *) (&msg->msg[12])));
++      printf("%s: ==================================================================================================\n", __FUNCTION__);
++
++      return 0;
++}
++
++static int dst_session_test(int cafd, struct ca_msg *msg)
++{
++      msg->msg[0] = 0x91;
++      printf("Debugging open session request\n");
++      if ((ioctl(cafd, CA_SEND_MSG, msg)) < 0) {
++              printf("%s: ioctl failed ..\n", __FUNCTION__);
++              return -1;
++      }
++
++      return 0;
++}
++
++
++int main(int argc, char *argv[])
++{
++      int cafd;
++      const char *usage = " DST-TEST: Twinhan DST and clones test utility\n"
++                              " an implementation for the High Level Common Interface\n"
++                              " Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)\n\n"
++                              "\t dst_test options:\n"
++                              "\t -c capabilities\n"
++                              "\t -i info\n"
++                              "\t -r reset\n"
++                              "\t -p pid\n"
++                              "\t -g get descr\n"
++                              "\t -s set_descr\n"
++                              "\t -a app_info\n"
++                              "\t -t session test\n";
++
++
++      struct ca_caps *caps;
++      caps = (struct ca_caps *) malloc(sizeof (struct ca_caps));
++
++      struct ca_slot_info *info;
++      info = (struct ca_slot_info *)malloc (sizeof (struct ca_slot_info));
++
++      struct ca_msg *msg;
++      msg = (struct ca_msg *) malloc(sizeof (struct ca_msg));
++
++      if (argc < 2)
++              printf("%s\n", usage);
++
++      if (argc > 1) {
++              if ((cafd = open(CA_NODE, O_RDONLY)) < 0) {
++                      printf("%s: Error opening %s\n", __FUNCTION__, CA_NODE);
++                      return -1;
++              }
++
++              switch (getopt(argc, argv, "cirpgsat")) {
++                      case 'c':
++                              printf("%s: Capabilities\n", __FUNCTION__);
++                              dst_get_caps(cafd, caps);
++                              break;
++                      case 'i':
++                              printf("%s: Info\n", __FUNCTION__);
++                              dst_get_info(cafd, info);
++                              break;
++                      case 'r':
++                              printf("%s: Reset\n", __FUNCTION__);
++                              dst_reset(cafd);
++                              break;
++                      case 'p':
++                              printf("%s: PID\n", __FUNCTION__);
++                              dst_set_pid(cafd);
++                              break;
++                      case 'g':
++                              printf("%s: Get Desc\n", __FUNCTION__);
++                              dst_get_descr(cafd);
++                              break;
++                      case 's':
++                              printf("%s: Set Desc\n", __FUNCTION__);
++                              dst_set_descr(cafd);
++                              break;
++                      case 'a':
++                              printf("%s: App Info\n", __FUNCTION__);
++                              dst_get_app_info(cafd, msg);
++                              break;
++                      case 't':
++                              printf("%s: Session test\n", __FUNCTION__);
++                              dst_session_test(cafd, msg);
++                              break;
++
++                      break;
++              }
++              close(cafd);
++      }
++      return 0;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/dst-utils/Makefile dvb-apps/util/dst-utils/Makefile
+--- linuxtv-dvb-apps-1.1.1/util/dst-utils/Makefile     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/dst-utils/Makefile   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,13 @@
++# Makefile for linuxtv.org dvb-apps/util/dst-utils
++
++binaries = dst_test
++
++inst_bin = $(binaries)
++
++CPPFLAGS += -I../../lib
++
++.PHONY: all
++
++all: $(binaries)
++
++include ../../Make.rules
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/dvbdate/dvbdate.c dvb-apps/util/dvbdate/dvbdate.c
+--- linuxtv-dvb-apps-1.1.1/util/dvbdate/dvbdate.c      2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/dvbdate/dvbdate.c    2009-06-21 13:29:06.000000000 +0200
+@@ -8,7 +8,10 @@
+    Revamped by Johannes Stezenbach <js@convergence.de>
+    and Michael Hunold <hunold@convergence.de>
+-  
++
++   Ported to use the standard dvb libraries and add ATSC STT
++   support Andrew de Quincey <adq_dvb@lidskialf.net>
++
+    This program is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public License
+    as published by the Free Software Foundation; either version 2
+@@ -40,10 +43,10 @@
+ #include <errno.h>
+ #include <getopt.h>
+ #include <stdarg.h>
+-
+-#include <linux/dvb/dmx.h>
+-
+-#define bcdtoint(i) ((((i & 0xf0) >> 4) * 10) + (i & 0x0f))
++#include <libdvbapi/dvbfe.h>
++#include <libdvbapi/dvbdemux.h>
++#include <libucsi/dvb/section.h>
++#include <libucsi/atsc/section.h>
+ /* How many seconds can the system clock be out before we get warned? */
+ #define ALLOWABLE_DELTA 30*60
+@@ -54,6 +57,7 @@
+ int do_force;
+ int do_quiet;
+ int timeout = 25;
++int adapter = 0;
+ void errmsg(char *message, ...)
+ {
+@@ -65,15 +69,24 @@
+       va_end(ap);
+ }
+-void usage()
++void usage(void)
+ {
+-      fprintf(stderr, "usage: %s [-p] [-s] [-f] [-q] [-h]\n", ProgName);
++      fprintf(stderr, "usage: %s [-a] [-p] [-s] [-f] [-q] [-h]\n", ProgName);
+       _exit(1);
+ }
+-void help()
++void help(void)
+ {
+-      fprintf(stderr, "\nhelp:\n" "%s [-p] [-s] [-f] [-q] [-h] [-t n]\n" "  --print   (print current time, TDT time and delta)\n" "  --set    (set the system clock to TDT time)\n" "  --force        (force the setting of the clock)\n" "  --quiet  (be silent)\n" "  --help        (display this message)\n""  --timout n  (max seconds to wait, default: 25)\n", ProgName);
++      fprintf(stderr,
++              "\nhelp:\n"
++              "%s [-a] [-p] [-s] [-f] [-q] [-h] [-t n]\n"
++              "  --adapter    (adapter to use, default: 0)\n"
++              "  --print      (print current time, received time and delta)\n"
++              "  --set        (set the system clock to received time)\n"
++              "  --force      (force the setting of the clock)\n"
++              "  --quiet      (be silent)\n"
++              "  --help       (display this message)\n"
++              "  --timeout n  (max seconds to wait, default: 25)\n", ProgName);
+       _exit(1);
+ }
+@@ -86,13 +99,14 @@
+               {"quiet", 0, 0, 'q'},
+               {"help", 0, 0, 'h'},
+               {"timeout", 1, 0, 't'},
++              {"adapter", 1, 0, 'a'},
+               {0, 0, 0, 0}
+       };
+       int c;
+       int Option_Index = 0;
+       while (1) {
+-              c = getopt_long(arg_count, arg_strings, "psfqht:", Long_Options, &Option_Index);
++              c = getopt_long(arg_count, arg_strings, "a:psfqht:", Long_Options, &Option_Index);
+               if (c == EOF)
+                       break;
+               switch (c) {
+@@ -103,6 +117,9 @@
+                               usage();
+                       }
+                       break;
++              case 'a':
++                      adapter = atoi(optarg);
++                      break;
+               case 'p':
+                       do_print = 1;
+                       break;
+@@ -134,7 +151,8 @@
+                       case 2: /* Force */
+                       case 3: /* Quiet */
+                       case 4: /* Help */
+-                      case 5: /* timout */
++                      case 5: /* timeout */
++                      case 6: /* adapter */
+                               break;
+                       default:
+                               fprintf(stderr, "%s: unknown long option %d\n", ProgName, Option_Index);
+@@ -153,125 +171,135 @@
+ }
+ /*
+- * return the TDT time in UNIX time_t format
++ * Get the next UTC date packet from the TDT section
+  */
+-
+-time_t convert_date(char *dvb_buf)
++int dvb_scan_date(time_t *rx_time, unsigned int to)
+ {
+-      int i;
+-      int year, month, day, hour, min, sec;
+-      long int mjd;
+-      struct tm dvb_time;
++      int tdt_fd;
++      uint8_t filter[18];
++      uint8_t mask[18];
++      unsigned char sibuf[4096];
++      int size;
+-      mjd = (dvb_buf[0] & 0xff) << 8;
+-      mjd += (dvb_buf[1] & 0xff);
+-      hour = bcdtoint(dvb_buf[2] & 0xff);
+-      min = bcdtoint(dvb_buf[3] & 0xff);
+-      sec = bcdtoint(dvb_buf[4] & 0xff);
+-/*
+- * Use the routine specified in ETSI EN 300 468 V1.4.1,
+- * "Specification for Service Information in Digital Video Broadcasting"
+- * to convert from Modified Julian Date to Year, Month, Day.
+- */
+-      year = (int) ((mjd - 15078.2) / 365.25);
+-      month = (int) ((mjd - 14956.1 - (int) (year * 365.25)) / 30.6001);
+-      day = mjd - 14956 - (int) (year * 365.25) - (int) (month * 30.6001);
+-      if (month == 14 || month == 15)
+-              i = 1;
+-      else
+-              i = 0;
+-      year += i;
+-      month = month - 1 - i * 12;
++      // open the demuxer
++      if ((tdt_fd = dvbdemux_open_demux(adapter, 0, 0)) < 0) {
++              return -1;
++      }
+-      dvb_time.tm_sec = sec;
+-      dvb_time.tm_min = min;
+-      dvb_time.tm_hour = hour;
+-      dvb_time.tm_mday = day;
+-      dvb_time.tm_mon = month - 1;
+-      dvb_time.tm_year = year;
+-      dvb_time.tm_isdst = -1;
+-      dvb_time.tm_wday = 0;
+-      dvb_time.tm_yday = 0;
+-      return (timegm(&dvb_time));
++      // create a section filter for the TDT
++      memset(filter, 0, sizeof(filter));
++      memset(mask, 0, sizeof(mask));
++      filter[0] = stag_dvb_time_date;
++      mask[0] = 0xFF;
++      if (dvbdemux_set_section_filter(tdt_fd, TRANSPORT_TDT_PID, filter, mask, 1, 1)) {
++              close(tdt_fd);
++              return -1;
++      }
++
++      // poll for data
++      struct pollfd pollfd;
++      pollfd.fd = tdt_fd;
++      pollfd.events = POLLIN|POLLERR|POLLPRI;
++      if (poll(&pollfd, 1, to * 1000) != 1) {
++              close(tdt_fd);
++              return -1;
++      }
++
++      // read it
++      if ((size = read(tdt_fd, sibuf, sizeof(sibuf))) < 0) {
++              close(tdt_fd);
++              return -1;
++      }
++
++      // parse section
++      struct section *section = section_codec(sibuf, size);
++      if (section == NULL) {
++              close(tdt_fd);
++              return -1;
++      }
++
++      // parse TDT
++      struct dvb_tdt_section *tdt = dvb_tdt_section_codec(section);
++      if (tdt == NULL) {
++              close(tdt_fd);
++              return -1;
++      }
++
++      // done
++      *rx_time = dvbdate_to_unixtime(tdt->utc_time);
++      close(tdt_fd);
++      return 0;
+ }
+ /*
+- * Get the next UTC date packet from the TDT multiplex
++ * Get the next date packet from the STT section
+  */
+-
+-int scan_date(time_t *dvb_time, unsigned int to)
++int atsc_scan_date(time_t *rx_time, unsigned int to)
+ {
+-      int fd_date;
+-      int n, seclen;
+-      time_t t;
+-      unsigned char buf[4096];
+-      struct dmx_sct_filter_params sctFilterParams;
+-      struct pollfd ufd;
+-      int found = 0;
+-      
+-      t = 0;
+-      if ((fd_date = open("/dev/dvb/adapter0/demux0", O_RDWR | O_NONBLOCK)) < 0) {
+-              perror("fd_date DEVICE: ");
++      int stt_fd;
++      uint8_t filter[18];
++      uint8_t mask[18];
++      unsigned char sibuf[4096];
++      int size;
++
++      // open the demuxer
++      if ((stt_fd = dvbdemux_open_demux(adapter, 0, 0)) < 0) {
+               return -1;
+       }
+-      memset(&sctFilterParams, 0, sizeof(sctFilterParams));
+-      sctFilterParams.pid = 0x14;
+-      sctFilterParams.timeout = 0;
+-      sctFilterParams.flags = DMX_IMMEDIATE_START;
+-      sctFilterParams.filter.filter[0] = 0x70;
+-      sctFilterParams.filter.mask[0] = 0xff;
+-
+-      if (ioctl(fd_date, DMX_SET_FILTER, &sctFilterParams) < 0) {
+-              perror("DATE - DMX_SET_FILTER:");
+-              close(fd_date);
++      // create a section filter for the STT
++      memset(filter, 0, sizeof(filter));
++      memset(mask, 0, sizeof(mask));
++      filter[0] = stag_atsc_system_time;
++      mask[0] = 0xFF;
++      if (dvbdemux_set_section_filter(stt_fd, ATSC_BASE_PID, filter, mask, 1, 1)) {
++              close(stt_fd);
+               return -1;
+       }
+-      while (to > 0) {
+-              int res;
++      // poll for data
++      struct pollfd pollfd;
++      pollfd.fd = stt_fd;
++      pollfd.events = POLLIN|POLLERR|POLLPRI;
++      if (poll(&pollfd, 1, to * 1000) != 1) {
++              close(stt_fd);
++              return -1;
++      }
+-              memset(&ufd,0,sizeof(ufd));
+-              ufd.fd=fd_date;
+-              ufd.events=POLLIN;
++      // read it
++      if ((size = read(stt_fd, sibuf, sizeof(sibuf))) < 0) {
++              close(stt_fd);
++              return -1;
++      }
+-              res = poll(&ufd,1,1000);
+-              if (0 == res) {
+-                      fprintf(stdout, ".");
+-                      fflush(stdout);
+-                      to--;
+-                      continue;
+-              }
+-              if (1 == res) {
+-                      found = 1;
+-                      break;
+-              }
+-              errmsg("error polling for data");
+-              close(fd_date);
++      // parse section
++      struct section *section = section_codec(sibuf, size);
++      if (section == NULL) {
++              close(stt_fd);
+               return -1;
+       }
+-      fprintf(stdout, "\n");
+-      if (0 == found) {
+-              errmsg("timeout - try tuning to a multiplex?\n");
+-              close(fd_date);
++      struct section_ext *section_ext = section_ext_decode(section, 0);
++      if (section_ext == NULL) {
++              close(stt_fd);
++              return -1;
++      }
++      struct atsc_section_psip *psip = atsc_section_psip_decode(section_ext);
++      if (psip == NULL) {
++              close(stt_fd);
+               return -1;
+       }
+-      if ((n = read(fd_date, buf, 4096)) >= 3) {
+-              seclen = ((buf[1] & 0x0f) << 8) | (buf[2] & 0xff);
+-              if (n == seclen + 3) {
+-                      t = convert_date(&(buf[3]));
+-              } else {
+-                      errmsg("Under-read bytes for DATE - wanted %d, got %d\n", seclen, n);
+-                      return 0;
+-              }
+-      } else {
+-              errmsg("Nothing to read from fd_date - try tuning to a multiplex?\n");
+-              return 0;
++      // parse STT
++      struct atsc_stt_section *stt = atsc_stt_section_codec(psip);
++      if (stt == NULL) {
++              close(stt_fd);
++              return -1;
+       }
+-      close(fd_date);
+-      *dvb_time = t;
++
++      // done
++      *rx_time = atsctime_to_unixtime(stt->system_time);
++      close(stt_fd);
+       return 0;
+ }
+@@ -291,10 +319,12 @@
+ int main(int argc, char **argv)
+ {
+-      time_t dvb_time;
++      time_t rx_time;
+       time_t real_time;
+       time_t offset;
+       int ret;
++      struct dvbfe_handle *fe;
++      struct dvbfe_info fe_info;
+       do_print = 0;
+       do_force = 0;
+@@ -310,27 +340,51 @@
+               errmsg("quiet and print options are mutually exclusive.\n");
+               exit(1);
+       }
++
+ /*
+- * Get the date from the currently tuned TDT multiplex
++ * Find the frontend type
+  */
+-      ret = scan_date(&dvb_time, timeout);
++      if ((fe = dvbfe_open(adapter, 0, 1)) == NULL) {
++              errmsg("Unable to open frontend.\n");
++              exit(1);
++      }
++      dvbfe_get_info(fe, 0, &fe_info, DVBFE_INFO_QUERYTYPE_IMMEDIATE, 0);
++
++/*
++ * Get the date from the currently tuned multiplex
++ */
++      switch(fe_info.type) {
++      case DVBFE_TYPE_DVBS:
++      case DVBFE_TYPE_DVBC:
++      case DVBFE_TYPE_DVBT:
++              ret = dvb_scan_date(&rx_time, timeout);
++              break;
++
++      case DVBFE_TYPE_ATSC:
++              ret = atsc_scan_date(&rx_time, timeout);
++              break;
++
++      default:
++              errmsg("Unsupported frontend type.\n");
++              exit(1);
++      }
+       if (ret != 0) {
+               errmsg("Unable to get time from multiplex.\n");
+               exit(1);
+       }
+       time(&real_time);
+-      offset = dvb_time - real_time;
++      offset = rx_time - real_time;
+       if (do_print) {
+               fprintf(stdout, "System time: %s", ctime(&real_time));
+-              fprintf(stdout, "   TDT time: %s", ctime(&dvb_time));
++              fprintf(stdout, "    RX time: %s", ctime(&rx_time));
+               fprintf(stdout, "     Offset: %ld seconds\n", offset);
+       } else if (!do_quiet) {
+-              fprintf(stdout, "%s", ctime(&dvb_time));
++              fprintf(stdout, "%s", ctime(&rx_time));
+       }
+       if (do_set) {
+               if (labs(offset) > ALLOWABLE_DELTA) {
+                       if (do_force) {
+-                              if (0 != set_time(&dvb_time)) {
++                              if (0 != set_time(&rx_time)) {
+                                       errmsg("setting the time failed\n");
+                               }
+                       } else {
+@@ -339,7 +393,7 @@
+                               exit(1);
+                       }
+               } else {
+-                      set_time(&dvb_time);
++                      set_time(&rx_time);
+               }
+       }                       /* #end if (do_set) */
+       return (0);
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/dvbdate/Makefile dvb-apps/util/dvbdate/Makefile
+--- linuxtv-dvb-apps-1.1.1/util/dvbdate/Makefile       2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/dvbdate/Makefile     2009-06-21 13:29:06.000000000 +0200
+@@ -1,25 +1,15 @@
++# Makefile for linuxtv.org dvb-apps/util/dvbdate
+-CC      = gcc
+-CFLAGS  = -g -O2 -MD -Wall -I. -I../../include
+-LFLAGS  =
+-
+-OBJS    = dvbdate.o
+-TARGET  = dvbdate
+-DESTDIR = /usr/local/bin/
+-
+-all: $(TARGET)
+-
+-.c.o:
+-      $(CC) $(CFLAGS) -c $< -o $@
++binaries = dvbdate
+-$(TARGET): $(OBJS)
+-      $(CC) -o $@ $(OBJS) $(LFLAGS)
++inst_bin = $(binaries)
+-install: all
+-      install -m 755 $(TARGET) $(DESTDIR) 
++CPPFLAGS += -I../../lib
++LDFLAGS  += -L../../lib/libdvbapi -L../../lib/libucsi
++LDLIBS   += -ldvbapi -lucsi
+-clean:
+-      rm -f $(TARGET) $(OBJS) core* *~ *.d
++.PHONY: all
+--include $(wildcard *.d) dummy
++all: $(binaries)
++include ../../Make.rules
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/dvbnet/dvbnet.c dvb-apps/util/dvbnet/dvbnet.c
+--- linuxtv-dvb-apps-1.1.1/util/dvbnet/dvbnet.c        2006-05-18 01:37:58.000000000 +0200
++++ dvb-apps/util/dvbnet/dvbnet.c      2009-06-21 13:29:06.000000000 +0200
+@@ -1,26 +1,29 @@
+-/* 
++/*
+  * dvbnet.c
+  *
+  * Copyright (C) 2003 TV Files S.p.A
+  *                    L.Y.Mesentsev <lymes@tiscalinet.it>
+  *
++ * Ported to use new DVB libraries:
++ * Copyright (C) 2006 Andrew de Quincey <adq_dvb@lidskialf.net>
++ *
+  * This program is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU General Public License
+  * as published by the Free Software Foundation; either version 2
+  * of the License, or (at your option) any later version.
+- * 
++ *
+  *
+  * This program is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  * GNU General Public License for more details.
+- * 
++ *
+  *
+  * You should have received a copy of the GNU General Public License
+  * along with this program; if not, write to the Free Software
+  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+  * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
+- * 
++ *
+  */
+ #include <stdio.h>
+@@ -33,19 +36,10 @@
+ #include <sys/stat.h>
+ #include <sys/types.h>
+ #include <sys/ioctl.h>
+-
+-#include <linux/dvb/net.h>
+-#include <version.h>
+-
+-#ifndef VERSION_INFO
+-#define VERSION_INFO "1.1.1"
+-#endif
++#include <libdvbapi/dvbnet.h>
+ #define OK    0
+ #define FAIL -1
+-#define DVB_NET_DEVICE "/dev/dvb/adapter%d/net%d"
+-#define DVB_NET_DEVICES_MAX 10
+-#define IFNAME_DVB "dvb"
+ enum Mode {
+@@ -57,14 +51,15 @@
+ static int adapter = 0;
+ static int netdev = 0;
+-static struct dvb_net_if net_data;
+ static void hello(void);
+ static void usage(char *);
+ static void parse_args(int, char **);
+-static int queryInterface(int, int);
++static void queryInterface(int);
+-static char dvb_net_device[40];
++int ifnum;
++int pid;
++int encapsulation;
+ int main(int argc, char **argv)
+ {
+@@ -74,40 +69,36 @@
+       parse_args(argc, argv);
+-      sprintf(dvb_net_device, DVB_NET_DEVICE, adapter, netdev);
+-
+-      printf("Device: %s\n", dvb_net_device);
+-
+-      if ((fd_net = open(dvb_net_device, O_RDWR | O_NONBLOCK)) < 0) {
+-              fprintf(stderr, "Error: couldn't open device %s: %d %m\n",
+-                      dvb_net_device, errno);
++      if ((fd_net = dvbnet_open(adapter, netdev)) < 0) {
++              fprintf(stderr, "Error: couldn't open device %d: %d %m\n",
++                      netdev, errno);
+               return FAIL;
+       }
+       switch (op_mode) {
+       case DEL_INTERFACE:
+-              if (ioctl(fd_net, NET_REMOVE_IF, net_data.if_num))
++              if (dvbnet_remove_interface(fd_net, ifnum))
+                       fprintf(stderr,
+                               "Error: couldn't remove interface %d: %d %m.\n",
+-                              net_data.if_num, errno);
++                              ifnum, errno);
+               else
+                       printf("Status: device %d removed successfully.\n",
+-                             net_data.if_num);
++                             ifnum);
+               break;
+       case ADD_INTERFACE:
+-              if (ioctl(fd_net, NET_ADD_IF, &net_data))
++              if ((ifnum = dvbnet_add_interface(fd_net, pid, encapsulation)) < 0)
+                       fprintf(stderr,
+                               "Error: couldn't add interface for pid %d: %d %m.\n",
+-                              net_data.pid, errno);
++                              pid, errno);
+               else
+                       printf
+                           ("Status: device dvb%d_%d for pid %d created successfully.\n",
+-                           adapter, net_data.if_num, net_data.pid);
++                           adapter, ifnum, pid);
+               break;
+       case LST_INTERFACE:
+-              queryInterface(fd_net, 0);
++              queryInterface(fd_net);
+               break;
+       default:
+@@ -120,39 +111,48 @@
+ }
+-int queryInterface(int fd_net, int dev)
++void queryInterface(int fd_net)
+ {
+-      struct dvb_net_if data;
+-      int IF, nIFaces = 0, ret = FAIL;
++      int IF, nIFaces = 0;
++      char *encap;
+       printf("Query DVB network interfaces:\n");
+       printf("-----------------------------\n");
+-      for (IF = 0; IF < DVB_NET_DEVICES_MAX; IF++) {
+-              data.if_num = IF;
+-              if (ioctl(fd_net, NET_GET_IF, &data))
++      for (IF = 0; IF < DVBNET_MAX_INTERFACES; IF++) {
++              uint16_t _pid;
++              enum dvbnet_encap _encapsulation;
++              if (dvbnet_get_interface(fd_net, IF, &_pid, &_encapsulation))
+                       continue;
+-              if (dev == data.if_num)
+-                      ret = OK;
++              encap = "???";
++              switch(_encapsulation) {
++              case DVBNET_ENCAP_MPE:
++                      encap = "MPE";
++                      break;
++              case DVBNET_ENCAP_ULE:
++                      encap = "ULE";
++                      break;
++              }
+               printf("Found device %d: interface dvb%d_%d, "
+-                     "listening on PID %d\n",
+-                     IF, adapter, data.if_num, data.pid);
++                     "listening on PID %d, encapsulation %s\n",
++                     IF, adapter, IF, _pid, encap);
+               nIFaces++;
+       }
+       printf("-----------------------------\n");
+       printf("Found %d interface(s).\n\n", nIFaces);
+-      return ret;
+ }
+ void parse_args(int argc, char **argv)
+ {
+-      char c, *s;
++      int c;
++      char *s;
+       op_mode = UNKNOWN;
+-      while ((c = getopt(argc, argv, "a:n:p:d:lvh")) != EOF) {
++      encapsulation = DVBNET_ENCAP_MPE;
++      while ((c = getopt(argc, argv, "a:n:p:d:lUvh")) != EOF) {
+               switch (c) {
+               case 'a':
+                       adapter = strtol(optarg, NULL, 0);
+@@ -161,16 +161,19 @@
+                       netdev = strtol(optarg, NULL, 0);
+                       break;
+               case 'p':
+-                      net_data.pid = strtol(optarg, NULL, 0);
++                      pid = strtol(optarg, NULL, 0);
+                       op_mode = ADD_INTERFACE;
+                       break;
+               case 'd':
+-                      net_data.if_num = strtol(optarg, NULL, 0);
++                      ifnum = strtol(optarg, NULL, 0);
+                       op_mode = DEL_INTERFACE;
+                       break;
+               case 'l':
+                       op_mode = LST_INTERFACE;
+                       break;
++              case 'U':
++                      encapsulation = DVBNET_ENCAP_ULE;
++                      break;
+               case 'v':
+                       exit(OK);
+               case 'h':
+@@ -187,12 +190,12 @@
+ {
+       fprintf(stderr, "Usage: %s [options]\n", prog_name);
+       fprintf(stderr, "Where options are:\n");
+-      fprintf(stderr, "\t-a AD  : Adapter card AD (default 0)\n");
+-      fprintf(stderr, "\t-n NET : Net demux NET (default 0)\n");
++      fprintf(stderr, "\t-a AD  : Adapter card (default 0)\n");
++      fprintf(stderr, "\t-n DD  : Demux (default 0)\n");
+       fprintf(stderr, "\t-p PID : Add interface listening on PID\n");
+-      fprintf(stderr, "\t-d NUM : Remove interface dvbAD_NUM\n");
+-      fprintf(stderr,
+-              "\t-l     : List currently available interfaces\n");
++      fprintf(stderr, "\t-d NUM : Remove interface NUM\n");
++      fprintf(stderr, "\t-l     : List currently available interfaces\n");
++      fprintf(stderr, "\t-U     : use ULE framing (default: MPE)\n" );
+       fprintf(stderr, "\t-v     : Print current version\n\n");
+ }
+@@ -200,6 +203,5 @@
+ void hello(void)
+ {
+       printf("\nDVB Network Interface Manager\n");
+-      printf("Version %s\n", VERSION_INFO);
+       printf("Copyright (C) 2003, TV Files S.p.A\n\n");
+ }
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/dvbnet/Makefile dvb-apps/util/dvbnet/Makefile
+--- linuxtv-dvb-apps-1.1.1/util/dvbnet/Makefile        2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/dvbnet/Makefile      2009-06-21 13:29:06.000000000 +0200
+@@ -1,29 +1,15 @@
++# Makefile for linuxtv.org dvb-apps/util/dvbnet
+-CC      = gcc
+-CFLAGS  = -g -O2 -MD -Wall -I. -I../../include
+-LFLAGS  =
+-
+-OBJS    = dvbnet.o
+-TARGET  = dvbnet
+-DESTDIR = /usr/local/bin/
+-
+-all: version.h $(TARGET)
+-
+-.c.o:
+-      $(CC) $(CFLAGS) -c $< -o $@
+-
+-$(TARGET): $(OBJS)
+-      $(CC) -o $@ $(OBJS) $(LFLAGS)
++binaries = dvbnet
+-version.h:
+-      printf '#define VERSION_INFO "%s (Build %s)"\n' \
+-              "`cat $@.in`" "`date +'%a %b %d %X %Y'`" > $@
++inst_bin = $(binaries)
+-install: all
+-      install -m 755 $(TARGET) $(DESTDIR) 
++CPPFLAGS += -I../../lib
++LDFLAGS  += -L../../lib/libdvbapi
++LDLIBS   += -ldvbapi
+-clean:
+-      rm -f $(TARGET) $(OBJS) version.h core* *~ *.d
++.PHONY: all
+--include $(wildcard *.d) dummy
++all: $(binaries)
++include ../../Make.rules
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/dvbnet/net_start.pl dvb-apps/util/dvbnet/net_start.pl
+--- linuxtv-dvb-apps-1.1.1/util/dvbnet/net_start.pl    2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/dvbnet/net_start.pl  2009-06-21 13:29:06.000000000 +0200
+@@ -22,4 +22,3 @@
+   system("/sbin/ifconfig $DEV_NAME");
+ }
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/dvbnet/version.h.in dvb-apps/util/dvbnet/version.h.in
+--- linuxtv-dvb-apps-1.1.1/util/dvbnet/version.h.in    2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/dvbnet/version.h.in  1970-01-01 01:00:00.000000000 +0100
+@@ -1 +0,0 @@
+-1.1.0-TVF
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/dvbscan/dvbscan_atsc.c dvb-apps/util/dvbscan/dvbscan_atsc.c
+--- linuxtv-dvb-apps-1.1.1/util/dvbscan/dvbscan_atsc.c 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/dvbscan/dvbscan_atsc.c       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,30 @@
++/*
++      dvbscan utility
++
++      Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++      This program is free software; you can redistribute it and/or modify
++      it under the terms of the GNU General Public License as published by
++      the Free Software Foundation; either version 2 of the License, or
++      (at your option) any later version.
++
++      This program is distributed in the hope that it will be useful,
++      but WITHOUT ANY WARRANTY; without even the implied warranty of
++      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++
++      GNU General Public License for more details.
++
++      You should have received a copy of the GNU General Public License
++      along with this program; if not, write to the Free Software
++      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#include <stdlib.h>
++#include <stdio.h>
++#include <string.h>
++#include "dvbscan.h"
++
++void dvbscan_scan_atsc(struct dvbfe_handle *fe)
++{
++      // FIXME
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/dvbscan/dvbscan.c dvb-apps/util/dvbscan/dvbscan.c
+--- linuxtv-dvb-apps-1.1.1/util/dvbscan/dvbscan.c      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/dvbscan/dvbscan.c    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,370 @@
++/*
++      dvbscan utility
++
++      Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++      This program is free software; you can redistribute it and/or modify
++      it under the terms of the GNU General Public License as published by
++      the Free Software Foundation; either version 2 of the License, or
++      (at your option) any later version.
++
++      This program is distributed in the hope that it will be useful,
++      but WITHOUT ANY WARRANTY; without even the implied warranty of
++      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++
++      GNU General Public License for more details.
++
++      You should have received a copy of the GNU General Public License
++      along with this program; if not, write to the Free Software
++      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#include <stdlib.h>
++#include <unistd.h>
++#include <stdio.h>
++#include <string.h>
++#include <time.h>
++#include <libdvbsec/dvbsec_cfg.h>
++#include <libdvbcfg/dvbcfg_scanfile.h>
++#include <libdvbapi/dvbdemux.h>
++#include "dvbscan.h"
++
++
++#define OUTPUT_TYPE_RAW               1
++#define OUTPUT_TYPE_CHANNELS          2
++#define OUTPUT_TYPE_VDR12             3
++#define OUTPUT_TYPE_VDR13             4
++
++#define SERVICE_FILTER_TV             1
++#define SERVICE_FILTER_RADIO          2
++#define SERVICE_FILTER_OTHER          4
++#define SERVICE_FILTER_ENCRYPTED      8
++
++#define TIMEOUT_WAIT_LOCK             2
++
++
++// transponders we have yet to scan
++static struct transponder *toscan = NULL;
++static struct transponder *toscan_end = NULL;
++
++// transponders we have scanned
++static struct transponder *scanned = NULL;
++static struct transponder *scanned_end = NULL;
++
++
++static void usage(void)
++{
++      static const char *_usage = "\n"
++              " dvbscan: A digital tv channel scanning utility\n"
++              " Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)\n\n"
++              " usage: dvbscan <options> as follows:\n"
++              " -h                    help\n"
++              " -adapter <id>         adapter to use (default 0)\n"
++              " -frontend <id>        frontend to use (default 0)\n"
++              " -demux <id>           demux to use (default 0)\n"
++              " -secfile <filename>   Optional sec.conf file.\n"
++              " -secid <secid>        ID of the SEC configuration to use, one of:\n"
++              "                        * UNIVERSAL (default) - Europe, 10800 to 11800 MHz and 11600 to 12700 Mhz,\n"
++              "                                                Dual LO, loband 9750, hiband 10600 MHz.\n"
++              "                        * DBS - Expressvu, North America, 12200 to 12700 MHz, Single LO, 11250 MHz.\n"
++              "                        * STANDARD - 10945 to 11450 Mhz, Single LO, 10000 Mhz.\n"
++              "                        * ENHANCED - Astra, 10700 to 11700 MHz, Single LO, 9750 MHz.\n"
++              "                        * C-BAND - Big Dish, 3700 to 4200 MHz, Single LO, 5150 Mhz.\n"
++              "                        * C-MULTI - Big Dish - Multipoint LNBf, 3700 to 4200 MHz,\n"
++              "                                               Dual LO, H:5150MHz, V:5750MHz.\n"
++              "                        * One of the sec definitions from the secfile if supplied\n"
++              " -satpos <position>    Specify DISEQC switch position for DVB-S.\n"
++              " -inversion <on|off|auto> Specify inversion (default: auto).\n"
++              " -uk-ordering          Use UK DVB-T channel ordering if present.\n"
++              " -timeout <secs>       Specify filter timeout to use (standard specced values will be used by default)\n"
++              " -filter <filter>      Specify service filter, a comma seperated list of the following tokens:\n"
++              "                        (If no filter is supplied, all services will be output)\n"
++              "                        * tv - Output TV channels\n"
++              "                        * radio - Output radio channels\n"
++              "                        * other - Output other channels\n"
++              "                        * encrypted - Output encrypted channels\n"
++              " -out raw <filename>|-  Output in raw format to <filename> or stdout\n"
++              "      channels <filename>|-  Output in channels.conf format to <filename> or stdout.\n"
++              "      vdr12 <filename>|- Output in vdr 1.2.x format to <filename> or stdout.\n"
++              "      vdr13 <filename>|- Output in vdr 1.3.x format to <filename> or stdout.\n"
++              " <initial scan file>\n";
++      fprintf(stderr, "%s\n", _usage);
++
++      exit(1);
++}
++
++
++static int scan_load_callback(struct dvbcfg_scanfile *channel, void *private_data)
++{
++      struct dvbfe_info *feinfo = (struct dvbfe_info *) private_data;
++
++      if (channel->fe_type != feinfo->type)
++              return 0;
++
++      struct transponder *t = new_transponder();
++      append_transponder(t, &toscan, &toscan_end);
++      memcpy(&t->params, &channel->fe_params, sizeof(struct dvbfe_parameters));
++
++      add_frequency(t, t->params.frequency);
++      t->params.frequency = 0;
++
++      return 0;
++}
++
++int main(int argc, char *argv[])
++{
++      uint32_t i;
++      int argpos = 1;
++      int adapter_id = 0;
++      int frontend_id = 0;
++      int demux_id = 0;
++      char *secfile = NULL;
++      char *secid = NULL;
++      int satpos = 0;
++      enum dvbfe_spectral_inversion inversion = DVBFE_INVERSION_AUTO;
++      int service_filter = -1;
++      int uk_ordering = 0;
++      int timeout = 5;
++      int output_type = OUTPUT_TYPE_RAW;
++      char *output_filename = NULL;
++      char *scan_filename = NULL;
++      struct dvbsec_config sec;
++      int valid_sec = 0;
++
++      while(argpos != argc) {
++              if (!strcmp(argv[argpos], "-h")) {
++                      usage();
++              } else if (!strcmp(argv[argpos], "-adapter")) {
++                      if ((argc - argpos) < 2)
++                              usage();
++                      if (sscanf(argv[argpos+1], "%i", &adapter_id) != 1)
++                              usage();
++                      argpos+=2;
++              } else if (!strcmp(argv[argpos], "-frontend")) {
++                      if ((argc - argpos) < 2)
++                              usage();
++                      if (sscanf(argv[argpos+1], "%i", &frontend_id) != 1)
++                              usage();
++                      argpos+=2;
++              } else if (!strcmp(argv[argpos], "-demux")) {
++                      if ((argc - argpos) < 2)
++                              usage();
++                      if (sscanf(argv[argpos+1], "%i", &demux_id) != 1)
++                              usage();
++                      argpos+=2;
++              } else if (!strcmp(argv[argpos], "-secfile")) {
++                      if ((argc - argpos) < 2)
++                              usage();
++                      secfile = argv[argpos+1];
++                      argpos+=2;
++              } else if (!strcmp(argv[argpos], "-secid")) {
++                      if ((argc - argpos) < 2)
++                              usage();
++                      secid = argv[argpos+1];
++                      argpos+=2;
++              } else if (!strcmp(argv[argpos], "-satpos")) {
++                      if ((argc - argpos) < 2)
++                              usage();
++                      if (sscanf(argv[argpos+1], "%i", &satpos) != 1)
++                              usage();
++                      argpos+=2;
++              } else if (!strcmp(argv[argpos], "-inversion")) {
++                      if ((argc - argpos) < 2)
++                              usage();
++                      if (!strcmp(argv[argpos+1], "off")) {
++                              inversion = DVBFE_INVERSION_OFF;
++                      } else if (!strcmp(argv[argpos+1], "on")) {
++                              inversion = DVBFE_INVERSION_ON;
++                      } else if (!strcmp(argv[argpos+1], "auto")) {
++                              inversion = DVBFE_INVERSION_AUTO;
++                      } else {
++                              usage();
++                      }
++                      argpos+=2;
++              } else if (!strcmp(argv[argpos], "-uk-ordering")) {
++                      if ((argc - argpos) < 1)
++                              usage();
++                      uk_ordering = 1;
++              } else if (!strcmp(argv[argpos], "-timeout")) {
++                      if ((argc - argpos) < 2)
++                              usage();
++                      if (sscanf(argv[argpos+1], "%i", &timeout) != 1)
++                              usage();
++                      argpos+=2;
++              } else if (!strcmp(argv[argpos], "-filter")) {
++                      if ((argc - argpos) < 2)
++                              usage();
++                      service_filter = 0;
++                      if (!strstr(argv[argpos+1], "tv")) {
++                              service_filter |= SERVICE_FILTER_TV;
++                      }
++                      if (!strstr(argv[argpos+1], "radio")) {
++                              service_filter |= SERVICE_FILTER_RADIO;
++                      }
++                      if (!strstr(argv[argpos+1], "other")) {
++                              service_filter |= SERVICE_FILTER_OTHER;
++                      }
++                      if (!strstr(argv[argpos+1], "encrypted")) {
++                              service_filter |= SERVICE_FILTER_ENCRYPTED;
++                      }
++                      argpos+=2;
++              } else if (!strcmp(argv[argpos], "-out")) {
++                      if ((argc - argpos) < 3)
++                              usage();
++                      if (!strcmp(argv[argpos+1], "raw")) {
++                              output_type = OUTPUT_TYPE_RAW;
++                      } else if (!strcmp(argv[argpos+1], "channels")) {
++                              output_type = OUTPUT_TYPE_CHANNELS;
++                      } else if (!strcmp(argv[argpos+1], "vdr12")) {
++                              output_type = OUTPUT_TYPE_VDR12;
++                      } else if (!strcmp(argv[argpos+1], "vdr13")) {
++                              output_type = OUTPUT_TYPE_VDR13;
++                      } else {
++                              usage();
++                      }
++                      output_filename = argv[argpos+2];
++                      if (!strcmp(output_filename, "-"))
++                              output_filename = NULL;
++              } else {
++                      if ((argc - argpos) != 1)
++                              usage();
++                      scan_filename = argv[argpos];
++                      argpos++;
++              }
++      }
++
++      // open the frontend & get its type
++      struct dvbfe_handle *fe = dvbfe_open(adapter_id, frontend_id, 0);
++      if (fe == NULL) {
++              fprintf(stderr, "Failed to open frontend\n");
++              exit(1);
++      }
++      struct dvbfe_info feinfo;
++      if (dvbfe_get_info(fe, 0, &feinfo, DVBFE_INFO_QUERYTYPE_IMMEDIATE, 0) != 0) {
++              fprintf(stderr, "Failed to query frontend\n");
++              exit(1);
++      }
++
++      // default SEC with a DVBS card
++      if ((secid == NULL) && (feinfo.type == DVBFE_TYPE_DVBS))
++              secid = "UNIVERSAL";
++
++      // look up SECID if one was supplied
++      if (secid != NULL) {
++              if (dvbsec_cfg_find(secfile, secid, &sec)) {
++                      fprintf(stderr, "Unable to find suitable sec/lnb configuration for channel\n");
++                      exit(1);
++              }
++              valid_sec = 1;
++      }
++
++      // load the initial scan file
++      FILE *scan_file = fopen(scan_filename, "r");
++      if (scan_file == NULL) {
++              fprintf(stderr, "Could not open scan file %s\n", scan_filename);
++              exit(1);
++      }
++      if (dvbcfg_scanfile_parse(scan_file, scan_load_callback, &feinfo) < 0) {
++              fprintf(stderr, "Could not parse scan file %s\n", scan_filename);
++              exit(1);
++      }
++      fclose(scan_file);
++
++      // main scan loop
++      while(toscan) {
++              // get the first item on the toscan list
++              struct transponder *tmp = first_transponder(&toscan, &toscan_end);
++
++              // have we already seen this transponder?
++              if (seen_transponder(tmp, scanned)) {
++                      free_transponder(tmp);
++                      continue;
++              }
++
++              // do we have a valid SEC configuration?
++              struct dvbsec_config *psec = NULL;
++              if (valid_sec)
++                      psec = &sec;
++
++              // tune it
++              int tuned_ok = 0;
++              for(i=0; i < tmp->frequency_count; i++) {
++                      tmp->params.frequency = tmp->frequencies[i];
++                      if (dvbsec_set(fe,
++                                      psec,
++                                      tmp->polarization,
++                                      (satpos & 0x01) ? DISEQC_SWITCH_B : DISEQC_SWITCH_A,
++                                      (satpos & 0x02) ? DISEQC_SWITCH_B : DISEQC_SWITCH_A,
++                                      &tmp->params,
++                                      0)) {
++                              fprintf(stderr, "Failed to set frontend\n");
++                              exit(1);
++                      }
++
++                      // wait for lock
++                      time_t starttime = time(NULL);
++                      while((time(NULL) - starttime) < TIMEOUT_WAIT_LOCK) {
++                              if (dvbfe_get_info(fe, DVBFE_INFO_LOCKSTATUS, &feinfo,
++                                                      DVBFE_INFO_QUERYTYPE_IMMEDIATE, 0) !=
++                                      DVBFE_INFO_QUERYTYPE_IMMEDIATE) {
++                                      fprintf(stderr, "Unable to query frontend status\n");
++                                      exit(1);
++                              }
++                              if (feinfo.lock) {
++                                      tuned_ok = 1;
++                                      break;
++                              }
++                              usleep(100000);
++                      }
++              }
++              if (!tuned_ok) {
++                      free_transponder(tmp);
++                      continue;
++              }
++
++              // scan it
++              switch(feinfo.type) {
++              case DVBFE_TYPE_DVBS:
++              case DVBFE_TYPE_DVBC:
++              case DVBFE_TYPE_DVBT:
++                      dvbscan_scan_dvb(fe);
++                      break;
++
++              case DVBFE_TYPE_ATSC:
++                      dvbscan_scan_atsc(fe);
++                      break;
++              }
++
++              // add to scanned list.
++              append_transponder(tmp, &scanned, &scanned_end);
++      }
++
++      // FIXME: output the data
++
++      return 0;
++}
++
++int create_section_filter(int adapter, int demux, uint16_t pid, uint8_t table_id)
++{
++      int demux_fd = -1;
++      uint8_t filter[18];
++      uint8_t mask[18];
++
++      // open the demuxer
++      if ((demux_fd = dvbdemux_open_demux(adapter, demux, 0)) < 0) {
++              return -1;
++      }
++
++      // create a section filter
++      memset(filter, 0, sizeof(filter));
++      memset(mask, 0, sizeof(mask));
++      filter[0] = table_id;
++      mask[0] = 0xFF;
++      if (dvbdemux_set_section_filter(demux_fd, pid, filter, mask, 1, 1)) {
++              close(demux_fd);
++              return -1;
++      }
++
++      // done
++      return demux_fd;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/dvbscan/dvbscan_dvb.c dvb-apps/util/dvbscan/dvbscan_dvb.c
+--- linuxtv-dvb-apps-1.1.1/util/dvbscan/dvbscan_dvb.c  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/dvbscan/dvbscan_dvb.c        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,30 @@
++/*
++      dvbscan utility
++
++      Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++      This program is free software; you can redistribute it and/or modify
++      it under the terms of the GNU General Public License as published by
++      the Free Software Foundation; either version 2 of the License, or
++      (at your option) any later version.
++
++      This program is distributed in the hope that it will be useful,
++      but WITHOUT ANY WARRANTY; without even the implied warranty of
++      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++
++      GNU General Public License for more details.
++
++      You should have received a copy of the GNU General Public License
++      along with this program; if not, write to the Free Software
++      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#include <stdlib.h>
++#include <stdio.h>
++#include <string.h>
++#include "dvbscan.h"
++
++void dvbscan_scan_dvb(struct dvbfe_handle *fe)
++{
++      // FIXME
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/dvbscan/dvbscan.h dvb-apps/util/dvbscan/dvbscan.h
+--- linuxtv-dvb-apps-1.1.1/util/dvbscan/dvbscan.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/dvbscan/dvbscan.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,136 @@
++/*
++      dvbscan utility
++
++      Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++      This program is free software; you can redistribute it and/or modify
++      it under the terms of the GNU General Public License as published by
++      the Free Software Foundation; either version 2 of the License, or
++      (at your option) any later version.
++
++      This program is distributed in the hope that it will be useful,
++      but WITHOUT ANY WARRANTY; without even the implied warranty of
++      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++
++      GNU General Public License for more details.
++
++      You should have received a copy of the GNU General Public License
++      along with this program; if not, write to the Free Software
++      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#ifndef DVBSCAN_H
++#define DVBSCAN_H 1
++
++#include <libdvbapi/dvbfe.h>
++#include <libdvbsec/dvbsec_api.h>
++#include <libucsi/types.h>
++
++/**
++ * A stream which is part of a service.
++ */
++struct stream
++{
++      uint8_t stream_type;
++      iso639lang_t language;
++
++      struct stream *next;
++};
++
++/**
++ * A service (programme) which is part of a transponder.
++ */
++struct service
++{
++      /**
++       * Service identification stuff. Strings are in UTF-8.
++       */
++      uint16_t service_id;
++      char *provider_name;
++      char *service_name;
++
++      /**
++       * Pids common to the whole service.
++       */
++      uint16_t pmt_pid;
++      uint16_t pcr_pid;
++
++      /**
++       * CA stuff.
++       */
++      uint16_t *ca_ids;
++      uint32_t ca_ids_count;
++      uint8_t is_scrambled;
++
++      /**
++       * BBC channel number (-1 if unknown).
++       */
++      int bbc_channel_number;
++
++      /**
++       * Streams composing this service.
++       */
++      struct stream *streams;
++      struct stream *streams_end;
++
++      /**
++       * Next service in list.
++       */
++      struct service *next;
++};
++
++/**
++ * A collection of multiplexed services.
++ */
++struct transponder
++{
++      /**
++       * we need to have a seperate list of frequencies since the
++       * DVB standard allows a frequency list descriptor of alternate
++       * frequencies to be supplied.
++       */
++      uint32_t *frequencies;
++      uint32_t frequency_count;
++
++      /**
++       * The rest of the tuning parameters.
++       */
++      struct dvbfe_parameters params;
++
++      /**
++       * DVBS specific parameters
++       */
++      enum dvbsec_diseqc_polarization polarization;
++      int oribital_position;
++
++      /**
++       * Numerical IDs
++       */
++      uint16_t network_id;
++      uint16_t original_network_id;
++      uint16_t transport_stream_id;
++
++      /**
++       * Services detected on this transponder.
++       */
++      struct service *services;
++      struct service *services_end;
++
++      /**
++       * Next item in list.
++       */
++      struct transponder *next;
++};
++
++extern void append_transponder(struct transponder *t, struct transponder **tlist, struct transponder **tlist_end);
++extern struct transponder *new_transponder(void);
++extern void free_transponder(struct transponder *t);
++extern int seen_transponder(struct transponder *t, struct transponder *checklist);
++extern void add_frequency(struct transponder *t, uint32_t frequency);
++extern struct transponder *first_transponder(struct transponder **tlist, struct transponder **tlist_end);
++
++extern int create_section_filter(int adapter, int demux, uint16_t pid, uint8_t table_id);
++extern void dvbscan_scan_dvb(struct dvbfe_handle *fe);
++extern void dvbscan_scan_atsc(struct dvbfe_handle *fe);
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/dvbscan/dvbscan_structutils.c dvb-apps/util/dvbscan/dvbscan_structutils.c
+--- linuxtv-dvb-apps-1.1.1/util/dvbscan/dvbscan_structutils.c  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/dvbscan/dvbscan_structutils.c        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,99 @@
++/*
++      dvbscan utility
++
++      Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++      This program is free software; you can redistribute it and/or modify
++      it under the terms of the GNU General Public License as published by
++      the Free Software Foundation; either version 2 of the License, or
++      (at your option) any later version.
++
++      This program is distributed in the hope that it will be useful,
++      but WITHOUT ANY WARRANTY; without even the implied warranty of
++      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++
++      GNU General Public License for more details.
++
++      You should have received a copy of the GNU General Public License
++      along with this program; if not, write to the Free Software
++      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#include <stdlib.h>
++#include <stdio.h>
++#include <string.h>
++#include "dvbscan.h"
++
++void append_transponder(struct transponder *t, struct transponder **tlist, struct transponder **tlist_end)
++{
++      if (*tlist_end == NULL) {
++              *tlist = t;
++      } else {
++              (*tlist_end)->next = t;
++      }
++      *tlist_end = t;
++      t->next = NULL;
++}
++
++struct transponder *new_transponder(void)
++{
++      struct transponder *t = (struct transponder *) malloc(sizeof(struct transponder));
++      if (t == NULL) {
++              fprintf(stderr, "Out of memory\n");
++              exit(1);
++      }
++      memset(t, 0, sizeof(struct transponder));
++
++      return t;
++}
++
++void free_transponder(struct transponder *t)
++{
++      if (t->frequencies)
++              free(t->frequencies);
++      // FIXME: free services
++      free(t);
++}
++
++int seen_transponder(struct transponder *t, struct transponder *checklist)
++{
++      uint32_t i;
++
++      struct transponder *cur_check = checklist;
++      while(cur_check) {
++              uint32_t freq1 = cur_check->params.frequency / 2000;
++              for(i=0; i < t->frequency_count; i++) {
++                      uint32_t freq2 = t->frequencies[i] / 2000;
++                      if (freq1 == freq2) {
++                              return 1;
++                      }
++              }
++              cur_check = cur_check->next;
++      }
++
++      return 0;
++}
++
++void add_frequency(struct transponder *t, uint32_t frequency)
++{
++      uint32_t *tmp;
++
++      tmp = (uint32_t*) realloc(t->frequencies, sizeof(uint32_t) * (t->frequency_count + 1));
++      if (tmp == NULL) {
++              fprintf(stderr, "Out of memory\n");
++              exit(1);
++      }
++      tmp[t->frequency_count++] = frequency;
++      t->frequencies = tmp;
++}
++
++struct transponder *first_transponder(struct transponder **tlist, struct transponder **tlist_end)
++{
++      struct transponder *t = *tlist;
++
++      *tlist = t->next;
++      if (*tlist == NULL)
++              *tlist_end = NULL;
++
++      return t;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/dvbscan/Makefile dvb-apps/util/dvbscan/Makefile
+--- linuxtv-dvb-apps-1.1.1/util/dvbscan/Makefile       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/dvbscan/Makefile     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,22 @@
++# Makefile for linuxtv.org dvb-apps/util/dvbscan
++
++objects  = dvbscan.o  \
++         dvbscan_structutils.o \
++           dvbscan_dvb.o \
++           dvbscan_atsc.o
++
++binaries = dvbscan
++
++inst_bin = $(binaries)
++
++CPPFLAGS += -I../../lib
++LDFLAGS  += -L../../lib/libdvbapi -L../../lib/libdvbcfg -L../../lib/libdvbsec -L../../lib/libucsi
++LDLIBS   += -ldvbcfg -lucsi -ldvbsec -ldvbapi -lpthread
++
++.PHONY: all
++
++all: $(binaries)
++
++$(binaries): $(objects)
++
++include ../../Make.rules
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/dvbtraffic/dvbtraffic.c dvb-apps/util/dvbtraffic/dvbtraffic.c
+--- linuxtv-dvb-apps-1.1.1/util/dvbtraffic/dvbtraffic.c        2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/dvbtraffic/dvbtraffic.c      2009-06-21 13:29:06.000000000 +0200
+@@ -1,3 +1,5 @@
++/* This file is released into the public domain by its authors */
++
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <sys/ioctl.h>
+@@ -9,64 +11,83 @@
+ #include <sys/poll.h>
+ #include <sys/time.h>
+ #include <string.h>
+-
+-#include <linux/dvb/dmx.h>
+-#include <linux/dvb/frontend.h>
+-#include <linux/dvb/video.h>
++#include <limits.h>
++#include <libdvbapi/dvbdemux.h>
+ #define BSIZE 188
+-int pidt[0x2001];
++static int pidt[0x2001];
++
++static void usage(FILE *output)
++{
++      fprintf(output,
++              "Usage: dvbtraffic [OPTION]...\n"
++              "Options:\n"
++              "       -a N    use dvb adapter N\n"
++              "       -d N    use demux N\n"
++              "       -h      display this help\n");
++}
+ int main(int argc, char **argv)
+ {
+-      int fd, ffd, packets = 0;
+       struct timeval startt;
+-      struct dmx_pes_filter_params flt;
+-      char *search;
+-      unsigned char buffer[BSIZE];
+-
+-      fd = open("/dev/dvb/adapter0/dvr0", O_RDONLY);
+-
+-      ioctl(fd, DMX_SET_BUFFER_SIZE, 1024 * 1024);
++      int adapter = 0, demux = 0;
++      char *search = NULL;
++      int fd, ffd, packets = 0;
++      int opt;
+-      ffd = open("/dev/dvb/adapter0/demux0", O_RDWR);
+-      if (ffd < 0) {
+-              perror("/dev/dvb/adapter0/demux0");
+-              return -fd;
++      while ((opt = getopt(argc, argv, "a:d:hs:")) != -1) {
++              switch (opt) {
++              case 'a':
++                      adapter = atoi(optarg);
++                      break;
++              case 'd':
++                      demux = atoi(optarg);
++                      break;
++              case 'h':
++                      usage(stdout);
++                      exit(0);
++              case 's':
++                      search = strdup(optarg);
++                      break;
++              default:
++                      usage(stderr);
++                      exit(1);
++              }
+       }
+-      flt.pid = 0x2000;
+-      flt.input = DMX_IN_FRONTEND;
+-      flt.output = DMX_OUT_TS_TAP;
+-      flt.pes_type = DMX_PES_OTHER;
+-      flt.flags = 0;
++      // open the DVR device
++      fd = dvbdemux_open_dvr(adapter, demux, 1, 0);
++      if (fd < 0) {
++              fprintf(stderr, "dvbtraffic: Could not open dvr device: %m\n");
++              exit(1);
++      }
++      dvbdemux_set_buffer(fd, 1024 * 1024);
+-      if (ioctl(ffd, DMX_SET_PES_FILTER, &flt) < 0) {
+-              perror("DMX_SET_PES_FILTER");
+-              return -1;
++      ffd = dvbdemux_open_demux(adapter, demux, 0);
++      if (ffd < 0) {
++              fprintf(stderr, "dvbtraffic: Could not open demux device: %m\n");
++              exit(1);
+       }
+-      if (ioctl(ffd, DMX_START, 0) < 0) {
+-              perror("DMX_SET_PES_FILTER");
++      if (dvbdemux_set_pid_filter(ffd, -1, DVBDEMUX_INPUT_FRONTEND, DVBDEMUX_OUTPUT_DVR, 1)) {
++              perror("dvbdemux_set_pid_filter");
+               return -1;
+       }
+       gettimeofday(&startt, 0);
+-      if (argc > 1)
+-              search = argv[1];
+-      else
+-              search = 0;
+-
+       while (1) {
+-              int pid, r, ok;
+-              if ((r = read(fd, buffer, 188)) <= 0) {
++              unsigned char buffer[BSIZE];
++              int pid, ok;
++              ssize_t r;
++
++              if ((r = read(fd, buffer, BSIZE)) <= 0) {
+                       perror("read");
+                       break;
+               }
+-              if (r != 188) {
+-                      printf("only read %d\n", r);
++              if (r != BSIZE) {
++                      fprintf(stderr, "dvbtraffic: only read %zd bytes\n", r);
+                       break;
+               }
+               if (buffer[0] != 0x47) {
+@@ -106,16 +127,16 @@
+                           (now.tv_sec - startt.tv_sec) * 1000 +
+                           (now.tv_usec - startt.tv_usec) / 1000;
+                       if (diff > 1000) {
+-                              int pid = 0;
+-                              for (pid = 0; pid < 0x2001; pid++) {
+-                                      if (pidt[pid]) {
++                              int _pid = 0;
++                              for (_pid = 0; _pid < 0x2001; _pid++) {
++                                      if (pidt[_pid]) {
+                                               printf("%04x %5d p/s %5d kb/s %5d kbit\n",
+-                                                   pid,
+-                                                   pidt[pid] * 1000 / diff,
+-                                                   pidt[pid] * 1000 / diff * 188 / 1024,
+-                                                   pidt[pid] * 8 * 1000 / diff * 188 / 1000);
++                                                   _pid,
++                                                   pidt[_pid] * 1000 / diff,
++                                                   pidt[_pid] * 1000 / diff * 188 / 1024,
++                                                   pidt[_pid] * 8 * 1000 / diff * 188 / 1000);
+                                       }
+-                                      pidt[pid] = 0;
++                                      pidt[_pid] = 0;
+                               }
+                               printf("-PID--FREQ-----BANDWIDTH-BANDWIDTH-\n");
+                               startt = now;
+@@ -127,4 +148,3 @@
+       close(fd);
+       return 0;
+ }
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/dvbtraffic/Makefile dvb-apps/util/dvbtraffic/Makefile
+--- linuxtv-dvb-apps-1.1.1/util/dvbtraffic/Makefile    2004-01-19 18:10:16.000000000 +0100
++++ dvb-apps/util/dvbtraffic/Makefile  2009-06-21 13:29:06.000000000 +0200
+@@ -1,6 +1,15 @@
++# Makefile for linuxtv.org dvb-apps/util/dvbtraffic
+-dvbtraffic: dvbtraffic.c
+-      gcc -MD -g -O2 -Wall -I../../include $< -o $@
++binaries = dvbtraffic
+-clean:
+-      rm -f *.o *.d dvbtraffic
++inst_bin = $(binaries)
++
++CPPFLAGS += -I../../lib
++LDFLAGS  += -L../../lib/libdvbapi
++LDLIBS   += -ldvbapi
++
++.PHONY: all
++
++all: $(binaries)
++
++include ../../Make.rules
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/femon/femon.c dvb-apps/util/femon/femon.c
+--- linuxtv-dvb-apps-1.1.1/util/femon/femon.c  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/femon/femon.c        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,175 @@
++/* femon -- monitor frontend status
++ *
++ * Copyright (C) 2003 convergence GmbH
++ * Johannes Stezenbach <js@convergence.de>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <limits.h>
++#include <string.h>
++#include <errno.h>
++#include <sys/ioctl.h>
++#include <sys/types.h>
++#include <sys/stat.h>
++#include <sys/poll.h>
++#include <fcntl.h>
++#include <time.h>
++#include <unistd.h>
++
++#include <stdint.h>
++#include <sys/time.h>
++
++#include <libdvbapi/dvbfe.h>
++
++#define FE_STATUS_PARAMS (DVBFE_INFO_LOCKSTATUS|DVBFE_INFO_SIGNAL_STRENGTH|DVBFE_INFO_BER|DVBFE_INFO_SNR|DVBFE_INFO_UNCORRECTED_BLOCKS)
++
++static char *usage_str =
++    "\nusage: femon [options]\n"
++    "     -H        : human readable output\n"
++    "     -a number : use given adapter (default 0)\n"
++    "     -f number : use given frontend (default 0)\n"
++    "     -c number : samples to take (default 0 = infinite)\n\n";
++
++
++static void usage(void)
++{
++      fprintf(stderr, usage_str);
++      exit(1);
++}
++
++
++static
++int check_frontend (struct dvbfe_handle *fe, int human_readable, unsigned int count)
++{
++      struct dvbfe_info fe_info;
++      unsigned int samples = 0;
++
++      do {
++              if (dvbfe_get_info(fe, FE_STATUS_PARAMS, &fe_info, DVBFE_INFO_QUERYTYPE_IMMEDIATE, 0) != FE_STATUS_PARAMS) {
++                      fprintf(stderr, "Problem retrieving frontend information: %m\n");
++              }
++
++
++
++              if (human_readable) {
++                       printf ("status %c%c%c%c%c | signal %3u%% | snr %3u%% | ber %d | unc %d | ",
++                              fe_info.signal ? 'S' : ' ',
++                              fe_info.carrier ? 'C' : ' ',
++                              fe_info.viterbi ? 'V' : ' ',
++                              fe_info.sync ? 'Y' : ' ',
++                              fe_info.lock ? 'L' : ' ',
++                              (fe_info.signal_strength * 100) / 0xffff,
++                              (fe_info.snr * 100) / 0xffff,
++                              fe_info.ber,
++                              fe_info.ucblocks);
++              } else {
++                      printf ("status %c%c%c%c%c | signal %04x | snr %04x | ber %08x | unc %08x | ",
++                              fe_info.signal ? 'S' : ' ',
++                              fe_info.carrier ? 'C' : ' ',
++                              fe_info.viterbi ? 'V' : ' ',
++                              fe_info.sync ? 'Y' : ' ',
++                              fe_info.lock ? 'L' : ' ',
++                              fe_info.signal_strength,
++                              fe_info.snr,
++                              fe_info.ber,
++                              fe_info.ucblocks);
++              }
++
++              if (fe_info.lock)
++                      printf("FE_HAS_LOCK");
++
++              printf("\n");
++              fflush(stdout);
++              usleep(1000000);
++              samples++;
++      } while ((!count) || (count-samples));
++
++      return 0;
++}
++
++
++static
++int do_mon(unsigned int adapter, unsigned int frontend, int human_readable, unsigned int count)
++{
++      int result;
++      struct dvbfe_handle *fe;
++      struct dvbfe_info fe_info;
++      char *fe_type = "UNKNOWN";
++
++      fe = dvbfe_open(adapter, frontend, 1);
++      if (fe == NULL) {
++              perror("opening frontend failed");
++              return 0;
++      }
++
++      dvbfe_get_info(fe, 0, &fe_info, DVBFE_INFO_QUERYTYPE_IMMEDIATE, 0);
++      switch(fe_info.type) {
++      case DVBFE_TYPE_DVBS:
++              fe_type = "DVBS";
++              break;
++      case DVBFE_TYPE_DVBC:
++              fe_type = "DVBC";
++              break;
++      case DVBFE_TYPE_DVBT:
++              fe_type = "DVBT";
++              break;
++      case DVBFE_TYPE_ATSC:
++              fe_type = "ATSC";
++              break;
++      }
++      printf("FE: %s (%s)\n", fe_info.name, fe_type);
++
++      result = check_frontend (fe, human_readable, count);
++
++      dvbfe_close(fe);
++
++      return result;
++}
++
++int main(int argc, char *argv[])
++{
++      unsigned int adapter = 0, frontend = 0, count = 0;
++      int human_readable = 0;
++      int opt;
++
++       while ((opt = getopt(argc, argv, "Ha:f:c:")) != -1) {
++              switch (opt)
++              {
++              default:
++                      usage();
++                      break;
++              case 'a':
++                      adapter = strtoul(optarg, NULL, 0);
++                      break;
++              case 'c':
++                      count = strtoul(optarg, NULL, 0);
++                      break;
++              case 'f':
++                      frontend = strtoul(optarg, NULL, 0);
++                      break;
++              case 'H':
++                      human_readable = 1;
++                      break;
++              }
++      }
++
++      do_mon(adapter, frontend, human_readable, count);
++
++      return 0;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/femon/Makefile dvb-apps/util/femon/Makefile
+--- linuxtv-dvb-apps-1.1.1/util/femon/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/femon/Makefile       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,15 @@
++# Makefile for linuxtv.org dvb-apps/util/femon
++
++binaries = femon
++
++inst_bin = $(binaries)
++
++CPPFLAGS += -I../../lib
++LDFLAGS  += -L../../lib/libdvbapi
++LDLIBS   += -ldvbapi
++
++.PHONY: all
++
++all: $(binaries)
++
++include ../../Make.rules
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/gnutv/gnutv.c dvb-apps/util/gnutv/gnutv.c
+--- linuxtv-dvb-apps-1.1.1/util/gnutv/gnutv.c  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/gnutv/gnutv.c        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,375 @@
++/*
++      gnutv utility
++
++      Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++      Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++      This program is free software; you can redistribute it and/or modify
++      it under the terms of the GNU General Public License as published by
++      the Free Software Foundation; either version 2 of the License, or
++      (at your option) any later version.
++
++      This program is distributed in the hope that it will be useful,
++      but WITHOUT ANY WARRANTY; without even the implied warranty of
++      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++
++      GNU General Public License for more details.
++
++      You should have received a copy of the GNU General Public License
++      along with this program; if not, write to the Free Software
++      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#include <stdio.h>
++#include <unistd.h>
++#include <limits.h>
++#include <string.h>
++#include <fcntl.h>
++#include <signal.h>
++#include <pthread.h>
++#include <sys/poll.h>
++#include <libdvbapi/dvbdemux.h>
++#include <libdvbapi/dvbaudio.h>
++#include <libdvbsec/dvbsec_cfg.h>
++#include <libucsi/mpeg/section.h>
++#include "gnutv.h"
++#include "gnutv_dvb.h"
++#include "gnutv_ca.h"
++#include "gnutv_data.h"
++
++
++static void signal_handler(int _signal);
++
++static int quit_app = 0;
++
++void usage(void)
++{
++      static const char *_usage = "\n"
++              " gnutv: A digital tv utility\n"
++              " Copyright (C) 2004, 2005, 2006 Manu Abraham (manu@kromtek.com)\n"
++              " Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)\n\n"
++              " usage: gnutv <options> as follows:\n"
++              " -h                    help\n"
++              " -adapter <id>         adapter to use (default 0)\n"
++              " -frontend <id>        frontend to use (default 0)\n"
++              " -demux <id>           demux to use (default 0)\n"
++              " -caslotnum <id>       ca slot number to use (default 0)\n"
++              " -channels <filename>  channels.conf file.\n"
++              " -secfile <filename>   Optional sec.conf file.\n"
++              " -secid <secid>        ID of the SEC configuration to use, one of:\n"
++              "                        * UNIVERSAL (default) - Europe, 10800 to 11800 MHz and 11600 to 12700 Mhz,\n"
++              "                                                Dual LO, loband 9750, hiband 10600 MHz.\n"
++              "                        * DBS - Expressvu, North America, 12200 to 12700 MHz, Single LO, 11250 MHz.\n"
++              "                        * STANDARD - 10945 to 11450 Mhz, Single LO, 10000 Mhz.\n"
++              "                        * ENHANCED - Astra, 10700 to 11700 MHz, Single LO, 9750 MHz.\n"
++              "                        * C-BAND - Big Dish, 3700 to 4200 MHz, Single LO, 5150 Mhz.\n"
++              "                        * C-MULTI - Big Dish - Multipoint LNBf, 3700 to 4200 MHz,\n"
++              "                                               Dual LO, H:5150MHz, V:5750MHz.\n"
++              "                        * One of the sec definitions from the secfile if supplied\n"
++              " -buffer <size>        Custom DVR buffer size\n"
++              " -out decoder          Output to hardware decoder (default)\n"
++              "      decoderabypass   Output to hardware decoder using audio bypass\n"
++              "      dvr              Output stream to dvr device\n"
++              "      null             Do not output anything\n"
++              "      stdout           Output to stdout\n"
++              "      file <filename>  Output stream to file\n"
++              "      udp <address> <port>                     Output stream to address:port using udp\n"
++              "      udpif <address> <port> <interface>       Output stream to address:port using udp\n"
++              "                                                       forcing the specified interface\n"
++              "      rtp <address> <port>                     Output stream to address:port using udp-rtp\n"
++              "      rtpif <address> <port> <interface>       Output stream to address:port using udp-rtp\n"
++              "                                                       forcing the specified interface\n"
++              " -timeout <secs>       Number of seconds to output channel for\n"
++              "                               (0=>exit immediately after successful tuning, default is to output forever)\n"
++              " -cammenu              Show the CAM menu\n"
++              " -nomoveca             Do not attempt to move CA descriptors from stream to programme level\n"
++              " <channel name>\n";
++      fprintf(stderr, "%s\n", _usage);
++
++      exit(1);
++}
++
++int find_channel(struct dvbcfg_zapchannel *channel, void *private_data)
++{
++      struct dvbcfg_zapchannel *tmpchannel = private_data;
++
++      if (strcmp(channel->name, tmpchannel->name) == 0) {
++              memcpy(tmpchannel, channel, sizeof(struct dvbcfg_zapchannel));
++              return 1;
++      }
++
++      return 0;
++}
++
++int main(int argc, char *argv[])
++{
++      int adapter_id = 0;
++      int frontend_id = 0;
++      int demux_id = 0;
++      int caslot_num = 0;
++      char *chanfile = "/etc/channels.conf";
++      char *secfile = NULL;
++      char *secid = NULL;
++      char *channel_name = NULL;
++      int output_type = OUTPUT_TYPE_DECODER;
++      char *outfile = NULL;
++      char *outhost = NULL;
++      char *outport = NULL;
++      char *outif = NULL;
++      struct addrinfo *outaddrs = NULL;
++      int timeout = -1;
++      int moveca = 1;
++      int cammenu = 0;
++      int argpos = 1;
++      struct gnutv_dvb_params gnutv_dvb_params;
++      struct gnutv_ca_params gnutv_ca_params;
++      int ffaudiofd = -1;
++      int usertp = 0;
++      int buffer_size = 0;
++
++      while(argpos != argc) {
++              if (!strcmp(argv[argpos], "-h")) {
++                      usage();
++              } else if (!strcmp(argv[argpos], "-adapter")) {
++                      if ((argc - argpos) < 2)
++                              usage();
++                      if (sscanf(argv[argpos+1], "%i", &adapter_id) != 1)
++                              usage();
++                      argpos+=2;
++              } else if (!strcmp(argv[argpos], "-frontend")) {
++                      if ((argc - argpos) < 2)
++                              usage();
++                      if (sscanf(argv[argpos+1], "%i", &frontend_id) != 1)
++                              usage();
++                      argpos+=2;
++              } else if (!strcmp(argv[argpos], "-demux")) {
++                      if ((argc - argpos) < 2)
++                              usage();
++                      if (sscanf(argv[argpos+1], "%i", &demux_id) != 1)
++                              usage();
++                      argpos+=2;
++              } else if (!strcmp(argv[argpos], "-caslotnum")) {
++                      if ((argc - argpos) < 2)
++                              usage();
++                      if (sscanf(argv[argpos+1], "%i", &caslot_num) != 1)
++                              usage();
++                      argpos+=2;
++              } else if (!strcmp(argv[argpos], "-channels")) {
++                      if ((argc - argpos) < 2)
++                              usage();
++                      chanfile = argv[argpos+1];
++                      argpos+=2;
++              } else if (!strcmp(argv[argpos], "-secfile")) {
++                      if ((argc - argpos) < 2)
++                              usage();
++                      secfile = argv[argpos+1];
++                      argpos+=2;
++              } else if (!strcmp(argv[argpos], "-secid")) {
++                      if ((argc - argpos) < 2)
++                              usage();
++                      secid = argv[argpos+1];
++                      argpos+=2;
++              } else if (!strcmp(argv[argpos], "-buffer")) {
++                      if ((argc - argpos) < 2)
++                              usage();
++                      if (sscanf(argv[argpos+1], "%i", &buffer_size) != 1)
++                              usage();
++                      if (buffer_size < 0)
++                              usage();
++                      argpos+=2;
++              } else if (!strcmp(argv[argpos], "-out")) {
++                      if ((argc - argpos) < 2)
++                              usage();
++                      if (!strcmp(argv[argpos+1], "decoder")) {
++                              output_type = OUTPUT_TYPE_DECODER;
++                      } else if (!strcmp(argv[argpos+1], "decoderabypass")) {
++                              output_type = OUTPUT_TYPE_DECODER_ABYPASS;
++                      } else if (!strcmp(argv[argpos+1], "dvr")) {
++                              output_type = OUTPUT_TYPE_DVR;
++                      } else if (!strcmp(argv[argpos+1], "null")) {
++                              output_type = OUTPUT_TYPE_NULL;
++                      } else if (!strcmp(argv[argpos+1], "stdout")) {
++                              output_type = OUTPUT_TYPE_STDOUT;
++                      } else if (!strcmp(argv[argpos+1], "file")) {
++                              output_type = OUTPUT_TYPE_FILE;
++                              if ((argc - argpos) < 3)
++                                      usage();
++                              outfile = argv[argpos+2];
++                              argpos++;
++                      } else if ((!strcmp(argv[argpos+1], "udp")) ||
++                                 (!strcmp(argv[argpos+1], "rtp"))) {
++                              output_type = OUTPUT_TYPE_UDP;
++                              if ((argc - argpos) < 4)
++                                      usage();
++
++                              if (!strcmp(argv[argpos+1], "rtp"))
++                                      usertp = 1;
++                              outhost = argv[argpos+2];
++                              outport = argv[argpos+3];
++                              argpos+=2;
++                      } else if ((!strcmp(argv[argpos+1], "udpif")) ||
++                                 (!strcmp(argv[argpos+1], "rtpif"))) {
++                              output_type = OUTPUT_TYPE_UDP;
++                              if ((argc - argpos) < 5)
++                                      usage();
++
++                              if (!strcmp(argv[argpos+1], "rtpif"))
++                                      usertp = 1;
++                              outhost = argv[argpos+2];
++                              outport = argv[argpos+3];
++                              outif = argv[argpos+4];
++                              argpos+=3;
++                      } else {
++                              usage();
++                      }
++                      argpos+=2;
++              } else if (!strcmp(argv[argpos], "-timeout")) {
++                      if ((argc - argpos) < 2)
++                              usage();
++                      if (sscanf(argv[argpos+1], "%i", &timeout) != 1)
++                              usage();
++                      argpos+=2;
++              } else if (!strcmp(argv[argpos], "-nomoveca")) {
++                      moveca = 0;
++                      argpos++;
++              } else if (!strcmp(argv[argpos], "-cammenu")) {
++                      cammenu = 1;
++                      argpos++;
++              } else {
++                      if ((argc - argpos) != 1)
++                              usage();
++                      channel_name = argv[argpos];
++                      argpos++;
++              }
++      }
++
++      // the user didn't select anything!
++      if ((channel_name == NULL) && (!cammenu))
++              usage();
++
++      // resolve host/port
++      if ((outhost != NULL) && (outport != NULL)) {
++              int res;
++              struct addrinfo hints;
++              memset(&hints, 0, sizeof(hints));
++              hints.ai_family = AF_UNSPEC;
++              hints.ai_socktype = SOCK_DGRAM;
++              if ((res = getaddrinfo(outhost, outport, &hints, &outaddrs)) != 0) {
++                      fprintf(stderr, "Unable to resolve requested address: %s\n", gai_strerror(res));
++                      exit(1);
++              }
++      }
++
++      // setup any signals
++      signal(SIGINT, signal_handler);
++      signal(SIGPIPE, SIG_IGN);
++
++      // start the CA stuff
++      gnutv_ca_params.adapter_id = adapter_id;
++      gnutv_ca_params.caslot_num = caslot_num;
++      gnutv_ca_params.cammenu = cammenu;
++      gnutv_ca_params.moveca = moveca;
++      gnutv_ca_start(&gnutv_ca_params);
++
++      // frontend setup if a channel name was supplied
++      if ((!cammenu) && (channel_name != NULL)) {
++              // find the requested channel
++              if (strlen(channel_name) >= sizeof(gnutv_dvb_params.channel.name)) {
++                      fprintf(stderr, "Channel name is too long %s\n", channel_name);
++                      exit(1);
++              }
++              FILE *channel_file = fopen(chanfile, "r");
++              if (channel_file == NULL) {
++                      fprintf(stderr, "Could open channel file %s\n", chanfile);
++                      exit(1);
++              }
++              memcpy(gnutv_dvb_params.channel.name, channel_name, strlen(channel_name) + 1);
++              if (dvbcfg_zapchannel_parse(channel_file, find_channel, &gnutv_dvb_params.channel) != 1) {
++                      fprintf(stderr, "Unable to find requested channel %s\n", channel_name);
++                      exit(1);
++              }
++              fclose(channel_file);
++
++              // default SEC with a DVBS card
++              if ((secid == NULL) && (gnutv_dvb_params.channel.fe_type == DVBFE_TYPE_DVBS))
++                      secid = "UNIVERSAL";
++
++              // look it up if one were supplied
++              gnutv_dvb_params.valid_sec = 0;
++              if (secid != NULL) {
++                      if (dvbsec_cfg_find(secfile, secid,
++                                      &gnutv_dvb_params.sec)) {
++                              fprintf(stderr, "Unable to find suitable sec/lnb configuration for channel\n");
++                              exit(1);
++                      }
++                      gnutv_dvb_params.valid_sec = 1;
++              }
++
++              // open the frontend
++              gnutv_dvb_params.fe = dvbfe_open(adapter_id, frontend_id, 0);
++              if (gnutv_dvb_params.fe == NULL) {
++                      fprintf(stderr, "Failed to open frontend\n");
++                      exit(1);
++              }
++
++              // failover decoder to dvr output if decoder not available
++              if ((output_type == OUTPUT_TYPE_DECODER) ||
++                  (output_type == OUTPUT_TYPE_DECODER_ABYPASS)) {
++                      ffaudiofd = dvbaudio_open(adapter_id, 0);
++                      if (ffaudiofd < 0) {
++                              fprintf(stderr, "Cannot open decoder; defaulting to dvr output\n");
++                              output_type = OUTPUT_TYPE_DVR;
++                      }
++              }
++
++              // start the DVB stuff
++              gnutv_dvb_params.adapter_id = adapter_id;
++              gnutv_dvb_params.frontend_id = frontend_id;
++              gnutv_dvb_params.demux_id = demux_id;
++              gnutv_dvb_params.output_type = output_type;
++              gnutv_dvb_start(&gnutv_dvb_params);
++
++              // start the data stuff
++              gnutv_data_start(output_type, ffaudiofd, adapter_id, demux_id, buffer_size, outfile, outif, outaddrs, usertp);
++      }
++
++      // the UI
++      time_t start = 0;
++      while(!quit_app) {
++              if (gnutv_dvb_locked() && (start == 0))
++                      start = time(NULL);
++
++              // the timeout
++              if ((timeout != -1) && (start != 0)) {
++                      if ((time(NULL) - start) >= timeout)
++                              break;
++              }
++
++              if (cammenu)
++                      gnutv_ca_ui();
++              else
++                      usleep(1);
++      }
++
++      // stop data handling
++      gnutv_data_stop();
++
++      // shutdown DVB stuff
++      if (channel_name != NULL)
++              gnutv_dvb_stop();
++
++      // shutdown CA stuff
++      gnutv_ca_stop();
++
++      // done
++      exit(0);
++}
++
++static void signal_handler(int _signal)
++{
++      (void) _signal;
++
++      if (!quit_app) {
++              quit_app = 1;
++      }
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/gnutv/gnutv_ca.c dvb-apps/util/gnutv/gnutv_ca.c
+--- linuxtv-dvb-apps-1.1.1/util/gnutv/gnutv_ca.c       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/gnutv/gnutv_ca.c     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,404 @@
++/*
++      gnutv utility
++
++      Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++      Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++      This program is free software; you can redistribute it and/or modify
++      it under the terms of the GNU General Public License as published by
++      the Free Software Foundation; either version 2 of the License, or
++      (at your option) any later version.
++
++      This program is distributed in the hope that it will be useful,
++      but WITHOUT ANY WARRANTY; without even the implied warranty of
++      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++
++      GNU General Public License for more details.
++
++      You should have received a copy of the GNU General Public License
++      along with this program; if not, write to the Free Software
++      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <unistd.h>
++#include <sys/poll.h>
++#include <pthread.h>
++#include <libdvben50221/en50221_stdcam.h>
++#include "gnutv.h"
++#include "gnutv_ca.h"
++
++
++
++#define MMI_STATE_CLOSED 0
++#define MMI_STATE_OPEN 1
++#define MMI_STATE_ENQ 2
++#define MMI_STATE_MENU 3
++
++static int gnutv_ca_info_callback(void *arg, uint8_t slot_id, uint16_t session_number, uint32_t ca_id_count, uint16_t *ca_ids);
++static int gnutv_ai_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                           uint8_t application_type, uint16_t application_manufacturer,
++                           uint16_t manufacturer_code, uint8_t menu_string_length,
++                           uint8_t *menu_string);
++
++static int gnutv_mmi_close_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                                  uint8_t cmd_id, uint8_t delay);
++static int gnutv_mmi_display_control_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                                            uint8_t cmd_id, uint8_t mmi_mode);
++static int gnutv_mmi_enq_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                                uint8_t blind_answer, uint8_t expected_answer_length,
++                                uint8_t *text, uint32_t text_size);
++static int gnutv_mmi_menu_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                                 struct en50221_app_mmi_text *title,
++                                 struct en50221_app_mmi_text *sub_title,
++                                 struct en50221_app_mmi_text *bottom,
++                                 uint32_t item_count, struct en50221_app_mmi_text *items,
++                                 uint32_t item_raw_length, uint8_t *items_raw);
++static void *camthread_func(void* arg);
++
++static struct en50221_transport_layer *tl = NULL;
++static struct en50221_session_layer *sl = NULL;
++static struct en50221_stdcam *stdcam = NULL;
++
++static int ca_resource_connected = 0;
++static int mmi_state = MMI_STATE_CLOSED;
++static int mmi_enq_blind;
++static int mmi_enq_length;
++
++static int camthread_shutdown = 0;
++static pthread_t camthread;
++int moveca = 0;
++int seenpmt = 0;
++int cammenu = 0;
++
++char ui_line[256];
++uint32_t ui_linepos = 0;
++
++
++void gnutv_ca_start(struct gnutv_ca_params *params)
++{
++      // create transport layer
++      tl = en50221_tl_create(1, 16);
++      if (tl == NULL) {
++              fprintf(stderr, "Failed to create transport layer\n");
++              return;
++      }
++
++      // create session layer
++      sl = en50221_sl_create(tl, 16);
++      if (sl == NULL) {
++              fprintf(stderr, "Failed to create session layer\n");
++              en50221_tl_destroy(tl);
++              return;
++      }
++
++      // create the stdcam instance
++      stdcam = en50221_stdcam_create(params->adapter_id, params->caslot_num, tl, sl);
++      if (stdcam == NULL) {
++              en50221_sl_destroy(sl);
++              en50221_tl_destroy(tl);
++              return;
++      }
++
++      // hook up the AI callbacks
++      if (stdcam->ai_resource) {
++              en50221_app_ai_register_callback(stdcam->ai_resource, gnutv_ai_callback, stdcam);
++      }
++
++      // hook up the CA callbacks
++      if (stdcam->ca_resource) {
++              en50221_app_ca_register_info_callback(stdcam->ca_resource, gnutv_ca_info_callback, stdcam);
++      }
++
++      // hook up the MMI callbacks
++      if (params->cammenu) {
++              if (stdcam->mmi_resource) {
++                      en50221_app_mmi_register_close_callback(stdcam->mmi_resource, gnutv_mmi_close_callback, stdcam);
++                      en50221_app_mmi_register_display_control_callback(stdcam->mmi_resource, gnutv_mmi_display_control_callback, stdcam);
++                      en50221_app_mmi_register_enq_callback(stdcam->mmi_resource, gnutv_mmi_enq_callback, stdcam);
++                      en50221_app_mmi_register_menu_callback(stdcam->mmi_resource, gnutv_mmi_menu_callback, stdcam);
++                      en50221_app_mmi_register_list_callback(stdcam->mmi_resource, gnutv_mmi_menu_callback, stdcam);
++              } else {
++                      fprintf(stderr, "CAM Menus are not supported by this interface hardware\n");
++                      exit(1);
++              }
++      }
++
++      // any other stuff
++      moveca = params->moveca;
++      cammenu = params->cammenu;
++
++      // start the cam thread
++      pthread_create(&camthread, NULL, camthread_func, NULL);
++}
++
++void gnutv_ca_stop(void)
++{
++      if (stdcam == NULL)
++              return;
++
++      // shutdown the cam thread
++      camthread_shutdown = 1;
++      pthread_join(camthread, NULL);
++
++      // destroy the stdcam
++      if (stdcam->destroy)
++              stdcam->destroy(stdcam, 1);
++
++      // destroy session layer
++      en50221_sl_destroy(sl);
++
++      // destroy transport layer
++      en50221_tl_destroy(tl);
++}
++
++void gnutv_ca_ui(void)
++{
++      // make up polling structure for stdin
++      struct pollfd pollfd;
++      pollfd.fd = 0;
++      pollfd.events = POLLIN|POLLPRI|POLLERR;
++
++      if (stdcam == NULL)
++              return;
++
++      // is there a character?
++      if (poll(&pollfd, 1, 10) != 1)
++              return;
++      if (pollfd.revents & POLLERR)
++              return;
++
++      // try to read the character
++      char c;
++      if (read(0, &c, 1) != 1)
++              return;
++      if (c == '\r') {
++              return;
++      } else if (c == '\n') {
++              switch(mmi_state) {
++              case MMI_STATE_CLOSED:
++              case MMI_STATE_OPEN:
++                      if ((ui_linepos == 0) && (ca_resource_connected)) {
++                              en50221_app_ai_entermenu(stdcam->ai_resource, stdcam->ai_session_number);
++                      }
++                      break;
++
++              case MMI_STATE_ENQ:
++                      if (ui_linepos == 0) {
++                              en50221_app_mmi_answ(stdcam->mmi_resource, stdcam->mmi_session_number,
++                                                      MMI_ANSW_ID_CANCEL, NULL, 0);
++                      } else {
++                              en50221_app_mmi_answ(stdcam->mmi_resource, stdcam->mmi_session_number,
++                                                      MMI_ANSW_ID_ANSWER, (uint8_t*) ui_line, ui_linepos);
++                      }
++                      mmi_state = MMI_STATE_OPEN;
++                      break;
++
++              case MMI_STATE_MENU:
++                      ui_line[ui_linepos] = 0;
++                      en50221_app_mmi_menu_answ(stdcam->mmi_resource, stdcam->mmi_session_number,
++                                                      atoi(ui_line));
++                      mmi_state = MMI_STATE_OPEN;
++                      break;
++              }
++              ui_linepos = 0;
++      } else {
++              if (ui_linepos < (sizeof(ui_line)-1)) {
++                      ui_line[ui_linepos++] = c;
++              }
++      }
++}
++
++int gnutv_ca_new_pmt(struct mpeg_pmt_section *pmt)
++{
++      uint8_t capmt[4096];
++      int size;
++
++      if (stdcam == NULL)
++              return -1;
++
++      if (ca_resource_connected) {
++              fprintf(stderr, "Received new PMT - sending to CAM...\n");
++
++              // translate it into a CA PMT
++              int listmgmt = CA_LIST_MANAGEMENT_ONLY;
++              if (seenpmt) {
++                      listmgmt = CA_LIST_MANAGEMENT_UPDATE;
++              }
++              seenpmt = 1;
++
++              if ((size = en50221_ca_format_pmt(pmt, capmt, sizeof(capmt), moveca, listmgmt,
++                                                CA_PMT_CMD_ID_OK_DESCRAMBLING)) < 0) {
++                      fprintf(stderr, "Failed to format PMT\n");
++                      return -1;
++              }
++
++              // set it
++              if (en50221_app_ca_pmt(stdcam->ca_resource, stdcam->ca_session_number, capmt, size)) {
++                      fprintf(stderr, "Failed to send PMT\n");
++                      return -1;
++              }
++
++              // we've seen this PMT
++              return 1;
++      }
++
++      return 0;
++}
++
++void gnutv_ca_new_dvbtime(time_t dvb_time)
++{
++      if (stdcam == NULL)
++              return;
++
++      if (stdcam->dvbtime)
++              stdcam->dvbtime(stdcam, dvb_time);
++}
++
++static void *camthread_func(void* arg)
++{
++      (void) arg;
++      int entered_menu = 0;
++
++      while(!camthread_shutdown) {
++              stdcam->poll(stdcam);
++
++              if ((!entered_menu) && cammenu && ca_resource_connected && stdcam->mmi_resource) {
++                      en50221_app_ai_entermenu(stdcam->ai_resource, stdcam->ai_session_number);
++                      entered_menu = 1;
++              }
++      }
++
++      return 0;
++}
++
++static int gnutv_ai_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                           uint8_t application_type, uint16_t application_manufacturer,
++                           uint16_t manufacturer_code, uint8_t menu_string_length,
++                           uint8_t *menu_string)
++{
++      (void) arg;
++      (void) slot_id;
++      (void) session_number;
++
++      fprintf(stderr, "CAM Application type: %02x\n", application_type);
++      fprintf(stderr, "CAM Application manufacturer: %04x\n", application_manufacturer);
++      fprintf(stderr, "CAM Manufacturer code: %04x\n", manufacturer_code);
++      fprintf(stderr, "CAM Menu string: %.*s\n", menu_string_length, menu_string);
++
++      return 0;
++}
++
++static int gnutv_ca_info_callback(void *arg, uint8_t slot_id, uint16_t session_number, uint32_t ca_id_count, uint16_t *ca_ids)
++{
++      (void) arg;
++      (void) slot_id;
++      (void) session_number;
++
++      fprintf(stderr, "CAM supports the following ca system ids:\n");
++      uint32_t i;
++      for(i=0; i< ca_id_count; i++) {
++              fprintf(stderr, "  0x%04x\n", ca_ids[i]);
++      }
++      ca_resource_connected = 1;
++      return 0;
++}
++
++static int gnutv_mmi_close_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                                  uint8_t cmd_id, uint8_t delay)
++{
++      (void) arg;
++      (void) slot_id;
++      (void) session_number;
++      (void) cmd_id;
++      (void) delay;
++
++      // note: not entirely correct as its supposed to delay if asked
++      mmi_state = MMI_STATE_CLOSED;
++      return 0;
++}
++
++static int gnutv_mmi_display_control_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                                            uint8_t cmd_id, uint8_t mmi_mode)
++{
++      struct en50221_app_mmi_display_reply_details reply;
++      (void) arg;
++      (void) slot_id;
++
++      // don't support any commands but set mode
++      if (cmd_id != MMI_DISPLAY_CONTROL_CMD_ID_SET_MMI_MODE) {
++              en50221_app_mmi_display_reply(stdcam->mmi_resource, session_number,
++                                            MMI_DISPLAY_REPLY_ID_UNKNOWN_CMD_ID, &reply);
++              return 0;
++      }
++
++      // we only support high level mode
++      if (mmi_mode != MMI_MODE_HIGH_LEVEL) {
++              en50221_app_mmi_display_reply(stdcam->mmi_resource, session_number,
++                                            MMI_DISPLAY_REPLY_ID_UNKNOWN_MMI_MODE, &reply);
++              return 0;
++      }
++
++      // ack the high level open
++      reply.u.mode_ack.mmi_mode = mmi_mode;
++      en50221_app_mmi_display_reply(stdcam->mmi_resource, session_number,
++                                    MMI_DISPLAY_REPLY_ID_MMI_MODE_ACK, &reply);
++      mmi_state = MMI_STATE_OPEN;
++      return 0;
++}
++
++static int gnutv_mmi_enq_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                                uint8_t blind_answer, uint8_t expected_answer_length,
++                                uint8_t *text, uint32_t text_size)
++{
++      (void) arg;
++      (void) slot_id;
++      (void) session_number;
++
++      fprintf(stderr, "%.*s: ", text_size, text);
++      fflush(stdout);
++
++      mmi_enq_blind = blind_answer;
++      mmi_enq_length = expected_answer_length;
++      mmi_state = MMI_STATE_ENQ;
++      return 0;
++}
++
++static int gnutv_mmi_menu_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                                 struct en50221_app_mmi_text *title,
++                                 struct en50221_app_mmi_text *sub_title,
++                                 struct en50221_app_mmi_text *bottom,
++                                 uint32_t item_count, struct en50221_app_mmi_text *items,
++                                 uint32_t item_raw_length, uint8_t *items_raw)
++{
++      (void) arg;
++      (void) slot_id;
++      (void) session_number;
++      (void) item_raw_length;
++      (void) items_raw;
++
++      fprintf(stderr, "------------------------------\n");
++
++      if (title->text_length) {
++              fprintf(stderr, "%.*s\n", title->text_length, title->text);
++      }
++      if (sub_title->text_length) {
++              fprintf(stderr, "%.*s\n", sub_title->text_length, sub_title->text);
++      }
++
++      uint32_t i;
++      fprintf(stderr, "0. Quit menu\n");
++      for(i=0; i< item_count; i++) {
++              fprintf(stderr, "%i. %.*s\n", i+1, items[i].text_length, items[i].text);
++      }
++
++      if (bottom->text_length) {
++              fprintf(stderr, "%.*s\n", bottom->text_length, bottom->text);
++      }
++      fprintf(stderr, "Enter option: ");
++      fflush(stdout);
++
++      mmi_state = MMI_STATE_MENU;
++      return 0;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/gnutv/gnutv_ca.h dvb-apps/util/gnutv/gnutv_ca.h
+--- linuxtv-dvb-apps-1.1.1/util/gnutv/gnutv_ca.h       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/gnutv/gnutv_ca.h     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,40 @@
++/*
++      gnutv utility
++
++      Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++      Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++      This program is free software; you can redistribute it and/or modify
++      it under the terms of the GNU General Public License as published by
++      the Free Software Foundation; either version 2 of the License, or
++      (at your option) any later version.
++
++      This program is distributed in the hope that it will be useful,
++      but WITHOUT ANY WARRANTY; without even the implied warranty of
++      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++
++      GNU General Public License for more details.
++
++      You should have received a copy of the GNU General Public License
++      along with this program; if not, write to the Free Software
++      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#ifndef gnutv_CA_H
++#define gnutv_CA_H 1
++
++struct gnutv_ca_params {
++      int adapter_id;
++      int caslot_num;
++      int cammenu;
++      int moveca;
++};
++
++extern void gnutv_ca_start(struct gnutv_ca_params *params);
++extern void gnutv_ca_ui(void);
++extern void gnutv_ca_stop(void);
++
++extern int gnutv_ca_new_pmt(struct mpeg_pmt_section *pmt);
++extern void gnutv_ca_new_dvbtime(time_t dvb_time);
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/gnutv/gnutv_data.c dvb-apps/util/gnutv/gnutv_data.c
+--- linuxtv-dvb-apps-1.1.1/util/gnutv/gnutv_data.c     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/gnutv/gnutv_data.c   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,483 @@
++/*
++      gnutv utility
++
++      Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++      Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++      This program is free software; you can redistribute it and/or modify
++      it under the terms of the GNU General Public License as published by
++      the Free Software Foundation; either version 2 of the License, or
++      (at your option) any later version.
++
++      This program is distributed in the hope that it will be useful,
++      but WITHOUT ANY WARRANTY; without even the implied warranty of
++      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++
++      GNU General Public License for more details.
++
++      You should have received a copy of the GNU General Public License
++      along with this program; if not, write to the Free Software
++      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#define _FILE_OFFSET_BITS 64
++#define _LARGEFILE_SOURCE 1
++#define _LARGEFILE64_SOURCE 1
++
++#include <stdio.h>
++#include <unistd.h>
++#include <limits.h>
++#include <string.h>
++#include <fcntl.h>
++#include <signal.h>
++#include <pthread.h>
++#include <errno.h>
++#include <sys/poll.h>
++#include <sys/socket.h>
++#include <netinet/in.h>
++#include <arpa/inet.h>
++#include <libdvbapi/dvbdemux.h>
++#include <libdvbapi/dvbaudio.h>
++#include <libucsi/mpeg/section.h>
++#include "gnutv.h"
++#include "gnutv_dvb.h"
++#include "gnutv_ca.h"
++#include "gnutv_data.h"
++
++static void *fileoutputthread_func(void* arg);
++static void *udpoutputthread_func(void* arg);
++
++static int gnutv_data_create_decoder_filter(int adapter, int demux, uint16_t pid, int pestype);
++static int gnutv_data_create_dvr_filter(int adapter, int demux, uint16_t pid);
++
++static void gnutv_data_decoder_pmt(struct mpeg_pmt_section *pmt);
++static void gnutv_data_dvr_pmt(struct mpeg_pmt_section *pmt);
++
++static void gnutv_data_append_pid_fd(int pid, int fd);
++static void gnutv_data_free_pid_fds(void);
++
++static pthread_t outputthread;
++static int outfd = -1;
++static int dvrfd = -1;
++static int pat_fd_dvrout = -1;
++static int pmt_fd_dvrout = -1;
++static int outputthread_shutdown = 0;
++
++static int usertp = 0;
++static int adapter_id = -1;
++static int demux_id = -1;
++static int output_type = 0;
++static struct addrinfo *outaddrs = NULL;
++
++struct pid_fd {
++      int pid;
++      int fd;
++};
++static struct pid_fd *pid_fds = NULL;
++static int pid_fds_count = 0;
++
++void gnutv_data_start(int _output_type,
++                  int ffaudiofd, int _adapter_id, int _demux_id, int buffer_size,
++                  char *outfile,
++                  char* outif, struct addrinfo *_outaddrs, int _usertp)
++{
++      usertp = _usertp;
++      demux_id = _demux_id;
++      adapter_id = _adapter_id;
++      output_type = _output_type;
++
++      // setup output
++      switch(output_type) {
++      case OUTPUT_TYPE_DECODER:
++      case OUTPUT_TYPE_DECODER_ABYPASS:
++              dvbaudio_set_bypass(ffaudiofd, (output_type == OUTPUT_TYPE_DECODER_ABYPASS) ? 1 : 0);
++              close(ffaudiofd);
++              break;
++
++      case OUTPUT_TYPE_STDOUT:
++      case OUTPUT_TYPE_FILE:
++              if (output_type == OUTPUT_TYPE_FILE) {
++                      // open output file
++                      outfd = open(outfile, O_WRONLY|O_CREAT|O_LARGEFILE|O_TRUNC, 0644);
++                      if (outfd < 0) {
++                              fprintf(stderr, "Failed to open output file\n");
++                              exit(1);
++                      }
++              } else {
++                      outfd = STDOUT_FILENO;
++              }
++
++              // open dvr device
++              dvrfd = dvbdemux_open_dvr(adapter_id, 0, 1, 0);
++              if (dvrfd < 0) {
++                      fprintf(stderr, "Failed to open DVR device\n");
++                      exit(1);
++              }
++
++              // optionally set dvr buffer size
++              if (buffer_size > 0) {
++                      if (dvbdemux_set_buffer(dvrfd, buffer_size) != 0) {
++                              fprintf(stderr, "Failed to set DVR buffer size\n");
++                              exit(1);
++                      }
++              }
++
++              pthread_create(&outputthread, NULL, fileoutputthread_func, NULL);
++              break;
++
++      case OUTPUT_TYPE_UDP:
++              outaddrs = _outaddrs;
++
++              // open output socket
++              outfd = socket(outaddrs->ai_family, outaddrs->ai_socktype, outaddrs->ai_protocol);
++              if (outfd < 0) {
++                      fprintf(stderr, "Failed to open output socket\n");
++                      exit(1);
++              }
++
++              // bind to local interface if requested
++              if (outif != NULL) {
++                      if (setsockopt(outfd, SOL_SOCKET, SO_BINDTODEVICE, outif, strlen(outif)) < 0) {
++                              fprintf(stderr, "Failed to bind to interface %s\n", outif);
++                              exit(1);
++                      }
++              }
++
++              // open dvr device
++              dvrfd = dvbdemux_open_dvr(adapter_id, 0, 1, 0);
++              if (dvrfd < 0) {
++                      fprintf(stderr, "Failed to open DVR device\n");
++                      exit(1);
++              }
++
++              // optionally set dvr buffer size
++              if (buffer_size > 0) {
++                      if (dvbdemux_set_buffer(dvrfd, buffer_size) != 0) {
++                              fprintf(stderr, "Failed to set DVR buffer size\n");
++                              exit(1);
++                      }
++              }
++
++              pthread_create(&outputthread, NULL, udpoutputthread_func, NULL);
++              break;
++      }
++
++      // output PAT to DVR if requested
++      switch(output_type) {
++      case OUTPUT_TYPE_DVR:
++      case OUTPUT_TYPE_FILE:
++      case OUTPUT_TYPE_STDOUT:
++      case OUTPUT_TYPE_UDP:
++              pat_fd_dvrout = gnutv_data_create_dvr_filter(adapter_id, demux_id, TRANSPORT_PAT_PID);
++      }
++}
++
++void gnutv_data_stop()
++{
++      // shutdown output thread if necessary
++      if (dvrfd != -1) {
++              outputthread_shutdown = 1;
++              pthread_join(outputthread, NULL);
++      }
++      gnutv_data_free_pid_fds();
++      if (pat_fd_dvrout != -1)
++              close(pat_fd_dvrout);
++      if (pmt_fd_dvrout != -1)
++              close(pmt_fd_dvrout);
++      if (outaddrs)
++              freeaddrinfo(outaddrs);
++}
++
++void gnutv_data_new_pat(int pmt_pid)
++{
++      // output PMT to DVR if requested
++      switch(output_type) {
++      case OUTPUT_TYPE_DVR:
++      case OUTPUT_TYPE_FILE:
++      case OUTPUT_TYPE_STDOUT:
++      case OUTPUT_TYPE_UDP:
++              if (pmt_fd_dvrout != -1)
++                      close(pmt_fd_dvrout);
++              pmt_fd_dvrout = gnutv_data_create_dvr_filter(adapter_id, demux_id, pmt_pid);
++      }
++}
++
++int gnutv_data_new_pmt(struct mpeg_pmt_section *pmt)
++{
++      // close all old PID FDs
++      gnutv_data_free_pid_fds();
++
++      // deal with the PMT appropriately
++      switch(output_type) {
++      case OUTPUT_TYPE_DECODER:
++      case OUTPUT_TYPE_DECODER_ABYPASS:
++              gnutv_data_decoder_pmt(pmt);
++              break;
++
++      case OUTPUT_TYPE_DVR:
++      case OUTPUT_TYPE_FILE:
++      case OUTPUT_TYPE_STDOUT:
++      case OUTPUT_TYPE_UDP:
++              gnutv_data_dvr_pmt(pmt);
++              break;
++      }
++
++      return 1;
++}
++
++static void *fileoutputthread_func(void* arg)
++{
++      (void)arg;
++      uint8_t buf[4096];
++      struct pollfd pollfd;
++      int written;
++
++      pollfd.fd = dvrfd;
++      pollfd.events = POLLIN|POLLPRI|POLLERR;
++
++      while(!outputthread_shutdown) {
++              if (poll(&pollfd, 1, 1000) == -1) {
++                      if (errno == EINTR)
++                              continue;
++                      fprintf(stderr, "DVR device poll failure\n");
++                      return 0;
++              }
++
++              if (pollfd.revents == 0)
++                      continue;
++
++              int size = read(dvrfd, buf, sizeof(buf));
++              if (size < 0) {
++                      if (errno == EINTR)
++                              continue;
++
++                      if (errno == EOVERFLOW) {
++                              // The error flag has been cleared, next read should succeed.
++                              fprintf(stderr, "DVR overflow\n");
++                              continue;
++                      }
++
++                      fprintf(stderr, "DVR device read failure\n");
++                      return 0;
++              }
++
++              written = 0;
++              while(written < size) {
++                      int tmp = write(outfd, buf + written, size - written);
++                      if (tmp == -1) {
++                              if (errno != EINTR) {
++                                      fprintf(stderr, "Write error: %m\n");
++                                      break;
++                              }
++                      } else {
++                              written += tmp;
++                      }
++              }
++      }
++
++      return 0;
++}
++
++#define TS_PAYLOAD_SIZE (188*7)
++
++static void *udpoutputthread_func(void* arg)
++{
++      (void)arg;
++      uint8_t buf[12 + TS_PAYLOAD_SIZE];
++      struct pollfd pollfd;
++      int bufsize = 0;
++      int bufbase = 0;
++      int readsize;
++      uint16_t rtpseq = 0;
++
++      pollfd.fd = dvrfd;
++      pollfd.events = POLLIN|POLLPRI|POLLERR;
++
++      if (usertp) {
++              srandom(time(NULL));
++              int ssrc = random();
++              rtpseq = random();
++              buf[0x0] = 0x80;
++              buf[0x1] = 0x21;
++              buf[0x4] = 0x00; // }
++              buf[0x5] = 0x00; // } FIXME: should really be a valid stamp
++              buf[0x6] = 0x00; // }
++              buf[0x7] = 0x00; // }
++              buf[0x8] = ssrc >> 24;
++              buf[0x9] = ssrc >> 16;
++              buf[0xa] = ssrc >> 8;
++              buf[0xb] = ssrc;
++              bufbase = 12;
++      }
++
++      while(!outputthread_shutdown) {
++              if (poll(&pollfd, 1, 1000) != 1)
++                      continue;
++              if (pollfd.revents & POLLERR) {
++                      if (errno == EINTR)
++                              continue;
++                      fprintf(stderr, "DVR device read failure\n");
++                      return 0;
++              }
++
++              readsize = TS_PAYLOAD_SIZE - bufsize;
++              readsize = read(dvrfd, buf + bufbase + bufsize, readsize);
++              if (readsize < 0) {
++                      if (errno == EINTR)
++                              continue;
++                      fprintf(stderr, "DVR device read failure\n");
++                      return 0;
++              }
++              bufsize += readsize;
++
++              if (bufsize == TS_PAYLOAD_SIZE) {
++                      if (usertp) {
++                              buf[2] = rtpseq >> 8;
++                              buf[3] = rtpseq;
++                      }
++                      if (sendto(outfd, buf, bufbase + bufsize, 0, outaddrs->ai_addr, outaddrs->ai_addrlen) < 0) {
++                              if (errno != EINTR) {
++                                      fprintf(stderr, "Socket send failure: %m\n");
++                                      return 0;
++                              }
++                      }
++                      rtpseq++;
++                      bufsize = 0;
++              }
++      }
++
++      if (bufsize) {
++              if (usertp) {
++                      buf[2] = rtpseq >> 8;
++                      buf[3] = rtpseq;
++              }
++              if (sendto(outfd, buf, bufbase + bufsize, 0, outaddrs->ai_addr, outaddrs->ai_addrlen) < 0) {
++                      if (errno != EINTR)
++                              fprintf(stderr, "Socket send failure: %m\n");
++              }
++      }
++
++      return 0;
++}
++
++static int gnutv_data_create_decoder_filter(int adapter, int demux, uint16_t pid, int pestype)
++{
++      int demux_fd = -1;
++
++      // open the demuxer
++      if ((demux_fd = dvbdemux_open_demux(adapter, demux, 0)) < 0) {
++              return -1;
++      }
++
++      // create a section filter
++      if (dvbdemux_set_pes_filter(demux_fd, pid, DVBDEMUX_INPUT_FRONTEND, DVBDEMUX_OUTPUT_DECODER, pestype, 1)) {
++              close(demux_fd);
++              return -1;
++      }
++
++      // done
++      return demux_fd;
++}
++
++static int gnutv_data_create_dvr_filter(int adapter, int demux, uint16_t pid)
++{
++      int demux_fd = -1;
++
++      // open the demuxer
++      if ((demux_fd = dvbdemux_open_demux(adapter, demux, 0)) < 0) {
++              return -1;
++      }
++
++      // create a section filter
++      if (dvbdemux_set_pid_filter(demux_fd, pid, DVBDEMUX_INPUT_FRONTEND, DVBDEMUX_OUTPUT_DVR, 1)) {
++              close(demux_fd);
++              return -1;
++      }
++
++      // done
++      return demux_fd;
++}
++
++static void gnutv_data_decoder_pmt(struct mpeg_pmt_section *pmt)
++{
++      int audio_pid = -1;
++      int video_pid = -1;
++      struct mpeg_pmt_stream *cur_stream;
++      mpeg_pmt_section_streams_for_each(pmt, cur_stream) {
++              switch(cur_stream->stream_type) {
++              case 1:
++              case 2: // video
++                      video_pid = cur_stream->pid;
++                      break;
++
++              case 3:
++              case 4: // audio
++                      audio_pid = cur_stream->pid;
++                      break;
++              }
++      }
++
++      if (audio_pid != -1) {
++              int fd = gnutv_data_create_decoder_filter(adapter_id, demux_id, audio_pid, DVBDEMUX_PESTYPE_AUDIO);
++              if (fd < 0) {
++                      fprintf(stderr, "Unable to create dvr filter for PID %i\n", audio_pid);
++              } else {
++                      gnutv_data_append_pid_fd(audio_pid, fd);
++              }
++      }
++      if (video_pid != -1) {
++              int fd = gnutv_data_create_decoder_filter(adapter_id, demux_id, video_pid, DVBDEMUX_PESTYPE_VIDEO);
++              if (fd < 0) {
++                      fprintf(stderr, "Unable to create dvr filter for PID %i\n", video_pid);
++              } else {
++                      gnutv_data_append_pid_fd(video_pid, fd);
++              }
++      }
++      int fd = gnutv_data_create_decoder_filter(adapter_id, demux_id, pmt->pcr_pid, DVBDEMUX_PESTYPE_PCR);
++      if (fd < 0) {
++              fprintf(stderr, "Unable to create dvr filter for PID %i\n", pmt->pcr_pid);
++      } else {
++              gnutv_data_append_pid_fd(pmt->pcr_pid, fd);
++      }
++}
++
++static void gnutv_data_dvr_pmt(struct mpeg_pmt_section *pmt)
++{
++      struct mpeg_pmt_stream *cur_stream;
++      mpeg_pmt_section_streams_for_each(pmt, cur_stream) {
++              int fd = gnutv_data_create_dvr_filter(adapter_id, demux_id, cur_stream->pid);
++              if (fd < 0) {
++                      fprintf(stderr, "Unable to create dvr filter for PID %i\n", cur_stream->pid);
++              } else {
++                      gnutv_data_append_pid_fd(cur_stream->pid, fd);
++              }
++      }
++}
++
++static void gnutv_data_append_pid_fd(int pid, int fd)
++{
++      struct pid_fd *tmp;
++      if ((tmp = realloc(pid_fds, (pid_fds_count +1) * sizeof(struct pid_fd))) == NULL) {
++              fprintf(stderr, "Out of memory when adding a new pid_fd\n");
++              exit(1);
++      }
++      tmp[pid_fds_count].pid = pid;
++      tmp[pid_fds_count].fd = fd;
++      pid_fds_count++;
++      pid_fds = tmp;
++}
++
++static void gnutv_data_free_pid_fds()
++{
++      if (pid_fds_count) {
++              int i;
++              for(i=0; i< pid_fds_count; i++) {
++                      close(pid_fds[i].fd);
++              }
++      }
++      if (pid_fds)
++              free(pid_fds);
++
++      pid_fds_count = 0;
++      pid_fds = NULL;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/gnutv/gnutv_data.h dvb-apps/util/gnutv/gnutv_data.h
+--- linuxtv-dvb-apps-1.1.1/util/gnutv/gnutv_data.h     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/gnutv/gnutv_data.h   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,39 @@
++/*
++      gnutv utility
++
++      Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++      Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++      This program is free software; you can redistribute it and/or modify
++      it under the terms of the GNU General Public License as published by
++      the Free Software Foundation; either version 2 of the License, or
++      (at your option) any later version.
++
++      This program is distributed in the hope that it will be useful,
++      but WITHOUT ANY WARRANTY; without even the implied warranty of
++      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++
++      GNU General Public License for more details.
++
++      You should have received a copy of the GNU General Public License
++      along with this program; if not, write to the Free Software
++      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#ifndef gnutv_DATA_H
++#define gnutv_DATA_H 1
++
++#include <netdb.h>
++
++extern void gnutv_data_start(int output_type,
++                         int ffaudiofd, int adapter_id, int demux_id, int buffer_size,
++                         char *outfile,
++                         char* outif, struct addrinfo *outaddrs, int usertp);
++extern void gnutv_data_stop(void);
++
++extern void gnutv_data_new_pat(int pmt_pid);
++extern int gnutv_data_new_pmt(struct mpeg_pmt_section *pmt);
++
++
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/gnutv/gnutv_dvb.c dvb-apps/util/gnutv/gnutv_dvb.c
+--- linuxtv-dvb-apps-1.1.1/util/gnutv/gnutv_dvb.c      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/gnutv/gnutv_dvb.c    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,376 @@
++/*
++      gnutv utility
++
++      Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++      Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++      This program is free software; you can redistribute it and/or modify
++      it under the terms of the GNU General Public License as published by
++      the Free Software Foundation; either version 2 of the License, or
++      (at your option) any later version.
++
++      This program is distributed in the hope that it will be useful,
++      but WITHOUT ANY WARRANTY; without even the implied warranty of
++      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++
++      GNU General Public License for more details.
++
++      You should have received a copy of the GNU General Public License
++      along with this program; if not, write to the Free Software
++      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#include <stdio.h>
++#include <unistd.h>
++#include <limits.h>
++#include <string.h>
++#include <signal.h>
++#include <pthread.h>
++#include <errno.h>
++#include <sys/poll.h>
++#include <libdvbapi/dvbdemux.h>
++#include <libucsi/section.h>
++#include <libucsi/mpeg/section.h>
++#include <libucsi/dvb/section.h>
++#include "gnutv.h"
++#include "gnutv_dvb.h"
++#include "gnutv_data.h"
++#include "gnutv_ca.h"
++
++#define FE_STATUS_PARAMS (DVBFE_INFO_LOCKSTATUS|DVBFE_INFO_SIGNAL_STRENGTH|DVBFE_INFO_BER|DVBFE_INFO_SNR|DVBFE_INFO_UNCORRECTED_BLOCKS)
++
++static int dvbthread_shutdown = 0;
++static pthread_t dvbthread;
++static int tune_state = 0;
++
++static int pat_version = -1;
++static int ca_pmt_version = -1;
++static int data_pmt_version = -1;
++
++static void *dvbthread_func(void* arg);
++
++static void process_pat(int pat_fd, struct gnutv_dvb_params *params, int *pmt_fd, struct pollfd *pollfd);
++static void process_tdt(int tdt_fd);
++static void process_pmt(int pmt_fd, struct gnutv_dvb_params *params);
++static int create_section_filter(int adapter, int demux, uint16_t pid, uint8_t table_id);
++
++
++int gnutv_dvb_start(struct gnutv_dvb_params *params)
++{
++      pthread_create(&dvbthread, NULL, dvbthread_func, (void*) params);
++      return 0;
++}
++
++void gnutv_dvb_stop(void)
++{
++      dvbthread_shutdown = 1;
++      pthread_join(dvbthread, NULL);
++}
++
++int gnutv_dvb_locked(void)
++{
++      return tune_state == 2;
++}
++
++static void *dvbthread_func(void* arg)
++{
++      int pat_fd = -1;
++      int pmt_fd = -1;
++      int tdt_fd = -1;
++      struct pollfd pollfds[3];
++
++      struct gnutv_dvb_params *params = (struct gnutv_dvb_params *) arg;
++
++      tune_state = 0;
++
++      // create PAT filter
++      if ((pat_fd = create_section_filter(params->adapter_id, params->demux_id,
++           TRANSPORT_PAT_PID, stag_mpeg_program_association)) < 0) {
++              fprintf(stderr, "Failed to create PAT section filter\n");
++              exit(1);
++      }
++      pollfds[0].fd = pat_fd;
++      pollfds[0].events = POLLIN|POLLPRI|POLLERR;
++
++      // create TDT filter
++      if ((tdt_fd = create_section_filter(params->adapter_id, params->demux_id, TRANSPORT_TDT_PID, stag_dvb_time_date)) < 0) {
++              fprintf(stderr, "Failed to create TDT section filter\n");
++              exit(1);
++      }
++      pollfds[1].fd = tdt_fd;
++      pollfds[1].events = POLLIN|POLLPRI|POLLERR;
++
++      // zero PMT filter
++      pollfds[2].fd = 0;
++      pollfds[2].events = 0;
++
++      // the DVB loop
++      while(!dvbthread_shutdown) {
++              // tune frontend + monitor lock status
++              if (tune_state == 0) {
++                      // get the type of frontend
++                      struct dvbfe_info result;
++                      char *types;
++                      memset(&result, 0, sizeof(result));
++                      dvbfe_get_info(params->fe, 0, &result, DVBFE_INFO_QUERYTYPE_IMMEDIATE, 0);
++                      switch(result.type) {
++                      case DVBFE_TYPE_DVBS:
++                              types = "DVB-S";
++                              break;
++                      case DVBFE_TYPE_DVBC:
++                              types = "DVB-C";
++                              break;
++                      case DVBFE_TYPE_DVBT:
++                              types = "DVB-T";
++                              break;
++                      case DVBFE_TYPE_ATSC:
++                              types = "ATSC";
++                              break;
++                      default:
++                              types = "Unknown";
++                      }
++                      fprintf(stderr, "Using frontend \"%s\", type %s\n", result.name, types);
++
++                      // do we have a valid SEC configuration?
++                      struct dvbsec_config *sec = NULL;
++                      if (params->valid_sec)
++                              sec = &params->sec;
++
++                      // tune!
++                      if (dvbsec_set(params->fe,
++                                        sec,
++                                        params->channel.polarization,
++                                        (params->channel.diseqc_switch & 0x01) ? DISEQC_SWITCH_B : DISEQC_SWITCH_A,
++                                        (params->channel.diseqc_switch & 0x02) ? DISEQC_SWITCH_B : DISEQC_SWITCH_A,
++                                        &params->channel.fe_params,
++                                        0)) {
++                              fprintf(stderr, "Failed to set frontend\n");
++                              exit(1);
++                      }
++
++                      tune_state++;
++              } else if (tune_state == 1) {
++                      struct dvbfe_info result;
++                      memset(&result, 0, sizeof(result));
++                      dvbfe_get_info(params->fe,
++                                     FE_STATUS_PARAMS,
++                                     &result,
++                                     DVBFE_INFO_QUERYTYPE_IMMEDIATE,
++                                     0);
++
++                      fprintf(stderr, "status %c%c%c%c%c | signal %04x | snr %04x | ber %08x | unc %08x | %s\r",
++                              result.signal ? 'S' : ' ',
++                              result.carrier ? 'C' : ' ',
++                              result.viterbi ? 'V' : ' ',
++                              result.sync ? 'Y' : ' ',
++                              result.lock ? 'L' : ' ',
++                              result.signal_strength,
++                              result.snr,
++                              result.ber,
++                              result.ucblocks,
++                              result.lock ? "FE_HAS_LOCK" : "");
++                      fflush(stderr);
++
++                      if (result.lock) {
++                              tune_state++;
++                              fprintf(stderr, "\n");
++                              fflush(stderr);
++                      } else {
++                              usleep(500000);
++                      }
++              }
++
++              // is there SI data?
++              int count = poll(pollfds, 3, 100);
++              if (count < 0) {
++                      if (errno != EINTR)
++                              fprintf(stderr, "Poll error: %m\n");
++                      break;
++              }
++              if (count == 0) {
++                      continue;
++              }
++
++              // PAT
++              if (pollfds[0].revents & (POLLIN|POLLPRI)) {
++                      process_pat(pat_fd, params, &pmt_fd, &pollfds[2]);
++              }
++
++              // TDT
++              if (pollfds[1].revents & (POLLIN|POLLPRI)) {
++                      process_tdt(tdt_fd);
++              }
++
++              //  PMT
++              if (pollfds[2].revents & (POLLIN|POLLPRI)) {
++                      process_pmt(pmt_fd, params);
++              }
++      }
++
++      // close demuxers
++      if (pat_fd != -1)
++              close(pat_fd);
++      if (pmt_fd != -1)
++              close(pmt_fd);
++      if (tdt_fd != -1)
++              close(tdt_fd);
++
++      return 0;
++}
++
++static void process_pat(int pat_fd, struct gnutv_dvb_params *params, int *pmt_fd, struct pollfd *pollfd)
++{
++      int size;
++      uint8_t sibuf[4096];
++
++      // read the section
++      if ((size = read(pat_fd, sibuf, sizeof(sibuf))) < 0) {
++              return;
++      }
++
++      // parse section
++      struct section *section = section_codec(sibuf, size);
++      if (section == NULL) {
++              return;
++      }
++
++      // parse section_ext
++      struct section_ext *section_ext = section_ext_decode(section, 0);
++      if (section_ext == NULL) {
++              return;
++      }
++      if (pat_version == section_ext->version_number) {
++              return;
++      }
++
++      // parse PAT
++      struct mpeg_pat_section *pat = mpeg_pat_section_codec(section_ext);
++      if (pat == NULL) {
++              return;
++      }
++
++      // try and find the requested program
++      struct mpeg_pat_program *cur_program;
++      mpeg_pat_section_programs_for_each(pat, cur_program) {
++              if (cur_program->program_number == params->channel.service_id) {
++                      // close old PMT fd
++                      if (*pmt_fd != -1)
++                              close(*pmt_fd);
++
++                      // create PMT filter
++                      if ((*pmt_fd = create_section_filter(params->adapter_id, params->demux_id,
++                                                           cur_program->pid, stag_mpeg_program_map)) < 0) {
++                              return;
++                      }
++                      pollfd->fd = *pmt_fd;
++                      pollfd->events = POLLIN|POLLPRI|POLLERR;
++
++                      gnutv_data_new_pat(cur_program->pid);
++
++                      // we have a new PMT pid
++                      data_pmt_version = -1;
++                      ca_pmt_version = -1;
++                      break;
++              }
++      }
++
++      // remember the PAT version
++      pat_version = section_ext->version_number;
++}
++
++static void process_tdt(int tdt_fd)
++{
++      int size;
++      uint8_t sibuf[4096];
++
++      // read the section
++      if ((size = read(tdt_fd, sibuf, sizeof(sibuf))) < 0) {
++              return;
++      }
++
++      // parse section
++      struct section *section = section_codec(sibuf, size);
++      if (section == NULL) {
++              return;
++      }
++
++      // parse TDT
++      struct dvb_tdt_section *tdt = dvb_tdt_section_codec(section);
++      if (tdt == NULL) {
++              return;
++      }
++
++      // done
++      gnutv_ca_new_dvbtime(dvbdate_to_unixtime(tdt->utc_time));
++}
++
++static void process_pmt(int pmt_fd, struct gnutv_dvb_params *params)
++{
++      int size;
++      uint8_t sibuf[4096];
++
++      // read the section
++      if ((size = read(pmt_fd, sibuf, sizeof(sibuf))) < 0) {
++              return;
++      }
++
++      // parse section
++      struct section *section = section_codec(sibuf, size);
++      if (section == NULL) {
++              return;
++      }
++
++      // parse section_ext
++      struct section_ext *section_ext = section_ext_decode(section, 0);
++      if (section_ext == NULL) {
++              return;
++      }
++      if ((section_ext->table_id_ext != params->channel.service_id) ||
++          ((section_ext->version_number == data_pmt_version) &&
++           (section_ext->version_number == ca_pmt_version))) {
++              return;
++      }
++
++      // parse PMT
++      struct mpeg_pmt_section *pmt = mpeg_pmt_section_codec(section_ext);
++      if (pmt == NULL) {
++              return;
++      }
++
++      // do data handling
++      if (section_ext->version_number != data_pmt_version) {
++              if (gnutv_data_new_pmt(pmt) == 1)
++                      data_pmt_version = pmt->head.version_number;
++      }
++
++      // do ca handling
++      if (section_ext->version_number != ca_pmt_version) {
++              if (gnutv_ca_new_pmt(pmt) == 1)
++                      ca_pmt_version = pmt->head.version_number;
++      }
++}
++
++static int create_section_filter(int adapter, int demux, uint16_t pid, uint8_t table_id)
++{
++      int demux_fd = -1;
++      uint8_t filter[18];
++      uint8_t mask[18];
++
++      // open the demuxer
++      if ((demux_fd = dvbdemux_open_demux(adapter, demux, 0)) < 0) {
++              return -1;
++      }
++
++      // create a section filter
++      memset(filter, 0, sizeof(filter));
++      memset(mask, 0, sizeof(mask));
++      filter[0] = table_id;
++      mask[0] = 0xFF;
++      if (dvbdemux_set_section_filter(demux_fd, pid, filter, mask, 1, 1)) {
++              close(demux_fd);
++              return -1;
++      }
++
++      // done
++      return demux_fd;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/gnutv/gnutv_dvb.h dvb-apps/util/gnutv/gnutv_dvb.h
+--- linuxtv-dvb-apps-1.1.1/util/gnutv/gnutv_dvb.h      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/gnutv/gnutv_dvb.h    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,44 @@
++/*
++      gnutv utility
++
++      Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++      Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++      This program is free software; you can redistribute it and/or modify
++      it under the terms of the GNU General Public License as published by
++      the Free Software Foundation; either version 2 of the License, or
++      (at your option) any later version.
++
++      This program is distributed in the hope that it will be useful,
++      but WITHOUT ANY WARRANTY; without even the implied warranty of
++      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++
++      GNU General Public License for more details.
++
++      You should have received a copy of the GNU General Public License
++      along with this program; if not, write to the Free Software
++      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#ifndef gnutv_DVB_H
++#define gnutv_DVB_H 1
++
++#include <libdvbcfg/dvbcfg_zapchannel.h>
++#include <libdvbsec/dvbsec_api.h>
++
++struct gnutv_dvb_params {
++      int adapter_id;
++      int frontend_id;
++      int demux_id;
++      struct dvbcfg_zapchannel channel;
++      struct dvbsec_config sec;
++      int valid_sec;
++      int output_type;
++      struct dvbfe_handle *fe;
++};
++
++extern int gnutv_dvb_start(struct gnutv_dvb_params *params);
++extern void gnutv_dvb_stop(void);
++extern int gnutv_dvb_locked(void);
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/gnutv/gnutv.h dvb-apps/util/gnutv/gnutv.h
+--- linuxtv-dvb-apps-1.1.1/util/gnutv/gnutv.h  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/gnutv/gnutv.h        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,37 @@
++/*
++      gnutv utility
++
++      Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++      Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++      This program is free software; you can redistribute it and/or modify
++      it under the terms of the GNU General Public License as published by
++      the Free Software Foundation; either version 2 of the License, or
++      (at your option) any later version.
++
++      This program is distributed in the hope that it will be useful,
++      but WITHOUT ANY WARRANTY; without even the implied warranty of
++      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++
++      GNU General Public License for more details.
++
++      You should have received a copy of the GNU General Public License
++      along with this program; if not, write to the Free Software
++      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#ifndef __CA_gnutv_H__
++#define __CA_gnutv_H__
++
++#include <stdlib.h>
++#include <stdint.h>
++
++#define OUTPUT_TYPE_DECODER 0
++#define OUTPUT_TYPE_DECODER_ABYPASS 1
++#define OUTPUT_TYPE_DVR 2
++#define OUTPUT_TYPE_NULL 3
++#define OUTPUT_TYPE_FILE 4
++#define OUTPUT_TYPE_UDP 5
++#define OUTPUT_TYPE_STDOUT 6
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/gnutv/Makefile dvb-apps/util/gnutv/Makefile
+--- linuxtv-dvb-apps-1.1.1/util/gnutv/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/gnutv/Makefile       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,21 @@
++# Makefile for linuxtv.org dvb-apps/util/gnutv
++
++objects  = gnutv_ca.o  \
++           gnutv_dvb.o \
++           gnutv_data.o
++
++binaries = gnutv
++
++inst_bin = $(binaries)
++
++CPPFLAGS += -I../../lib
++LDFLAGS  += -L../../lib/libdvbapi -L../../lib/libdvbcfg -L../../lib/libdvbsec -L../../lib/libdvben50221 -L../../lib/libucsi
++LDLIBS   += -ldvbcfg -ldvben50221 -lucsi -ldvbsec -ldvbapi -lpthread
++
++.PHONY: all
++
++all: $(binaries)
++
++$(binaries): $(objects)
++
++include ../../Make.rules
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/lib/lnb.c dvb-apps/util/lib/lnb.c
+--- linuxtv-dvb-apps-1.1.1/util/lib/lnb.c      2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/lib/lnb.c    1970-01-01 01:00:00.000000000 +0100
+@@ -1,101 +0,0 @@
+-#include <stdlib.h>
+-#include <string.h>
+-#include <ctype.h>
+-#include "lnb.h"
+-
+-static char *univ_desc[] = {
+-              "Europe",
+-              "10800 to 11800 MHz and 11600 to 12700 Mhz",
+-              "Dual LO, loband 9750, hiband 10600 MHz",
+-              (char *)NULL };
+-
+-static char *dbs_desc[] = {
+-              "Expressvu, North America",
+-              "12200 to 12700 MHz",
+-              "Single LO, 11250 MHz", 
+-              (char *)NULL };
+-
+-static char *standard_desc[] = {
+-              "10945 to 11450 Mhz",
+-              "Single LO, 10000 Mhz",
+-              (char *)NULL };
+-
+-static char *enhan_desc[] = {
+-              "Astra",
+-              "10700 to 11700 MHz",
+-              "Single LO, 9750 MHz",
+-              (char *)NULL };
+-
+-static char *cband_desc[] = {
+-              "Big Dish",
+-              "3700 to 4200 MHz",
+-              "Single LO, 5150 Mhz",
+-              (char *)NULL };
+-
+-static struct lnb_types_st lnbs[] = {
+-      {"UNIVERSAL",   univ_desc,              9750, 10600, 11700 },
+-      {"DBS",         dbs_desc,               11250, 0, 0 },
+-      {"STANDARD",    standard_desc,          10000, 0, 0 },
+-      {"ENHANCED",    enhan_desc,             9750, 0, 0 },
+-      {"C-BAND",      cband_desc,             5150, 0, 0 }
+-};
+-
+-/* Enumerate through standard types of LNB's until NULL returned.
+- * Increment curno each time
+- */
+-
+-struct lnb_types_st *
+-lnb_enum(int curno)
+-{
+-      if (curno >= sizeof(lnbs) / sizeof(lnbs[0]))
+-              return (struct lnb_types_st *)NULL;
+-      return &lnbs[curno];
+-}
+-
+-/* Decode an lnb type, for example given on a command line
+- * If alpha and standard type, e.g. "Universal" then match that
+- * otherwise low[,high[,switch]]
+- */
+-
+-int
+-lnb_decode(char *str, struct lnb_types_st *lnbp)
+-{
+-int i;
+-char *cp, *np;
+-
+-      memset(lnbp, 0, sizeof(*lnbp));
+-      cp = str;
+-      while(*cp && isspace(*cp))
+-              cp++;
+-      if (isalpha(*cp)) {
+-              for(i = 0; i < (sizeof(lnbs) / sizeof(lnbs[0])); i++) {
+-                      if (!strcasecmp(lnbs[i].name, cp)) {
+-                              *lnbp = lnbs[i];
+-                              return 1;
+-                      }
+-              }
+-              return -1;
+-      }
+-      if (*cp == '\0' || !isdigit(*cp))
+-              return -1;
+-      lnbp->low_val = strtoul(cp, &np, 0);
+-      if (lnbp->low_val == 0)
+-              return -1;
+-      cp = np;
+-      while(*cp && (isspace(*cp) || *cp == ','))
+-              cp++;
+-      if (*cp == '\0')
+-              return 1;
+-      if (!isdigit(*cp))
+-              return -1;
+-      lnbp->high_val = strtoul(cp, &np, 0);
+-      cp = np;
+-      while(*cp && (isspace(*cp) || *cp == ','))
+-              cp++;
+-      if (*cp == '\0')
+-              return 1;
+-      if (!isdigit(*cp))
+-              return -1;
+-      lnbp->switch_val = strtoul(cp, NULL, 0);
+-      return 1;
+-}
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/lib/lnb.h dvb-apps/util/lib/lnb.h
+--- linuxtv-dvb-apps-1.1.1/util/lib/lnb.h      2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/lib/lnb.h    1970-01-01 01:00:00.000000000 +0100
+@@ -1,24 +0,0 @@
+-
+-struct lnb_types_st {
+-      char    *name;
+-      char    **desc;
+-      unsigned long   low_val;
+-      unsigned long   high_val;       /* zero indicates no hiband */
+-      unsigned long   switch_val;     /* zero indicates no hiband */
+-};
+-
+-/* Enumerate through standard types of LNB's until NULL returned.
+- * Increment curno each time
+- */
+-
+-struct lnb_types_st *
+-lnb_enum(int curno);
+-
+-/* Decode an lnb type, for example given on a command line
+- * If alpha and standard type, e.g. "Universal" then match that
+- * otherwise low[,high[,switch]]
+- */
+-
+-int
+-lnb_decode(char *str, struct lnb_types_st *lnbp);
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/lib/Makefile dvb-apps/util/lib/Makefile
+--- linuxtv-dvb-apps-1.1.1/util/lib/Makefile   2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/lib/Makefile 1970-01-01 01:00:00.000000000 +0100
+@@ -1,20 +0,0 @@
+-
+-CC = gcc
+-CFLAGS = -MD -g -Wall -O2 -I../../include -I.
+-LFLAGS = -g -Wall
+-
+-OBJS = lnb.o
+-SRCS = $(OBJS:.o=.c)
+-
+-TARGET = lnb.o
+-
+-$(TARGET): $(SRCS)
+-
+-.c.o:
+-      $(CC) $(CFLAGS) -c $< -o $@
+-
+-clean:
+-      $(RM) *.o *.d $(TARGET)
+-
+--include $(wildcard *.d) dummy
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/Makefile dvb-apps/util/Makefile
+--- linuxtv-dvb-apps-1.1.1/util/Makefile       2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/Makefile     2009-06-21 13:29:06.000000000 +0200
+@@ -1,12 +1,19 @@
+ # Makefile for linuxtv.org dvb-apps/util
+-%:: FORCE
+-      $(MAKE) -C lib $(MAKECMDGOALS)
+-      $(MAKE) -C szap $(MAKECMDGOALS)
+-      $(MAKE) -C scan $(MAKECMDGOALS)
+-      $(MAKE) -C dvbnet $(MAKECMDGOALS)
+-      $(MAKE) -C dvbdate $(MAKECMDGOALS)
+-      $(MAKE) -C dvbtraffic $(MAKECMDGOALS)
+-      $(MAKE) -C av7110_loadkeys $(MAKECMDGOALS)
++.PHONY: all clean install
+-FORCE:
++all clean install:
++      $(MAKE) -C atsc_epg $@
++      $(MAKE) -C av7110_loadkeys $@
++      $(MAKE) -C dib3000-watch $@
++      $(MAKE) -C dst-utils $@
++      $(MAKE) -C dvbdate $@
++      $(MAKE) -C dvbnet $@
++      $(MAKE) -C dvbtraffic $@
++      $(MAKE) -C dvbscan $@
++      $(MAKE) -C femon $@
++      $(MAKE) -C scan $@
++      $(MAKE) -C szap $@
++      $(MAKE) -C ttusb_dec_reset $@
++      $(MAKE) -C gnutv $@
++      $(MAKE) -C zap $@
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/atsc/us-ATSC-center-frequencies-8VSB dvb-apps/util/scan/atsc/us-ATSC-center-frequencies-8VSB
+--- linuxtv-dvb-apps-1.1.1/util/scan/atsc/us-ATSC-center-frequencies-8VSB      2006-04-29 22:31:08.000000000 +0200
++++ dvb-apps/util/scan/atsc/us-ATSC-center-frequencies-8VSB    2009-06-21 13:29:06.000000000 +0200
+@@ -68,4 +68,3 @@
+ A 791028615 8VSB
+ A 797028615 8VSB
+ A 803028615 8VSB
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/atsc/us-NTSC-center-frequencies-8VSB dvb-apps/util/scan/atsc/us-NTSC-center-frequencies-8VSB
+--- linuxtv-dvb-apps-1.1.1/util/scan/atsc/us-NTSC-center-frequencies-8VSB      2006-04-29 22:31:08.000000000 +0200
++++ dvb-apps/util/scan/atsc/us-NTSC-center-frequencies-8VSB    2009-06-21 13:29:06.000000000 +0200
+@@ -68,4 +68,3 @@
+ A 791000000 8VSB
+ A 797000000 8VSB
+ A 803000000 8VSB
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/atsc/us-NY-TWC-NYC dvb-apps/util/scan/atsc/us-NY-TWC-NYC
+--- linuxtv-dvb-apps-1.1.1/util/scan/atsc/us-NY-TWC-NYC        2006-04-29 22:31:08.000000000 +0200
++++ dvb-apps/util/scan/atsc/us-NY-TWC-NYC      1970-01-01 01:00:00.000000000 +0100
+@@ -1,53 +0,0 @@
+-#initial tuning data for Time Warner Cable in New York City\r
+-\r
+-#80\r
+-A 561000000 QAM256\r
+-A 567000000 QAM256\r
+-A 573000000 QAM256\r
+-A 579000000 QAM256\r
+-A 585000000 QAM256\r
+-A 591000000 QAM256\r
+-A 597000000 QAM256\r
+-A 603000000 QAM256\r
+-A 609000000 QAM256\r
+-A 615000000 QAM256\r
+-#90\r
+-A 621000000 QAM256\r
+-A 627000000 QAM256\r
+-A 633000000 QAM256\r
+-A 639000000 QAM256\r
+-A 645000000 QAM256\r
+-A  93000000 QAM256\r
+-A  99000000 QAM256\r
+-A 105000000 QAM256\r
+-A 111025000 QAM256\r
+-A 117025000 QAM256\r
+-#100\r
+-A 651000000 QAM256\r
+-A 657000000 QAM256\r
+-A 663000000 QAM256\r
+-A 669000000 QAM256\r
+-A 675000000 QAM256\r
+-A 681000000 QAM256\r
+-A 687000000 QAM256\r
+-A 693000000 QAM256\r
+-A 699000000 QAM256\r
+-A 705000000 QAM256\r
+-#110\r
+-A 711000000 QAM256\r
+-A 717000000 QAM256\r
+-A 723000000 QAM256\r
+-A 729000000 QAM256\r
+-A 735000000 QAM256\r
+-A 741000000 QAM256\r
+-A 747000000 QAM256\r
+-A 753000000 QAM256\r
+-A 759000000 QAM256\r
+-A 765000000 QAM256\r
+-#120\r
+-A 771000000 QAM256\r
+-A 777000000 QAM256\r
+-A 783000000 QAM256\r
+-A 789000000 QAM256\r
+-A 795000000 QAM256\r
+-A 801000000 QAM256\r
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/atsc_psip_section.c dvb-apps/util/scan/atsc_psip_section.c
+--- linuxtv-dvb-apps-1.1.1/util/scan/atsc_psip_section.c       2006-05-18 01:33:25.000000000 +0200
++++ dvb-apps/util/scan/atsc_psip_section.c     1970-01-01 01:00:00.000000000 +0100
+@@ -1,62 +0,0 @@
+-#include "atsc_psip_section.h"
+-
+-struct ATSC_extended_channel_name_descriptor read_ATSC_extended_channel_name_descriptor(const u8 *b)
+-{
+-      struct ATSC_extended_channel_name_descriptor v;
+-      v.descriptor_tag            = getBits(b,  0, 8);
+-      v.descriptor_length         = getBits(b,  8, 8);
+-      v.TODO                      = getBits(b, 16, 1);
+-      return v;
+-}
+-
+-struct ATSC_service_location_descriptor read_ATSC_service_location_descriptor(const u8 *b)
+-{
+-      struct ATSC_service_location_descriptor v;
+-      v.descriptor_tag            = getBits(b,  0, 8);
+-      v.descriptor_length         = getBits(b,  8, 8);
+-      v.reserved                  = getBits(b, 16, 3);
+-      v.PCR_PID                   = getBits(b, 19,13);
+-      v.number_elements           = getBits(b, 32, 8);
+-      return v;
+-}
+-
+-struct ATSC_service_location_element read_ATSC_service_location_element(const u8 *b)
+-{
+-      struct ATSC_service_location_element v;
+-      v.stream_type               = getBits(b,  0, 8);
+-      v.reserved                  = getBits(b,  8, 3);
+-      v.elementary_PID            = getBits(b, 11,13);
+-      v.ISO_639_language_code     = getBits(b, 24,24);
+-      return v;
+-}
+-
+-struct tvct_channel read_tvct_channel(const u8 *b)
+-{
+-      struct tvct_channel v;
+-      v.short_name0               = getBits(b,  0,16);
+-      v.short_name1               = getBits(b, 16,16);
+-      v.short_name2               = getBits(b, 32,16);
+-      v.short_name3               = getBits(b, 48,16);
+-      v.short_name4               = getBits(b, 64,16);
+-      v.short_name5               = getBits(b, 80,16);
+-      v.short_name6               = getBits(b, 96,16);
+-      v.reserved0                 = getBits(b,112, 4);
+-      v.major_channel_number      = getBits(b,116,10);
+-      v.minor_channel_number      = getBits(b,126,10);
+-      v.modulation_mode           = getBits(b,136, 8);
+-      v.carrier_frequency         = getBits(b,144,32);
+-      v.channel_TSID              = getBits(b,176,16);
+-      v.program_number            = getBits(b,192,16);
+-      v.ETM_location              = getBits(b,208, 2);
+-      v.access_controlled         = getBits(b,210, 1);
+-      v.hidden                    = getBits(b,211, 1);
+-      v.reserved1                 = getBits(b,212, 2);
+-      v.hide_guide                = getBits(b,214, 1);
+-      v.reserved2                 = getBits(b,215, 3);
+-      v.service_type              = getBits(b,218, 6);
+-      v.source_id                 = getBits(b,224,16);
+-      v.reserved3                 = getBits(b,240, 6);
+-      v.descriptors_length        = getBits(b,246,10);
+-      return v;
+-}
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/atsc_psip_section.h dvb-apps/util/scan/atsc_psip_section.h
+--- linuxtv-dvb-apps-1.1.1/util/scan/atsc_psip_section.h       2006-05-18 01:33:27.000000000 +0200
++++ dvb-apps/util/scan/atsc_psip_section.h     1970-01-01 01:00:00.000000000 +0100
+@@ -1,60 +0,0 @@
+-#ifndef __ATSC_PSIP_SECTION_H_
+-#define __ATSC_PSIP_SECTION_H_
+-
+-#include "section.h"
+-
+-#define ATSC_EXTENDED_CHANNEL_NAME_DESCRIPTOR_ID 0xA0
+-struct ATSC_extended_channel_name_descriptor {
+-              u8  descriptor_tag            : 8;
+-              u8  descriptor_length         : 8;
+-              u8  TODO                      : 1;
+-} PACKED;
+-struct ATSC_extended_channel_name_descriptor read_ATSC_extended_channel_name_descriptor(const u8 *);
+-
+-#define ATSC_SERVICE_LOCATION_DESCRIPTOR_ID 0xA1
+-struct ATSC_service_location_descriptor {
+-              u8  descriptor_tag            : 8;
+-              u8  descriptor_length         : 8;
+-              u8  reserved                  : 3;
+-              u16 PCR_PID                   :13;
+-              u8  number_elements           : 8;
+-} PACKED;
+-struct ATSC_service_location_descriptor read_ATSC_service_location_descriptor(const u8 *);
+-
+-struct ATSC_service_location_element {
+-              u8  stream_type               : 8;
+-              u8  reserved                  : 3;
+-              u16 elementary_PID            :13;
+-              u32 ISO_639_language_code     :24;
+-} PACKED;
+-struct ATSC_service_location_element read_ATSC_service_location_element(const u8 *);
+-
+-struct tvct_channel {
+-              u16 short_name0               :16;
+-              u16 short_name1               :16;
+-              u16 short_name2               :16;
+-              u16 short_name3               :16;
+-              u16 short_name4               :16;
+-              u16 short_name5               :16;
+-              u16 short_name6               :16;
+-              u8  reserved0                 : 4;
+-              u16 major_channel_number      :10;
+-              u16 minor_channel_number      :10;
+-              u8  modulation_mode           : 8;
+-              u32 carrier_frequency         :32;
+-              u16 channel_TSID              :16;
+-              u16 program_number            :16;
+-              u8  ETM_location              : 2;
+-              u8  access_controlled         : 1;
+-              u8  hidden                    : 1;
+-              u8  reserved1                 : 2;
+-              u8  hide_guide                : 1;
+-              u8  reserved2                 : 3;
+-              u8  service_type              : 6;
+-              u16 source_id                 :16;
+-              u8  reserved3                 : 6;
+-              u16 descriptors_length        :10;
+-} PACKED;
+-struct tvct_channel read_tvct_channel(const u8 *);
+-
+-#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/atsc_psip_section.pl dvb-apps/util/scan/atsc_psip_section.pl
+--- linuxtv-dvb-apps-1.1.1/util/scan/atsc_psip_section.pl      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/atsc_psip_section.pl    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,76 @@
++use strict;
++
++return {
++#{  0x80, 0x80,  "ATSC stuffing descriptor" },
++#{  0x81, 0x81,  "ATSC AC-3 audio descriptor" },
++#{  0x82, 0x85,  "ATSC TODO" },
++#{  0x86, 0x86,  "ATSC caption service descriptor" },
++#{  0x87, 0x87,  "ATSC content advisory descriptor" },
++#{  0x88, 0x8F,  "ATSC TODO" },
++#{  0xA0, 0xA0,  "ATSC extended channel name descriptor" },
++#{  0xA1, 0xA1,  "ATSC service location descriptor" },
++#{  0xA2, 0xA2,  "ATSC time-shifted service descriptor" },
++#{  0xA3, 0xA3,  "ATSC component name descriptor" },
++#{  0xA4, 0xA7,  "ATSC TODO" },
++#{  0xA8, 0xA8,  "ATSC DCC departing request descriptor" },
++#{  0xA9, 0xA9,  "ATSC DCC arriving request descriptor" },
++#{  0xAA, 0xAA,  "ATSC redistribution control descriptor" },
++      descriptors => [
++              {       id   => 0xa0,
++                      name => "ATSC_extended_channel_name_descriptor",
++                      elements => [
++                              descriptor_tag    => 8,
++                              descriptor_length => 8,
++                              TODO              => 1,
++                      ],
++              },
++              {       id   => 0xa1,
++                      name => "ATSC_service_location_descriptor",
++                      elements => [
++                              descriptor_tag    => 8,
++                              descriptor_length => 8,
++                              reserved          => 3,
++                              PCR_PID           => 13,
++                              number_elements   => 8,
++                      ],
++              }
++      ],
++      misc => [
++              {       name => "ATSC_service_location_element",
++                      elements => [
++                              stream_type           => 8,
++                              reserved              => 3,
++                              elementary_PID        => 13,
++                              ISO_639_language_code => 24,
++                      ],
++              },
++              {       name => "tvct_channel",
++                      elements => [
++                              short_name0 => 16,
++                              short_name1 => 16,
++                              short_name2 => 16,
++                              short_name3 => 16,
++                              short_name4 => 16,
++                              short_name5 => 16,
++                              short_name6 => 16,
++                              reserved0 => 4,
++                              major_channel_number => 10,
++                              minor_channel_number => 10,
++                              modulation_mode => 8,
++                              carrier_frequency => 32,
++                              channel_TSID => 16,
++                              program_number => 16,
++                              ETM_location => 2,
++                              access_controlled => 1,
++                              hidden => 1,
++                              reserved1 => 2,
++                              hide_guide => 1,
++                              reserved2 => 3,
++                              service_type => 6,
++                              source_id => 16,
++                              reserved3 => 6,
++                              descriptors_length => 10,
++                      ],
++              },
++      ]
++};
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/diseqc.c dvb-apps/util/scan/diseqc.c
+--- linuxtv-dvb-apps-1.1.1/util/scan/diseqc.c  2006-05-18 01:33:25.000000000 +0200
++++ dvb-apps/util/scan/diseqc.c        2009-06-21 13:29:06.000000000 +0200
+@@ -37,9 +37,6 @@
+               ;
+ }
+-#define printf(x...)
+-
+-
+ int diseqc_send_msg (int fd, fe_sec_voltage_t v, struct diseqc_cmd **cmd,
+                    fe_sec_tone_mode_t t, fe_sec_mini_cmd_t b)
+ {
+@@ -104,5 +101,3 @@
+                               (i/2) % 2 ? SEC_TONE_ON : SEC_TONE_OFF,
+                               (i/4) % 2 ? SEC_MINI_B : SEC_MINI_A);
+ }
+-
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/diseqc.h dvb-apps/util/scan/diseqc.h
+--- linuxtv-dvb-apps-1.1.1/util/scan/diseqc.h  2006-05-18 01:33:27.000000000 +0200
++++ dvb-apps/util/scan/diseqc.h        2009-06-21 13:29:06.000000000 +0200
+@@ -22,4 +22,3 @@
+ #endif
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dump-vdr.c dvb-apps/util/scan/dump-vdr.c
+--- linuxtv-dvb-apps-1.1.1/util/scan/dump-vdr.c        2006-05-18 01:33:25.000000000 +0200
++++ dvb-apps/util/scan/dump-vdr.c      2009-06-21 13:29:06.000000000 +0200
+@@ -138,7 +138,7 @@
+ {
+         int i;
+-      if ((video_pid || audio_pid[0]) && ((ca_select > 0) || ((ca_select == 0) && (scrambled == 0)))) {
++      if (video_pid || audio_pid[0]) {
+               if (vdr_version <= 2) {
+                       audio_lang = NULL;
+                       network_id = 0;
+@@ -174,10 +174,17 @@
+                       if (audio_lang && audio_lang[0][0])
+                               fprintf (f, "=%.4s", audio_lang[0]);
+               }
+-              if (scrambled == 1) scrambled = ca_select;
++              if (scrambled == 1) {
++                      if (ca_select == -1)
++                              if (vdr_version <= 2)
++                                      scrambled = 1;
++                              else
++                                      scrambled = 0;
++                      else
++                              scrambled = ca_select;
++              }
+               fprintf (f, ":%d:%d:%d:%d:%d:0", teletext_pid, scrambled,
+                               service_id, network_id, transport_stream_id);
+               fprintf (f, "\n");
+       }
+ }
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dump-vdr.h dvb-apps/util/scan/dump-vdr.h
+--- linuxtv-dvb-apps-1.1.1/util/scan/dump-vdr.h        2006-05-18 01:33:27.000000000 +0200
++++ dvb-apps/util/scan/dump-vdr.h      2009-06-21 13:29:06.000000000 +0200
+@@ -36,4 +36,3 @@
+                                int channel_num);
+ #endif
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dump-zap.c dvb-apps/util/scan/dump-zap.c
+--- linuxtv-dvb-apps-1.1.1/util/scan/dump-zap.c        2006-05-18 01:33:25.000000000 +0200
++++ dvb-apps/util/scan/dump-zap.c      2009-06-21 13:29:06.000000000 +0200
+@@ -123,4 +123,3 @@
+       fprintf (f, ":%i:%i:%i", video_pid, audio_pid[0], service_id);
+       fprintf (f, "\n");
+ }
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dump-zap.h dvb-apps/util/scan/dump-zap.h
+--- linuxtv-dvb-apps-1.1.1/util/scan/dump-zap.h        2006-05-18 01:33:27.000000000 +0200
++++ dvb-apps/util/scan/dump-zap.h      2009-06-21 13:29:06.000000000 +0200
+@@ -17,4 +17,3 @@
+                                uint16_t service_id);
+ #endif
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/at-Innsbruck dvb-apps/util/scan/dvb-c/at-Innsbruck
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/at-Innsbruck        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/at-Innsbruck      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,8 @@
++# scan config for Innsbruck Telesystem cable provider
++# freq sr fec mod
++C 450000000 6875000 NONE QAM64
++C 490000000 6875000 NONE QAM64
++C 442000000 6875000 NONE QAM64
++C 546000000 6875000 NONE QAM64
++C 554000000 6875000 NONE QAM64
++C 562000000 6875000 NONE QAM64
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/at-KarrerNet dvb-apps/util/scan/dvb-c/at-KarrerNet
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/at-KarrerNet        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/at-KarrerNet      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,18 @@
++# Kabel St. Florian bei Linz/AT KarrerNet
++# 2009-01-10
++# freq sr fec mod
++C 418000000 6900000 NONE QAM64
++C 426000000 6900000 NONE QAM64
++C 434000000 6900000 NONE QAM64
++C 442000000 6900000 NONE QAM64
++C 450000000 6900000 NONE QAM64
++C 458000000 6900000 NONE QAM64
++C 466000000 6900000 NONE QAM64
++C 474000000 6900000 NONE QAM64
++C 482000000 6900000 NONE QAM64
++C 522000000 6900000 NONE QAM64
++C 530000000 6900000 NONE QAM64
++C 538000000 6900000 NONE QAM64
++C 578000000 6900000 NONE QAM64
++C 402000000 6900000 NONE QAM256
++C 410000000 6900000 NONE QAM256
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/at-Liwest dvb-apps/util/scan/dvb-c/at-Liwest
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/at-Liwest   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/at-Liwest 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,31 @@
++# Kabel Linz/AT Liwest
++# 2006-08-01
++# freq sr fec mod
++C 394000000 6900000 NONE QAM64
++C 402000000 6900000 NONE QAM64
++C 410000000 6875000 NONE QAM64
++C 418000000 6900000 NONE QAM64
++C 426000000 6900000 NONE QAM64
++C 434000000 6900000 NONE QAM64
++C 442000000 6900000 NONE QAM64
++C 506000000 6900000 NONE QAM64
++C 514000000 6900000 NONE QAM64
++C 522000000 6900000 NONE QAM64
++C 530000000 6900000 NONE QAM64
++C 538000000 6900000 NONE QAM64
++C 546000000 6900000 NONE QAM64
++C 554000000 6900000 NONE QAM64
++C 562000000 6900000 NONE QAM64
++C 570000000 6900000 NONE QAM64
++C 578000000 6900000 NONE QAM64
++C 586000000 6900000 NONE QAM64
++C 594000000 6900000 NONE QAM64
++C 666000000 6900000 NONE QAM64
++C 674000000 6900000 NONE QAM64
++C 682000000 6900000 NONE QAM64
++C 586000000 6900000 NONE QAM256
++C 634000000 6900000 NONE QAM256
++C 642000000 6900000 NONE QAM256
++C 650000000 6900000 NONE QAM256
++C 658000000 6900000 NONE QAM256
++C 690000000 6900000 NONE QAM256
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/at-SalzburgAG dvb-apps/util/scan/dvb-c/at-SalzburgAG
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/at-SalzburgAG       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/at-SalzburgAG     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,8 @@
++# scan config for Salzburg AG cable provider
++# freq sr fec mod
++C 306000000 6900000 NONE QAM64
++C 370000000 6900000 NONE QAM64
++C 410000000 6900000 NONE QAM64
++C 418000000 6900000 NONE QAM64
++C 426000000 6900000 NONE QAM64
++C 442000000 6900000 NONE QAM64
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/be-IN.DI-Integan dvb-apps/util/scan/dvb-c/be-IN.DI-Integan
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/be-IN.DI-Integan    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/be-IN.DI-Integan  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,16 @@
++# Integan DVB-C (Belgium, IN.DI region)
++# freq sr fec mod
++C 330000000 6875000 NONE QAM256
++C 338000000 6875000 NONE QAM256
++C 346000000 6875000 NONE QAM256
++C 354000000 6875000 NONE QAM256
++C 362000000 6875000 NONE QAM64
++C 370000000 6875000 NONE QAM256
++C 378000000 6875000 NONE QAM256
++C 386000000 6875000 NONE QAM256
++C 394000000 6875000 NONE QAM256
++C 458000000 6875000 NONE QAM256
++C 466000000 6875000 NONE QAM256
++C 474000000 6875000 NONE QAM256
++C 482000000 6875000 NONE QAM256
++C 586000000 6875000 NONE QAM256
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/ch-Rega-Sense dvb-apps/util/scan/dvb-c/ch-Rega-Sense
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/ch-Rega-Sense       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/ch-Rega-Sense     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,34 @@
++# Rega Sense, Switzerland
++# freq sr fec mod
++
++# Pay TV
++C 434000000 6900000 NONE QAM64 # Teleclub
++C 714000000 6900000 NONE QAM64
++C 722000000 6900000 NONE QAM64
++
++# Basis offer
++C 125000000 6900000 NONE QAM64
++C 450000000 6900000 NONE QAM64
++C 458000000 6900000 NONE QAM64
++C 466000000 6900000 NONE QAM64
++C 474000000 6900000 NONE QAM64
++C 482000000 6900000 NONE QAM64
++C 514000000 6900000 NONE QAM64
++C 522000000 6900000 NONE QAM64
++C 578000000 6900000 NONE QAM64
++C 586000000 6900000 NONE QAM64
++C 634000000 6900000 NONE QAM64
++C 642000000 6900000 NONE QAM64
++C 650000000 6900000 NONE QAM64
++C 658000000 6900000 NONE QAM64
++C 666000000 6900000 NONE QAM64
++C 682000000 6900000 NONE QAM64
++C 698000000 6900000 NONE QAM64
++C 730000000 6900000 NONE QAM64
++
++C 618000000 6900000 NONE QAM256
++C 674000000 6900000 NONE QAM256
++
++# HDTV
++C 642000000 6900000 NONE QAM256
++C 690000000 6900000 NONE QAM256
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/ch-Video2000 dvb-apps/util/scan/dvb-c/ch-Video2000
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/ch-Video2000        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/ch-Video2000      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# Cable Video2000
++# Canton of Neuchatel, Switzerland
++
++# freq sr fec mod
++C 306000000 6900000 NONE QAM64
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/ch-Zuerich-cablecom dvb-apps/util/scan/dvb-c/ch-Zuerich-cablecom
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/ch-Zuerich-cablecom 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/ch-Zuerich-cablecom       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Kabel cablecom.ch Zuerich
++# freq sr fec mod
++C 410000000 6900000 NONE QAM64
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/cz-Moravianet dvb-apps/util/scan/dvb-c/cz-Moravianet
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/cz-Moravianet       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/cz-Moravianet     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,24 @@
++# DVB-C Moravianet (http://www.moravia.net/)
++# Available in villages and cities around Brno:
++# Bohuslavice, Bukovany, Hrusovany u Brna, Hustopece, Ivancice, Jirikovice,
++# Kyjov, Moravsky Krumlov, Mutenice, Neslovice, Nove Branice, Oslavany,
++# Popuvky, Padochov, Troubsko, Rosice, Tisnov, Vojkovice, Svatoborice,
++# Slapanice, Zabcice, Zidlochovice
++# The same content is available also from NejTV where they provide DVB-C.
++# Currently it is in Havlickuv Brod, Breclav, Velke Mezirici
++#
++# 2008-12-03
++#
++# freq      sr      fec  mod
++C 218000000 6900000 NONE QAM64
++C 226000000 6900000 NONE QAM64
++C 234000000 6900000 NONE QAM64
++C 242000000 6900000 NONE QAM64
++C 250000000 6900000 NONE QAM64
++C 258000000 6900000 NONE QAM64
++C 266000000 6900000 NONE QAM64
++C 274000000 6900000 NONE QAM64
++C 282000000 6900000 NONE QAM64
++C 290000000 6900000 NONE QAM64
++C 298000000 6900000 NONE QAM64
++C 306000000 6900000 NONE QAM64
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/de-Berlin dvb-apps/util/scan/dvb-c/de-Berlin
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/de-Berlin   2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/de-Berlin 2009-06-21 13:29:06.000000000 +0200
+@@ -2,3 +2,4 @@
+ # freq sr fec mod
+ C 394000000 6900000 NONE QAM64
+ C 113000000 6900000 NONE QAM64
++C 466000000 6900000 NONE QAM64
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/de-iesy dvb-apps/util/scan/dvb-c/de-iesy
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/de-iesy     2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/de-iesy   2009-06-21 13:29:06.000000000 +0200
+@@ -1,3 +1,20 @@
+-# Kabel iesy
++# Unity Media (iesy Hessen, ish Nordrhein-Westfalen)
+ # freq sr fec mod
++C 113000000 6900000 NONE QAM64
++C 121000000 6900000 NONE QAM64
++C 346000000 6900000 NONE QAM256
++C 354000000 6900000 NONE QAM64
++C 362000000 6900000 NONE QAM64
++C 370000000 6900000 NONE QAM64
++C 378000000 6900000 NONE QAM64
++C 386000000 6900000 NONE QAM64
++C 394000000 6900000 NONE QAM64
++C 402000000 6900000 NONE QAM256
+ C 410000000 6900000 NONE QAM64
++C 426000000 6900000 NONE QAM64
++C 434000000 6900000 NONE QAM256
++C 442000000 6900000 NONE QAM256
++C 450000000 6900000 NONE QAM64
++C 458000000 6900000 NONE QAM64
++C 466000000 6900000 NONE QAM64
++C 538000000 6900000 NONE QAM256
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/de-Kabel_BW dvb-apps/util/scan/dvb-c/de-Kabel_BW
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/de-Kabel_BW 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/de-Kabel_BW       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,16 @@
++# Kabel-BW, Stand 04/2007
++#
++# Nur eine Anfangsfrequenz ist noetig, um den Ball ins
++# Rollen zu bringen. Quasi als Einstiegspunkt fuer eine
++# umfassende Suche. Es besteht kein Grund, sich um all die
++# vielen anderen Frequenzen und deren aktuell verwendete
++# Parameter zu kuemmern und diese dann womoeglich auch
++# noch auf einem aktuellen Stand halten zu wollen. Bei der
++# schieren Anzahl der innerhalb des Ausbaugebiets durch
++# Kabel BW genutzten Frequenzen waere das nur zeitraubend
++# und fehleranfaellig... ;-)
++#
++# Dirk Ritter <dirk@GNUmatic.de>
++#
++# freq      sr      fec  mod
++C 113000000 6900000 NONE QAM64
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/de-Muenchen dvb-apps/util/scan/dvb-c/de-Muenchen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/de-Muenchen 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/de-Muenchen       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,27 @@
++# 2008-06-22
++# Area: Muenchen City
++# Cable Provider: Kabel & Medien Service - http://www.atcable.de
++# Cable Content: Cablevista GmbH - http://www.cablevista.de
++#
++# freq sr fec mod
++C 113000000 6900000 NONE QAM64
++C 121000000 6900000 NONE QAM64
++C 346000000 6900000 NONE QAM64
++C 354000000 6900000 NONE QAM64
++C 362000000 6900000 NONE QAM64
++C 370000000 6900000 NONE QAM64
++C 378000000 6900000 NONE QAM64
++C 386000000 6900000 NONE QAM64
++C 394000000 6900000 NONE QAM64
++C 402000000 6900000 NONE QAM64
++C 410000000 6900000 NONE QAM64
++C 418000000 6900000 NONE QAM64
++C 426000000 6900000 NONE QAM64
++C 434000000 6900000 NONE QAM64
++C 442000000 6900000 NONE QAM64
++C 450000000 6900000 NONE QAM64
++C 466000000 6900000 NONE QAM64
++C 482000000 6900000 NONE QAM64
++C 322000000 6900000 NONE QAM256
++C 458000000 6900000 NONE QAM256
++C 490000000 6900000 NONE QAM256
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/de-neftv dvb-apps/util/scan/dvb-c/de-neftv
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/de-neftv    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/de-neftv  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,23 @@
++# Cable conf for NEFtv
++# (Nuernberg, Erlangen, Fuerth and Herzogenaurach)
++
++# freq sr fec mod
++C 346000000 6875000 NONE QAM64
++C 354000000 6875000 NONE QAM64
++C 362000000 6875000 NONE QAM64
++C 370000000 6875000 NONE QAM64
++C 378000000 6875000 NONE QAM64
++C 386000000 6875000 NONE QAM64
++C 394000000 6875000 NONE QAM64
++C 402000000 6875000 NONE QAM64
++C 410000000 6875000 NONE QAM64
++C 418000000 6875000 NONE QAM64
++C 426000000 6875000 NONE QAM64
++C 434000000 6875000 NONE QAM64
++C 450000000 6875000 NONE QAM64
++C 458000000 6875000 NONE QAM64
++C 474000000 6875000 NONE QAM64
++C 490000000 6875000 NONE QAM64
++C 498000000 6875000 NONE QAM64
++C 514000000 6875000 NONE QAM64
++C 546000000 6875000 NONE QAM64
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/de-Primacom dvb-apps/util/scan/dvb-c/de-Primacom
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/de-Primacom 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/de-Primacom       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,23 @@
++# Primacom
++# freq sr fec mod
++C 121000000 6900000 NONE QAM64
++C 306000000 6900000 NONE QAM64
++C 314000000 6900000 NONE QAM64
++C 322000000 6900000 NONE QAM64
++C 330000000 6900000 NONE QAM64
++C 338000000 6900000 NONE QAM256
++C 346000000 6900000 NONE QAM256
++C 354000000 6900000 NONE QAM256
++C 362000000 6900000 NONE QAM256
++C 370000000 6900000 NONE QAM256
++C 378000000 6900000 NONE QAM256
++C 386000000 6900000 NONE QAM256
++C 394000000 6900000 NONE QAM256
++C 418000000 6900000 NONE QAM256
++C 434000000 6900000 NONE QAM64
++C 442000000 6900000 NONE QAM64
++C 450000000 6900000 NONE QAM64
++C 458000000 6900000 NONE QAM64
++C 466000000 6900000 NONE QAM64
++C 610000000 6900000 NONE QAM64
++C 746000000 6900000 NONE QAM64
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/de-Unitymedia dvb-apps/util/scan/dvb-c/de-Unitymedia
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/de-Unitymedia       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/de-Unitymedia     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,35 @@
++# Unitymedia
++# Created from http://www.unitymedia.de/service/tv/frequenzen.html
++# and http://blob.unitymedia.de/Download/Unitymedia_Senderlineup_digital_2008-05-28.pdf
++# freq sr fec mod
++C 113000000 6900000 NONE QAM256
++C 121000000 6900000 NONE QAM256
++C 338000000 6900000 NONE QAM256
++C 346000000 6900000 NONE QAM256
++C 354000000 6900000 NONE QAM64
++C 362000000 6900000 NONE QAM64
++C 370000000 6900000 NONE QAM64
++C 378000000 6900000 NONE QAM64
++C 386000000 6900000 NONE QAM64
++C 394000000 6900000 NONE QAM256
++C 402000000 6900000 NONE QAM256
++C 410000000 6900000 NONE QAM256
++C 418000000 6900000 NONE QAM256
++C 426000000 6900000 NONE QAM256
++C 434000000 6900000 NONE QAM256
++C 442000000 6900000 NONE QAM64
++C 450000000 6900000 NONE QAM64
++C 458000000 6900000 NONE QAM256
++C 466000000 6900000 NONE QAM256
++C 474000000 6900000 NONE QAM64
++C 522000000 6900000 NONE QAM256
++C 530000000 6900000 NONE QAM256
++C 538000000 6900000 NONE QAM256
++C 554000000 6900000 NONE QAM256
++C 562000000 6900000 NONE QAM256
++C 570000000 6900000 NONE QAM256
++C 610000000 6900000 NONE QAM64
++C 650000000 6900000 NONE QAM256
++C 658000000 6900000 NONE QAM256
++C 666000000 6900000 NONE QAM256
++C 674000000 6900000 NONE QAM256
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/dk-Copenhagen-AFDK dvb-apps/util/scan/dvb-c/dk-Copenhagen-AFDK
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/dk-Copenhagen-AFDK  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/dk-Copenhagen-AFDK        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,11 @@
++# AFDK, Copenhagen
++# http://www.afdk.tv/
++# freq sr fec mod
++C 386000000 6875000 NONE QAM64
++C 394000000 6875000 NONE QAM64
++C 402000000 6875000 NONE QAM64
++C 490000000 6875000 NONE QAM64
++C 602000000 6875000 NONE QAM64
++C 610000000 6875000 NONE QAM64
++C 618000000 6875000 NONE QAM64
++C 794000000 6875000 NONE QAM64
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/dk-Odense dvb-apps/util/scan/dvb-c/dk-Odense
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/dk-Odense   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/dk-Odense 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# Glentevejs Antennelaug (Denmark / Odense)
++# freq sr fec mod
++C 442000000 6900000 NONE QAM64
++C 434000000 6875000 NONE QAM256
++C 255000000 5000000 NONE QAM256
++C 506000000 6875000 NONE QAM256
++C 562000000 6875000 NONE QAM256
++C 610000000 6875000 NONE QAM256
++C 754000000 6875000 NONE QAM256
++C 770000000 6875000 NONE QAM256
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/es-Euskaltel dvb-apps/util/scan/dvb-c/es-Euskaltel
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/es-Euskaltel        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/es-Euskaltel      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,19 @@
++# Scan config for Euskaltel (DVB-C)
++# Basque Country - Spain
++# file automatically generated by w_scan
++# (http://free.pages.at/wirbel4vdr/w_scan/index2.html)
++# freq sr fec mod
++C 714000000 6875000 NONE QAM64
++C 722000000 6875000 NONE QAM64
++C 730000000 6875000 NONE QAM64
++C 738000000 6875000 NONE QAM64
++C 746000000 6875000 NONE QAM64
++C 754000000 6875000 NONE QAM64
++C 762000000 6875000 NONE QAM64
++C 770000000 6875000 NONE QAM64
++C 778000000 6875000 NONE QAM64
++C 786000000 6875000 NONE QAM64
++C 794000000 6875000 NONE QAM64
++C 802000000 6875000 NONE QAM64
++C 810000000 6875000 NONE QAM64
++C 818000000 6875000 NONE QAM64
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/fi-3ktv dvb-apps/util/scan/dvb-c/fi-3ktv
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/fi-3ktv     2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/fi-3ktv   2009-06-21 13:29:06.000000000 +0200
+@@ -1,3 +1,20 @@
+-# 3KTV
+-# freq sr fec mod
+-C 306000000 6875000 NONE QAM64
++# 3KTV network reference channels
++# freq      sr      fec  mod
++C 154000000 6875000 NONE QAM128
++C 162000000 6875000 NONE QAM128
++C 170000000 6875000 NONE QAM128
++C 232000000 6875000 NONE QAM128
++C 298000000 6875000 NONE QAM128
++C 306000000 6875000 NONE QAM128
++C 314000000 6875000 NONE QAM128
++C 322000000 6875000 NONE QAM128
++C 330000000 6875000 NONE QAM128
++C 338000000 6875000 NONE QAM128
++C 346000000 6875000 NONE QAM128
++C 354000000 6875000 NONE QAM128
++C 362000000 6875000 NONE QAM128
++C 370000000 6875000 NONE QAM128
++C 378000000 6875000 NONE QAM128
++C 394000000 6875000 NONE QAM128
++C 402000000 6875000 NONE QAM128
++C 450000000 6875000 NONE QAM128
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/fi-HTV dvb-apps/util/scan/dvb-c/fi-HTV
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/fi-HTV      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/fi-HTV    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# HTV
++# freq sr fec mod
++C 283000000 5900000 NONE QAM128
++C 154000000 6900000 NONE QAM128
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/fi-jkl dvb-apps/util/scan/dvb-c/fi-jkl
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/fi-jkl      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/fi-jkl    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# OnCable (Finland / Jyväskylä)
++# freq sr fec mod
++C 514000000 6900000 NONE QAM128
++C 426000000 6900000 NONE QAM128
++C 162000000 6900000 NONE QAM128
++C 418000000 6900000 NONE QAM128
++C 490000000 6900000 NONE QAM128
++C 498000000 6900000 NONE QAM128
++C 402000000 6900000 NONE QAM128
++C 410000000 6900000 NONE QAM128
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/fi-Joensuu-Tikka dvb-apps/util/scan/dvb-c/fi-Joensuu-Tikka
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/fi-Joensuu-Tikka    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/fi-Joensuu-Tikka  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,13 @@
++# DVB-C, Tikka Media, Joensuu, Finland
++# freq sr fec mod
++C 154000000 6900000 NONE QAM128
++C 162000000 6900000 NONE QAM128
++C 170000000 6900000 NONE QAM128
++C 402000000 6900000 NONE QAM128
++C 410000000 6900000 NONE QAM128
++C 418000000 6900000 NONE QAM128
++C 426000000 6900000 NONE QAM128
++C 434000000 6900000 NONE QAM128
++C 458000000 6900000 NONE QAM128
++C 466000000 6900000 NONE QAM128
++C 474000000 6900000 NONE QAM128
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/fi-sonera dvb-apps/util/scan/dvb-c/fi-sonera
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/fi-sonera   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/fi-sonera 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,12 @@
++# Sonera kaapeli-tv (Finland)
++# Maksuttomat kanavat ovat 162 ja 170 MHz:n muxeissa
++#
++# freq      sr      fec  mod
++C 154000000 6900000 NONE QAM128
++C 162000000 6900000 NONE QAM128
++C 170000000 6900000 NONE QAM128
++C 314000000 6900000 NONE QAM128
++C 322000000 6900000 NONE QAM128
++C 338000000 6900000 NONE QAM128
++C 346000000 6900000 NONE QAM128
++C 354000000 6900000 NONE QAM128
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/fi-TTV dvb-apps/util/scan/dvb-c/fi-TTV
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/fi-TTV      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/fi-TTV    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# TTV
++# freq sr fec mod
++C 418000000 6900000 NONE QAM128
++C 346000000 6900000 NONE QAM128
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/fi-Turku dvb-apps/util/scan/dvb-c/fi-Turku
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/fi-Turku    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/fi-Turku  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,17 @@
++# Turun Kaapelitelevisio Oy (Turku)
++# freq sr fec mod
++C 146000000 6900000 NONE QAM128
++C 154000000 6900000 NONE QAM128
++C 162000000 6900000 NONE QAM128
++C 322000000 6900000 NONE QAM128
++C 330000000 6900000 NONE QAM128
++C 338000000 6900000 NONE QAM128
++C 362000000 6900000 NONE QAM128
++C 378000000 6900000 NONE QAM128
++C 386000000 6900000 NONE QAM128
++C 402000000 6900000 NONE QAM128
++C 410000000 6900000 NONE QAM128
++C 418000000 6900000 NONE QAM128
++C 426000000 6900000 NONE QAM128
++C 442000000 6900000 NONE QAM128
++C 354000000 6900000 NONE QAM256
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/fr-noos-numericable dvb-apps/util/scan/dvb-c/fr-noos-numericable
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/fr-noos-numericable 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/fr-noos-numericable       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,41 @@
++# Cable en France
++# freq sr fec mod
++C 123000000 6875000 NONE QAM64
++C 131000000 6875000 NONE QAM64
++C 139000000 6875000 NONE QAM64
++C 147000000 6875000 NONE QAM64
++C 155000000 6875000 NONE QAM64
++C 163000000 6875000 NONE QAM64
++C 171000000 6875000 NONE QAM64
++C 179000000 6875000 NONE QAM64
++C 187000000 6875000 NONE QAM64
++C 195000000 6875000 NONE QAM64
++C 203000000 6875000 NONE QAM64
++C 211000000 6875000 NONE QAM64
++C 219000000 6875000 NONE QAM64
++C 227000000 6875000 NONE QAM64
++C 235000000 6875000 NONE QAM64
++C 243000000 6875000 NONE QAM64
++C 251000000 6875000 NONE QAM64
++C 259000000 6875000 NONE QAM64
++C 267000000 6875000 NONE QAM64
++C 275000000 6875000 NONE QAM64
++C 283000000 6875000 NONE QAM64
++C 291000000 6875000 NONE QAM64
++C 299000000 6875000 NONE QAM64
++C 315000000 6875000 NONE QAM64
++C 323000000 6875000 NONE QAM64
++C 339000000 6875000 NONE QAM64
++C 347000000 6875000 NONE QAM64
++C 706000000 6875000 NONE QAM64
++C 714000000 6875000 NONE QAM64
++C 722000000 6875000 NONE QAM64
++C 730000000 6875000 NONE QAM64
++C 738000000 6875000 NONE QAM64
++C 746000000 6875000 NONE QAM64
++C 748000000 6875000 NONE QAM64
++C 754000000 6875000 NONE QAM64
++C 762000000 6875000 NONE QAM64
++C 834000000 6875000 NONE QAM64
++C 842000000 6875000 NONE QAM64
++C 850000000 6875000 NONE QAM64
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/lu-Ettelbruck-ACE dvb-apps/util/scan/dvb-c/lu-Ettelbruck-ACE
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/lu-Ettelbruck-ACE   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/lu-Ettelbruck-ACE 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,20 @@
++# Scan config for Antenne Collective Ettelbruck a.s.b.l.
++# (http://antenne-ettelbruck.lu)
++# Luxembourg - Ettelbruck
++# freq sr fec mod
++C 634000000 6900000 NONE QAM64
++C 642000000 6900000 NONE QAM64
++C 650000000 6900000 NONE QAM64
++C 666000000 6900000 NONE QAM64
++C 674000000 6900000 NONE QAM64
++C 682000000 6900000 NONE QAM64
++C 690000000 6900000 NONE QAM64
++C 698000000 6900000 NONE QAM64
++C 706000000 6900000 NONE QAM64
++C 714000000 6900000 NONE QAM64
++C 656000000 3450000 NONE QAM64
++C 660000000 3450000 NONE QAM64
++C 720000000 3450000 NONE QAM64
++C 732000000 3450000 NONE QAM64
++C 724000000 3450000 NONE QAM64
++C 728000000 3450000 NONE QAM64
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/nl-Ziggo dvb-apps/util/scan/dvb-c/nl-Ziggo
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/nl-Ziggo    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/nl-Ziggo  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,14 @@
++# Initial Tuning file for nl-Ziggo
++# This file only lists the main
++# frequencies. You still need to do
++# a network scan to find other
++# transponders.
++#
++# based on:
++# http://blob.ziggo.nl/dynamic/NL_HOME/PDF-UPLOAD/Gebruikers-Handleiding-DigitaleTV.pdf
++# Chapter 4
++#
++C 372000000 6875000 NONE QAM64 # Main Frequency Ziggo/Casema
++C 514000000 6875000 NONE QAM64 # Main Frequency Ziggo/Multikabel
++C 356000000 6875000 NONE QAM64 # Main Frequency Ziggo/@Home Zuid
++C 369000000 6875000 NONE QAM64 # Main Frequency Ziggo/@Home Noord
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/nl-Ziggo-Zwolle dvb-apps/util/scan/dvb-c/nl-Ziggo-Zwolle
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/nl-Ziggo-Zwolle     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/nl-Ziggo-Zwolle   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,26 @@
++C 313000000 6875000 NONE QAM64 # TS   1
++C 361000000 6875000 NONE QAM64 # TS   2
++C 353000000 6875000 NONE QAM64 # TS   3
++C 345000000 6875000 NONE QAM64 # TS   4
++C 818000000 6875000 NONE QAM64 # TS   5
++C 329000000 6875000 NONE QAM64 # TS   6
++C 810000000 6875000 NONE QAM64 # TS   7
++C 305000000 6875000 NONE QAM64 # TS   8
++C 762000000 6875000 NONE QAM64 # TS   9
++C 618000000 6875000 NONE QAM64 # TS  10
++C 610000000 6875000 NONE QAM64 # TS  11
++C 337000000 6875000 NONE QAM64 # TS  12
++C 321000000 6875000 NONE QAM64 # TS  13
++C 385000000 6875000 NONE QAM64 # TS  14
++C 393000000 6875000 NONE QAM64 # TS  15
++C 401000000 6875000 NONE QAM64 # TS  16
++C 369000000 6875000 NONE QAM64 # TS  18 (main TS)
++C 297000000 6875000 NONE QAM64 # TS  19
++C 377000000 6875000 NONE QAM64 # TS  22
++C 754000000 6875000 NONE QAM64 # TS  23
++C 642000000 6875000 NONE QAM64 # TS  24
++C 650000000 6875000 NONE QAM64 # TS  25
++C 794000000 6875000 NONE QAM64 # TS  26
++C 409000000 6875000 NONE QAM64 # TS  27
++C 425000000 6875000 NONE QAM64 # TS 206
++C 417000000 6875000 NONE QAM64 # TS 207
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/no-Oslo-CanalDigital dvb-apps/util/scan/dvb-c/no-Oslo-CanalDigital
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/no-Oslo-CanalDigital        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/no-Oslo-CanalDigital      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,13 @@
++# no-oslo-CanalDigital (cable)
++C 354000000 6950000 NONE QAM64
++C 362000000 6950000 NONE QAM64
++C 370000000 6950000 NONE QAM64
++C 378000000 6950000 NONE QAM64
++C 386000000 6950000 NONE QAM64
++C 394000000 6950000 NONE QAM64
++C 402000000 6950000 NONE QAM64
++C 410000000 6950000 NONE QAM64
++C 418000000 6950000 NONE QAM64
++C 426000000 6950000 NONE QAM64
++C 450000000 6950000 NONE QAM64
++C 474000000 6950000 NONE QAM64
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/no-Oslo-Get dvb-apps/util/scan/dvb-c/no-Oslo-Get
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/no-Oslo-Get 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/no-Oslo-Get       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,22 @@
++# no-Oslo-Get (cable)
++C 241000000 6900000 NONE QAM256
++C 272000000 6900000 NONE QAM256
++C 280000000 6900000 NONE QAM256
++C 290000000 6900000 NONE QAM256
++C 298000000 6900000 NONE QAM256
++C 306000000 6900000 NONE QAM256
++C 314000000 6900000 NONE QAM256
++C 322000000 6900000 NONE QAM256
++C 330000000 6900000 NONE QAM256
++C 338000000 6900000 NONE QAM256
++C 346000000 6900000 NONE QAM256
++C 354000000 6900000 NONE QAM256
++C 362000000 6900000 NONE QAM256
++C 370000000 6900000 NONE QAM256
++C 378000000 6900000 NONE QAM256
++C 386000000 6900000 NONE QAM256
++C 394000000 6900000 NONE QAM256
++C 410000000 6900000 NONE QAM256
++C 442000000 6952000 NONE QAM256
++C 482000000 6900000 NONE QAM256
++C 498000000 6900000 NONE QAM256
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/se-comhem dvb-apps/util/scan/dvb-c/se-comhem
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/se-comhem   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/se-comhem 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# com hem
++# freq sr fec mod
++C 362000000 6875000 NONE QAM64
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/se-Gothnet dvb-apps/util/scan/dvb-c/se-Gothnet
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-c/se-Gothnet  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-c/se-Gothnet        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,23 @@
++# Gothnet DVB-C
++# Updated: 2008-09-19
++# freq sr fec mod
++
++# Free channels
++C 490000000 6875000 NONE QAM64
++C 498000000 6875000 NONE QAM64
++C 506000000 6875000 NONE QAM64
++C 514000000 6875000 NONE QAM64
++
++# SPA channels
++C 682000000 6900000 NONE QAM64
++C 690000000 6900000 NONE QAM64
++C 698000000 6900000 NONE QAM64
++C 706000000 6900000 NONE QAM64
++
++# Canal Digital channels
++C 314000000 7000000 NONE QAM64
++C 322000000 7000000 NONE QAM64
++C 346000000 7000000 NONE QAM64
++C 354000000 7000000 NONE QAM64
++C 362000000 7000000 NONE QAM64
++C 370000000 7000000 NONE QAM64
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-h/fi-Helsinki dvb-apps/util/scan/dvb-h/fi-Helsinki
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-h/fi-Helsinki 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-h/fi-Helsinki       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,2 @@
++# H freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++H 586000000 8MHz 1/2 NONE QAM16 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-h/fi-Oulu dvb-apps/util/scan/dvb-h/fi-Oulu
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-h/fi-Oulu     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-h/fi-Oulu   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,2 @@
++# H freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++H 498000000 8MHz 1/2 NONE QAM16 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-h/fi-Oulu-Nokia-devel dvb-apps/util/scan/dvb-h/fi-Oulu-Nokia-devel
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-h/fi-Oulu-Nokia-devel 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-h/fi-Oulu-Nokia-devel       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Nokia Oulu delelopment network
++# Network Name 'Nokia Oulu'
++# H freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++H 690000000 8MHz 1/2 NONE QPSK 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-h/fi-Turku dvb-apps/util/scan/dvb-h/fi-Turku
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-h/fi-Turku    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-h/fi-Turku  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,2 @@
++# H freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++H 498000000 8MHz 1/2 NONE QAM16 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-h/README dvb-apps/util/scan/dvb-h/README
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-h/README      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-h/README    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++These files are mainly for informational and experimental purposes.
++The DVB-H file format hasn't been specified in any way; currently it's just
++a copy of the DVB-T format.
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/ABS1-75.0E dvb-apps/util/scan/dvb-s/ABS1-75.0E
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/ABS1-75.0E  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/ABS1-75.0E        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# ABS-1 @ 75E
++# freq pol sr fec
++S 12518000 V 22000000 AUTO
++S 12548000 V 22000000 AUTO
++S 12579000 V 22000000 AUTO
++S 12640000 V 22000000 AUTO
++S 12670000 V 22000000 AUTO
++S 12693000 V 10000000 AUTO
++S 12704000 V 3900000 AUTO
++S 12740000 V 7408000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Amazonas-61.0W dvb-apps/util/scan/dvb-s/Amazonas-61.0W
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Amazonas-61.0W      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Amazonas-61.0W    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,54 @@
++# Amazonas @ 61.0W
++# freq pol sr fec
++
++S 3957000 H 06666000 AUTO
++S 3966000 H 06666000 AUTO
++S 3975000 H 06666000 AUTO
++S 3993000 H 06666000 AUTO
++S 4137000 H 03409000 AUTO
++S 3941000 V 03480000 AUTO
++S 12092000 V 30000000 AUTO
++S 12132000 V 30000000 AUTO
++S 4174000 H 03330000 AUTO
++S 11128000 V 06666000 AUTO
++S 11185000 V 11800000 AUTO
++S 11049000 V 02000000 AUTO
++S 12052000 V 27000000 AUTO
++S 10975000 V 27000000 AUTO
++S 3631000 H 02785000 AUTO
++S 10975000 H 26666000 AUTO
++S 3677000 H 04400000 AUTO
++S 3985000 H 04444000 AUTO
++S 11810000 V 06666000 AUTO
++S 11921000 V 21740000 AUTO
++S 11943000 V 04750000 AUTO
++S 4168000 H 07307000 AUTO
++S 12052000 H 26667000 AUTO
++S 12172000 H 27500000 AUTO
++S 12092000 H 27500000 AUTO
++S 11175000 H 28880000 AUTO
++S 4154000 H 09615000 AUTO
++S 11099000 V 07576000 AUTO
++S 11885000 H 04890000 AUTO
++S 11882000 V 11343000 AUTO
++S 11133000 V 03111000 AUTO
++S 11078000 V 01862000 AUTO
++S 11912000 H 02222000 AUTO
++S 11906000 H 02220000 AUTO
++S 11108000 V 02170000 AUTO
++S 12132000 H 27500000 AUTO
++S 11135000 H 26667000 AUTO
++S 4144000 V 04540000 AUTO
++S 11808000 H 11111000 AUTO
++S 11972000 H 26667000 AUTO
++S 4156000 V 04540000 AUTO
++S 4149000 V 04540000 AUTO
++S 3948000 H 13300000 AUTO
++S 4178000 H 03333000 AUTO
++S 11844000 V 16600000 AUTO
++S 11095000 H 30000000 AUTO
++S 11790000 H 03600000 AUTO
++S 12172000 V 30000000 AUTO
++S 11015000 H 26666000 AUTO
++S 11055000 H 27500000 AUTO
++S 12012000 H 27500000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/AMC1-103w dvb-apps/util/scan/dvb-s/AMC1-103w
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/AMC1-103w   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/AMC1-103w 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# AMC 1 @ 103W
++# freq pol sr fec
++
++S 11942000 V 20000000 AUTO
++S 12100000 V 20000000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/AMC2-85w dvb-apps/util/scan/dvb-s/AMC2-85w
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/AMC2-85w    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/AMC2-85w  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# AMC 2 @ 85W
++# freq pol sr fec
++
++S 11731000 H 13021000 AUTO
++S 11744000 H 13021000 AUTO
++S 11771000 H 13021000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/AMC3-87w dvb-apps/util/scan/dvb-s/AMC3-87w
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/AMC3-87w    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/AMC3-87w  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# AMC 3 @ 87.0W
++# freq pol sr fec
++
++S 11716000 H 04859000 AUTO
++S 12142000 V 30000000 AUTO
++S 12147000 H 04340000 AUTO
++S 12159000 H 04444000 AUTO
++S 12165000 H 04444000 AUTO
++S 12172000 H 04444000 AUTO
++S 12182000 V 30000000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/AMC4-101w dvb-apps/util/scan/dvb-s/AMC4-101w
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/AMC4-101w   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/AMC4-101w 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# AMC 4 @ 101.0W
++# freq pol sr fec
++
++S 11573000 V 07234000 AUTO
++S 11655000 V 30000000 AUTO
++S 11708000 V 02170000 AUTO
++S 11822000 H 05700000 AUTO
++S 11860000 H 28138000 AUTO
++S 12120000 V 30000000 AUTO
++S 12169000 H 03003000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/AMC5-79w dvb-apps/util/scan/dvb-s/AMC5-79w
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/AMC5-79w    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/AMC5-79w  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# AMC 5 @ 79W
++# freq pol sr fec
++
++S 11742000 V 11110000 AUTO
++S 12182000 H 23000000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/AMC6-72w dvb-apps/util/scan/dvb-s/AMC6-72w
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/AMC6-72w    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/AMC6-72w  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,44 @@
++# AMC 6 @ 72W
++# freq pol sr fec
++
++S 11482000 V 02656000 AUTO
++S 11494000 V 06560000 AUTO
++S 11499000 V 02964000 AUTO
++S 11505000 V 02963000 AUTO
++S 11546000 V 12000000 AUTO
++S 11548000 H 03002000 AUTO
++S 11552000 H 03002000 AUTO
++S 11557000 H 04392000 AUTO
++S 11563000 H 04392000 AUTO
++S 11570000 H 04392000 AUTO
++S 11576000 H 04392000 AUTO
++S 11586000 H 02652000 AUTO
++S 11603000 V 08500000 AUTO
++S 11605000 V 03600000 AUTO
++S 11611000 V 03400000 AUTO
++S 11628000 V 06560000 AUTO
++S 11637000 V 02800000 AUTO
++S 11641000 V 03702000 AUTO
++S 11648000 V 07500000 AUTO
++S 11667000 V 07400000 AUTO
++S 11674000 V 04000000 AUTO
++S 11680000 V 03255000 AUTO
++S 11703000 V 03979000 AUTO
++S 11709000 V 03979000 AUTO
++S 11715000 V 03979000 AUTO
++S 11746000 V 03979000 AUTO
++S 11748000 H 14015000 AUTO
++S 11752000 V 03979000 AUTO
++S 11763000 V 03979000 AUTO
++S 11817000 H 05000000 AUTO
++S 11874000 V 04000000 AUTO
++S 11986000 V 03979000 AUTO
++S 11995000 V 03979000 AUTO
++S 12004000 V 03979000 AUTO
++S 12013000 V 03979000 AUTO
++S 12025000 V 03979000 AUTO
++S 12031000 V 03979000 AUTO
++S 12046000 H 06111000 AUTO
++S 12055000 V 06890000 AUTO
++S 12144000 V 02573000 AUTO
++S 12188000 H 06511000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/AMC9-83w dvb-apps/util/scan/dvb-s/AMC9-83w
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/AMC9-83w    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/AMC9-83w  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,18 @@
++# AMC 9 @ 83W
++# freq pol sr fec
++
++S 11745000 H 04232000 AUTO
++S 11751000 H 04232000 AUTO
++S 11757000 H 04232000 AUTO
++S 11763000 H 04232000 AUTO
++S 11769000 H 04232000 AUTO
++S 11775000 H 04232000 AUTO
++S 11826000 H 05632000 AUTO
++S 11864000 H 03979000 AUTO
++S 11871000 H 13000000 AUTO
++S 11889000 H 13025000 AUTO
++S 11926000 V 06511000 AUTO
++S 11953000 V 03979000 AUTO
++S 11960000 H 05000000 AUTO
++S 12002000 H 03979000 AUTO
++S 12011000 H 03979000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Amos-4w dvb-apps/util/scan/dvb-s/Amos-4w
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Amos-4w     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Amos-4w   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,48 @@
++# Amos 6 @ 4W
++# freq pol sr fec
++S 10722000 H 27500000 3/4
++S 10722000 V 27500000 3/4
++S 10722000 V 30000000 2/3
++S 10758000 V 27500000 3/4
++S 10758000 V 30000000 2/3
++S 10759000 H 30000000 3/4
++S 10806000 H 27500000 5/6
++S 10806000 V 27500000 3/4
++S 10842000 H 27500000 7/8
++S 10842000 V 27500000 3/4
++S 10842000 V 30000000 2/3
++S 10890000 H 27500000 7/8
++S 10890000 V 27500000 3/4
++S 10925000 H 27500000 7/8
++S 10925000 V 27500000 3/4
++S 10972000 V 27500000 3/4
++S 11008000 V 27500000 3/4
++S 11015000 H 2295000 3/4
++S 11123000 H 1850000 7/8
++S 11167000 H 12500000 5/6
++S 11179000 H 6666000 3/4
++S 11260000 H 27500000 3/4
++S 11304000 H 19540000 3/4
++S 11319000 H 2750000 3/4
++S 11329000 H 3333000 3/4
++S 11333000 H 3500000 3/4
++S 11347000 H 3350000 3/4
++S 11384000 H 19000000 5/6
++S 11411000 H 7925000 5/6
++S 11429000 H 5925000 3/4
++S 11435000 H 2089000 3/4
++S 11474000 V 27500000 3/4
++S 11510000 V 30000000 2/3
++S 11558000 V 27500000 3/4
++S 11559000 H 13400000 7/8
++S 11572000 H 8888000 3/4
++S 11592000 H 21350000 3/4
++S 11593000 V 27500000 3/4
++S 11625000 V 3000000 3/4
++S 11630000 H 2963000 3/4
++S 11630000 V 3000000 3/4
++S 11637000 V 1480000 3/4
++S 11647000 H 9167000 3/4
++S 11647000 V 8518000 3/4
++S 11654000 H 2000000 5/6
++S 11658000 V 8520000 5/6
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Anik-F1-107.3W dvb-apps/util/scan/dvb-s/Anik-F1-107.3W
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Anik-F1-107.3W      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Anik-F1-107.3W    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Anik F1 @ 107.3W
++# freq pol sr fec
++
++S 12002000 H 19980000 AUTO
++S 12063000 H 19980000 AUTO
++S 12155000 H 22500000 AUTO
++S 12185000 H 19980000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/AsiaSat3S_C-105.5E dvb-apps/util/scan/dvb-s/AsiaSat3S_C-105.5E
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/AsiaSat3S_C-105.5E  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/AsiaSat3S_C-105.5E        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,122 @@
++# AsiaSat 3S 105.5E C-BAND
++# Generated by Xingbo Wang
++# Apr 2, 2005
++
++# MPEG-2 QPSK
++# freq pol sr fec
++
++# [encrypted] ZEE English, ZEE TV International, ZEE Movies, MX, ZEE TV SE Asia, ZEE TV Asia, Trendz
++S 3700000 V 27500000 3/4
++
++# BTV World
++S 3725000 V 4450000 3/4
++
++# SAB TV
++S 3743000 V 3300000 3/4
++
++# AAJ TV
++S 3750000 V 2820000 3/4
++
++# Arirang TV
++S 3755150 V 4417900 7/8
++
++# [encrypted] STAR Plus India, STAR Movies India, STAR News India, National Geographic India, STAR Gold, STAR Movies (Middle East)
++# STAR Utsav
++S 3780000 V 28100000 3/4
++
++# Chinese Provincial TV: Guangxi, Shanxi, Anhui, Jiangsu, Heilongjiang
++S 3806000 V 4420000 3/4
++S 3813000 V 4420000 3/4
++S 3820000 V 4420000 3/4
++S 3827000 V 4420000 3/4
++S 3834000 V 4420000 3/4
++
++# [encrypted] ESPN Taiwan, STAR Sports Taiwan, ESPN Asia, STAR Sports South East Asia, STAR Sports India, ESPN India, ESPN Philippines
++S 3860000 V 27500000 3/4
++
++# Dragon TV
++S 3886000 V 4800000 3/4
++
++# Shandong TV
++S 3895000 V 6813000 3/4
++
++# CCTV-1(comprehensive), China National Radio Channel 1
++S 3904000 V 4420000 7/8
++
++# Jilin Provincial TV
++S 3914500 V 4420000 3/4
++
++# [encrypted] A1, History, STAR Movies SEA/China, STAR World India, STAR Plus Pakistan, Channel[V] India, STAR Chinese Movies, CNBC India, STAR One, STAR Vijay
++S 3980000 V 28100000 3/4
++
++# Sahara One, Sahara Samay National, Sahara Samay Mumbai, Sahara Samay Uttar Pradesh, Sahara Samay Bihar, Sahara Samay Madhya Pradesh
++S 4020000 V 27250000 3/4
++
++# Tianjin TV
++S 4046000 V 5950000 3/4
++
++# PTV-1, PTV World, PTV Channel 3, AVT Khyber
++S 4091000 V 13333000 3/4
++
++# PTV National
++S 4106000 V 3333300 3/4
++
++# Indus News
++S 4115750 V 3333000 3/4
++
++# [encrypted] ZEE Biz, ZEE News, ZEE Cinema, ZEE Music, Alpha TV Punjabi, Alpha TV Gujarati, Alpha TV Bangla, Alpha TV Marathi, Smile TV
++S 4140000 V 27500000 3/4
++
++# Chinese Provincial TV: Henan, Fujian, Jiangxi, Liaoning
++S 4166000 V 4420000 3/4
++S 4180000 V 4420000 3/4
++S 4187000 V 4420000 3/4
++S 4194000 V 4420000 3/4
++
++# CETV
++S 3680000 H 26670000 3/4
++
++# Channel NewsAsia
++S 3706000 H 6000000 3/4
++
++# Asia Plus
++S 3715500 H 7000000 3/4
++
++# TVB 8, CETV
++S 3729000 H 13650000 3/4
++
++# Network of the World, Bloomberg TV Asia, Indus Vision, Indus Music, Muslim TV Ahmadiyya, Living Asia Channel
++# [encrypted] Filmazia
++S 3760000 H 26000000 7/8
++
++# [encrypted] Fox News, Sky News, STAR Movies Int'l Taiwan, National Geographic Taiwan, STAR Chinese Channel, STAR Movies mandarin, Channel[V] Taiwan
++S 3840000 H 26850000 7/8
++
++# STAR Sports Asia
++# [encrypted] ESPN China, STAR Sports Hong Kong, ESPN Hong Kong
++S 3920000 H 26750000 7/8
++
++# [encrypted] CNN International Asia, CNN Newsource, Cartoon Network Asia, Cartoon Network Taiwan, Cartoon Network Philippines, Cartoon Network Australia/New Zealand, TCM Australia, Boomerang
++S 3960000 H 27500000 3/4
++
++# [encrypted] Phoenix Movies, star World Asia, Star Movies Int'l, Channel[V] International, National Geographic Regional
++# Phoenix Chinese Channel, Phoenix Info News Channel, Xiong Kong Int'l, Xing Kong Regional, Channel[V](Greater China)
++S 4000000 H 26850000 7/8
++
++# Chinese Provincial TV: Hubei, Sichuan
++S 4034600 H 4420000 3/4
++S 4051000 H 4420000 3/4
++
++# Chinese Provincial TV: Qinghai, Hunan
++S 4067000 H 4420000 3/4
++S 4082000 H 4420000 3/4
++
++# Sun TV
++S 4094000 H 5555000 3/4
++
++# MATV, Horizon Channel
++# [encrypted] Tian Ying Movies Channel, TVB Xing He Channel
++S 4111000 H 13650000 3/4
++
++# CCTV Channel 4 (International), Channel 9 (English language), CCTV E&F
++S 4129000 H 13240000 3/4
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Astra-28.2E dvb-apps/util/scan/dvb-s/Astra-28.2E
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Astra-28.2E 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Astra-28.2E       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,186 @@
++# Astra 28.2E SDT info service transponder
++# freq pol sr fec
++
++## Astra 2A
++# Transponder 1
++S 11720000 H 29500000 3/4
++# Transponder 2
++S 11740000 V 27500000 2/3
++# Transponder 3
++S 11758000 H 27500000 2/3
++# Transponder 4
++S 11778000 V 27500000 2/3
++# Transponder 5
++S 11798000 H 29500000 3/4
++# Transponder 6
++S 11817000 V 27500000 2/3
++# Transponder 7
++S 11836000 H 27500000 2/3
++# Transponder 8
++S 11856000 V 27500000 2/3
++# Transponder 9
++S 11876000 H 27500000 2/3
++# Transponder 10
++S 11895000 V 27500000 2/3
++# Transponder 11
++S 11914000 H 27500000 2/3
++# Transponder 12
++S 11934000 V 27500000 2/3
++# Transponder 13
++S 11954000 H 27500000 2/3
++# Transponder 18
++S 12051000 V 27500000 2/3
++# Transponder 22
++S 12129000 V 27500000 2/3
++# Transponder 23
++S 12148000 H 27500000 2/3
++# Transponder 24
++S 12168000 V 27500000 2/3
++# Transponder 27
++S 12226000 H 27500000 2/3
++# Transponder 28
++S 12246000 V 27500000 2/3
++# Transponder 37
++S 12422000 H 27500000 2/3
++# Transponder 40
++S 12480000 V 27500000 2/3
++
++## Astra 2B
++# Transponder 14
++S 11973000 V 27500000 2/3
++# Transponder 15
++S 11992000 H 27500000 2/3
++# Transponder 16
++S 12012000 V 27500000 2/3
++# Transponder 17
++S 12032000 H 27500000 2/3
++# Transponder 19
++S 12070000 H 27500000 2/3
++# Transponder 20
++S 12090000 V 27500000 2/3
++# Transponder 21
++S 12110000 H 27500000 2/3
++# Transponder 25
++S 12188000 H 27500000 2/3
++# Transponder 26
++S 12207000 V 27500000 2/3
++# Transponder 29
++S 12266000 H 27500000 2/3
++# Transponder 30
++S 12285000 V 27500000 2/3
++# Transponder 31
++S 12304000 H 27500000 2/3
++# Transponder 32
++S 12324000 V 29500000 3/4
++# Transponder 33
++S 12344000 H 29500000 3/4
++# Transponder 34
++S 12363000 V 29500000 3/4
++# Transponder 35
++S 12382000 H 27500000 2/3
++# Transponder 36
++S 12402000 V 27500000 2/3
++# Transponder 38
++S 12441000 V 27500000 2/3
++# Transponder 39
++S 12460000 H 27500000 2/3
++
++## Astra 2D
++# Transponder 41
++S 10714000 H 22000000 5/6
++# Transponder 42
++S 10729000 V 22000000 5/6
++# Transponder 43
++S 10744000 H 22000000 5/6
++# Transponder 44
++S 10758000 V 22000000 5/6
++# Transponder 45
++S 10773000 H 22000000 5/6
++# Transponder 46
++S 10788000 V 22000000 5/6
++# Transponder 47
++S 10803000 H 22000000 5/6
++# Transponder 48
++S 10818000 V 22000000 5/6
++# Transponder 49
++S 10832000 H 22000000 5/6
++# Transponder 50
++S 10847000 V 22000000 5/6
++# Transponder 51
++S 10862000 H 22000000 5/6
++# Transponder 52
++S 10876000 V 22000000 5/6
++# Transponder 53
++S 10891000 H 22000000 5/6
++# Transponder 54
++S 10906000 V 22000000 5/6
++# Transponder 55
++S 10921000 H 22000000 5/6
++# Transponder 56
++S 10936000 V 22000000 5/6
++
++## Eurobird 1
++# Transponder C1
++S 11222170 H 27500000 2/3
++# Transponder C2
++S 11223670 V 27500000 2/3
++# Transponder C2
++S 11259000 V 27500000 2/3
++# Transponder C1
++S 11261000 H 27500000 2/3
++# Transponder C3
++S 11307000 H 27500000 2/3
++# Transponder C4
++S 11307000 V 27500000 2/3
++# Transponder C4
++S 11343000 V 27500000 2/3
++# Transponder C3
++S 11344000 H 27500000 2/3
++# Transponder C5
++S 11390000 H 27500000 2/3
++# Transponder C6
++S 11390000 V 27500000 2/3
++# Transponder C5
++S 11426000 H 27500000 2/3
++# Transponder C6
++S 11426000 V 27500000 2/3
++# Transponder D1
++S 11469000 H 27500000 2/3
++# Transponder D2S
++S 11488000 V 27500000 2/3
++# Transponder D3S
++S 11508000 H 27500000 2/3
++# Transponder D4S
++S 11527000 V 27500000 2/3
++# Transponder D5
++S 11546000 H 27500000 2/3
++# Transponder D6
++S 11565000 V 27500000 2/3
++# Transponder D7
++S 11585000 H 27500000 2/3
++# Transponder D8
++S 11603850 V 27500000 2/3
++# Transponder D9
++S 11623000 H 27500000 2/3
++# Transponder D10
++S 11642000 V 27500000 2/3
++# Transponder D11
++S 11661540 H 27500000 2/3
++# Transponder D12
++S 11680770 V 27500000 2/3
++# Transponder F1
++S 12524000 H 27500000 2/3
++# Transponder F2
++S 12524000 V 27500000 2/3
++# Transponder F1
++S 12560000 H 27500000 2/3
++# Transponder F2
++S 12560000 V 27500000 2/3
++# Transponder F4
++S 12596000 V 27500000 2/3
++# Transponder F3
++S 12607000 H 27500000 3/4
++# Transponder F4
++S 12629000 V 6111000 3/4
++# Transponder F5
++S 12692000 V 19532000 1/2
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Atlantic-Bird-1-12.5W dvb-apps/util/scan/dvb-s/Atlantic-Bird-1-12.5W
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Atlantic-Bird-1-12.5W       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Atlantic-Bird-1-12.5W     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,30 @@
++# Atlantic Bird 1 @ 12.5W
++# freq pol sr fec
++S 11099000 H 2000000 5/6
++S 11132000 H 3255000 3/4
++S 11136000 V 3700000 5/6
++S 11174000 H 15190000 3/4
++S 11179000 V 22400000 2/3
++S 11188000 H 5722000 5/6
++S 11332000 H 6428000 2/3
++S 11337000 H 1923000 7/8
++S 11340000 H 2279000 5/6
++S 11355000 H 11781000 7/8
++S 11408000 V 27500000 3/4
++S 11428000 H 30000000 5/6
++S 11595000 V 27500000 5/6
++S 11622000 H 3255000 AUTO
++S 11643000 H 2398000 AUTO
++S 11645000 V 4790000 AUTO
++S 11651000 V 3688000 AUTO
++S 12515000 H 17455000 3/4
++S 12535000 V 2000000 3/4
++S 12545000 H 17455000 3/4
++S 12594000 H 2170000 3/4
++S 12597000 H 1730000 3/4
++S 12604000 H 1481000 3/4
++S 12655000 H 4285000 3/4
++S 12659000 H 2141000 3/4
++S 12662000 V 3928000 3/4
++S 12720000 V 1808000 3/4
++S 12743000 V 3214000 3/4
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/BrasilSat-B1-75.0W dvb-apps/util/scan/dvb-s/BrasilSat-B1-75.0W
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/BrasilSat-B1-75.0W  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/BrasilSat-B1-75.0W        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,11 @@
++# Brasilsat B1 @ 75.0W
++# freq pol sr fec
++
++S 3648000 V 04285000 AUTO
++S 3657000 V 06620000 AUTO
++S 3653000 V 04710000 AUTO
++S 3655000 H 06620000 AUTO
++S 3629000 H 06620000 AUTO
++S 3711000 H 03200000 AUTO
++S 3644000 V 04440000 AUTO
++S 3638000 H 04440000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/BrasilSat-B2-65.0W dvb-apps/util/scan/dvb-s/BrasilSat-B2-65.0W
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/BrasilSat-B2-65.0W  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/BrasilSat-B2-65.0W        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,34 @@
++# Brasilsat B2 @ 65.0W
++# freq pol sr fec
++
++S 3745000 H 03540000 AUTO
++S 4008000 H 03333000 AUTO
++S 4011000 V 05000000 AUTO
++S 3792000 V 03393000 AUTO
++S 4104000 V 03214000 AUTO
++S 4097000 V 06667000 AUTO
++S 3905000 H 06666000 AUTO
++S 3935000 H 06666000 AUTO
++S 3890000 H 06666000 AUTO
++S 3925000 H 06666000 AUTO
++S 4112000 V 04285000 AUTO
++S 3650000 V 04440000 AUTO
++S 3736000 H 01808000 AUTO
++S 3787000 H 06666000 AUTO
++S 3876000 V 02740000 AUTO
++S 4117000 V 02963000 AUTO
++S 3815000 H 06666000 AUTO
++S 3793000 H 06666000 AUTO
++S 3721000 H 02963000 AUTO
++S 3684000 H 06666000 AUTO
++S 3915000 H 06666000 AUTO
++S 3766000 H 03336000 AUTO
++S 3847000 H 04444000 AUTO
++S 3706000 H 02462000 AUTO
++S 3667000 H 07236000 AUTO
++S 3771000 V 01480000 AUTO
++S 3734000 V 02852000 AUTO
++S 3810000 H 13333000 AUTO
++S 3762000 H 02222000 AUTO
++S 3834000 H 03572000 AUTO
++S 3850000 H 01570000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/BrasilSat-B3-84.0W dvb-apps/util/scan/dvb-s/BrasilSat-B3-84.0W
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/BrasilSat-B3-84.0W  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/BrasilSat-B3-84.0W        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,85 @@
++# Brasilsat B3 @ 84.0W
++# freq pol sr fec
++
++S 3728000 H 04340000 AUTO
++S 3698000 V 03333000 AUTO
++S 4054000 V 01287000 AUTO
++S 3745000 H 04300000 AUTO
++S 3738000 V 04708000 AUTO
++S 3923000 V 01808000 AUTO
++S 3768000 V 08000000 AUTO
++S 3955000 V 04340000 AUTO
++S 4167000 H 03255000 AUTO
++S 3791000 V 03330000 AUTO
++S 3866000 H 04425000 AUTO
++S 3932000 V 03255000 AUTO
++S 4132000 V 02532000 AUTO
++S 3906000 H 03928000 AUTO
++S 3858000 V 04288000 AUTO
++S 3665000 V 03177000 AUTO
++S 3732000 V 03214000 AUTO
++S 3774000 H 03330000 AUTO
++S 3927000 V 03255000 AUTO
++S 3710000 H 03261000 AUTO
++S 3883000 H 04278000 AUTO
++S 3770000 H 03333000 AUTO
++S 3754000 V 05000000 AUTO
++S 3764000 H 04285000 AUTO
++S 3910000 H 03616000 AUTO
++S 3705000 H 04280000 AUTO
++S 3852000 V 03806000 AUTO
++S 3845000 H 10127000 AUTO
++S 3936000 V 03255000 AUTO
++S 3653000 V 03807000 AUTO
++S 3751000 H 03565000 AUTO
++S 3871000 H 04435000 AUTO
++S 3895000 H 04430000 AUTO
++S 3936000 H 03255000 AUTO
++S 3800000 H 03255000 AUTO
++S 3855000 H 04000000 AUTO
++S 4171000 H 02170000 AUTO
++S 3716000 H 04800000 AUTO
++S 4068000 H 02600000 AUTO
++S 4070000 V 02964000 AUTO
++S 3949000 V 04340000 AUTO
++S 3684000 V 03200000 AUTO
++S 4169000 V 08140000 AUTO
++S 4144000 H 02734000 AUTO
++S 3736000 H 04285000 AUTO
++S 3790000 H 10444000 AUTO
++S 3724000 V 02075000 AUTO
++S 4121000 H 02500000 AUTO
++S 3629000 H 06666000 AUTO
++S 3970000 V 04445000 AUTO
++S 3985000 V 03300000 AUTO
++S 3916000 H 03255000 AUTO
++S 4155000 V 03255000 AUTO
++S 3692000 V 03330000 AUTO
++S 3644000 V 04687000 AUTO
++S 4087000 H 17200000 AUTO
++S 3889000 H 04440000 AUTO
++S 4176000 V 03515000 AUTO
++S 3829000 V 04340000 AUTO
++S 3805000 V 02662000 AUTO
++S 3943000 V 02460000 AUTO
++S 3757000 H 03565000 AUTO
++S 3696000 H 01808000 AUTO
++S 3989000 V 02666000 AUTO
++S 3690000 V 03200000 AUTO
++S 3657000 V 03600000 AUTO
++S 3996000 V 02300000 AUTO
++S 3926000 H 04000000 AUTO
++S 4126000 H 04000000 AUTO
++S 4136000 H 02142000 AUTO
++S 3675000 V 04285000 AUTO
++S 3931000 H 04000000 AUTO
++S 3786000 V 04286000 AUTO
++S 3688000 V 02308000 AUTO
++S 4075000 V 04444000 AUTO
++S 3911000 V 03255000 AUTO
++S 3824000 H 03002000 AUTO
++S 3778000 V 06850000 AUTO
++S 3710000 V 12960000 AUTO
++S 3877000 H 04450000 AUTO
++S 3940000 V 03255000 AUTO
++S 4064000 H 03300000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/BrasilSat-B4-70.0W dvb-apps/util/scan/dvb-s/BrasilSat-B4-70.0W
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/BrasilSat-B4-70.0W  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/BrasilSat-B4-70.0W        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,39 @@
++# Brasilsat B4 @ 70.0W
++# freq pol sr fec
++
++S 3951000 H 03214000 AUTO
++S 3714000 V 04400000 AUTO
++S 3672000 H 04713000 AUTO
++S 3955000 H 04400000 AUTO
++S 3965000 V 02930000 AUTO
++S 3628000 H 03000000 AUTO
++S 3644000 V 03214000 AUTO
++S 3650000 H 04285000 AUTO
++S 3688000 H 06000000 AUTO
++S 3680000 H 06000000 AUTO
++S 3662000 V 04606000 AUTO
++S 3945000 H 03214000 AUTO
++S 3640000 H 03263000 AUTO
++S 3979000 V 03617000 AUTO
++S 3752000 V 06220000 AUTO
++S 3685000 V 04500000 AUTO
++S 3650000 V 04400000 AUTO
++S 3985000 H 02170000 AUTO
++S 4010000 H 13021000 AUTO
++S 3665000 H 04700000 AUTO
++S 3637000 H 02228000 AUTO
++S 3708000 V 03928000 AUTO
++S 4047000 V 07143000 AUTO
++S 3672000 V 08454000 AUTO
++S 3820000 V 27500000 AUTO
++S 3940000 V 27500000 AUTO
++S 3964000 H 01875000 AUTO
++S 3695000 H 03598000 AUTO
++S 3900000 V 27500000 AUTO
++S 3645000 H 03520000 AUTO
++S 3983000 V 01630000 AUTO
++S 3631000 H 04687000 AUTO
++S 3874000 V 05926000 AUTO
++S 3700000 V 09123000 AUTO
++S 3997000 V 02300000 AUTO
++S 3973000 V 04338000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Estrela-do-Sul-63.0W dvb-apps/util/scan/dvb-s/Estrela-do-Sul-63.0W
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Estrela-do-Sul-63.0W        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Estrela-do-Sul-63.0W      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,27 @@
++# Estrela do Sul @ 63.0W
++# freq pol sr fec
++
++S 11892000 V 02964000 AUTO
++S 11987000 H 03330000 AUTO
++S 12054000 H 26660000 AUTO
++S 11830000 V 06000000 AUTO
++S 11603000 V 03124000 AUTO
++S 11598000 V 03124000 AUTO
++S 11803000 V 04444000 AUTO
++S 11958000 H 04444000 AUTO
++S 11610000 V 03124000 AUTO
++S 11861000 V 02964000 AUTO
++S 11879000 V 02964000 AUTO
++S 11903000 V 02362000 AUTO
++S 11817000 V 06666000 AUTO
++S 11577000 V 03124000 AUTO
++S 11582000 V 03124000 AUTO
++S 11982000 H 08888000 AUTO
++S 11888000 V 02392000 AUTO
++S 11898000 V 02480000 AUTO
++S 11871000 V 02000000 AUTO
++S 11795000 V 04444000 AUTO
++S 11845000 V 04444000 AUTO
++S 11640000 V 18100000 AUTO
++S 11875000 V 03333000 AUTO
++S 11543000 V 10410000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Eurobird1-28.5E dvb-apps/util/scan/dvb-s/Eurobird1-28.5E
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Eurobird1-28.5E     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Eurobird1-28.5E   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# Eurobird 28.5E SDT info service transponder
++# freq pol sr fec
++S 11623000 H 27500000 2/3
++S 11224000 V 27500000 2/3
++S 11527000 V 27500000 2/3
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Eurobird9-9.0E dvb-apps/util/scan/dvb-s/Eurobird9-9.0E
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Eurobird9-9.0E      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Eurobird9-9.0E    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,16 @@
++# Eurobird 9.0E
++# freq pol sr fec
++S 11727000 V 27500000 5/6
++S 11747000 H 27500000 3/4
++S 11766000 V 27500000 5/6
++S 11785000 H 27500000 3/4
++S 11804000 V 27500000 3/4
++S 11823000 H 27500000 3/4
++S 11843000 V 27500000 3/4
++S 11881000 V 26700000 3/4
++S 11919000 V 27500000 5/6
++S 11938000 H 27500000 3/4
++S 11977000 H 27500000 3/4
++S 11996000 V 27500000 3/4
++S 12054000 H 27500000 3/4
++S 12092000 H 27500000 3/4
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/EutelsatW2-16E dvb-apps/util/scan/dvb-s/EutelsatW2-16E
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/EutelsatW2-16E      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/EutelsatW2-16E    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,59 @@
++# Eutelsat W2 @ 16E
++# freq pol sr fec
++
++S 10957000 H 2821000 AUTO
++S 10968000 H 6400000 AUTO
++S 10972000 V 27500000 AUTO
++S 10976000 H 6400000 AUTO
++S 10989000 H 6400000 AUTO
++S 10997000 H 6400000 AUTO
++S 11005000 H 6400000 AUTO
++S 11011000 V 27500000 AUTO
++S 11015000 H 6400000 AUTO
++S 11025000 H 2894000 AUTO
++S 11046000 H 10555000 AUTO
++S 11057000 H 3327000 AUTO
++S 11061000 H 5722000 AUTO
++S 11078000 H 5208000 AUTO
++S 11092000 V 32000000 AUTO
++S 11094000 H 2734000 AUTO
++S 11132000 V 14185000 AUTO
++S 11178000 V 27500000 AUTO
++S 11192000 H 2667000 AUTO
++S 11267000 H 2170000 AUTO
++S 11276000 H 11100000 AUTO
++S 11294000 H 13333000 AUTO
++S 11304000 V 30000000 AUTO
++S 11324000 H 27500000 AUTO
++S 11428000 V 30000000 AUTO
++S 11449000 H 27500000 AUTO
++S 11471000 V 29950000 AUTO
++S 11492000 H 29950000 AUTO
++S 11513000 V 29950000 AUTO
++S 11534000 H 30000000 AUTO
++S 11554000 V 30000000 AUTO
++S 11575000 H 30000000 AUTO
++S 11594000 V 28800000 AUTO
++S 11617000 H 29950000 AUTO
++S 11634000 V 17578000 AUTO
++S 11658000 H 30000000 AUTO
++S 11659000 V 17578000 AUTO
++S 11682000 V 14468000 AUTO
++S 12538000 V 4340000 AUTO
++S 12549000 V 2894000 AUTO
++S 12555000 H 5632000 AUTO
++S 12557000 V 2156000 AUTO
++S 12562000 H 5632000 AUTO
++S 12563000 V 2222000 AUTO
++S 12568000 H 3703000 AUTO
++S 12625000 V 4444000 AUTO
++S 12633000 V 4883000 AUTO
++S 12642000 V 3418000 AUTO
++S 12650000 H 15000000 AUTO
++S 12656000 V 4883000 AUTO
++S 12677000 V 6111000 AUTO
++S 12683000 H 2894000 AUTO
++S 12703000 H 2748000 AUTO
++S 12716000 H 6000000 AUTO
++S 12723000 H 3000000 AUTO
++S 12733000 V 16277000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Express-3A-11.0W dvb-apps/util/scan/dvb-s/Express-3A-11.0W
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Express-3A-11.0W    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Express-3A-11.0W  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Express 3A @ 11.0W
++# freq pol sr fec
++
++S 3675000 V 29623000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/ExpressAM1-40.0E dvb-apps/util/scan/dvb-s/ExpressAM1-40.0E
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/ExpressAM1-40.0E    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/ExpressAM1-40.0E  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# Express AM1 @ 40E
++# freq pol sr fec
++S 10967000 V 20000000 AUTO
++S 10995000 V 20000000 AUTO
++S 11097000 H 4000000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/ExpressAM22-53.0E dvb-apps/util/scan/dvb-s/ExpressAM22-53.0E
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/ExpressAM22-53.0E   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/ExpressAM22-53.0E 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,9 @@
++# Express AM 22 @ 53E
++# freq pol sr fec
++S 11044000 V 44950000 3/4
++S 10974000 H 8150000 3/4
++#S 10974000 V 32223000 7/8
++S 11031000 H 3750000 3/4
++S 11096000 V 6400000 3/4
++S 11124000 V 7593000 3/4
++S 11161000 V 5785000 3/4
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/ExpressAM2-80.0E dvb-apps/util/scan/dvb-s/ExpressAM2-80.0E
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/ExpressAM2-80.0E    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/ExpressAM2-80.0E  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,35 @@
++# Express AM2 @ 80E
++# freq pol sr fec
++S 10973000 V 4444000 AUTO
++S 10991000 V 4444000 AUTO
++S 11044000 H 44948000 AUTO
++S 11081000 V 5064000 AUTO
++S 11088000 V 4548000 AUTO
++S 11191000 H 3255000 AUTO
++S 11462000 V 3200000 AUTO
++S 11478000 H 4400000 AUTO
++S 11544000 V 44950000 AUTO
++S 11606000 V 44948000 AUTO
++S 11650000 V 3500000 AUTO
++
++# Express AM2 @ 80E C-BAND
++# Generated by Roman Kashcheev
++# Mar 30, 2008
++# freq pol sr fec
++
++# RSCC
++S 3525000 V 31106000 3/4
++# TRK Sever
++S 3558000 V 3215000 3/4
++# TRV Muji
++S 3562000 V 3225000 3/4
++# OTV Sakhalin
++S 3625000 V 3000000 3/4
++# RSCC
++S 3675000 V 33483000 7/8
++# 5 Kanal
++S 3929000 H 8705000 3/4
++# TV Centr
++S 4147000 V 27500000 3/4
++# Blagovest Telekanal
++S 4175000 V 6510000 3/4
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Galaxy10R-123w dvb-apps/util/scan/dvb-s/Galaxy10R-123w
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Galaxy10R-123w      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Galaxy10R-123w    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# Galaxy 10R @ 123W
++# freq pol sr fec
++
++S 11720000 V 27692000 AUTO
++S 11732000 H 13240000 AUTO
++S 11800000 V 26657000 AUTO
++S 11805000 H 04580000 AUTO
++S 11966000 V 13021000 AUTO
++S 12104000 V 02222000 AUTO
++S 12114000 V 04444000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Galaxy11-91w dvb-apps/util/scan/dvb-s/Galaxy11-91w
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Galaxy11-91w        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Galaxy11-91w      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,49 @@
++# Galaxy 11 @ 91W
++# freq pol sr fec
++
++S 10964000 V 19850000 AUTO
++S 10994000 V 20000000 AUTO
++S 11024000 V 20000000 AUTO
++S 11806000 V 03979000 AUTO
++S 11815000 V 03979000 AUTO
++S 11825000 V 06111000 AUTO
++S 11925000 V 03979000 AUTO
++S 11930000 V 03979000 AUTO
++S 11935000 V 03979000 AUTO
++S 11940000 V 03979000 AUTO
++S 11945000 V 03979000 AUTO
++S 11950000 H 03979000 AUTO
++S 11950000 V 03979000 AUTO
++S 11955000 H 03979000 AUTO
++S 11955000 V 03979000 AUTO
++S 11960000 H 03979000 AUTO
++S 11965000 V 03979000 AUTO
++S 11965000 H 03979000 AUTO
++S 11970000 V 03979000 AUTO
++S 11970000 H 03979000 AUTO
++S 11975000 V 03979000 AUTO
++S 11975000 H 03979000 AUTO
++S 11980000 V 03979000 AUTO
++S 11985000 H 03979000 AUTO
++S 11985000 V 03979000 AUTO
++S 11990000 H 03979000 AUTO
++S 11990000 V 03979000 AUTO
++S 11995000 H 03979000 AUTO
++S 11995000 V 03979000 AUTO
++S 12000000 H 03979000 AUTO
++S 12005000 V 03979000 AUTO
++S 12010000 H 03979000 AUTO
++S 12010000 V 03979000 AUTO
++S 12015000 H 03979000 AUTO
++S 12015000 V 03979000 AUTO
++S 12020000 V 03979000 AUTO
++S 12025000 V 03979000 AUTO
++S 12030000 V 03979000 AUTO
++S 12035000 V 03979000 AUTO
++S 12066000 H 05632000 AUTO
++S 12075000 H 03979000 AUTO
++S 12083000 H 05632000 AUTO
++S 12086000 V 06144000 AUTO
++S 12096000 V 06144000 AUTO
++S 12104000 V 06144000 AUTO
++S 12114000 V 06144000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Galaxy25-97w dvb-apps/util/scan/dvb-s/Galaxy25-97w
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Galaxy25-97w        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Galaxy25-97w      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,19 @@
++# Galaxy 25 @ 97W
++# freq pol sr fec
++
++S 11789000 V 28125000 AUTO
++S 11836000 V 20770000 AUTO
++S 11867000 V 22000000 AUTO
++S 11874000 H 22000000 AUTO
++S 11898000 V 22000000 AUTO
++S 11936000 H 20000000 AUTO
++S 11966000 H 22000000 AUTO
++S 11991000 V 22000000 AUTO
++S 11999000 H 20000000 AUTO
++S 12053000 V 22000000 AUTO
++S 12084000 V 22000000 AUTO
++S 12090000 H 20000000 AUTO
++S 12115000 V 22425000 AUTO
++S 12146000 V 22000000 AUTO
++S 12152000 H 20000000 AUTO
++S 12177000 V 23000000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Galaxy26-93w dvb-apps/util/scan/dvb-s/Galaxy26-93w
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Galaxy26-93w        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Galaxy26-93w      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,58 @@
++# Galaxy 26 @ 93W
++# freq pol sr fec
++
++S 11711000 V 14312000 AUTO
++S 11721000 V 03979000 AUTO
++S 11727000 V 03979000 AUTO
++S 11732000 V 03979000 AUTO
++S 11737000 V 03979000 AUTO
++S 11737000 H 03979000 AUTO
++S 11742000 V 03979000 AUTO
++S 11748000 V 03979000 AUTO
++S 11753000 V 03979000 AUTO
++S 11767000 V 03979000 AUTO
++S 11772000 V 03979000 AUTO
++S 11772000 H 03979000 AUTO
++S 11777000 V 03979000 AUTO
++S 11782000 V 03979000 AUTO
++S 11788000 V 03979000 AUTO
++S 11793000 V 03979000 AUTO
++S 11809000 V 03979000 AUTO
++S 11814000 V 03979000 AUTO
++S 11841000 H 04000000 AUTO
++S 11887000 V 03979000 AUTO
++S 11893000 V 03979000 AUTO
++S 11904000 H 03010000 AUTO
++S 11919000 V 03979000 AUTO
++S 11924000 V 03979000 AUTO
++S 11926000 H 08848000 AUTO
++S 11929000 V 03979000 AUTO
++S 11935000 V 03979000 AUTO
++S 11936000 H 08848000 AUTO
++S 11944000 H 08848000 AUTO
++S 11949000 V 03979000 AUTO
++S 11954000 V 03979000 AUTO
++S 11956000 H 03979000 AUTO
++S 11960000 V 03979000 AUTO
++S 11961000 H 03979000 AUTO
++S 11965000 V 03979000 AUTO
++S 11967000 H 03979000 AUTO
++S 11970000 V 03979000 AUTO
++S 11972000 H 03979000 AUTO
++S 11977000 H 03979000 AUTO
++S 12047000 V 03979000 AUTO
++S 12048000 H 03979000 AUTO
++S 12054000 H 03979000 AUTO
++S 12058000 V 03979000 AUTO
++S 12059000 H 03979000 AUTO
++S 12063000 V 03979000 AUTO
++S 12064000 H 03979000 AUTO
++S 12069000 H 03979000 AUTO
++S 12076000 V 08681000 AUTO
++S 12089000 V 06511000 AUTO
++S 12110000 H 04104000 AUTO
++S 12116000 H 03979000 AUTO
++S 12121000 H 03979000 AUTO
++S 12126000 H 03979000 AUTO
++S 12132000 H 03979000 AUTO
++S 12175000 V 05147000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Galaxy27-129w dvb-apps/util/scan/dvb-s/Galaxy27-129w
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Galaxy27-129w       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Galaxy27-129w     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Galaxy 27 @ 129W
++# freq pol sr fec
++
++S 11964000 H 02920000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Galaxy28-89w dvb-apps/util/scan/dvb-s/Galaxy28-89w
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Galaxy28-89w        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Galaxy28-89w      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,41 @@
++# Galaxy 28 @ 89W
++# freq pol sr fec
++
++S 11717000 H 04411000 AUTO
++S 11747000 H 06620000 AUTO
++S 11756000 H 06620000 AUTO
++S 11780000 H 29000000 AUTO
++S 11800000 H 27500000 AUTO
++S 11825000 H 04552000 AUTO
++S 11865000 H 03700000 AUTO
++S 11882000 H 04883000 AUTO
++S 11925000 H 03979000 AUTO
++S 11930000 H 03979000 AUTO
++S 11935000 H 03979000 AUTO
++S 11936000 H 06000000 AUTO
++S 11940000 H 03979000 AUTO
++S 11945000 H 03979000 AUTO
++S 11950000 H 03979000 AUTO
++S 11955000 V 19532000 AUTO
++S 11960000 H 28800000 AUTO
++S 11965000 H 03979000 AUTO
++S 11970000 H 03979000 AUTO
++S 11975000 V 03979000 AUTO
++S 11980000 H 03979000 AUTO
++S 11985000 H 03979000 AUTO
++S 11989000 V 06111000 AUTO
++S 11990000 H 03979000 AUTO
++S 11995000 H 03979000 AUTO
++S 12000000 H 28800000 AUTO
++S 12009000 V 06111000 AUTO
++S 12032000 H 06666000 AUTO
++S 12092000 H 02314000 AUTO
++S 12114000 H 14398000 AUTO
++S 12134000 H 04000000 AUTO
++S 12164000 H 03979000 AUTO
++S 12170000 H 03979000 AUTO
++S 12175000 H 03979000 AUTO
++S 12180000 H 03979000 AUTO
++S 12185000 H 03979000 AUTO
++S 12191000 H 03979000 AUTO
++S 12196000 H 03979000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Galaxy3C-95w dvb-apps/util/scan/dvb-s/Galaxy3C-95w
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Galaxy3C-95w        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Galaxy3C-95w      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Galaxy 3C @ 95W
++# freq pol sr fec
++
++S 11780000 H 20760000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Hispasat-30.0W dvb-apps/util/scan/dvb-s/Hispasat-30.0W
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Hispasat-30.0W      2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Hispasat-30.0W    2009-06-21 13:29:06.000000000 +0200
+@@ -1,6 +1,43 @@
+ # Hispasat 30.0W
+ # freq pol sr fec
++
+ S 11539000 V 24500000 5/6
++S 11749000 V 03520000 AUTO
++S 11760000 V 03260000 AUTO
++S 11766000 V 04500000 AUTO
++S 11776000 V 02387000 AUTO
++S 11783000 V 01200000 AUTO
++S 11787000 V 02500000 AUTO
++S 11807000 V 06510000 AUTO
++S 11823000 V 02387000 AUTO
++S 11884000 V 27500000 AUTO
++S 11907000 V 02592000 AUTO
++S 11917000 V 05681000 AUTO
+ S 11931000 H 27500000 3/4
++S 11931000 V 02220000 AUTO
++S 11936000 V 05185000 AUTO
++S 11940000 V 01481000 AUTO
++S 11972000 H 27500000 AUTO
++S 11997000 H 04422000 AUTO
++S 12003000 H 05632000 AUTO
++S 12008000 H 06111000 AUTO
++S 12015000 H 03492000 AUTO
+ S 12015000 V 27500000 3/4
++S 12040000 H 05632000 AUTO
++S 12052000 V 27500000 AUTO
++S 12085000 H 05632000 AUTO
++S 12131000 H 27500000 AUTO
++S 12135000 V 04444000 AUTO
++S 12137000 V 03030000 AUTO
++S 12141000 V 03255000 AUTO
++S 12146000 V 04200000 AUTO
++S 12156000 V 02222000 AUTO
++S 12158000 V 02348000 AUTO
++S 12163000 V 03030000 AUTO
++S 12168000 V 05240000 AUTO
++S 12172000 H 27500000 AUTO
++S 12175000 V 04500000 AUTO
++S 12182000 V 03340000 AUTO
++S 12188000 V 02583000 AUTO
++S 12192000 V 02593000 AUTO
+ S 12567000 H 19850000 3/4
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Hotbird-13.0E dvb-apps/util/scan/dvb-s/Hotbird-13.0E
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Hotbird-13.0E       2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Hotbird-13.0E     2009-06-21 13:29:06.000000000 +0200
+@@ -1,3 +1,96 @@
+ # EUTELSAT SkyPlex, Hotbird 13E
+ # freq pol sr fec
+ S 12539000 H 27500000 3/4
++S 10719000 V 27500000 3/4
++S 10723000 H 29900000 3/4
++S 10757000 V 27500000 3/4
++S 10775000 H 28000000 3/4
++S 10795000 V 27500000 3/4
++S 10834000 V 27500000 3/4
++S 10853000 H 27500000 3/4
++S 10872000 V 27500000 3/4
++S 10892000 H 27500000 3/4
++S 10910000 V 27500000 3/4
++S 10930000 H 27500000 3/4
++S 10949000 V 27500000 3/4
++S 10971000 H 27500000 3/4
++S 10992000 V 27500000 2/3
++S 11013000 H 27500000 3/4
++S 11034000 V 27500000 3/4
++S 11054000 H 27500000 5/6
++S 11075000 V 27500000 3/4
++S 11095000 H 28000000 3/4
++S 11117000 V 27500000 3/4
++S 11137000 H 27500000 3/4
++S 11158000 V 27500000 3/4
++S 11178000 H 27500000 3/4
++S 11200000 V 27500000 5/6
++S 11219000 H 27500000 3/4
++S 11242000 V 27500000 3/4
++S 11278000 V 27500000 3/4
++S 11295000 H 27500000 3/4
++S 11334000 H 27500000 2/3
++S 11355000 V 27500000 3/4
++S 11373000 H 27500000 2/3
++S 11393000 V 27500000 3/4
++S 11411000 H 27500000 5/6
++S 11432000 V 27500000 2/3
++S 11470000 V 27500000 5/6
++S 11488000 H 27500000 3/4
++S 11526000 H 27500000 3/4
++S 11541000 V 22000000 5/6
++S 11565000 H 27500000 3/4
++S 11585000 V 27500000 3/4
++S 11604000 H 27500000 5/6
++S 11623000 V 27500000 3/4
++S 11645000 H 27500000 3/4
++S 11662000 V 27500000 3/4
++S 11677000 H 27500000 3/4
++S 11727000 V 27500000 3/4
++S 11747000 H 27500000 3/4
++S 11765000 V 27500000 2/3
++S 11785000 H 27500000 3/4
++S 11804000 V 27500000 2/3
++S 11823000 H 27500000 3/4
++S 11842000 V 27500000 3/4
++S 11861000 H 27500000 3/4
++S 11880000 V 27500000 3/4
++S 11900000 H 27500000 3/4
++S 11919000 V 27500000 2/3
++S 11938000 H 27500000 3/4
++S 11958000 V 27500000 3/4
++S 11976000 H 27500000 3/4
++S 12015000 H 27500000 3/4
++S 12034000 V 27500000 3/4
++S 12054000 H 27500000 3/4
++S 12072000 V 27500000 3/4
++S 12092000 H 27500000 3/4
++S 12111000 V 27500000 3/4
++S 12149000 V 27500000 3/4
++S 12169000 H 27500000 3/4
++S 12188000 V 27500000 3/4
++S 12207000 H 27500000 3/4
++S 12226000 V 27500000 3/4
++S 12245000 H 27500000 3/4
++S 12264000 V 27500000 3/4
++S 12284000 H 27500000 3/4
++S 12302000 V 27500000 3/4
++S 12322000 H 27500000 3/4
++S 12341000 V 27500000 3/4
++S 12360000 H 27500000 3/4
++S 12379000 V 27500000 3/4
++S 12398000 H 27500000 3/4
++S 12418000 V 27500000 3/4
++S 12437000 H 27500000 3/4
++S 12475000 H 27500000 3/4
++S 12519000 V 27500000 3/4
++S 12558000 V 27500000 3/4
++S 12577000 H 27500000 3/4
++S 12596000 V 27500000 3/4
++S 12616000 H 27500000 3/4
++S 12635000 V 27500000 3/4
++S 12654000 H 27500000 3/4
++S 12673000 V 27500000 3/4
++S 12692000 H 27500000 3/4
++S 12713000 V 27500000 3/4
++S 12731000 H 27500000 3/4
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/IA5-97w dvb-apps/util/scan/dvb-s/IA5-97w
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/IA5-97w     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/IA5-97w   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,18 @@
++# Intelsat Americas 5 @ 97W
++# freq pol sr fec
++
++S 11789000 V 25000000 AUTO
++S 11836000 V 20765000 AUTO
++S 11867000 V 22000000 AUTO
++S 11874000 H 22000000 AUTO
++S 11898000 V 22000000 AUTO
++S 11966000 H 22000000 AUTO
++S 11991000 V 22000000 AUTO
++S 12053000 V 22000000 AUTO
++S 12084000 V 22000000 AUTO
++S 12090000 H 20000000 AUTO
++S 12115000 V 22425000 AUTO
++S 12122000 H 22000000 AUTO
++S 12146000 V 22000000 AUTO
++S 12152000 H 20000000 AUTO
++S 12177000 V 23000000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/IA6-93w dvb-apps/util/scan/dvb-s/IA6-93w
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/IA6-93w     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/IA6-93w   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,61 @@
++# Intelsat Americas 6 @ 93W
++# freq pol sr fec
++
++S 11711000 V 14312000 AUTO
++S 11721000 V 03979000 AUTO
++S 11727000 V 03979000 AUTO
++S 11732000 V 03979000 AUTO
++S 11737000 V 03979000 AUTO
++S 11737000 H 03979000 AUTO
++S 11742000 V 03979000 AUTO
++S 11748000 V 03979000 AUTO
++S 11753000 V 03979000 AUTO
++S 11767000 V 03979000 AUTO
++S 11772000 V 03979000 AUTO
++S 11772000 H 03979000 AUTO
++S 11777000 V 03979000 AUTO
++S 11782000 V 03979000 AUTO
++S 11788000 V 03979000 AUTO
++S 11793000 V 03979000 AUTO
++S 11809000 V 03979000 AUTO
++S 11814000 V 03979000 AUTO
++S 11827000 V 08429000 AUTO
++S 11836000 H 07179000 AUTO
++S 11841000 H 04000000 AUTO
++S 11865000 V 03516000 AUTO
++S 11887000 V 03979000 AUTO
++S 11893000 V 03979000 AUTO
++S 11904000 V 05000000 AUTO
++S 11919000 V 03979000 AUTO
++S 11924000 V 03979000 AUTO
++S 11926000 H 08848000 AUTO
++S 11929000 V 03979000 AUTO
++S 11935000 V 03979000 AUTO
++S 11936000 H 08848000 AUTO
++S 11944000 H 08848000 AUTO
++S 11949000 V 03979000 AUTO
++S 11954000 V 03979000 AUTO
++S 11956000 H 03979000 AUTO
++S 11960000 V 03979000 AUTO
++S 11961000 H 03979000 AUTO
++S 11965000 V 03979000 AUTO
++S 11967000 H 03979000 AUTO
++S 11970000 V 03979000 AUTO
++S 11972000 H 03979000 AUTO
++S 11977000 H 03979000 AUTO
++S 12047000 V 03979000 AUTO
++S 12048000 H 03979000 AUTO
++S 12054000 H 03979000 AUTO
++S 12058000 V 03979000 AUTO
++S 12059000 H 03979000 AUTO
++S 12063000 V 03979000 AUTO
++S 12064000 H 03979000 AUTO
++S 12069000 H 03979000 AUTO
++S 12076000 V 08679000 AUTO
++S 12089000 V 06511000 AUTO
++S 12110000 H 04104000 AUTO
++S 12116000 H 03979000 AUTO
++S 12121000 H 03979000 AUTO
++S 12126000 H 03979000 AUTO
++S 12132000 H 03979000 AUTO
++S 12175000 V 05147000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/IA7-129w dvb-apps/util/scan/dvb-s/IA7-129w
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/IA7-129w    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/IA7-129w  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Intelsat Americas 7 @ 129W
++# freq pol sr fec
++
++S 11989000 H 02821000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/IA8-89w dvb-apps/util/scan/dvb-s/IA8-89w
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/IA8-89w     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/IA8-89w   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,34 @@
++# Intelsat Americas 8 @ 89W
++# freq pol sr fec
++
++S 11780000 H 29000000 AUTO
++S 11925000 H 03979000 AUTO
++S 11930000 H 03979000 AUTO
++S 11935000 H 03979000 AUTO
++S 11940000 H 03979000 AUTO
++S 11945000 H 03979000 AUTO
++S 11945000 V 03979000 AUTO
++S 11950000 H 03979000 AUTO
++S 11950000 V 03979000 AUTO
++S 11955000 H 03979000 AUTO
++S 11955000 V 03979000 AUTO
++S 11960000 V 03979000 AUTO
++S 11965000 V 03979000 AUTO
++S 11965000 H 03979000 AUTO
++S 11970000 V 03979000 AUTO
++S 11970000 H 03979000 AUTO
++S 11975000 V 03979000 AUTO
++S 11975000 H 03979000 AUTO
++S 11980000 H 03979000 AUTO
++S 11985000 H 03979000 AUTO
++S 11989000 V 06111000 AUTO
++S 11990000 H 03979000 AUTO
++S 11995000 H 03979000 AUTO
++S 12009000 V 06111000 AUTO
++S 12164000 H 03979000 AUTO
++S 12170000 H 03979000 AUTO
++S 12175000 H 03979000 AUTO
++S 12180000 H 03979000 AUTO
++S 12185000 H 03979000 AUTO
++S 12191000 H 03979000 AUTO
++S 12196000 H 03979000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intel4-72.0E dvb-apps/util/scan/dvb-s/Intel4-72.0E
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intel4-72.0E        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Intel4-72.0E      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Intel4 @ 72E
++# freq pol sr fec
++S 11533000 V 4220000 AUTO
++S 11638000 H 5632000 AUTO
++S 12518000 V 8232000 AUTO
++S 12526000 V 3266000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intel904-60.0E dvb-apps/util/scan/dvb-s/Intel904-60.0E
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intel904-60.0E      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Intel904-60.0E    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,13 @@
++# Intel904 @ 60E
++# freq pol sr fec
++S 11003000 H 2975000 AUTO
++S 11011000 H 2975000 AUTO
++S 11015000 H 2975000 AUTO
++S 11093000 V 3980000 AUTO
++S 11101000 V 4105000 AUTO
++S 11142000 H 2963000 AUTO
++S 11152000 H 2963000 AUTO
++S 11157000 H 2963000 AUTO
++S 11515000 V 7300000 AUTO
++S 11635000 V 29700000 AUTO
++S 11675000 V 29700000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-1002-1.0W dvb-apps/util/scan/dvb-s/Intelsat-1002-1.0W
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-1002-1.0W  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Intelsat-1002-1.0W        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,20 @@
++# Intelsat 1002 @ 1.0W
++# freq pol sr fec
++S 4175000 V 28000000 AUTO
++S 4180000 H 21050000 AUTO
++S 11093000 H 19191000 7/8
++S 11166000 V 1450000 7/8
++S 11182000 V 3100000 7/8
++S 11606000 H 13356000 7/8
++S 12527000 H 27500000 3/4
++S 12563000 H 27500000 3/4
++S 12563000 V 27500000 3/4
++S 12607000 H 27500000 3/4
++S 12607000 V 27500000 3/4
++S 12643000 H 27500000 3/4
++S 12643000 V 27500000 3/4
++S 12687000 H 27500000 3/4
++S 12687000 V 27500000 3/4
++S 12718000 V 18400000 3/4
++S 12723000 H 27500000 3/4
++S 12735000 V 8800000 5/6
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-11-43.0W dvb-apps/util/scan/dvb-s/Intelsat-11-43.0W
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-11-43.0W   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Intelsat-11-43.0W 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Intelsat 11 @ 43.0W
++# freq pol sr fec
++
++S 3944000 H 05945000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-1R-45.0W dvb-apps/util/scan/dvb-s/Intelsat-1R-45.0W
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-1R-45.0W   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Intelsat-1R-45.0W 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,44 @@
++# Intelsat 1R @ 45.0W
++# freq pol sr fec
++
++S 4104000 V 14450000 AUTO
++S 3854000 H 02370000 AUTO
++S 11893000 H 06620000 AUTO
++S 3869000 H 03515000 AUTO
++S 4186000 V 02000000 AUTO
++S 4040000 V 04347000 AUTO
++S 4071000 V 02615000 AUTO
++S 3991000 V 04044000 AUTO
++S 3882000 V 04410000 AUTO
++S 11788000 V 10000000 AUTO
++S 11728000 V 05057000 AUTO
++S 11737000 V 05057000 AUTO
++S 11722000 V 03000000 AUTO
++S 11718000 H 24667000 AUTO
++S 11833000 H 17360000 AUTO
++S 11930000 V 11790000 AUTO
++S 11808000 H 04779000 AUTO
++S 4132000 H 05749000 AUTO
++S 3780000 V 02941000 AUTO
++S 11705000 V 04440000 AUTO
++S 3759000 V 02941000 AUTO
++S 4171000 V 04410000 AUTO
++S 3899000 V 06611000 AUTO
++S 4192000 H 02075000 AUTO
++S 4096000 H 08102000 AUTO
++S 11873000 H 06000000 AUTO
++S 11856000 V 03000000 AUTO
++S 11746000 V 06900000 AUTO
++S 11715000 V 05500000 AUTO
++S 3985000 V 03310000 AUTO
++S 3892000 V 06110000 AUTO
++S 4135000 H 26600000 AUTO
++S 4121000 H 03510000 AUTO
++S 3742000 V 04444000 AUTO
++S 3910000 V 04292000 AUTO
++S 3975000 V 03310000 AUTO
++S 4133000 V 03255000 AUTO
++S 3785000 V 04409000 AUTO
++S 3868000 V 10075000 AUTO
++S 3774000 V 08820000 AUTO
++S 4128000 V 03310000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-3R-43.0W dvb-apps/util/scan/dvb-s/Intelsat-3R-43.0W
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-3R-43.0W   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Intelsat-3R-43.0W 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,35 @@
++# Intelsat 3R @ 43.0W
++# freq pol sr fec
++
++S 3936000 H 03310000 AUTO
++S 3901000 V 06620000 AUTO
++S 3891000 V 06111000 AUTO
++S 3935000 V 17360000 AUTO
++S 3872000 H 06620000 AUTO
++S 3736000 H 29270000 AUTO
++S 4106000 V 26470000 AUTO
++S 3910000 V 05632000 AUTO
++S 3919000 V 06620000 AUTO
++S 4083000 V 06599000 AUTO
++S 4106000 H 29270000 AUTO
++S 3994000 H 21090000 AUTO
++S 3867000 V 06429000 AUTO
++S 3958000 V 06500000 AUTO
++S 3980000 V 03500000 AUTO
++S 3828000 V 04350000 AUTO
++S 3888000 H 07813000 AUTO
++S 3785000 H 30800000 AUTO
++S 3942000 V 01200000 AUTO
++S 3946000 V 02592000 AUTO
++S 3988000 V 04070000 AUTO
++S 3845000 H 30800000 AUTO
++S 4040000 H 30800000 AUTO
++S 3865000 V 06900000 AUTO
++S 3850000 V 28800000 AUTO
++S 11705000 H 03700000 AUTO
++S 11745000 H 03111000 AUTO
++S 11711000 H 04687000 AUTO
++S 11754000 H 03109000 AUTO
++S 3746000 V 21261000 AUTO
++S 4150000 H 24570000 AUTO
++S 3930000 H 02812000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-6B-43.0W dvb-apps/util/scan/dvb-s/Intelsat-6B-43.0W
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-6B-43.0W   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Intelsat-6B-43.0W 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,17 @@
++# Intelsat 6B @ 43.0W
++# freq pol sr fec
++
++S 10882000 H 30000000 AUTO
++S 10882000 V 30000000 AUTO
++S 10970000 H 30000000 AUTO
++S 10970000 V 30000000 AUTO
++S 11050000 H 30000000 AUTO
++S 11130000 H 30000000 AUTO
++S 11382000 V 30000000 AUTO
++S 11130000 V 30000000 AUTO
++S 10720000 H 30000000 AUTO
++S 10720000 V 30000000 AUTO
++S 11050000 V 30000000 AUTO
++S 11382000 H 30000000 AUTO
++S 10800000 H 30000000 AUTO
++S 10800000 V 30000000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-705-50.0W dvb-apps/util/scan/dvb-s/Intelsat-705-50.0W
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-705-50.0W  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Intelsat-705-50.0W        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Intelsat 705 @ 50.0W
++# freq pol sr fec
++
++S 3911000 V 03617000 AUTO
++S 3917000 V 04087000 AUTO
++S 3838000 H 07053000 AUTO
++S 4126000 H 06111000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-707-53.0W dvb-apps/util/scan/dvb-s/Intelsat-707-53.0W
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-707-53.0W  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Intelsat-707-53.0W        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# Intelsat 707 @ 53.0W
++# freq pol sr fec
++
++S 3820000 V 03255000 AUTO
++S 11483000 V 05333000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-805-55.5W dvb-apps/util/scan/dvb-s/Intelsat-805-55.5W
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-805-55.5W  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Intelsat-805-55.5W        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,67 @@
++# Intelsat 805 @ 55.5W
++# freq pol sr fec
++
++S 4171000 H 06111000 AUTO
++S 4147000 H 06111000 AUTO
++S 3914000 V 01809000 AUTO
++S 3572000 V 11800000 AUTO
++S 4135000 H 06111000 AUTO
++S 3737000 H 01809000 AUTO
++S 3932000 V 03255000 AUTO
++S 3759000 V 04167000 AUTO
++S 3750000 V 05632000 AUTO
++S 3850000 H 20000000 AUTO
++S 4010000 V 06111000 AUTO
++S 3715000 H 08890000 AUTO
++S 3670000 H 01374000 AUTO
++S 4158000 H 01447000 AUTO
++S 3549000 V 06510000 AUTO
++S 3451000 H 04444000 AUTO
++S 3667000 H 03300000 AUTO
++S 3522000 H 30000000 AUTO
++S 4055000 V 21703000 AUTO
++S 3698000 V 03600000 AUTO
++S 4119000 V 01631000 AUTO
++S 3446000 H 03200000 AUTO
++S 3675000 V 02660000 AUTO
++S 3717000 V 11574000 AUTO
++S 4030000 V 06111000 AUTO
++S 3767000 H 04427000 AUTO
++S 4027000 V 02000000 AUTO
++S 4089000 V 05540000 AUTO
++S 3685000 V 05632000 AUTO
++S 3751000 H 05632000 AUTO
++S 4127000 V 02000000 AUTO
++S 3980000 V 19510000 AUTO
++S 3590000 V 10127000 AUTO
++S 4000000 V 05200000 AUTO
++S 3762000 H 03662000 AUTO
++S 3936000 H 03255000 AUTO
++S 3727000 H 03000000 AUTO
++S 4104000 H 05062000 AUTO
++S 3777000 H 07400000 AUTO
++S 3431000 H 03500000 AUTO
++S 3478000 V 05632000 AUTO
++S 4093000 H 02540000 AUTO
++S 3929000 H 02941000 AUTO
++S 4195000 H 04444000 AUTO
++S 4140000 V 04700000 AUTO
++S 4096000 H 05247000 AUTO
++S 3467000 V 04340000 AUTO
++S 3442000 H 03000000 AUTO
++S 4080000 V 04340000 AUTO
++S 4084000 H 10317000 AUTO
++S 3723000 H 03000000 AUTO
++S 3815000 H 26667000 AUTO
++S 4006000 V 03690000 AUTO
++S 3918000 V 04400000 AUTO
++S 3735000 V 08680000 AUTO
++S 3727000 V 03000000 AUTO
++S 3940000 H 02575000 AUTO
++S 3792000 H 02244000 AUTO
++S 3900000 H 03612000 AUTO
++S 3677000 H 04232000 AUTO
++S 4127000 H 02532000 AUTO
++S 4152000 V 03600000 AUTO
++S 4177000 V 27690000 AUTO
++S 4111000 H 03333000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-903-34.5W dvb-apps/util/scan/dvb-s/Intelsat-903-34.5W
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-903-34.5W  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Intelsat-903-34.5W        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Intelsat 903 @ 34.5W
++# freq pol sr fec
++
++S 4178000 V 32555000 AUTO
++S 4045000 H 04960000 AUTO
++S 3895000 H 13021000 AUTO
++S 4004000 V 02170000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-905-24.5W dvb-apps/util/scan/dvb-s/Intelsat-905-24.5W
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-905-24.5W  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Intelsat-905-24.5W        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,9 @@
++# Intelsat 905 @ 24.5W
++# freq pol sr fec
++
++S 4171000 V 06111000 AUTO
++S 4181000 V 06111000 AUTO
++S 4194000 V 05193000 AUTO
++S 4162000 V 06111000 AUTO
++S 4060000 V 06111000 AUTO
++S 4070000 V 06111000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-907-27.5W dvb-apps/util/scan/dvb-s/Intelsat-907-27.5W
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-907-27.5W  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Intelsat-907-27.5W        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,9 @@
++# Intelsat 907 @ 27.5W
++# freq pol sr fec
++
++S 3873000 H 04687000 AUTO
++S 3935000 H 04687000 AUTO
++S 3743000 V 02900000 AUTO
++S 3732000 V 14000000 AUTO
++S 3943000 H 01808000 AUTO
++S 3938000 H 03544000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-9-58.0W dvb-apps/util/scan/dvb-s/Intelsat-9-58.0W
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Intelsat-9-58.0W    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Intelsat-9-58.0W  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,58 @@
++# Intelsat 9 @ 58.0W
++# freq pol sr fec
++
++S 4122000 H 02222000 AUTO
++S 4146000 H 06620000 AUTO
++S 4157000 H 06620000 AUTO
++S 4160000 V 03000000 AUTO
++S 3960000 V 29270000 AUTO
++S 3960000 H 29270000 AUTO
++S 4080000 H 27684000 AUTO
++S 3720000 H 19510000 AUTO
++S 4131000 H 04444000 AUTO
++S 4155000 H 06111000 AUTO
++S 4173000 H 06620000 AUTO
++S 3995000 H 05632000 AUTO
++S 3986000 H 06111000 AUTO
++S 4175000 H 04410000 AUTO
++S 4107000 H 08850000 AUTO
++S 3925000 H 06666000 AUTO
++S 3905000 H 06620000 AUTO
++S 3915000 H 06620000 AUTO
++S 3925000 H 06620000 AUTO
++S 4005000 H 06620000 AUTO
++S 4015000 H 06620000 AUTO
++S 3720000 V 27700000 AUTO
++S 4166000 H 06200000 AUTO
++S 3794000 H 03332000 AUTO
++S 3807000 H 03428000 AUTO
++S 3880000 V 27690000 AUTO
++S 3800000 V 26470000 AUTO
++S 3760000 V 27690000 AUTO
++S 3996000 H 03330000 AUTO
++S 3935000 H 05632000 AUTO
++S 11852000 V 30000000 AUTO
++S 11895000 V 20000000 AUTO
++S 11913000 V 10000000 AUTO
++S 4155000 V 03310000 AUTO
++S 3934000 V 07000000 AUTO
++S 3787000 H 07407000 AUTO
++S 3924000 V 06620000 AUTO
++S 3800000 H 04444000 AUTO
++S 3911000 V 13330000 AUTO
++S 4040000 H 16180000 AUTO
++S 4080000 V 27690000 AUTO
++S 4144000 V 02205000 AUTO
++S 4151000 V 02890000 AUTO
++S 4147000 V 02941000 AUTO
++S 4170000 V 02941000 AUTO
++S 3760000 H 28500000 AUTO
++S 4120000 V 27500000 AUTO
++S 11670000 V 16470000 AUTO
++S 4125000 H 02941000 AUTO
++S 4137000 H 02941000 AUTO
++S 3880000 H 27690000 AUTO
++S 4174000 V 02941000 AUTO
++S 3840000 V 27690000 AUTO
++S 3840000 H 27690000 AUTO
++S 3815000 H 06250000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Nahuel-1-71.8W dvb-apps/util/scan/dvb-s/Nahuel-1-71.8W
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Nahuel-1-71.8W      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Nahuel-1-71.8W    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,11 @@
++# Nahuel 1 @ 71.8W
++# freq pol sr fec
++
++S 11673000 V 04000000 AUTO
++S 11680000 V 03335000 AUTO
++S 11654000 V 04170000 AUTO
++S 11874000 V 04000000 AUTO
++S 12136000 V 02960000 AUTO
++S 11873000 H 08000000 AUTO
++S 12116000 H 14396000 AUTO
++S 11997000 V 08500000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Nilesat101+102-7.0W dvb-apps/util/scan/dvb-s/Nilesat101+102-7.0W
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Nilesat101+102-7.0W 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Nilesat101+102-7.0W       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,41 @@
++# Nilesat 101/102 & Atlantic Bird @ 7W
++# freq pol sr fec
++S 10719000 V 27500000 3/4
++S 10723000 H 27500000 3/4
++S 10758000 V 27500000 3/4
++S 10775000 H 27500000 3/4
++S 10796000 V 27500000 3/4
++S 10892000 H 27500000 3/4
++S 10911000 V 27500000 3/4
++S 10930000 H 27500000 3/4
++S 11317000 V 27500000 3/4
++S 11747000 V 27500000 3/4
++S 11766000 H 27500000 3/4
++S 11785000 V 27500000 3/4
++S 11804000 H 27500000 3/4
++S 11823000 V 27500000 3/4
++S 11843000 H 27500000 3/4
++S 11862000 V 27500000 3/4
++S 11881000 H 27500000 3/4
++S 11900000 V 27500000 3/4
++S 11919000 H 27500000 3/4
++S 11938000 V 27500000 3/4
++S 11958000 H 27500000 3/4
++S 11977000 V 27600000 5/6
++S 11996000 H 27500000 3/4
++S 12015000 V 27500000 3/4
++S 12034000 H 27500000 3/4
++S 12054000 V 27500000 3/4
++S 12073000 H 27500000 3/4
++S 12130000 V 27500000 3/4
++S 12149000 H 27500000 3/4
++S 12207000 V 27500000 3/4
++S 12226000 H 27500000 3/4
++S 12284000 V 27500000 3/4
++S 12303000 H 27500000 3/4
++S 12341000 V 27500000 3/4
++S 12360000 H 27500000 3/4
++S 12380000 V 27500000 3/4
++S 12399000 H 27500000 3/4
++S 12418000 V 27500000 3/4
++S 12476000 H 27500000 3/4
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/NSS-10-37.5W dvb-apps/util/scan/dvb-s/NSS-10-37.5W
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/NSS-10-37.5W        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/NSS-10-37.5W      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,12 @@
++# NSS 10 @ 37.5W
++# freq pol sr fec
++
++S 4055000 V 02700000 AUTO
++S 3824000 H 01808000 AUTO
++S 4059000 V 03214000 AUTO
++S 3828000 H 02532000 AUTO
++S 3844000 H 04340000 AUTO
++S 4071000 V 03150000 AUTO
++S 4051000 V 04440000 AUTO
++S 4044000 V 03250000 AUTO
++S 4077000 V 03200000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/NSS-7-22.0W dvb-apps/util/scan/dvb-s/NSS-7-22.0W
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/NSS-7-22.0W 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/NSS-7-22.0W       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# NSS 7 @ 22.0W
++# freq pol sr fec
++
++S 3926000 H 03715000 AUTO
++S 3920000 H 03715000 AUTO
++S 3954000 V 05632000 AUTO
++S 3929000 V 05632000 AUTO
++S 3915000 H 03715000 AUTO
++S 3761000 V 22650000 AUTO
++S 11825000 H 05904000 AUTO
++S 12162000 H 06510000 AUTO
++S 11777000 H 04000000 AUTO
++S 11860000 H 35000000 AUTO
++S 12049000 H 06500000 AUTO
++S 11921000 H 35000000 AUTO
++S 4003000 H 06667000 AUTO
++S 4011000 H 06667000 AUTO
++S 4126000 H 03680000 AUTO
++S 3969000 H 01808000 AUTO
++S 3976000 H 01842000 AUTO
++S 11814000 H 05630000 AUTO
++S 4038000 V 03690000 AUTO
++S 3674000 V 02222000 AUTO
++S 4033000 V 03689000 AUTO
++S 4016000 H 03663000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/NSS-806-40.5W dvb-apps/util/scan/dvb-s/NSS-806-40.5W
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/NSS-806-40.5W       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/NSS-806-40.5W     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,108 @@
++# NSS 806 @ 40.5W
++# freq pol sr fec
++
++S 11921000 H 35000000 AUTO
++S 3660000 H 04350000 AUTO
++S 3986000 H 03179000 AUTO
++S 3859000 H 02600000 AUTO
++S 4120000 V 02960000 AUTO
++S 4016000 V 05712000 AUTO
++S 3978000 H 03978000 AUTO
++S 4100000 V 06111000 AUTO
++S 3965000 V 02540000 AUTO
++S 3774000 H 06670000 AUTO
++S 3725000 V 26667000 AUTO
++S 3600000 V 25185000 AUTO
++S 3758000 V 26667000 AUTO
++S 3982000 V 17800000 AUTO
++S 4090000 V 02515000 AUTO
++S 4042000 H 08680000 AUTO
++S 4009000 V 06666000 AUTO
++S 4003000 H 06666000 AUTO
++S 3648000 H 02000000 AUTO
++S 3664000 V 02170000 AUTO
++S 3644000 H 02534000 AUTO
++S 3695000 H 02963000 AUTO
++S 4082000 H 06666000 AUTO
++S 4143000 V 04800000 AUTO
++S 3641000 V 02666000 AUTO
++S 3991000 H 03578000 AUTO
++S 4000000 H 02450000 AUTO
++S 4009000 H 02450000 AUTO
++S 3960000 V 03170000 AUTO
++S 3755000 H 20000000 AUTO
++S 4135000 V 02000000 AUTO
++S 4005000 H 02450000 AUTO
++S 4003000 H 02450000 AUTO
++S 3600000 H 29185000 AUTO
++S 3868000 V 02100000 AUTO
++S 3685000 H 06500000 AUTO
++S 3688000 V 06666000 AUTO
++S 3679000 V 02220000 AUTO
++S 3961000 H 01481000 AUTO
++S 4130000 V 02000000 AUTO
++S 3923000 H 27500000 AUTO
++S 4052000 V 02459000 AUTO
++S 4071000 V 03333000 AUTO
++S 4146000 H 02571000 AUTO
++S 3646000 V 03978000 AUTO
++S 3837000 H 19510000 AUTO
++S 4132000 H 02480000 AUTO
++S 3653000 V 05924000 AUTO
++S 4055000 H 07233000 AUTO
++S 3938000 V 04785000 AUTO
++S 4152000 V 03280000 AUTO
++S 3832000 V 13310000 AUTO
++S 4090000 H 06620000 AUTO
++S 4082000 V 06510000 AUTO
++S 4107000 V 02100000 AUTO
++S 3500000 H 06666000 AUTO
++S 4126000 V 02531000 AUTO
++S 3860000 V 02713000 AUTO
++S 3983000 H 02222000 AUTO
++S 4065000 H 08400000 AUTO
++S 4063000 V 08500000 AUTO
++S 3972000 H 03330000 AUTO
++S 4024000 H 16030000 AUTO
++S 3803000 V 26860000 AUTO
++S 3920000 V 20000000 AUTO
++S 4053000 V 06666000 AUTO
++S 3676000 V 03000000 AUTO
++S 3637000 H 02963000 AUTO
++S 3516000 V 05632000 AUTO
++S 3516000 H 05632000 AUTO
++S 4093000 V 02887000 AUTO
++S 4177000 H 04391000 AUTO
++S 4124000 H 03480000 AUTO
++S 4139000 V 02220000 AUTO
++S 3693000 V 04441000 AUTO
++S 4194000 H 06660000 AUTO
++S 3803000 H 27500000 AUTO
++S 4112000 V 02000000 AUTO
++S 3676000 H 05900000 AUTO
++S 3652000 H 04000000 AUTO
++S 3725000 H 26669000 AUTO
++S 3898000 V 04195000 AUTO
++S 4162000 H 07200000 AUTO
++S 4168000 H 02400000 AUTO
++S 3965000 H 03332000 AUTO
++S 4100000 H 06654000 AUTO
++S 4127000 H 03000000 AUTO
++S 4109000 H 06654000 AUTO
++S 3670000 H 02960000 AUTO
++S 3853000 H 05900000 AUTO
++S 3660000 V 02540000 AUTO
++S 4170000 H 02222000 AUTO
++S 3630000 H 05632000 AUTO
++S 3695000 V 02220000 AUTO
++S 4184000 H 06142000 AUTO
++S 4122000 V 01860000 AUTO
++S 4022000 V 03800000 AUTO
++S 4137000 H 04400000 AUTO
++S 3878000 V 22117000 AUTO
++S 4132000 V 02800000 AUTO
++S 4043000 V 07440000 AUTO
++S 4142000 H 02222000 AUTO
++S 3990000 V 04195000 AUTO
++S 3667000 V 03340000 AUTO
++S 3673000 V 03000000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/OptusC1-156E dvb-apps/util/scan/dvb-s/OptusC1-156E
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/OptusC1-156E        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/OptusC1-156E      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,20 @@
++# Optus C1 satellite 156E
++# freq pol sr fec
++S 12278000 H 30000000 2/3
++S 12305000 H 30000000 2/3
++S 12358000 H 27000000 2/3
++S 12398000 H 27800000 3/4
++S 12407000 V 30000000 2/3
++S 12438000 H 27800000 3/4
++S 12487000 V 27800000 3/4
++S 12501000 H 29473000 3/4
++S 12518000 H 27800000 3/4
++S 12527000 V 30000000 3/4
++S 12558000 H 27800000 3/4
++S 12564000 H 29473000 3/4
++S 12567000 V 27800000 2/3
++S 12598000 H 27800000 3/4
++S 12607000 V 29473000 3/4
++S 12638000 H 27800000 3/4
++S 12689000 H 27800000 3/4
++S 12720000 V 30000000 3/4
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Satmex-5-116.8W dvb-apps/util/scan/dvb-s/Satmex-5-116.8W
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Satmex-5-116.8W     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Satmex-5-116.8W   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,72 @@
++# Satmex 5 @ 116.8W
++# freq pol sr fec
++
++S 12034000 H 02532000 AUTO
++S 12175000 H 04232000 AUTO
++S 4060000 H 19510000 AUTO
++S 3905000 V 02963000 AUTO
++S 4084000 H 03162000 AUTO
++S 3767000 H 01620000 AUTO
++S 11975000 H 05000000 AUTO
++S 11960000 H 02000000 AUTO
++S 4180000 H 19510000 AUTO
++S 4115000 H 03253000 AUTO
++S 3840000 V 29270000 AUTO
++S 4160000 V 29270000 AUTO
++S 3940000 H 28125000 AUTO
++S 4052000 V 04307000 AUTO
++S 12024000 H 03000000 AUTO
++S 4134000 H 03617000 AUTO
++S 12028000 H 03255000 AUTO
++S 12060000 V 03078000 AUTO
++S 4012000 V 03131000 AUTO
++S 3949000 V 03255000 AUTO
++S 4076000 H 02962000 AUTO
++S 3749000 H 04070000 AUTO
++S 3744000 H 04480000 AUTO
++S 3755000 H 04000000 AUTO
++S 3869000 H 03000000 AUTO
++S 3876000 H 02170000 AUTO
++S 3879000 H 01984000 AUTO
++S 3957000 V 02600000 AUTO
++S 3975000 V 03131000 AUTO
++S 3982000 H 02531000 AUTO
++S 3832000 H 02500000 AUTO
++S 3953000 V 02597000 AUTO
++S 3987000 V 08860000 AUTO
++S 3996000 V 02170000 AUTO
++S 3748000 V 02100000 AUTO
++S 3932000 V 02500000 AUTO
++S 3914000 V 03223000 AUTO
++S 3888000 H 05351000 AUTO
++S 3805000 V 04679000 AUTO
++S 4001000 V 04100000 AUTO
++S 4023000 H 06400000 AUTO
++S 12176000 H 03985000 AUTO
++S 4108000 H 02666000 AUTO
++S 4038000 V 07675000 AUTO
++S 3809000 V 03100000 AUTO
++S 4080000 V 29270000 AUTO
++S 3910000 H 02500000 AUTO
++S 4164000 H 01733000 AUTO
++S 12193000 V 07885000 AUTO
++S 12164000 V 02000000 AUTO
++S 12044000 V 04340000 AUTO
++S 3720000 V 27000000 AUTO
++S 3922000 V 09760000 AUTO
++S 3797000 V 03200000 AUTO
++S 3968000 V 07500000 AUTO
++S 4037000 H 02222000 AUTO
++S 4046000 H 02441000 AUTO
++S 4080000 H 02441000 AUTO
++S 3773000 V 02892000 AUTO
++S 3767000 V 02893000 AUTO
++S 3935000 V 04440000 AUTO
++S 3972000 H 03364000 AUTO
++S 3905000 H 02400000 AUTO
++S 4007000 V 05582000 AUTO
++S 3885000 H 03000000 AUTO
++S 3826000 H 02712000 AUTO
++S 3944000 V 03410000 AUTO
++S 3915000 H 01520000 AUTO
++S 3876000 V 02920000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Satmex-6-113.0W dvb-apps/util/scan/dvb-s/Satmex-6-113.0W
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Satmex-6-113.0W     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Satmex-6-113.0W   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,19 @@
++# Satmex 6 @ 113.0W
++# freq pol sr fec
++
++S 4078000 H 03609000 AUTO
++S 4080000 V 03255000 AUTO
++S 12145000 V 03255000 AUTO
++S 4085000 V 02821000 AUTO
++S 12126000 V 06022000 AUTO
++S 12166000 H 17500000 AUTO
++S 4075000 V 03782000 AUTO
++S 4091000 V 03720000 AUTO
++S 3985000 V 02300000 AUTO
++S 12126000 H 02170000 AUTO
++S 12157000 V 03038000 AUTO
++S 12091000 V 03337000 AUTO
++S 3947000 V 03700000 AUTO
++S 3761000 V 02120000 AUTO
++S 12107000 V 02222000 AUTO
++S 12080000 H 25635000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/SBS6-74w dvb-apps/util/scan/dvb-s/SBS6-74w
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/SBS6-74w    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/SBS6-74w  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# SBS 6 @ 74W
++# freq pol sr fec
++
++S 11744000 H 06616000 AUTO
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Sirius-5.0E dvb-apps/util/scan/dvb-s/Sirius-5.0E
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Sirius-5.0E 2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Sirius-5.0E       2009-06-21 13:29:06.000000000 +0200
+@@ -1,5 +1,62 @@
+ # Sirius 5.0E
+ # freq pol sr fec
++S 11215000 V 6666000 1/2
++S 11227000 H 23145000 3/4
++S 11247000 V 23145000 3/4
++S 11420000 H 23145000 3/4
++S 11727000 H 27500000 5/6
++S 11747000 V 27500000 3/4
++S 11766000 H 27500000 3/4
++S 11785000 V 27500000 3/4
++S 11804000 H 27500000 3/4
+ S 11823000 V 27500000 3/4
++S 11843000 H 27500000 3/4
++S 11862000 V 27500000 3/4
++S 11881000 H 27500000 3/4
++S 11900000 V 27500000 3/4
++S 11919000 H 27500000 3/4
++S 11938000 V 27500000 3/4
++S 11958000 H 27500000 3/4
+ S 11977000 V 27500000 3/4
++S 11996000 H 27500000 3/4
++S 12015000 V 27500000 5/6
++S 12034000 H 27500000 3/4
+ S 12054000 V 27500000 3/4
++S 12073000 H 27500000 3/4
++S 12092000 V 27500000 3/4
++S 12111000 H 27500000 5/6
++S 12130000 V 27500000 3/4
++S 12149000 H 27500000 3/4
++S 12169000 V 27500000 3/4
++S 12188000 H 27500000 7/8
++S 12207000 V 27500000 3/4
++S 12226000 H 25540000 7/8
++S 12245000 V 27500000 3/4
++S 12265000 H 27500000 3/4
++S 12284000 V 27500000 3/4
++S 12303000 H 25547000 7/8
++S 12322000 V 27500000 3/4
++S 12341000 H 27500000 3/4
++S 12360000 V 27500000 7/8
++S 12379000 H 27500000 3/4
++S 12399000 V 27500000 2/3
++S 12418000 H 27500000 3/4
++S 12437000 V 27500000 2/3
++S 12456000 H 27500000 3/4
++S 12476000 V 27500000 3/4
++S 12608000 H 27500000 3/4
++S 12637000 H 14465000 3/4
++S 12668000 V 6666000 1/2
++S 12672000 H 3300000 3/4
++S 12674000 V 10000000 3/4
++S 12678000 V 13333000 5/6
++S 12680000 H 9404000 3/4
++S 12685000 V 4444000 3/4
++S 12690000 H 3330000 3/4
++S 12693000 V 3333000 5/6
++S 12701000 H 6111000 3/4
++S 12715000 H 3330000 3/4
++S 12718000 V 23500000 3/4
++S 12724000 H 1772000 3/4
++S 12728000 V 19720000 3/4
++S 12737000 V 6150000 3/4
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Telecom2-8.0W dvb-apps/util/scan/dvb-s/Telecom2-8.0W
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Telecom2-8.0W       2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Telecom2-8.0W     2009-06-21 13:29:06.000000000 +0200
+@@ -1,4 +1,17 @@
+ # Telecom2 8.0W
+ # freq pol sr fec
+-S 11635000 H 6800000 5/6
+-S 12687000 V 1879000 3/4
++S 10972000 V 27500000 3/4
++S 10974000 H 27500000 3/4
++S 11010000 H 27500000 3/4
++S 11011000 V 27500000 3/4
++S 11042000 H 7860000 3/4
++S 11053000 H 2850000 3/4
++S 11064000 H 12667000 3/4
++S 11387000 H 24740000 5/6
++S 11428000 H 27500000 3/4
++S 11500000 H 3460000 AUTO
++S 11554000 V 27500000 3/4
++S 11595000 V 27500000 3/4
++S 12545000 H 3038000 3/4
++S 12566000 V 27500000 3/4
++S 12649000 V 27500000 3/4
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Telstar12-15.0W dvb-apps/util/scan/dvb-s/Telstar12-15.0W
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Telstar12-15.0W     2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Telstar12-15.0W   2009-06-21 13:29:06.000000000 +0200
+@@ -1,4 +1,26 @@
+ # Telstar 12 15.0W
+ # freq pol sr fec
+-S 12041000 H 3256000 2/3
+-S 12520000 V 8700000 1/2
++S 10988000 H 2893000 3/4
++S 10992000 H 2893000 3/4
++S 11060000 H 19279000 3/4
++S 11123000 V 19279000 3/4
++S 11124000 H 18386000 3/4
++S 11150000 H 18386000 3/4
++S 11150000 V 19279000 3/4
++S 11531000 H 3198000 7/8
++S 11566000 H 4284000 3/4
++S 11677000 V 2200000 1/2
++S 11709000 V 3195000 AUTO
++S 11806000 V 7596000 3/4
++S 11963000 H 14714000 3/4
++S 12082000 H 3935000 3/4
++S 12117000 H 4772000 AUTO
++S 12159000 H 7777000 2/3
++S 12166000 H 3503000 3/4
++S 12173000 H 3503000 3/4
++S 12524000 V 26470000 3/4
++S 12547000 H 11900000 2/3
++S 12589000 V 4503000 1/2
++S 12608000 H 19279000 2/3
++S 12615000 V 11939000 2/3
++S 12645000 H 3255000 3/4
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Thor-1.0W dvb-apps/util/scan/dvb-s/Thor-1.0W
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Thor-1.0W   2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Thor-1.0W 2009-06-21 13:29:06.000000000 +0200
+@@ -1,8 +1,36 @@
+ # Thor 1.0W
+ # freq pol sr fec
++S 11216000 V 24500000 7/8
++S 11229000 H 24500000 7/8
+ S 11247000 V 24500000 7/8
++S 11261000 H 24500000 7/8
++S 11278000 V 24500000 7/8
+ S 11293000 H 24500000 7/8
++S 11309000 V 24500000 7/8
+ S 11325000 H 24500000 7/8
+-S 12054000 H 28000000 7/8
++S 11325000 V 24500000 7/8
++S 11325000 V 24500000 7/8
++S 11341000 V 24500000 7/8
++S 11357000 H 24500000 7/8
++S 11372000 V 24500000 7/8
++S 11389000 H 24500000 7/8
++S 11403000 V 24500000 7/8
++S 11421000 H 24500000 7/8
++S 11434000 V 24500000 7/8
++S 11747000 H 28000000 5/6
++S 11785000 H 28000000 5/6
++S 11823000 H 28000000 7/8
++S 11938000 H 25000000 3/4
++S 12015000 H 30000000 3/4
++S 12130000 H 30000000 3/4
++S 12149000 V 28000000 5/6
+ S 12169000 H 28000000 7/8
+-S 12226000 V 28000000 7/8
++S 12188000 V 25000000 3/4
++S 12226000 V 28000000 3/4
++S 12245000 H 28000000 5/6
++S 12303000 V 28000000 5/6
++S 12322000 H 27800000 3/4
++S 12399000 H 28000000 7/8
++S 12418000 V 28000000 7/8
++S 12456000 V 28000000 3/4
++S 12476000 H 28000000 5/6
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Turksat-42.0E dvb-apps/util/scan/dvb-s/Turksat-42.0E
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Turksat-42.0E       2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Turksat-42.0E     2009-06-21 13:29:06.000000000 +0200
+@@ -1,4 +1,104 @@
+ # Turksat 42.0E
+ # freq pol sr fec
+-S 11594000 H 4557000 5/6
+-S 10978000 V 2344000 3/4
++S 10968000 V 4557000 3/4
++S 10970000 H 30000000 5/6
++S 10999000 V 2222000 3/4
++S 11003000 V 2175000 3/4
++S 11007000 V 2950000 5/6
++S 11011000 V 2125000 5/6
++S 11014000 V 2050000 3/4
++S 11018000 V 2150000 3/4
++S 11028000 V 2400000 3/4
++S 11083000 V 8888000 3/4
++S 11136000 V 2170000 3/4
++S 11143000 V 2200000 3/4
++S 11159000 V 2596000 3/4
++S 11162000 V 2222000 5/6
++S 11166000 V 2960000 3/4
++S 11177000 V 2200000 3/4
++S 11554000 H 2916000 2/3
++S 11576000 H 2400000 5/6
++S 11581000 H 4444000 3/4
++S 11607000 H 3750000 2/3
++S 11712000 V 2963000 3/4
++S 11716000 V 2222000 3/4
++S 11729000 V 15555000 5/6
++S 11734000 H 3291000 3/4
++S 11739000 H 3125000 3/4
++S 11743000 H 2222000 3/4
++S 11743000 V 2222000 3/4
++S 11748000 H 4444000 5/6
++S 11753000 H 3000000 7/8
++S 11754000 V 3900000 5/6
++S 11758000 V 2962000 3/4
++S 11760000 H 5925000 3/4
++S 11762000 V 2155000 3/4
++S 11765000 V 2222000 3/4
++S 11770000 V 2177000 3/4
++S 11773000 V 2420000 5/6
++S 11775000 H 2222000 3/4
++S 11777000 V 3150000 5/6
++S 11781000 V 2815000 5/6
++S 11794000 H 5632000 3/4
++S 11800000 H 2400000 5/6
++S 11804000 V 24444000 5/6
++S 11830000 V 6666000 3/4
++S 11839000 V 4444000 3/4
++S 11846000 V 3333000 5/6
++S 11852000 V 4444000 5/6
++S 11858000 V 2400000 7/8
++S 11867000 V 4444000 5/6
++S 11874000 V 3400000 7/8
++S 11878000 V 3750000 5/6
++S 11882000 V 2965000 5/6
++S 11887000 V 3333000 7/8
++S 11892000 H 12800000 5/6
++S 11892000 V 2960000 5/6
++S 11896000 V 2222000 3/4
++S 11905000 H 6666000 3/4
++S 11912000 H 3333000 5/6
++S 11919000 V 24444000 3/4
++S 11951000 V 8800000 5/6
++S 11959000 V 2960000 3/4
++S 11963000 V 2300000 5/6
++S 11967000 V 4340000 3/4
++S 11970000 H 17900000 5/6
++S 11973000 V 2240000 5/6
++S 11984000 H 4000000 5/6
++S 11996000 V 26000000 5/6
++S 12002000 H 4800000 5/6
++S 12008000 H 4400000 5/6
++S 12015000 H 4800000 5/6
++S 12022000 H 5380000 5/6
++S 12028000 H 4557000 5/6
++S 12126000 V 6666000 5/6
++S 12127000 H 7400000 5/6
++S 12140000 H 2222000 3/4
++S 12140000 V 4444000 3/4
++S 12513000 H 4400000 3/4
++S 12518000 H 3125000 3/4
++S 12524000 H 4250000 5/6
++S 12530000 H 4444000 5/6
++S 12536000 H 2962000 3/4
++S 12540000 H 3125000 3/4
++S 12563000 H 24000000 7/8
++S 12590000 V 3000000 5/6
++S 12595000 V 2500000 5/6
++S 12605000 V 2961000 3/4
++S 12609000 V 3700000 5/6
++S 12614000 V 3333000 5/6
++S 12633000 V 4800000 5/6
++S 12636000 H 4800000 5/6
++S 12638000 V 2400000 5/6
++S 12647000 V 3333000 5/6
++S 12652000 H 22500000 5/6
++S 12652000 V 3900000 5/6
++S 12660000 V 9150000 5/6
++S 12672000 H 2222000 5/6
++S 12680000 H 8888000 3/4
++S 12692000 H 2800000 5/6
++S 12696000 H 2222000 3/4
++S 12699000 H 2400000 3/4
++S 12702000 H 2285000 7/8
++S 12717000 V 5925000 5/6
++S 12731000 V 3333000 3/4
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Yamal201-90.0E dvb-apps/util/scan/dvb-s/Yamal201-90.0E
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-s/Yamal201-90.0E      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-s/Yamal201-90.0E    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,48 @@
++# Yamal201 @ 90E
++# freq pol sr fec
++S 10990000 V 2170000 AUTO
++S 10995000 V 4285000 AUTO
++S 11057000 V 26470000 AUTO
++S 11092000 V 26470000 AUTO
++S 11145000 V 22222000 AUTO
++S 11671000 V 18200000 AUTO
++
++# Yamal201 @ 90E C-BAND
++# Generated by Roman Kashcheev
++# Mar 30, 2008
++# freq pol sr fec
++
++# NauTV
++S 3536000 H 2532000 3/4
++# Turkmenistan
++S 3553000 H 20000000 3/4
++# CNL
++S 3577000 H 2626000 3/4
++# Nord TV
++S 3588000 H 4285000 3/4
++# Telekompanija OTV
++S 3600000 H 4285000 3/4
++# Oblastnoe Televidenie
++S 3603000 V 4285000 3/4
++# CNL
++S 3605000 H 2626000 3/4
++# Gascom
++S 3645000 H 28000000 3/4
++# Spas
++S 3674000 H 17500000 3/4
++# TV Gubernia
++S 3725000 H 3200000 3/4
++# Yuzhniy Region
++S 3900000 H 4285000 3/4
++# Rostov TV
++S 3907000 H 4265000 3/4
++# ORTRK 12 Kanal
++S 3912000 H 4295000 3/4
++# O2
++S 3944000 H 15550000 3/4
++# Klub Puteshestviy
++S 3980000 H 38000000 3/4
++# Music Box
++S 4042000 V 8681000 3/4
++# NetService
++S 4084000 V 2500000 3/4
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/ad-Andorra dvb-apps/util/scan/dvb-t/ad-Andorra
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/ad-Andorra  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/ad-Andorra        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# DVB-T Andorra
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/at-Official dvb-apps/util/scan/dvb-t/at-Official
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/at-Official 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/at-Official       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,24 @@
++# Austria, all DVB-T transmitters run by ORS
++# Created from http://www.ors.at/view08/ors.php?mid=94
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 474000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE
++T 490000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE
++T 498000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE
++T 514000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE
++T 522000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE
++T 530000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE
++T 538000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE
++T 546000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE
++T 554000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE
++T 562000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE
++T 578000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE
++T 578000000 8MHz 3/4 NONE QAM16 8k 1/8 NONE
++T 594000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE
++T 602000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE
++T 610000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE
++T 634000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE
++T 650000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE
++T 666000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE
++T 698000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE
++T 722000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE
++T 754000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Adelaide dvb-apps/util/scan/dvb-t/au-Adelaide
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Adelaide 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/au-Adelaide       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,12 @@
++# Australia / Adelaide / Mt Lofty
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# ABC
++T 226500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Seven
++T 177500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Nine
++T 191625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Ten
++T 219500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# SBS
++T 564500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Brisbane dvb-apps/util/scan/dvb-t/au-Brisbane
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Brisbane 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/au-Brisbane       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,12 @@
++# Australia / Brisbane (Mt Coot-tha transmitters)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# ABC
++T 226500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Seven
++T 177500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Nine
++T 191625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Ten
++T 219500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# SBS
++T 585625000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Cairns dvb-apps/util/scan/dvb-t/au-Cairns
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Cairns   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/au-Cairns 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,12 @@
++# Australia / Cairns (Mt Bellenden-Ker transmitters)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# ABC VHF 8
++T 191500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# SEVEN VHF 11
++T 219500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# WIN VHF 12
++T 226500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# TEN VHF 6 (Expected Start Date Dec 2006)
++T 177500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# SBS UHF 29
++T 536500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-canberra dvb-apps/util/scan/dvb-t/au-canberra
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-canberra 2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/au-canberra       2009-06-21 13:29:06.000000000 +0200
+@@ -1,12 +1,12 @@
+ # Australia / Canberra / Woden
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+ # ABC
+-T 205625000 7MHz 3/4 3/4 QAM64 8k 1/16 NONE
++T 205625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+ # Seven
+-T 177500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 177500000 7MHz 3/4 NONE QAM64 8k 1/8 NONE
+ # Nine
+ T 191625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+ # Ten
+-T 219500000 7MHz 3/4 1/2 QAM64 8k 1/16 NONE
++T 219500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+ # SBS
+ T 543500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Canberra-Black-Mt dvb-apps/util/scan/dvb-t/au-Canberra-Black-Mt
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Canberra-Black-Mt        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/au-Canberra-Black-Mt      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,12 @@
++# Australia / Canberra / Black Mt
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# ABC
++T 205500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Prime
++T 226500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# WIN
++T 219500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Ten
++T 177500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# SBS
++T 543500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Coonabarabran dvb-apps/util/scan/dvb-t/au-Coonabarabran
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Coonabarabran    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/au-Coonabarabran  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,16 @@
++# Australia / Coonabarabran
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#
++# ABC VHF12
++T 226500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# TEN UHF46
++T 655500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Nine UHF45
++T 648500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Seven VHF11
++#T 618250000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# SBS UHF44
++T 641500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
++# D44 UHF35
++#T 578500000 7MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Darwin dvb-apps/util/scan/dvb-t/au-Darwin
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Darwin   2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/au-Darwin 2009-06-21 13:29:06.000000000 +0200
+@@ -1,5 +1,9 @@
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# ABC (UHF 30)
+ T 543625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+-T 550500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
++# Nine (UHF 31)
++T 550500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# SBS (UHF 29)
+ T 536625000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+-T 557625000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
++# Southern Cross (UHF 32)
++T 557625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-GoldCoast dvb-apps/util/scan/dvb-t/au-GoldCoast
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-GoldCoast        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/au-GoldCoast      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,21 @@
++# DVB-T frequencies & modulation for the Gold Coast, Australia (Mt Tamborine)
++# See http://www.dba.org.au/index.asp?sectionID=22&recLocation=Gold+Coast
++# and http://www.dba.org.au/index.asp?sectionID=120
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# ABC (UHF 62)
++T 767500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# SBS (UHF 36)
++T 585500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
++# Seven (UHF 53)
++T 704500000 7MHz 3/4 NONE QAM64 8k 1/8 NONE
++# NBN (UHF 68)
++T 809500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Prime (UHF 65)
++T 788500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Southern Cross Ten (UHF 43)
++T 634500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Nine (UHF 59)
++T 746500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Ten (UHF 56)
++T 725500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Hobart dvb-apps/util/scan/dvb-t/au-Hobart
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Hobart   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/au-Hobart 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,12 @@
++# Australia / Tasmania / Hobart
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# ABC VHF 8
++T 191500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# SBS VHF 9a
++T 205500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
++# SCT VHF 10
++T 212500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# WIN VHF 7
++T 184625000 7MHz 3/4 NONE QAM64 8k 1/8 NONE
++# TDT VHF 11
++T 219500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Mackay dvb-apps/util/scan/dvb-t/au-Mackay
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Mackay   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/au-Mackay 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,14 @@
++# Australia / Mackay (Mt Blackwood transmitters)
++# aufreq=((UHF channel number)*8+306)
++
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# ABC
++T 212500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Seven Network
++T 205500000 7MHz 3/4 NONE QAM64 8k 1/8 NONE
++# WIN Digital
++T 578500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Southern Cross Ten
++T 557500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# SBS
++T 536500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Melbourne dvb-apps/util/scan/dvb-t/au-Melbourne
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Melbourne        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/au-Melbourne      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,12 @@
++# Australia / Melbourne (Mt Dandenong transmitters)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# ABC
++T 226500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Seven
++T 177500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Nine
++T 191625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Ten
++T 219500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# SBS
++T 536625000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Melbourne-Upwey dvb-apps/util/scan/dvb-t/au-Melbourne-Upwey
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Melbourne-Upwey  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/au-Melbourne-Upwey        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,12 @@
++# Australia / Melbourne (Upwey Repeater)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# ABC
++T 662500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Seven
++T 620500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Nine
++T 641500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Ten
++T 711500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# SBS
++T 683500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-MidNorthCoast dvb-apps/util/scan/dvb-t/au-MidNorthCoast
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-MidNorthCoast    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/au-MidNorthCoast  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,22 @@
++# Australia ABC Mid North Coast
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# ABC middle brother
++T 184625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Prime Middle Brother
++T 198500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# NBN Middle Brother
++T 226500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Ten Middle Brother
++T 641500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# SBS middle brother
++T 205500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
++# ABC Moombil
++T 585500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Prime Moombil
++T 543500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# NBN Moombil
++T 564500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Ten Moombil
++T 599500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# SBS Moombil
++T 606500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Newcastle dvb-apps/util/scan/dvb-t/au-Newcastle
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Newcastle        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/au-Newcastle      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,12 @@
++# Australia / Newcastle
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# SBS
++T 599500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
++# NBN
++T 585500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Prime
++T 704500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# ABC
++T 592500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# SC10
++T 690500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Perth dvb-apps/util/scan/dvb-t/au-Perth
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Perth    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/au-Perth  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,12 @@
++# Australia / Perth
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# ABC
++T 226500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Seven Network
++T 177500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Nine Network
++T 191625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Network TEN
++T 219500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# SBS
++T 536625000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Perth_Roleystone dvb-apps/util/scan/dvb-t/au-Perth_Roleystone
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Perth_Roleystone 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/au-Perth_Roleystone       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,12 @@
++# Australia / Perth (Roleystone transmitter)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# SBS
++T 704500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
++# ABC
++T 725500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Seven
++T 746500000 7MHz 2/3 NONE QAM64 8k 1/16 NONE
++# Nine
++T 767500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Ten
++T 788500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-SpencerGulf dvb-apps/util/scan/dvb-t/au-SpencerGulf
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-SpencerGulf      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/au-SpencerGulf    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,8 @@
++# Australia / South Australia / Pt Pirie (THE BLUFF)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# ABC
++T 599500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Southern Cross
++T 641500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# SBS
++T 620500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-SunshineCoast dvb-apps/util/scan/dvb-t/au-SunshineCoast
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-SunshineCoast    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/au-SunshineCoast  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,12 @@
++# Australia / Sunshine Coast
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# SBS36 SBS ***
++T 585625000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
++# TNQ47 10 ***
++T 662625000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
++# ABQ62 ABC ***
++T 767625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# STQ65 7 ***
++T 788625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# STQ68 WIN ***
++T 809500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Sydney_Kings_Cross dvb-apps/util/scan/dvb-t/au-Sydney_Kings_Cross
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Sydney_Kings_Cross       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/au-Sydney_Kings_Cross     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,14 @@
++# Australia / Sydney / Kings Cross and North Head
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#
++# ABC UHF30
++T 543500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Seven UHF48
++T 669500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Nine UHF33
++T 564500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Ten UHF45
++T 648500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# SBS UHF34
++T 571500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-sydney_north_shore dvb-apps/util/scan/dvb-t/au-sydney_north_shore
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-sydney_north_shore       2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/au-sydney_north_shore     1970-01-01 01:00:00.000000000 +0100
+@@ -1,12 +0,0 @@
+-# Australia / Sydney / North Shore (aka Artarmon/Gore Hill)
+-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-# ABC
+-T 226500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+-# Seven
+-T 177500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+-# Nine
+-T 191625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+-# Ten
+-T 219500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+-# SBS
+-T 571500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Sydney_North_Shore dvb-apps/util/scan/dvb-t/au-Sydney_North_Shore
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Sydney_North_Shore       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/au-Sydney_North_Shore     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,16 @@
++# Australia / Sydney / North Shore (aka Artarmon/Gore Hill/Willoughby)
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#
++# ABC VHF12
++T 226500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Seven VHF6
++T 177500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Nine VHF8
++T 191625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Ten VHF11
++T 219500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# SBS UHF34
++T 571500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
++# D44 UHF35
++T 578500000 7MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Tamworth dvb-apps/util/scan/dvb-t/au-Tamworth
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Tamworth 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/au-Tamworth       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,38 @@
++# Australia / NSW / New England / Tamworth / Mt.Soma
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# SBS
++T 690500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
++# NBN
++T 753500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Prime
++T 732500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# ABC
++T 711500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# SC10
++T 774500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++
++# Australia / NSW / New England / Upper Namoi / Mt.Dowe
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# SBS
++T 585500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
++# NBN
++T 592500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Prime
++T 205625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# ABC
++T 191625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# SC10
++T 613500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++
++# Australia / NSW / Western Districts / Central Western Slopes / Mt. Cenn Cruaich
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# SBS
++T 641500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
++# WIN
++T 648500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Prime
++T 620500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# ABC
++T 226625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# SC10
++T 641500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Townsville dvb-apps/util/scan/dvb-t/au-Townsville
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Townsville       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/au-Townsville     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,12 @@
++# Australia / Brisbane (Mt Coot-tha transmitters)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# SBS
++T 592500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
++# ABC
++T 550500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Seven
++T 599500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Nine
++T 620500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Ten
++T 585500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-WaggaWagga dvb-apps/util/scan/dvb-t/au-WaggaWagga
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-WaggaWagga       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/au-WaggaWagga     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,12 @@
++# Australia / Wagga Wagga (Mt Ulundra)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# ABC
++T 655500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# SBS
++T 669500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
++# Prime
++T 662500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Southern Cross Ten
++T 690500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# WIN
++T 683500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Wollongong dvb-apps/util/scan/dvb-t/au-Wollongong
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/au-Wollongong       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/au-Wollongong     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,40 @@
++# Australia / Wollongong
++#
++# Australia modulation params:
++# - http://www.dba.org.au/index.asp?sectionID=120
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#
++# North (Broadcast Site Escarpment Road BROKERS NOSE)
++# - http://www.dba.org.au/index.asp?query=true&sectionID=22&recLocation=Wollongong+%2D+North
++#
++# ABC UHF52
++T 697500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Prime UHF46
++T 655500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# WIN UHF40
++T 613500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Ten UHF43
++T 634500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# SBS UHF54
++T 711625000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
++#
++# Illawarra (Broadcast Australia Digital Television Tower KNIGHTS HILL)
++# - http://www.dba.org.au/index.asp?query=true&sectionID=22&recLocation=Wollongong+%2D+Illawarra
++#
++# ABC UHF51
++T 690500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Prime UHF38
++T 599500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# WIN UHF36
++T 585500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Ten UHF37
++T 592500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
++# SBS - same as North
++#
++# Stanwell Park (Bald Hill STANWELL TOPS)
++# - http://www.dba.org.au/index.asp?query=true&sectionID=22&recLocation=Wollongong+%2D+Stanwell%20Park
++#
++# ABC, Prime, WIN, Ten are identical to Wollongong / North
++# SBS UHF49
++T 676500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/be-Brussels dvb-apps/util/scan/dvb-t/be-Brussels
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/be-Brussels 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/be-Brussels       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# Brussels - Belgium (Transmitters of the RTBF and the VRT)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # RTBF
++T 746000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # BE-TV
++T 482000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # VRT
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/be-Libramont dvb-apps/util/scan/dvb-t/be-Libramont
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/be-Libramont        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/be-Libramont      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# Libramont - Belgique
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# Canal  7 191.5 MHz M6
++# Canal 24 498.0 MHz RTL-TVI  Club-RTL  Plug-TV  RTL 4,5,7
++# Canal 27 522.0 MHz RTL Lux, den 2ten RTL
++# Canal 56 834.0 MHz RTBF 1,2,3 + radio
++T 191500000 7MHz 1/2 NONE QAM64 8k 1/8 NONE
++T 498000000 8MHz 1/2 NONE QAM64 8k 1/16 NONE
++T 522000000 8MHz 1/2 NONE QAM64 8k 1/16 NONE
++T 834000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/be-Schoten dvb-apps/util/scan/dvb-t/be-Schoten
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/be-Schoten  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/be-Schoten        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Schoten-Antwerpen - Belgie
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 778000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/be-St_Pieters_Leeuw dvb-apps/util/scan/dvb-t/be-St_Pieters_Leeuw
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/be-St_Pieters_Leeuw 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/be-St_Pieters_Leeuw       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# St.-Pieters-Leeuw - Belgie
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/be-Tournai dvb-apps/util/scan/dvb-t/be-Tournai
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/be-Tournai  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/be-Tournai        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Tournai - Belgique
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/ch-All dvb-apps/util/scan/dvb-t/ch-All
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/ch-All      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/ch-All    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,31 @@
++# Switzerland, whole country
++# Created from http://www.broadcast.ch/portal.aspx?pid=705
++# and http://www.broadcast.ch/data_program_dvbt.aspx
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 514000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
++T 522000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
++T 538000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
++T 554000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
++T 562000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
++T 578000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
++T 602000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
++T 618000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
++T 626000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
++T 642000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
++T 658000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
++T 658000000 8MHz 5/6 NONE QAM16 8k 1/8 NONE
++T 666000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
++T 674000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
++T 682000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
++T 690000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
++T 698000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
++T 714000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
++T 722000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
++T 722000000 8MHz 5/6 NONE QAM16 8k 1/8 NONE
++T 738000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
++T 754000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
++T 762000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
++T 786000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
++T 802000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
++T 826000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
++T 850000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/ch-Citycable dvb-apps/util/scan/dvb-t/ch-Citycable
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/ch-Citycable        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/ch-Citycable      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,18 @@
++# Lausanne - Switzerland (DVB-T on CityCable cable network)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 498000000 8MHz 7/8 NONE QAM64 8k 1/32 NONE
++T 522000000 8MHz 7/8 NONE QAM64 8k 1/32 NONE
++T 554000000 8MHz 7/8 NONE QAM64 8k 1/32 NONE
++T 570000000 8MHz 7/8 NONE QAM64 8k 1/32 NONE
++T 578000000 8MHz 7/8 NONE QAM64 8k 1/32 NONE
++T 586000000 8MHz 7/8 NONE QAM64 8k 1/32 NONE
++T 610000000 8MHz 7/8 NONE QAM64 8k 1/32 NONE
++T 618000000 8MHz 7/8 NONE QAM64 8k 1/32 NONE
++T 626000000 8MHz 7/8 NONE QAM64 8k 1/32 NONE
++T 658000000 8MHz 7/8 NONE QAM64 8k 1/32 NONE
++T 730000000 8MHz 7/8 NONE QAM64 8k 1/32 NONE
++T 746000000 8MHz 7/8 NONE QAM64 8k 1/32 NONE
++T 818000000 8MHz 7/8 NONE QAM64 8k 1/32 NONE
++T 826000000 8MHz 7/8 NONE QAM64 8k 1/32 NONE
++T 834000000 8MHz 7/8 NONE QAM64 8k 1/32 NONE
++T 842000000 8MHz 7/8 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/cz-Brno dvb-apps/util/scan/dvb-t/cz-Brno
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/cz-Brno     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/cz-Brno   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# DVB-T Brno (Brno, Czech Republic)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# MUX 1 Ceska televize
++T 506000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++# MUX 2 Ceske radiokomunikace
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++# MUX 3 Czech Digital Group
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++# MUX 4 Telefonica O2
++T 818000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/cz-Domazlice dvb-apps/util/scan/dvb-t/cz-Domazlice
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/cz-Domazlice        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/cz-Domazlice      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# DVB-T Domažlice (Domažlice, Czech Republic)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/cz-Klet dvb-apps/util/scan/dvb-t/cz-Klet
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/cz-Klet     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/cz-Klet   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# DVB-T Ceske Budejovice (Klet, Czech Republic)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# CRa - Ceske radiokomunikace, TX Klet
++T 698000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/cz-Ostrava dvb-apps/util/scan/dvb-t/cz-Ostrava
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/cz-Ostrava  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/cz-Ostrava        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# DVB-T Ostrava (Ostrava, Czech Republic)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/cz-Plzen dvb-apps/util/scan/dvb-t/cz-Plzen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/cz-Plzen    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/cz-Plzen  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,8 @@
++# DVB-T Plzen (Pilsen, Czech Republic)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# MUX 1 Ceska televize
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++# MUX 2 Ceske Radiokomunikace
++T 690000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++# MUX 3 Czech Digital Group
++T 722000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/cz-Praha dvb-apps/util/scan/dvb-t/cz-Praha
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/cz-Praha    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/cz-Praha  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# DVB-T Praha (Prague, Czech Republic)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 634000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 730000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 818000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Baden-Wuerttemberg dvb-apps/util/scan/dvb-t/de-Baden-Wuerttemberg
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Baden-Wuerttemberg       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/de-Baden-Wuerttemberg     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,20 @@
++# DVB-T Baden-Württemberg
++# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 514000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH26: Das Erste, arte, Phoenix, EinsPlus
++T 522000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH27: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 618000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH39: SWR-BW, BR, hr, WDR
++T 626000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH40: SWR-BW, BR, hr, WDR
++T 634000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH41: SWR-BW, BR, hr, WDR
++T 650000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH43: Das Erste, arte, Phoenix, EinsPlus
++T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH49: SWR-BW, BR, hr, WDR
++T 706000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH50: Das Erste, arte, Phoenix, EinsPlus
++                                            # CH50: SWR-BW, BR, hr, WDR
++T 722000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH52: Das Erste, arte, Phoenix, EinsPlus
++T 730000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH53: Das Erste, arte, Phoenix, EinsPlus
++                                            # CH53: SWR-BW, BR, hr, WDR
++T 738000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH54: Das Erste, arte, Phoenix, EinsPlus
++T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Das Erste, arte, Phoenix, EinsPlus
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Bayern dvb-apps/util/scan/dvb-t/de-Bayern
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Bayern   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/de-Bayern 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,40 @@
++# DVB-T Bayern
++# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 184500000 7MHz 3/4 NONE QAM16 8k 1/4 NONE # CH06: Das Erste, arte, Phoenix, EinsPlus
++T 191500000 7MHz 3/4 NONE QAM16 8k 1/4 NONE # CH07: Das Erste, arte, Phoenix, EinsPlus
++T 212500000 7MHz 3/4 NONE QAM16 8k 1/4 NONE # CH10: Das Erste, arte, Phoenix, EinsPlus
++T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 506000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH25: BR, BRalpha, SWR, Das Erste
++                                            # CH25: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 522000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH27: BR, BRalpha, SWR, Das Erste
++T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: BR, BRalpha, SWR, Das Erste
++                                            # CH28: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 538000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH29: Das Erste, arte, Phoenix, EinsPlus
++T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: Das Erste, arte, Phoenix, EinsPlus
++T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 578000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH34: RTL, RTL II, Super RTL, VOX
++                                            # CH34: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 586000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH35: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: Das Erste, arte, Phoenix, EinsPlus
++T 626000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH40: BR, BRalpha, hr, mdr
++                                            # CH40: Das Erste, arte, Phoenix, EinsPlus
++T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 658000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH44: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 666000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH45: BR, BRalpha, hr, mdr
++                                            # CH45: Das Erste, arte, Phoenix, EinsPlus
++T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: BR, BRalpha, SWR, Das Erste
++                                            # CH46: BR, BRalpha, hr, mdr
++T 682000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH47: BR, BRalpha, hr, mdr
++                                            # CH47: Das Erste, arte, Phoenix, EinsPlus
++T 690000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH48: Pro7, Sat.1, Kabel1, N24
++T 722000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH52: Pro7, Sat.1, Kabel1, N24
++T 730000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH53: BR, BRalpha, SWR, Das Erste
++                                            # CH53: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 738000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH54: http://www.digitalfernsehen.de/news/news_769785.html
++T 746000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH55: Das Erste, arte, Phoenix, EinsPlus
++T 754000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH56: BR, BRalpha, SWR, Das Erste
++T 770000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH58: Das Erste, arte, Phoenix, EinsPlus
++T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Tele 5, Eurosport, MonA, Franken Fernsehen
++T 834000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH66: RTL, RTL II, Super RTL, VOX
++                                            # CH66: Tele 5, Eurosport, HSE 24, münchen.tv
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Berlin dvb-apps/util/scan/dvb-t/de-Berlin
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Berlin   2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/de-Berlin 2009-06-21 13:29:06.000000000 +0200
+@@ -1,5 +1,11 @@
+ # DVB-T Berlin
++# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 522000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE     # ard / rbb
+-T 570000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE     # zdf
+-T 658000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE     # t-systems
++T 177500000 7MHz 3/4 NONE QAM16 8k 1/8 NONE # CH05: HSE 24/MONA, FAB, WDR, SWR
++T 191500000 7MHz 2/3 NONE QAM16 8k 1/8 NONE # CH07: MDR, NDR, arte
++T 506000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH25: RTL, RTL II, Super RTL, VOX
++T 522000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH27: Das Erste, RBB, Phoenix, EinsExtra
++T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 658000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH44: Pro7, Sat.1, Kabel1, N24
++T 754000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH56: Eurosport, TV.B, DSF, Neun live
++T 778000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH59: n-tv, EuroNews, + 26 Radioprogramme
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Brandenburg dvb-apps/util/scan/dvb-t/de-Brandenburg
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Brandenburg      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/de-Brandenburg    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# DVB-T Brandenburg
++# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 730000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE # CH53: Das Erste, RBB, Phoenix, EinsExtra
++T 762000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH57: MDR, NDR, arte
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Bremen dvb-apps/util/scan/dvb-t/de-Bremen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Bremen   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/de-Bremen 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,9 @@
++# DVB-T Bremen
++# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: Das Erste (RB), RB TV (NDR NDS), arte, Phoenix
++T 538000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH29: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
++T 562000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH32: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: RTL, RTL II, Super RTL, VOX
++T 666000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH45: Tele 5, Neun live, Eurosport, MONA/DMAX
++T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH49: Pro7, Sat.1, Kabel1, N24
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Hamburg dvb-apps/util/scan/dvb-t/de-Hamburg
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Hamburg  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/de-Hamburg        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,16 @@
++# DVB-T Hamburg
++# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 490000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: NDR SH, WDR/NDR NDS, MDR/NDR MVP, BR/NDR HH
++T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: Pro7, Sat.1, Kabel1, N24
++T 546000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH30: Pro7, Sat.1, Kabel1, N24
++T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: Das Erste, arte, Phoenix, EinsExtra
++T 570000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH33: Das Erste, arte, Phoenix, EinsExtra
++T 626000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH40: RTL, RTL II, Super RTL, VOX
++T 626000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH40: RTL, RTL II, Super RTL, VOX
++T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: Neun live, HH1, BibelTV, Eurosport
++T 674000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH46: Neun live, HH1, BibelTV, Eurosport
++T 738000000 8MHz 1/2 NONE QAM64 8k 1/8 NONE # CH54: NDR HH, WDR/NDR NDS, MDR/NDR MVP, BR/NDR SH
++T 738000000 8MHz 3/4 NONE QAM16 8k 1/8 NONE # CH54: NDR HH, WDR/NDR NDS, MDR/NDR MVP, BR/NDR SH
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Hessen dvb-apps/util/scan/dvb-t/de-Hessen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Hessen   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/de-Hessen 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,19 @@
++# DVB-T Hessen
++# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 198500000 7MHz 2/3 NONE QAM16 8k 1/4 NONE # CH08: Phoenix, BR, SWR-RP
++T 474000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH21: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 498000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH24: Phoenix, BR, SWR-RP, WDR
++T 506000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH25: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 562000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH32: Das Erste, hr, EinsExtra/arte
++T 578000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH34: RTL, RTL II, Super RTL, VOX
++T 602000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH37: Das Erste, hr, EinsExtra/arte
++T 618000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH39: Phoenix, BR, SWR-RP, mdr
++T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 650000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH43: Das Erste, hr, EinsExtra/arte
++T 722000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH52: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 730000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH53: BR, hr, SWR-BW, WDR
++T 738000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH54: Pro7, Sat.1, Kabel1, N24
++T 746000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH55: Phoenix, NDR, mdr, WDR
++T 818000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH64: Tele5, Eurosport, rheinmaintv
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Mecklenburg-Vorpommern dvb-apps/util/scan/dvb-t/de-Mecklenburg-Vorpommern
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Mecklenburg-Vorpommern   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/de-Mecklenburg-Vorpommern 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,12 @@
++# DVB-T Mecklenburg-Vorpommern
++# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: Das Erste, NDR MVP, RBB, MDR/NDR SH
++T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 514000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH26: Das Erste, NDR MVP, RBB, MDR/NDR SH
++T 538000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH29: Das Erste, NDR MVP, RBB, MDR/NDR SH
++T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: Das Erste, NDR MVP, RBB, MDR/NDR SH
++T 626000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH40: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 714000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH51: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 738000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH54: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Niedersachsen dvb-apps/util/scan/dvb-t/de-Niedersachsen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Niedersachsen    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/de-Niedersachsen  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,40 @@
++# DVB-T Niedersachsen
++# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 474000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH21: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
++T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: Das Erste (RB), RB TV (NDR NDS), arte, Phoenix
++                                            # CH22: Das Erste, arte, Phoenix, EinsExtra
++                                            # CH22: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
++T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 498000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH24: RTL, RTL II, Super RTL, VOX
++                                            # CH24: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 522000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH27: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: Tele 5, NICK/Comedy Central, Eurosport, MONA/DMAX
++T 538000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH29: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
++T 562000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH32: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: Das Erste, arte, Phoenix, EinsExtra
++T 586000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH35: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
++T 602000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH37: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
++T 610000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH38: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 634000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH41: Das Erste, arte, Phoenix, EinsExtra
++T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: RTL, RTL II, Super RTL, VOX
++                                            # CH42: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 650000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH43: Das Erste, arte, Phoenix, EinsExtra
++                                            # CH43: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
++T 658000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH44: Pro7, Sat.1, Kabel1, N24
++T 666000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH45: Tele 5, Neun live, Eurosport, MONA/DMAX
++T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
++T 682000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH47: Das Erste, arte, Phoenix, EinsExtra
++T 690000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH48: Das Erste, arte, Phoenix, EinsExtra
++T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH49: Pro7, Sat.1, Kabel1, N24
++T 706000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH50: Das Erste, arte, Phoenix, EinsExtra
++T 714000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH51: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
++T 746000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH55: Das Erste, arte, Phoenix, EinsExtra
++T 754000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH56: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
++T 770000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH58: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
++T 778000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH59: Das Erste, arte, Phoenix, EinsExtra
++                                            # CH59: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Tele 5, Comedy Central, Eurosport, MONA/DMAX
++                                            # CH60: Tele 5, NICK/Comedy Central, Eurosport, MONA/DMAX
++T 826000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH65: Das Erste, arte, Phoenix, EinsExtra
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Nordrhein-Westfalen dvb-apps/util/scan/dvb-t/de-Nordrhein-Westfalen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Nordrhein-Westfalen      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/de-Nordrhein-Westfalen    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,27 @@
++# DVB-T Nordrhein-Westfalen
++# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 474000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH21: Das Erste, arte, Phoenix, EinsFestival
++T 482000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH22: WDR-Wuppertal, NDR/WDR-Düsseldorf, MDR, SWR
++T 506000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH25: WDR-Dortmund, NDR/WDR-Essen, MDR, SWR
++T 514000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH26: Das Erste, arte, Phoenix, EinsFestival
++                                            # CH26: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 522000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE # CH27: WDR-Siegen, NDR, MDR, SWR
++T 538000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH29: RTL, RTL II, Super RTL, VOX
++T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 554000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE # CH31: WDR-Bielefeld, NDR/WDR-Siegen, MDR, SWR
++T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 586000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH35: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: CNN, Eurosport, Tele5, VIVA
++T 602000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE # CH37: WDR-Aachen, NDR/WDR-Köln, MDR, SWR
++T 666000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE # CH45: WDR-Münster, NDR/WDR-Dortmund, MDR, SWR
++T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: WDR-Düsseldorf, MDR/WDR-Duisburg, NDR/WDR-Wuppertal, SWR
++T 690000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH48: Das Erste, arte, Phoenix, EinsFestival
++T 698000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE # CH49: WDR-Köln, MDR/WDR-Bonn, NDR/WDR-Aachen, SWR
++T 706000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH50: Das Erste, arte, Phoenix, EinsFestival
++T 722000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH52: CNN, Eurosport, Tele5, VIVA
++T 730000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH53: Pro7, Sat.1, Kabel1, N24
++T 746000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH55: Pro7, Sat.1, Kabel1, N24
++T 762000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH57: WDR-Essen, NDR/WDR-Dortmund, MDR, SWR
++T 778000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH59: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Das Erste, arte, Phoenix, EinsFestival
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Rheinland-Pfalz dvb-apps/util/scan/dvb-t/de-Rheinland-Pfalz
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Rheinland-Pfalz  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/de-Rheinland-Pfalz        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,12 @@
++# DVB-T Rheinland-Pfalz
++# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: SWR-RP, BR, hr, WDR
++T 658000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH44: SWR-RP, BR, hr, WDR
++T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: Das Erste, arte, Phoenix, EinsPlus
++T 690000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH48: SWR-RP, BR, hr, WDR
++T 754000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH56: Das Erste, arte, Phoenix, EinsPlus
++T 762000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH57: Das Erste, arte, Phoenix, EinsPlus
++T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Das Erste, arte, Phoenix, EinsPlus
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Saarland dvb-apps/util/scan/dvb-t/de-Saarland
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Saarland 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/de-Saarland       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# DVB-T Saarland
++# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: Das Erste, SR Fernsehen, arte, Phoenix
++T 658000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH44: SWR-RP, BR, hr, WDR
++T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH49: SaarTV, Tele 5, QVC, BibelTV
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Sachsen dvb-apps/util/scan/dvb-t/de-Sachsen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Sachsen  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/de-Sachsen        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,12 @@
++# DVB-T Sachsen
++# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 205500000 7MHz 2/3 NONE QAM64 8k 1/16 NONE # CH09: MDR-SN, rbb, BR, WDR
++T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 498000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH24: Das Erste, arte, Phoenix, EinsFestival
++T 506000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH25: Das Erste, arte, Phoenix, EinsFestival
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH27: MDR-SN, rbb, BR, WDR
++T 538000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH29: MDR-SN, rbb, BR, WDR
++T 562000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH32: MDR-SN, rbb, BR, WDR
++T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 618000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH39: Das Erste, arte, Phoenix, EinsFestival
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Sachsen-Anhalt dvb-apps/util/scan/dvb-t/de-Sachsen-Anhalt
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Sachsen-Anhalt   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/de-Sachsen-Anhalt 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,12 @@
++# DVB-T Sachsen-Anhalt
++# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 498000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH24: Das Erste, arte, Phoenix, EinsFestival
++T 538000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH29: Das Erste, arte, Phoenix, EinsFestival
++T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 554000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH31: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH34: MDR-ST, rbb, NDR, WDR
++T 586000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH35: MDR-ST, rbb, NDR, WDR
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH38: MDR-ST, rbb, NDR, WDR
++T 634000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH41: Das Erste, arte, Phoenix, EinsFestival
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Schleswig-Holstein dvb-apps/util/scan/dvb-t/de-Schleswig-Holstein
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Schleswig-Holstein       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/de-Schleswig-Holstein     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,18 @@
++# DVB-T Schleswig-Holstein
++# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 474000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH21: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 514000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH26: NDR SH, WDR/NDR NDS, MDR/NDR MVP, BR/NDR HH
++T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: NDR SH, WDR/NDR NDS, MDR/NDR MVP, BR/NDR HH
++T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: Pro7, Sat.1, Kabel1, N24
++T 554000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH31: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: Das Erste, arte, Phoenix, EinsExtra
++T 586000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH35: Pro7, Sat.1, Kabel1, N24
++T 618000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH39: NDR SH, WDR/NDR NDS, MDR/NDR MVP, BR/NDR HH
++T 626000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH40: RTL, RTL II, Super RTL, VOX
++T 666000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH45: RTL, RTL II, Super RTL, VOX
++T 682000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH47: Das Erste, arte, Phoenix, EinsExtra
++T 762000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH57: Neun live, Tele 5, Eurosport, MONA/DMAX
++T 778000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH59: Neun live, Tele 5, Eurosport, MONA/DMAX
++T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Das Erste, arte, Phoenix, EinsExtra
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Thueringen dvb-apps/util/scan/dvb-t/de-Thueringen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/de-Thueringen       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/de-Thueringen     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# DVB-T Thüringen
++# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 474000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH21: Das Erste, arte, Phoenix, EinsFestival
++T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 506000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH25: Das Erste, arte, Phoenix, EinsFestival
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH27: MDR-TH, rbb, hr, BR
++T 690000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH48: MDR-TH, rbb, hr, BR
++T 706000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH50: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
++T 730000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH53: Das Erste, arte, Phoenix, EinsFestival
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/dk-All dvb-apps/util/scan/dvb-t/dk-All
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/dk-All      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/dk-All    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,17 @@
++# Denmark, whole country
++# Created from http://www.digi-tv.dk/Indhold_og_tilbud/frekvenser.asp
++# and http://www.digi-tv.dk/Sendenettets_opbygning/
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 506000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 538000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 554000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 690000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 738000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 826000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Albacete dvb-apps/util/scan/dvb-t/es-Albacete
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Albacete 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/es-Albacete       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,8 @@
++# Spain, Albacete
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 59: La Primera, La 2, Canal 24H, Clan/TVE 50, RNE1, RNE Clásica, RNE 3
++T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 63: CLMTV
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 66: Veo, Veo 2, Net TV, Teledeporte
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 67: Cuatro, CNN+, 40 Latino, La Sexta 1
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 68: Telecinco, Telecinco Sport, Telecinco Estrellas, Fly Music
++T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 69: Antena 3, Antena Neox, Antena Nova, La Sexta 2
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Alfabia dvb-apps/util/scan/dvb-t/es-Alfabia
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Alfabia  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/es-Alfabia        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,8 @@
++# DVB-T Alfabia, Mallorca, Balearic Islands, Spain.
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C.63: 24h, 50 aniv., ClanTV, La 2, TVE1; RNE 1, RNE 3, RNE C; Digitext, EPG, Lanzadera.
++T 826000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C.65: IB3, Aprenda Ingles TV
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C.66: NetTV, Teledeporte, VeoTV1, VeoTV2.
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C.67: 40 Latino TV, CNN+, Cuatro, La Sexta 1.
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C.68: Fly Music, Tele 5, Tele 5 Estrellas, Tele 5 Sport.
++T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C.69: Antena 3, La Sexta 2, Neox, Nova.
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Alicante dvb-apps/util/scan/dvb-t/es-Alicante
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Alicante 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/es-Alicante       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,9 @@
++# DVB-T Alicante, Spain
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 746000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 55: TV3, K33/33, 3/24, Canal 300
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 58: La Primera, La 2, Canal 24H, Clan/TVE 50, RNE1, RNE Clásica, RNE 3
++T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 63: Telemadrid, La Otra, Onda 6
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 66: Veo, Veo 2, Net TV, Teledeporte
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 67: Cuatro, CNN+, 40 Latino, La Sexta 1
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 68: Telecinco, Telecinco Sport, Telecinco Estrellas, Fly Music
++T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 69: Antena 3, Antena Neox, Antena Nova, La Sexta 2
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Alpicat dvb-apps/util/scan/dvb-t/es-Alpicat
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Alpicat  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/es-Alpicat        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,8 @@
++# DVB-T Alpicat (Lleida)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # c58: TV3, K3/33, 3/24, 300, 3i
++T 818000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # c64: TVE1, TVE2, Teledeporte, C24h
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # c66: TVE ClanTV, TVE 50a, Veo1, Veo2, Net
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # c67: Cuatro, 40Latino, CNN+, LaSexta 1
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # c68: T5, T5 Sports, T5 Estrellas, Net Fly Music
++T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # c69: Antena3, Antena.Neox, Antena.Nova, La Sexta 2
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Asturias dvb-apps/util/scan/dvb-t/es-Asturias
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Asturias 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/es-Asturias       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,8 @@
++# DVB-T Asturias
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # TPA TPA2
++T 818000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # TVE 1, TVE 2, 24H TVE, CLAN/50 TVE, RNE1, RNE CLASICA, RNE3
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # TELEDEPORTE, VEO TV, VEO 2, NET TV
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CUATRO, CNN+, 40 LATINO, LA SEXTA 1
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # TELECINCO, T5 ESTRELLAS, T5 SPORT, FLYMUSIC
++T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # ANTENA 3, ANTENA.NEOX, ANTENA.NOVA, LA SEXTA 2
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Bilbao dvb-apps/util/scan/dvb-t/es-Bilbao
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Bilbao   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/es-Bilbao 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 67: CNN+. Cuatro, La Sexta, 40 latino TV
++T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 69: Antena 3, La Sexta 2, Neo, Nova, Telehit, Onda Cero, Europa FM, Onda Melodia
++T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 63: La Primera, La 2, Canal 24H, Clan/TVE 50, RNE1, RNE Clásica, RNE 3
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 66: Veo, Veo 2, Net TV, Teledeporte
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 68: Telecinco, Telecinco Sport, Telecinco Estrellas, Fly Music
++T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 61: ETB1, ETB2, ETB-Sat, Canal Vasco, Euskadi Irratia, Radio Euskadi, Euskadi Gastea, Radio EITB
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Cadiz dvb-apps/util/scan/dvb-t/es-Cadiz
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Cadiz    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/es-Cadiz  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,8 @@
++# DVB-T Cadiz (Andalucia)                      by terrex  Feb 2009
++# T freq bw fec_hi fec_lo mod transm-mode guard-interval hierarchy
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE                  # C59
++T 818000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE                  # C64
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE                  # C66
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE                  # C67
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE                  # C68
++T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE                  # C69
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Carceres dvb-apps/util/scan/dvb-t/es-Carceres
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Carceres 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/es-Carceres       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 618000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 39: 8Madrid, TMT-Popular TV, Kiss TV, Intereconomía TV
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 50: EsMadrid TV, Ver-t, EM2, Libertad Digital TV
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 58: La Primera, La 2, Canal 24H, Clan/TVE 50, RNE1, RNE Clásica, RNE 3
++T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 63: Telemadrid, La Otra, Onda 6
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 66: Veo, Veo 2, Net TV, Teledeporte
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 67: Cuatro, CNN+, 40 Latino, La Sexta 1
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 68: Telecinco, Telecinco Sport, Telecinco Estrellas, Fly Music
++T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 69: Antena 3, Antena Neox, Antena Nova, La Sexta 2
++T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 61: Canal Extremadura, Extremadura Television
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Collserola dvb-apps/util/scan/dvb-t/es-Collserola
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Collserola       2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/es-Collserola     2009-06-21 13:29:06.000000000 +0200
+@@ -1,6 +1,10 @@
+ # DVB-T Collserola (Barcelona)
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 650000000 8MHz 2/3 2/3 QAM64 8k 1/32 NONE     # C43: tvc
+-T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # C61: tve, t5, a3, c+
+-T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # C66: veotv, nettv
+-
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     #c26: BTV
++T 570000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     #c33: CityTV
++T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     #c61: TV3, K3/33, 3/24, 300
++T 818000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     #c64: TVE1, TVE2, TVE 24H, Clan/TVE 50 Años, RNE1, RNEC, RNE3
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     #c66: Veo TV, Veo2, Net TV, Teledeporte
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     #c67: Cuatro, CNN+, 40 Latino, La Sexta1
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     #c68: Telecino, T5 Sport, T5 Estrellas, Fly Music
++T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     #c69: Antena 3, Antena.Neox, Antena.Nova, La Sexta2
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Donostia dvb-apps/util/scan/dvb-t/es-Donostia
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Donostia 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/es-Donostia       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,14 @@
++# The channels with 1/32 guard-interval are French and should be perfectly visible
++# here. However I have only managed to get a lock for the channel 57 of the French ones.
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 562000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 32: CNN+, Cuatro, La Sexta 1, 40 Latino TV, EPG Soge V2 5
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 40: Antena 3, Antena.Neox, Antena.Nova, Telehit, Onda Cero, Europa FM, Onda Melodia, A3Lanzadera, A3Portal, EPGA3, A3Ticker
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE   # Canal 42: Direct8, TMC, BFM, iTele, Europe2TV, Gulli
++T 698000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE   # Canal 49: M6, W9, NT1
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE   # Canal 51: Canal+, Canal+ Cinema, Canal+ Sport
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE   # Canal 57: TF1, NRJ12, Eurosport, TPS Star, LCI
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 60: ETB1, ETB2, ETB-Sat, Canal Vasco, Euskadi Irratia, Radio Euskadi, Euskadi Gaztea, Radio Etb, TGov, Eguraldi
++T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 63: TVE1, TVE2, 24H TVE, Clan/TVE 50 anos, RNE, RNEC, RNE3, Lanzadera, EPG, Digitext, Meteo, Bolsa, Trafico, Empleat
++T 826000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE   # Canal 65: France 2, France 3, France 4, France 5, Arte, LCP
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 66: Net TV, Teledeporte, Veo TV1, Veo TV2, Lanzadera, EPG, Digitext, Meteo, Bolsa, Trafico, Empleat
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 68: Fly Music, Tele 5, Tele 5 Estrellas, Tele 5 Sport
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Huesca dvb-apps/util/scan/dvb-t/es-Huesca
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Huesca   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/es-Huesca 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,8 @@
++# DVB-T Huesca (Aragón) [Spain] [es-Huesca]
++# Generated by Vicente Hernando Ara <bizenton@gmail.com>
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # Canal 57: ARAGON TV, ARAGON RADIO, ARAGON HD
++T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE  # Canal 61: La 1, La 2, 24h, Clan, RNE1, RNEC, RNE3
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE  # Canal 66: Teledeporte, Canal Ingenieria, VEO7, SONY TV en VEO, Tienda en VEO, GUIDE PLUS+, Intereconomia, Radio Intereconomia, RADIO MARCA
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE  # Canal 67: laSexta, CUATRO, CNN+, 40 LATINO, PROMO, SER, 40 PRINCIPALES, CADENA DIAL
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE  # Canal 68: Telecinco, FDF, Telecinco 2, Disney Channel, Cincoshop
++T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE  # Canal 69: ANTENA 3, ANTENA.NEOX, ANTENA.NOVA, ONDA CERO, EUROPA FM, ONDA MELODÍA, HOGAR 10
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Las_Palmas dvb-apps/util/scan/dvb-t/es-Las_Palmas
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Las_Palmas       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/es-Las_Palmas     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,8 @@
++# Funciona correctamente en Las Palmas de Gran Canaria (24-4-2007)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 60: TVE1, TVE2, 24H TVE, Clan/TVE, RNE, RNEC, RNE3, Lanzadera, EPG, Digitext, Meteo, Bolsa, Trafico, Empleat
++T 826000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 65: TV C, TV C2
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 66: Net TV, Teledeporte, Veo TV1, SETenVeo, Radio Intereconomía Lanzadera, EPG, Digitext, Meteo, Bolsa, Trafico, Empleat
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 67: CNN+, Cuatro, La Sexta 1, 40 Latino TV, EPG Soge V2 5
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 68: Fly Music, Punto Radio, Tele 5, Tele 5 Estrellas, Tele 5 Sport
++T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 69: Antena 3, Antena.Neox, Antena.Nova, Telehit, Onda Cero, Europa FM, Onda Melodia, A3Lanzadera, A3Portal, EPGA3, A3Ticker
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Lugo dvb-apps/util/scan/dvb-t/es-Lugo
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Lugo     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/es-Lugo   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,9 @@
++# DVB-T Lugo (Centro emisor Paramo) - Rev. 1.2 - 11.12.05
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # TVE 1, TVE 2, 24H TVE, CLAN/50 TVE, RNE1, RNE CLASICA, RNE3
++T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # TVG, GALICIA TV AMERICA, RADIO GALEGA, R.GALEGA MUSICA, SON GALICIA RADIO, PROBAS RETEGAL
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # TELEDEPORTE, VEO TV, VEO 2, NET TV
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # CUATRO, CNN+, 40 LATINO, LA SEXTA 1
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # TELECINCO, T5 ESTRELLAS, T5 SPORT, FLYMUSIC
++T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # ANTENA 3, ANTENA.NEOX, ANTENA.NOVA, LA SEXTA 2
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Madrid dvb-apps/util/scan/dvb-t/es-Madrid
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Madrid   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/es-Madrid 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,8 @@
++T 618000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 39: 8Madrid, TMT-Popular TV, Kiss TV, Intereconomía TV
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 50: EsMadrid TV, Ver-t, EM2, Libertad Digital TV
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 58: La Primera, La 2, Canal 24H, Clan/TVE 50, RNE1, RNE Clásica, RNE 3
++T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 63: Telemadrid, La Otra, Onda 6
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 66: Veo, Veo 2, Net TV, Teledeporte
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 67: Cuatro, CNN+, 40 Latino, La Sexta 1
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 68: Telecinco, Telecinco Sport, Telecinco Estrellas, Fly Music
++T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 69: Antena 3, Antena Neox, Antena Nova, La Sexta 2
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Malaga dvb-apps/util/scan/dvb-t/es-Malaga
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Malaga   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/es-Malaga 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,9 @@
++# DVB-T Malaga (Andalucia)                   by Pedro Leon 4 Mayo 2007
++# T freq bw fec_hi fec_lo mod transm-mode guard-interval hierarchy
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C57 La Primera, La 2, Canal 24H, Clan/TVE 50, RNE1, RNE Clásica, RNE 3
++T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C63 Canal Sur, Canal 2 Andalucia
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C66 TELEDEPORTE, VEO, *Canal Ingenieria, SETenVEO, Tienda en VEO, NET TV, Radio Intereconomia
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C67 CUATRO, CNN+, 40 LATINO, laSexta
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C68 Telecinco, T5 Estrellas, T5 Sport, FLYMUSIC, PUNTO RADIO
++T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C69 ANTENA 3, ANTENA.NEOX, ANTENA.NOVA, *tvtv DIGITAL, ONDA CERO, EUROPA FM, ONDA MELODIA, Telehit
++# * Canales de datos o MHT
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Muros-Noia dvb-apps/util/scan/dvb-t/es-Muros-Noia
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Muros-Noia       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/es-Muros-Noia     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,9 @@
++# DVB-T Muros and Noia
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # Canal 27: Local Ribeira
++T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # Canal 61: RAR A Corunha
++T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # Canal 63: RGE Galicia
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # Canal 66: SFN 1
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # Canal 67: SFN 2
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # Canal 68: SFN 3
++T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # Canal 69: SFN 4
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Mussara dvb-apps/util/scan/dvb-t/es-Mussara
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Mussara  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/es-Mussara        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,8 @@
++# DVB-T La Mussara (Reus-Tarragona)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # c59: TV3, K3/33, 3/24, 300, 3i
++T 818000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # c64: TVE1, TVE2, Teledeporte, C24h
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # c66: TVE ClanTV, TVE 50a, Veo1, Veo2, Net
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # c67: Cuatro, 40Latino, CNN+, LaSexta 1
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # c68: T5, T5 Sports, T5 Estrellas, Net Fly Music
++T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # c69: Antena3, Antena.Neox, Antena.Nova, La Sexta 2
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Rocacorba dvb-apps/util/scan/dvb-t/es-Rocacorba
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Rocacorba        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/es-Rocacorba      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# DVB-T Rocacorba (Girona)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # TVE 1, TVE 2, ANTENA 3, TELECINCO, CUATRO
++T 818000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # TV3, K3/33, 3XL.NET, 3/24, CANAL PILOT
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # SERVICIO PRUEBAS CANAL 67
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     #
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Santander dvb-apps/util/scan/dvb-t/es-Santander
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Santander        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/es-Santander      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# file automatically generated by w_scan
++# (http://wirbel.htpc-forum.de/w_scan/index2.html)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Santiago_de_Compostela dvb-apps/util/scan/dvb-t/es-Santiago_de_Compostela
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Santiago_de_Compostela   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/es-Santiago_de_Compostela 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,9 @@
++# DVB-T Santiago de Compostela
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 490000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # Canal 23: Local Santiago
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # Canal 40: RAR Santiago
++T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # Canal 63: RGE Galicia
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # Canal 66: SFN 1
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # Canal 67: SFN 2
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # Canal 68: SFN 3
++T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # Canal 69: SFN 4
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Sevilla dvb-apps/util/scan/dvb-t/es-Sevilla
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Sevilla  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/es-Sevilla        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,8 @@
++# DVB-T Sevilla (Andalucia)                   by x2 15 Agosto 2006
++# T freq bw fec_hi fec_lo mod transm-mode guard-interval hierarchy
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE                  # C57
++T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE                  # C61
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE                  # C66
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE                  # C67
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE                  # C68
++T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE                  # C69
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Valencia dvb-apps/util/scan/dvb-t/es-Valencia
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Valencia 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/es-Valencia       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,9 @@
++# DVB-T Valencia, Spain
++T 490000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # Canal 23: TMV, Tele 7, Aprende ingles TV, Ed. Prensa Val.,R.Mediamed
++T 746000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # Canal 55: TV3, 33, 3/24, K3/300
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # Canal 57: Canal 9, Punt 2, Popular TV, LP Teva, Radio 9, Si Radio
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # Canal 58: TVE 1, La 2, 24H TVE, Clan TVE, RNE 1, RNE C, RNE 3
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # Canal 66: Veo, Sony TV en Veo, Tienda en Veo, Intereconomia, Teledeporte, R. Interec., R. Marca
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # Canal 67: Cuatro, CNN+, 40 Latino, Promo, La Sexta, Ser, 40 Princ., Cad. Dial
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # Canal 68: Telecinco, Telecinco 2, FDF, Cinco Shop, Disney Channel, Punto Radio
++T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE     # Canal 69: Antena 3, Antena Neox, Antena Nova, Hogar 10, Onda Cero, Europa FM, Onda Melodia
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Valladolid dvb-apps/util/scan/dvb-t/es-Valladolid
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Valladolid       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/es-Valladolid     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# DVB-T Valladolid
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 57: Clan TVE, 24H TVE, La 2, TVE 1, RNE1, RNE3, RNC
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 66: Veo, Veo 2, Net TV, Teledeporte
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 67: Cuatro, CNN+, 40 Latino, La Sexta 1
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 68: Telecinco, Telecinco Sport, Telecinco Estrellas, Fly Music
++T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE    # Canal 69: Antena 3, Antena Neox, Antena Nova, La Sexta 2
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Vilamarxant dvb-apps/util/scan/dvb-t/es-Vilamarxant
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Vilamarxant      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/es-Vilamarxant    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# DVB-T Vilamarxant, Valencia, C. Valenciana, Spain.
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Zaragoza dvb-apps/util/scan/dvb-t/es-Zaragoza
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/es-Zaragoza 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/es-Zaragoza       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# DVB-T Zaragoza (Aragón) [Spain] [es-Zaragoza]
++# Generated by Víctor Martínez Romanos <vmromanos@gmail.com>
++T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE      # Canal 63: TVE 1, TVE 2, 24H, CLAN/50, RNE1, RNEC, RNE3
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE      # Canal 66: TELEDEPORTE, VEO TV, VEO 2, NET TV
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE      # Canal 67: CUATRO, CNN+, 40 LATINO, LA SEXTA 1
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE      # Canal 68: T5 ESTRELLAS, T5 SPORT, TELECINCO, FLYMUSIC
++T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE      # Canal 69: ANTENA 3, ANTENA.NEOX, ANTENA.NOVA, LA SEXTA 2
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Aanekoski dvb-apps/util/scan/dvb-t/fi-Aanekoski
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Aanekoski        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Aanekoski      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 826000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Aanekoski_Konginkangas dvb-apps/util/scan/dvb-t/fi-Aanekoski_Konginkangas
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Aanekoski_Konginkangas   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Aanekoski_Konginkangas 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ahtari dvb-apps/util/scan/dvb-t/fi-Ahtari
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ahtari   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Ahtari 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Alajarvi dvb-apps/util/scan/dvb-t/fi-Alajarvi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Alajarvi 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Alajarvi       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ala-Vuokki dvb-apps/util/scan/dvb-t/fi-Ala-Vuokki
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ala-Vuokki       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Ala-Vuokki     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ammansaari dvb-apps/util/scan/dvb-t/fi-Ammansaari
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ammansaari       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Ammansaari     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Anjalankoski dvb-apps/util/scan/dvb-t/fi-Anjalankoski
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Anjalankoski     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Anjalankoski   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Enontekio_Ahovaara_Raattama dvb-apps/util/scan/dvb-t/fi-Enontekio_Ahovaara_Raattama
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Enontekio_Ahovaara_Raattama      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Enontekio_Ahovaara_Raattama    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Espoo dvb-apps/util/scan/dvb-t/fi-Espoo
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Espoo    2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Espoo  2009-06-21 13:29:06.000000000 +0200
+@@ -1,3 +1,6 @@
+-# Espoo A-mux (Digita Finland)
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+ T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Eurajoki dvb-apps/util/scan/dvb-t/fi-Eurajoki
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Eurajoki 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Eurajoki       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Fiskars dvb-apps/util/scan/dvb-t/fi-Fiskars
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Fiskars  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Fiskars        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Haapavesi dvb-apps/util/scan/dvb-t/fi-Haapavesi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Haapavesi        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Haapavesi      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hameenkyro_Kyroskoski dvb-apps/util/scan/dvb-t/fi-Hameenkyro_Kyroskoski
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hameenkyro_Kyroskoski    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Hameenkyro_Kyroskoski  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hameenlinna_Painokangas dvb-apps/util/scan/dvb-t/fi-Hameenlinna_Painokangas
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hameenlinna_Painokangas  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Hameenlinna_Painokangas        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hanko dvb-apps/util/scan/dvb-t/fi-Hanko
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hanko    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Hanko  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hartola dvb-apps/util/scan/dvb-t/fi-Hartola
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hartola  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Hartola        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Heinavesi dvb-apps/util/scan/dvb-t/fi-Heinavesi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Heinavesi        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Heinavesi      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Heinola dvb-apps/util/scan/dvb-t/fi-Heinola
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Heinola  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Heinola        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 826000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hetta dvb-apps/util/scan/dvb-t/fi-Hetta
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hetta    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Hetta  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Houtskari dvb-apps/util/scan/dvb-t/fi-Houtskari
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Houtskari        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Houtskari      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hyrynsalmi dvb-apps/util/scan/dvb-t/fi-Hyrynsalmi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hyrynsalmi       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Hyrynsalmi     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hyrynsalmi_Kyparavaara dvb-apps/util/scan/dvb-t/fi-Hyrynsalmi_Kyparavaara
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hyrynsalmi_Kyparavaara   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Hyrynsalmi_Kyparavaara 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hyrynsalmi_Paljakka dvb-apps/util/scan/dvb-t/fi-Hyrynsalmi_Paljakka
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hyrynsalmi_Paljakka      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Hyrynsalmi_Paljakka    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hyvinkaa_Musta-Mannisto dvb-apps/util/scan/dvb-t/fi-Hyvinkaa_Musta-Mannisto
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Hyvinkaa_Musta-Mannisto  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Hyvinkaa_Musta-Mannisto        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 538000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ii_Raiskio dvb-apps/util/scan/dvb-t/fi-Ii_Raiskio
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ii_Raiskio       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Ii_Raiskio     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Iisalmi dvb-apps/util/scan/dvb-t/fi-Iisalmi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Iisalmi  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Iisalmi        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ikaalinen dvb-apps/util/scan/dvb-t/fi-Ikaalinen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ikaalinen        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Ikaalinen      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 538000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ikaalinen_Riitiala dvb-apps/util/scan/dvb-t/fi-Ikaalinen_Riitiala
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ikaalinen_Riitiala       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Ikaalinen_Riitiala     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 738000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Inari dvb-apps/util/scan/dvb-t/fi-Inari
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Inari    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Inari  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Inari_Janispaa dvb-apps/util/scan/dvb-t/fi-Inari_Janispaa
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Inari_Janispaa   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Inari_Janispaa 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Inari_Naatamo dvb-apps/util/scan/dvb-t/fi-Inari_Naatamo
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Inari_Naatamo    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Inari_Naatamo  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ivalo_Saarineitamovaara dvb-apps/util/scan/dvb-t/fi-Ivalo_Saarineitamovaara
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ivalo_Saarineitamovaara  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Ivalo_Saarineitamovaara        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Jalasjarvi dvb-apps/util/scan/dvb-t/fi-Jalasjarvi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Jalasjarvi       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Jalasjarvi     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Jamsa_Kaipola dvb-apps/util/scan/dvb-t/fi-Jamsa_Kaipola
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Jamsa_Kaipola    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Jamsa_Kaipola  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 538000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Jamsa_Kuorevesi_Halli dvb-apps/util/scan/dvb-t/fi-Jamsa_Kuorevesi_Halli
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Jamsa_Kuorevesi_Halli    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Jamsa_Kuorevesi_Halli  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Jamsa_Matkosvuori dvb-apps/util/scan/dvb-t/fi-Jamsa_Matkosvuori
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Jamsa_Matkosvuori        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Jamsa_Matkosvuori      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 538000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Jamsankoski dvb-apps/util/scan/dvb-t/fi-Jamsankoski
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Jamsankoski      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Jamsankoski    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Jamsa_Ouninpohja dvb-apps/util/scan/dvb-t/fi-Jamsa_Ouninpohja
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Jamsa_Ouninpohja 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Jamsa_Ouninpohja       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 498000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Joensuu_Vestinkallio dvb-apps/util/scan/dvb-t/fi-Joensuu_Vestinkallio
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Joensuu_Vestinkallio     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Joensuu_Vestinkallio   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Joroinen_Puukkola dvb-apps/util/scan/dvb-t/fi-Joroinen_Puukkola
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Joroinen_Puukkola        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Joroinen_Puukkola      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Joutsa_Lankia dvb-apps/util/scan/dvb-t/fi-Joutsa_Lankia
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Joutsa_Lankia    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Joutsa_Lankia  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Joutseno dvb-apps/util/scan/dvb-t/fi-Joutseno
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Joutseno 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Joutseno       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 586000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Juntusranta dvb-apps/util/scan/dvb-t/fi-Juntusranta
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Juntusranta      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Juntusranta    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Juupajoki_Kopsamo dvb-apps/util/scan/dvb-t/fi-Juupajoki_Kopsamo
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Juupajoki_Kopsamo        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Juupajoki_Kopsamo      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Jyvaskyla dvb-apps/util/scan/dvb-t/fi-Jyvaskyla
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Jyvaskyla        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Jyvaskyla      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Jyvaskylan_mlk_Vaajakoski dvb-apps/util/scan/dvb-t/fi-Jyvaskylan_mlk_Vaajakoski
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Jyvaskylan_mlk_Vaajakoski        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Jyvaskylan_mlk_Vaajakoski      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kaavi_Sivakkavaara_Luikonlahti dvb-apps/util/scan/dvb-t/fi-Kaavi_Sivakkavaara_Luikonlahti
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kaavi_Sivakkavaara_Luikonlahti   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Kaavi_Sivakkavaara_Luikonlahti 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kajaani_Pollyvaara dvb-apps/util/scan/dvb-t/fi-Kajaani_Pollyvaara
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kajaani_Pollyvaara       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Kajaani_Pollyvaara     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kalajoki dvb-apps/util/scan/dvb-t/fi-Kalajoki
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kalajoki 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Kalajoki       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kangaslampi dvb-apps/util/scan/dvb-t/fi-Kangaslampi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kangaslampi      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Kangaslampi    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kangasniemi_Turkinmaki dvb-apps/util/scan/dvb-t/fi-Kangasniemi_Turkinmaki
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kangasniemi_Turkinmaki   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Kangasniemi_Turkinmaki 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kankaanpaa dvb-apps/util/scan/dvb-t/fi-Kankaanpaa
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kankaanpaa       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Kankaanpaa     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Karigasniemi dvb-apps/util/scan/dvb-t/fi-Karigasniemi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Karigasniemi     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Karigasniemi   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Karkkila dvb-apps/util/scan/dvb-t/fi-Karkkila
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Karkkila 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Karkkila       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Karstula dvb-apps/util/scan/dvb-t/fi-Karstula
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Karstula 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Karstula       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Karvia dvb-apps/util/scan/dvb-t/fi-Karvia
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Karvia   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Karvia 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kaunispaa dvb-apps/util/scan/dvb-t/fi-Kaunispaa
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kaunispaa        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Kaunispaa      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kemijarvi_Suomutunturi dvb-apps/util/scan/dvb-t/fi-Kemijarvi_Suomutunturi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kemijarvi_Suomutunturi   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Kemijarvi_Suomutunturi 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kerimaki dvb-apps/util/scan/dvb-t/fi-Kerimaki
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kerimaki 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Kerimaki       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Keuruu dvb-apps/util/scan/dvb-t/fi-Keuruu
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Keuruu   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Keuruu 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 826000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Keuruu_Haapamaki dvb-apps/util/scan/dvb-t/fi-Keuruu_Haapamaki
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Keuruu_Haapamaki 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Keuruu_Haapamaki       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kihnio dvb-apps/util/scan/dvb-t/fi-Kihnio
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kihnio   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Kihnio 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 738000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kiihtelysvaara dvb-apps/util/scan/dvb-t/fi-Kiihtelysvaara
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kiihtelysvaara   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Kiihtelysvaara 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kilpisjarvi dvb-apps/util/scan/dvb-t/fi-Kilpisjarvi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kilpisjarvi      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Kilpisjarvi    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kittila_Sirkka_Levitunturi dvb-apps/util/scan/dvb-t/fi-Kittila_Sirkka_Levitunturi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kittila_Sirkka_Levitunturi       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Kittila_Sirkka_Levitunturi     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kolari_Vuolittaja dvb-apps/util/scan/dvb-t/fi-Kolari_Vuolittaja
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kolari_Vuolittaja        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Kolari_Vuolittaja      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Koli dvb-apps/util/scan/dvb-t/fi-Koli
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Koli     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Koli   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Korpilahti_Vaarunvuori dvb-apps/util/scan/dvb-t/fi-Korpilahti_Vaarunvuori
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Korpilahti_Vaarunvuori   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Korpilahti_Vaarunvuori 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Korppoo dvb-apps/util/scan/dvb-t/fi-Korppoo
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Korppoo  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Korppoo        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kruunupyy dvb-apps/util/scan/dvb-t/fi-Kruunupyy
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kruunupyy        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Kruunupyy      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuhmo_Iivantiira dvb-apps/util/scan/dvb-t/fi-Kuhmo_Iivantiira
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuhmo_Iivantiira 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Kuhmo_Iivantiira       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuhmoinen dvb-apps/util/scan/dvb-t/fi-Kuhmoinen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuhmoinen        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Kuhmoinen      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuhmoinen_Harjunsalmi dvb-apps/util/scan/dvb-t/fi-Kuhmoinen_Harjunsalmi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuhmoinen_Harjunsalmi    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Kuhmoinen_Harjunsalmi  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuhmoinen_Puukkoinen dvb-apps/util/scan/dvb-t/fi-Kuhmoinen_Puukkoinen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuhmoinen_Puukkoinen     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Kuhmoinen_Puukkoinen   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuhmo_Lentiira dvb-apps/util/scan/dvb-t/fi-Kuhmo_Lentiira
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuhmo_Lentiira   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Kuhmo_Lentiira 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 498000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuhmo_Tikkasenmaki dvb-apps/util/scan/dvb-t/fi-Kuhmo_Tikkasenmaki
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuhmo_Tikkasenmaki       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Kuhmo_Tikkasenmaki     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuopio dvb-apps/util/scan/dvb-t/fi-Kuopio
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuopio   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Kuopio 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 498000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kustavi_Viherlahti dvb-apps/util/scan/dvb-t/fi-Kustavi_Viherlahti
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kustavi_Viherlahti       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Kustavi_Viherlahti     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 738000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuttanen dvb-apps/util/scan/dvb-t/fi-Kuttanen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuttanen 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Kuttanen       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuusamo_Hamppulampi dvb-apps/util/scan/dvb-t/fi-Kuusamo_Hamppulampi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kuusamo_Hamppulampi      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Kuusamo_Hamppulampi    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kyyjarvi_Noposenaho dvb-apps/util/scan/dvb-t/fi-Kyyjarvi_Noposenaho
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Kyyjarvi_Noposenaho      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Kyyjarvi_Noposenaho    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 586000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Lahti dvb-apps/util/scan/dvb-t/fi-Lahti
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Lahti    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Lahti  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Lapua dvb-apps/util/scan/dvb-t/fi-Lapua
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Lapua    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Lapua  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Laukaa dvb-apps/util/scan/dvb-t/fi-Laukaa
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Laukaa   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Laukaa 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Laukaa_Vihtavuori dvb-apps/util/scan/dvb-t/fi-Laukaa_Vihtavuori
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Laukaa_Vihtavuori        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Laukaa_Vihtavuori      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Lavia_Lavianjarvi dvb-apps/util/scan/dvb-t/fi-Lavia_Lavianjarvi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Lavia_Lavianjarvi        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Lavia_Lavianjarvi      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 498000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Lieksa_Vieki dvb-apps/util/scan/dvb-t/fi-Lieksa_Vieki
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Lieksa_Vieki     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Lieksa_Vieki   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Lohja dvb-apps/util/scan/dvb-t/fi-Lohja
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Lohja    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Lohja  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Loimaa dvb-apps/util/scan/dvb-t/fi-Loimaa
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Loimaa   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Loimaa 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Luhanka dvb-apps/util/scan/dvb-t/fi-Luhanka
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Luhanka  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Luhanka        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Luopioinen dvb-apps/util/scan/dvb-t/fi-Luopioinen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Luopioinen       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Luopioinen     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Mantta dvb-apps/util/scan/dvb-t/fi-Mantta
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Mantta   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Mantta 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Mantyharju dvb-apps/util/scan/dvb-t/fi-Mantyharju
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Mantyharju       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Mantyharju     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Mikkeli dvb-apps/util/scan/dvb-t/fi-Mikkeli
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Mikkeli  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Mikkeli        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 538000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Muonio_Olostunturi dvb-apps/util/scan/dvb-t/fi-Muonio_Olostunturi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Muonio_Olostunturi       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Muonio_Olostunturi     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Nilsia dvb-apps/util/scan/dvb-t/fi-Nilsia
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Nilsia   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Nilsia 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Nilsia_Keski-Siikajarvi dvb-apps/util/scan/dvb-t/fi-Nilsia_Keski-Siikajarvi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Nilsia_Keski-Siikajarvi  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Nilsia_Keski-Siikajarvi        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Nilsia_Pisa dvb-apps/util/scan/dvb-t/fi-Nilsia_Pisa
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Nilsia_Pisa      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Nilsia_Pisa    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 498000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Nokia dvb-apps/util/scan/dvb-t/fi-Nokia
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Nokia    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Nokia  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 826000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Nokia_Siuro_Linnavuori dvb-apps/util/scan/dvb-t/fi-Nokia_Siuro_Linnavuori
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Nokia_Siuro_Linnavuori   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Nokia_Siuro_Linnavuori 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Nummi-Pusula_Hyonola dvb-apps/util/scan/dvb-t/fi-Nummi-Pusula_Hyonola
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Nummi-Pusula_Hyonola     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Nummi-Pusula_Hyonola   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Nurmes_Kortevaara dvb-apps/util/scan/dvb-t/fi-Nurmes_Kortevaara
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Nurmes_Kortevaara        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Nurmes_Kortevaara      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Orivesi_Langelmaki_Talviainen dvb-apps/util/scan/dvb-t/fi-Orivesi_Langelmaki_Talviainen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Orivesi_Langelmaki_Talviainen    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Orivesi_Langelmaki_Talviainen  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Oulu dvb-apps/util/scan/dvb-t/fi-Oulu
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Oulu     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Oulu   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 738000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Padasjoki dvb-apps/util/scan/dvb-t/fi-Padasjoki
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Padasjoki        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Padasjoki      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Padasjoki_Arrakoski dvb-apps/util/scan/dvb-t/fi-Padasjoki_Arrakoski
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Padasjoki_Arrakoski      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Padasjoki_Arrakoski    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 498000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Paltamo_Kivesvaara dvb-apps/util/scan/dvb-t/fi-Paltamo_Kivesvaara
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Paltamo_Kivesvaara       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Paltamo_Kivesvaara     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Parikkala dvb-apps/util/scan/dvb-t/fi-Parikkala
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Parikkala        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Parikkala      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Parkano dvb-apps/util/scan/dvb-t/fi-Parkano
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Parkano  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Parkano        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pello dvb-apps/util/scan/dvb-t/fi-Pello
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pello    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Pello  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pello_Ratasvaara dvb-apps/util/scan/dvb-t/fi-Pello_Ratasvaara
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pello_Ratasvaara 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Pello_Ratasvaara       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Perho dvb-apps/util/scan/dvb-t/fi-Perho
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Perho    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Perho  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pernaja dvb-apps/util/scan/dvb-t/fi-Pernaja
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pernaja  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Pernaja        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pieksamaki_Halkokumpu dvb-apps/util/scan/dvb-t/fi-Pieksamaki_Halkokumpu
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pieksamaki_Halkokumpu    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Pieksamaki_Halkokumpu  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pihtipudas dvb-apps/util/scan/dvb-t/fi-Pihtipudas
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pihtipudas       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Pihtipudas     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Porvoo_Suomenkyla dvb-apps/util/scan/dvb-t/fi-Porvoo_Suomenkyla
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Porvoo_Suomenkyla        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Porvoo_Suomenkyla      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Posio dvb-apps/util/scan/dvb-t/fi-Posio
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Posio    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Posio  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pudasjarvi dvb-apps/util/scan/dvb-t/fi-Pudasjarvi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pudasjarvi       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Pudasjarvi     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pudasjarvi_Iso-Syote dvb-apps/util/scan/dvb-t/fi-Pudasjarvi_Iso-Syote
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pudasjarvi_Iso-Syote     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Pudasjarvi_Iso-Syote   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pudasjarvi_Kangasvaara dvb-apps/util/scan/dvb-t/fi-Pudasjarvi_Kangasvaara
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pudasjarvi_Kangasvaara   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Pudasjarvi_Kangasvaara 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 538000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Puolanka dvb-apps/util/scan/dvb-t/fi-Puolanka
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Puolanka 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Puolanka       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pyhatunturi dvb-apps/util/scan/dvb-t/fi-Pyhatunturi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pyhatunturi      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Pyhatunturi    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pyhavuori dvb-apps/util/scan/dvb-t/fi-Pyhavuori
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pyhavuori        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Pyhavuori      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 586000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pylkonmaki_Karankajarvi dvb-apps/util/scan/dvb-t/fi-Pylkonmaki_Karankajarvi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Pylkonmaki_Karankajarvi  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Pylkonmaki_Karankajarvi        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Raahe_Mestauskallio dvb-apps/util/scan/dvb-t/fi-Raahe_Mestauskallio
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Raahe_Mestauskallio      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Raahe_Mestauskallio    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Raahe_Piehinki dvb-apps/util/scan/dvb-t/fi-Raahe_Piehinki
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Raahe_Piehinki   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Raahe_Piehinki 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ranua_Haasionmaa dvb-apps/util/scan/dvb-t/fi-Ranua_Haasionmaa
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ranua_Haasionmaa 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Ranua_Haasionmaa       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ranua_Leppiaho dvb-apps/util/scan/dvb-t/fi-Ranua_Leppiaho
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ranua_Leppiaho   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Ranua_Leppiaho 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rautavaara_Angervikko dvb-apps/util/scan/dvb-t/fi-Rautavaara_Angervikko
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rautavaara_Angervikko    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Rautavaara_Angervikko  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 738000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rautjarvi_Simpele dvb-apps/util/scan/dvb-t/fi-Rautjarvi_Simpele
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rautjarvi_Simpele        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Rautjarvi_Simpele      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ristijarvi dvb-apps/util/scan/dvb-t/fi-Ristijarvi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ristijarvi       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Ristijarvi     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rovaniemi dvb-apps/util/scan/dvb-t/fi-Rovaniemi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rovaniemi        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Rovaniemi      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rovaniemi_Ala-Nampa_Yli-Nampa_Rantalaki dvb-apps/util/scan/dvb-t/fi-Rovaniemi_Ala-Nampa_Yli-Nampa_Rantalaki
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rovaniemi_Ala-Nampa_Yli-Nampa_Rantalaki  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Rovaniemi_Ala-Nampa_Yli-Nampa_Rantalaki        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rovaniemi_Kaihuanvaara dvb-apps/util/scan/dvb-t/fi-Rovaniemi_Kaihuanvaara
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rovaniemi_Kaihuanvaara   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Rovaniemi_Kaihuanvaara 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rovaniemi_Karhuvaara_Marrasjarvi dvb-apps/util/scan/dvb-t/fi-Rovaniemi_Karhuvaara_Marrasjarvi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rovaniemi_Karhuvaara_Marrasjarvi 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Rovaniemi_Karhuvaara_Marrasjarvi       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rovaniemi_Marasenkallio dvb-apps/util/scan/dvb-t/fi-Rovaniemi_Marasenkallio
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rovaniemi_Marasenkallio  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Rovaniemi_Marasenkallio        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rovaniemi_Meltaus_Sorviselka dvb-apps/util/scan/dvb-t/fi-Rovaniemi_Meltaus_Sorviselka
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rovaniemi_Meltaus_Sorviselka     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Rovaniemi_Meltaus_Sorviselka   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rovaniemi_Sonka dvb-apps/util/scan/dvb-t/fi-Rovaniemi_Sonka
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Rovaniemi_Sonka  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Rovaniemi_Sonka        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ruka dvb-apps/util/scan/dvb-t/fi-Ruka
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ruka     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Ruka   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ruovesi_Storminiemi dvb-apps/util/scan/dvb-t/fi-Ruovesi_Storminiemi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ruovesi_Storminiemi      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Ruovesi_Storminiemi    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Saarijarvi dvb-apps/util/scan/dvb-t/fi-Saarijarvi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Saarijarvi       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Saarijarvi     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Saarijarvi_Kalmari dvb-apps/util/scan/dvb-t/fi-Saarijarvi_Kalmari
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Saarijarvi_Kalmari       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Saarijarvi_Kalmari     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Saarijarvi_Mahlu dvb-apps/util/scan/dvb-t/fi-Saarijarvi_Mahlu
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Saarijarvi_Mahlu 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Saarijarvi_Mahlu       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Salla_Hirvasvaara dvb-apps/util/scan/dvb-t/fi-Salla_Hirvasvaara
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Salla_Hirvasvaara        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Salla_Hirvasvaara      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Salla_Ihistysjanka dvb-apps/util/scan/dvb-t/fi-Salla_Ihistysjanka
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Salla_Ihistysjanka       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Salla_Ihistysjanka     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Salla_Naruska dvb-apps/util/scan/dvb-t/fi-Salla_Naruska
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Salla_Naruska    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Salla_Naruska  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Salla_Sallatunturi dvb-apps/util/scan/dvb-t/fi-Salla_Sallatunturi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Salla_Sallatunturi       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Salla_Sallatunturi     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Salla_Sarivaara dvb-apps/util/scan/dvb-t/fi-Salla_Sarivaara
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Salla_Sarivaara  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Salla_Sarivaara        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Salo_Isokyla dvb-apps/util/scan/dvb-t/fi-Salo_Isokyla
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Salo_Isokyla     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Salo_Isokyla   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Savukoski_Martti_Haarahonganmaa dvb-apps/util/scan/dvb-t/fi-Savukoski_Martti_Haarahonganmaa
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Savukoski_Martti_Haarahonganmaa  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Savukoski_Martti_Haarahonganmaa        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Savukoski_Tanhua dvb-apps/util/scan/dvb-t/fi-Savukoski_Tanhua
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Savukoski_Tanhua 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Savukoski_Tanhua       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Siilinjarvi dvb-apps/util/scan/dvb-t/fi-Siilinjarvi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Siilinjarvi      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Siilinjarvi    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Sipoo_Norrkulla dvb-apps/util/scan/dvb-t/fi-Sipoo_Norrkulla
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Sipoo_Norrkulla  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Sipoo_Norrkulla        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Sodankyla_Pittiovaara dvb-apps/util/scan/dvb-t/fi-Sodankyla_Pittiovaara
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Sodankyla_Pittiovaara    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Sodankyla_Pittiovaara  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Sulkava_Vaatalanmaki dvb-apps/util/scan/dvb-t/fi-Sulkava_Vaatalanmaki
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Sulkava_Vaatalanmaki     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Sulkava_Vaatalanmaki   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Suomussalmi_Myllylahti dvb-apps/util/scan/dvb-t/fi-Suomussalmi_Myllylahti
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Suomussalmi_Myllylahti   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Suomussalmi_Myllylahti 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Sysma_Liikola dvb-apps/util/scan/dvb-t/fi-Sysma_Liikola
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Sysma_Liikola    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Sysma_Liikola  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 498000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Taivalkoski dvb-apps/util/scan/dvb-t/fi-Taivalkoski
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Taivalkoski      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Taivalkoski    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Taivalkoski_Taivalvaara dvb-apps/util/scan/dvb-t/fi-Taivalkoski_Taivalvaara
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Taivalkoski_Taivalvaara  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Taivalkoski_Taivalvaara        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Tammela dvb-apps/util/scan/dvb-t/fi-Tammela
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Tammela  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Tammela        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Tammisaari dvb-apps/util/scan/dvb-t/fi-Tammisaari
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Tammisaari       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Tammisaari     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Tampere dvb-apps/util/scan/dvb-t/fi-Tampere
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Tampere  2004-01-19 18:10:16.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Tampere        2009-06-21 13:29:06.000000000 +0200
+@@ -1,6 +1,6 @@
+-# Tampere DVB-T (Digita Finland)
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+ T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+ T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+ T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+-
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Tampere_Pyynikki dvb-apps/util/scan/dvb-t/fi-Tampere_Pyynikki
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Tampere_Pyynikki 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Tampere_Pyynikki       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 586000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Tervola dvb-apps/util/scan/dvb-t/fi-Tervola
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Tervola  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Tervola        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Turku dvb-apps/util/scan/dvb-t/fi-Turku
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Turku    2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Turku  2009-06-21 13:29:06.000000000 +0200
+@@ -1,3 +1,6 @@
+-# Turku A-mux (Digita Finland)
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+ T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 738000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Utsjoki dvb-apps/util/scan/dvb-t/fi-Utsjoki
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Utsjoki  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Utsjoki        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Utsjoki_Nuorgam_Njallavaara dvb-apps/util/scan/dvb-t/fi-Utsjoki_Nuorgam_Njallavaara
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Utsjoki_Nuorgam_Njallavaara      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Utsjoki_Nuorgam_Njallavaara    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Utsjoki_Nuorgam_raja dvb-apps/util/scan/dvb-t/fi-Utsjoki_Nuorgam_raja
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Utsjoki_Nuorgam_raja     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Utsjoki_Nuorgam_raja   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Utsjoki_Nuvvus dvb-apps/util/scan/dvb-t/fi-Utsjoki_Nuvvus
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Utsjoki_Nuvvus   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Utsjoki_Nuvvus 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Utsjoki_Outakoski dvb-apps/util/scan/dvb-t/fi-Utsjoki_Outakoski
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Utsjoki_Outakoski        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Utsjoki_Outakoski      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Utsjoki_Polvarniemi dvb-apps/util/scan/dvb-t/fi-Utsjoki_Polvarniemi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Utsjoki_Polvarniemi      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Utsjoki_Polvarniemi    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Utsjoki_Rovisuvanto dvb-apps/util/scan/dvb-t/fi-Utsjoki_Rovisuvanto
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Utsjoki_Rovisuvanto      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Utsjoki_Rovisuvanto    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Utsjoki_Tenola dvb-apps/util/scan/dvb-t/fi-Utsjoki_Tenola
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Utsjoki_Tenola   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Utsjoki_Tenola 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Uusikaupunki_Orivo dvb-apps/util/scan/dvb-t/fi-Uusikaupunki_Orivo
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Uusikaupunki_Orivo       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Uusikaupunki_Orivo     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Vaala dvb-apps/util/scan/dvb-t/fi-Vaala
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Vaala    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Vaala  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Vaasa dvb-apps/util/scan/dvb-t/fi-Vaasa
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Vaasa    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Vaasa  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Valtimo dvb-apps/util/scan/dvb-t/fi-Valtimo
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Valtimo  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Valtimo        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 586000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Vammala_Jyranvuori dvb-apps/util/scan/dvb-t/fi-Vammala_Jyranvuori
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Vammala_Jyranvuori       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Vammala_Jyranvuori     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Vammala_Roismala dvb-apps/util/scan/dvb-t/fi-Vammala_Roismala
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Vammala_Roismala 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Vammala_Roismala       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Vammala_Savi dvb-apps/util/scan/dvb-t/fi-Vammala_Savi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Vammala_Savi     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Vammala_Savi   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Vantaa_Hakunila dvb-apps/util/scan/dvb-t/fi-Vantaa_Hakunila
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Vantaa_Hakunila  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Vantaa_Hakunila        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Varpaisjarvi_Honkamaki dvb-apps/util/scan/dvb-t/fi-Varpaisjarvi_Honkamaki
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Varpaisjarvi_Honkamaki   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Varpaisjarvi_Honkamaki 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Virrat_Lappavuori dvb-apps/util/scan/dvb-t/fi-Virrat_Lappavuori
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Virrat_Lappavuori        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Virrat_Lappavuori      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Vuokatti dvb-apps/util/scan/dvb-t/fi-Vuokatti
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Vuokatti 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Vuokatti       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Vuotso dvb-apps/util/scan/dvb-t/fi-Vuotso
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Vuotso   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Vuotso 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ylitornio_Ainiovaara dvb-apps/util/scan/dvb-t/fi-Ylitornio_Ainiovaara
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ylitornio_Ainiovaara     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Ylitornio_Ainiovaara   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ylitornio_Raanujarvi dvb-apps/util/scan/dvb-t/fi-Ylitornio_Raanujarvi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Ylitornio_Raanujarvi     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Ylitornio_Raanujarvi   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Yllas dvb-apps/util/scan/dvb-t/fi-Yllas
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fi-Yllas    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fi-Yllas  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# automatically generated from http://www.digitv.fi/sivu.asp?path=1;8224;9519
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Abbeville dvb-apps/util/scan/dvb-t/fr-Abbeville
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Abbeville        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Abbeville      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Abbeville - France (DVB-T transmitter of Abbeville ( LaMotte ) )
++# Abbeville - France (signal DVB-T transmis depuis l'émetteur de LaMotte )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Abbeville - LaMotte ####
++#R1
++T 506000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 538000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 570000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 618000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 770000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Agen dvb-apps/util/scan/dvb-t/fr-Agen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Agen     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Agen   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Agen - France (DVB-T transmitter of Agen ( Agglomération ) )
++# Agen - France (signal DVB-T transmis depuis l'émetteur de Agglomération )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Agen - Agglomération ####
++#R1
++T 666000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 746000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 714000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 642000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 722000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Ajaccio dvb-apps/util/scan/dvb-t/fr-Ajaccio
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Ajaccio  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Ajaccio        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Ajaccio - France (DVB-T transmitter of Ajaccio ( Baied'Ajaccio ) )
++# Ajaccio - France (signal DVB-T transmis depuis l'émetteur de Baied'Ajaccio )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Ajaccio - Baied'Ajaccio ####
++#R1
++T 538000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 514000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 642000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 610000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 778000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 730000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Albi dvb-apps/util/scan/dvb-t/fr-Albi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Albi     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Albi   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Albi - France (DVB-T transmitter of Albi ( Agglomération ) )
++# Albi - France (signal DVB-T transmis depuis l'émetteur de Agglomération )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Albi - Agglomération ####
++#R1
++T 730000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 754000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 746000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 818000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Alençon dvb-apps/util/scan/dvb-t/fr-Alençon
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Alençon 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Alençon       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Alençon - France (DVB-T transmitter of Alençon ( Montsd'Amain ) )
++# Alençon - France (signal DVB-T transmis depuis l'émetteur de Montsd'Amain )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Alençon - Montsd'Amain ####
++#R1
++T 618000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 826000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 634000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 770000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Ales dvb-apps/util/scan/dvb-t/fr-Ales
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Ales     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Ales   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Alès - France (DVB-T transmitter of Alès ( Agglomération ) )
++# Alès - France (signal DVB-T transmis depuis l'émetteur de Agglomération )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Alès - Agglomération ####
++#R1
++T 626000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 778000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 762000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 650000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 674000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Ales-Bouquet dvb-apps/util/scan/dvb-t/fr-Ales-Bouquet
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Ales-Bouquet     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Ales-Bouquet   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Alès - France (DVB-T transmitter of Alès ( MontBouquet ) )
++# Alès - France (signal DVB-T transmis depuis l'émetteur de MontBouquet )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Alès - MontBouquet ####
++#R1
++T 554000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 778000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 634000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Amiens dvb-apps/util/scan/dvb-t/fr-Amiens
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Amiens   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Amiens 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Amiens - France (DVB-T transmitter of Amiens ( LesSaintJust ) )
++# Amiens - France (signal DVB-T transmis depuis l'émetteur de LesSaintJust )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Amiens - LesSaintJust ####
++#R1
++T 594000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 706000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 650000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 674000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 730000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 626000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Angers dvb-apps/util/scan/dvb-t/fr-Angers
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Angers   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Angers 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Angers - France (DVB-T transmitter of Angers ( RochefortsurLoire ) )
++# Angers - France (signal DVB-T transmis depuis l'émetteur de RochefortsurLoire )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Angers - RochefortsurLoire ####
++#R1
++T 690000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 626000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 754000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 650000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 674000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 714000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Annecy dvb-apps/util/scan/dvb-t/fr-Annecy
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Annecy   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Annecy 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Annecy - France (DVB-T transmitter of Annecy ( Agglomération ) )
++# Annecy - France (signal DVB-T transmis depuis l'émetteur de Agglomération )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Annecy - Agglomération ####
++#R1
++T 642000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 482000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 530000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 666000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 506000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 834000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Arcachon dvb-apps/util/scan/dvb-t/fr-Arcachon
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Arcachon 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Arcachon       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Arcachon - France (DVB-T transmitter of Arcachon ( Agglomération ) )
++# Arcachon - France (signal DVB-T transmis depuis l'émetteur de Agglomération )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Arcachon - Agglomération ####
++#R1
++T 490000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 674000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 554000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 578000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 546000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Argenton dvb-apps/util/scan/dvb-t/fr-Argenton
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Argenton 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Argenton       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Argenton - France (DVB-T transmitter of Argenton ( Malicornay ) )
++# Argenton - France (signal DVB-T transmis depuis l'émetteur de Malicornay )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Argenton - Malicornay ####
++#R1
++T 618000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 666000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 594000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 786000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 642000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Aubenas dvb-apps/util/scan/dvb-t/fr-Aubenas
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Aubenas  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Aubenas        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Aubenas - France (DVB-T transmitter of Aubenas ( Nord ) )
++# Aubenas - France (signal DVB-T transmis depuis l'émetteur de Nord )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Aubenas - Nord ####
++#R1
++T 610000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 586000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 626000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 650000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 674000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Aurillac dvb-apps/util/scan/dvb-t/fr-Aurillac
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Aurillac 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Aurillac       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Aurillac - France (DVB-T transmitter of Aurillac ( Agglomération ) )
++# Aurillac - France (signal DVB-T transmis depuis l'émetteur de Agglomération )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Aurillac - Agglomération ####
++#R1
++T 642000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 578000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 618000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 706000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 666000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Autun dvb-apps/util/scan/dvb-t/fr-Autun
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Autun    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Autun  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Autun - France (DVB-T transmitter of Autun ( BoisduRoi ) )
++# Autun - France (signal DVB-T transmis depuis l'émetteur de BoisduRoi )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Autun - BoisduRoi ####
++#R1
++T 682000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 618000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 834000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 722000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 850000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Auxerre dvb-apps/util/scan/dvb-t/fr-Auxerre
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Auxerre  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Auxerre        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Auxerre - France (DVB-T transmitter of Auxerre ( Molesmes ) )
++# Auxerre - France (signal DVB-T transmis depuis l'émetteur de Molesmes )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Auxerre - Molesmes ####
++#R1
++T 570000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 794000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 770000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 546000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 586000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 562000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Avignon dvb-apps/util/scan/dvb-t/fr-Avignon
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Avignon  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Avignon        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Avignon - France (DVB-T transmitter of Avignon ( MontVentoux ) )
++# Avignon - France (signal DVB-T transmis depuis l'émetteur de MontVentoux )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Avignon - MontVentoux ####
++#R1
++T 650000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 778000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 714000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 634000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 674000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-BarleDuc dvb-apps/util/scan/dvb-t/fr-BarleDuc
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-BarleDuc 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-BarleDuc       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# BarleDuc - France (DVB-T transmitter of BarleDuc ( Willeroncourt ) )
++# BarleDuc - France (signal DVB-T transmis depuis l'émetteur de Willeroncourt )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### BarleDuc - Willeroncourt ####
++#R1
++T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 682000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 634000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 658000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 666000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 722000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Bastia dvb-apps/util/scan/dvb-t/fr-Bastia
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Bastia   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Bastia 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Bastia - France (DVB-T transmitter of Bastia ( SerradiPigno ) )
++# Bastia - France (signal DVB-T transmis depuis l'émetteur de SerradiPigno )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Bastia - SerradiPigno ####
++#R1
++T 490000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 626000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 578000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 666000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 538000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Bayonne dvb-apps/util/scan/dvb-t/fr-Bayonne
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Bayonne  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Bayonne        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Bayonne - France (DVB-T transmitter of Bayonne ( LaRhune ) )
++# Bayonne - France (signal DVB-T transmis depuis l'émetteur de LaRhune )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Bayonne - LaRhune ####
++#R1
++T 826000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 642000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 714000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 802000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 762000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Bergerac dvb-apps/util/scan/dvb-t/fr-Bergerac
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Bergerac 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Bergerac       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Bergerac - France (DVB-T transmitter of Bergerac ( Audrix ) )
++# Bergerac - France (signal DVB-T transmis depuis l'émetteur de Audrix )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Bergerac - Audrix ####
++#R1
++T 618000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 642000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 666000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 482000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 570000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 546000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Besançon dvb-apps/util/scan/dvb-t/fr-Besançon
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Besançon        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Besançon      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Besançon - France (DVB-T transmitter of Besançon ( Brégille ) )
++# Besançon - France (signal DVB-T transmis depuis l'émetteur de Brégille )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Besançon - Brégille ####
++#R1
++T 586000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 690000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 770000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 714000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 786000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Bordeaux dvb-apps/util/scan/dvb-t/fr-Bordeaux
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Bordeaux 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Bordeaux       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,9 @@
++# Bordeaux - France (DVB-T transmitter of Bouliac or Cauderan)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 490000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 562000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Bordeaux-Bouliac dvb-apps/util/scan/dvb-t/fr-Bordeaux-Bouliac
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Bordeaux-Bouliac 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Bordeaux-Bouliac       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Bordeaux - France (DVB-T transmitter of Bordeaux ( BordeauxEst ) )
++# Bordeaux - France (signal DVB-T transmis depuis l'émetteur de BordeauxEst )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Bordeaux - BordeauxEst ####
++#R1
++T 490000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 778000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 802000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 658000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 634000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 546000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Bordeaux-Cauderan dvb-apps/util/scan/dvb-t/fr-Bordeaux-Cauderan
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Bordeaux-Cauderan        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Bordeaux-Cauderan      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Bordeaux - France (DVB-T transmitter of Bordeaux ( Caudéran ) )
++# Bordeaux - France (signal DVB-T transmis depuis l'émetteur de Caudéran )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Bordeaux - Caudéran ####
++#R1
++T 490000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 514000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 482000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 562000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 594000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 546000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Boulogne dvb-apps/util/scan/dvb-t/fr-Boulogne
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Boulogne 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Boulogne       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Boulogne - France (DVB-T transmitter of Boulogne ( MontLambert ) )
++# Boulogne - France (signal DVB-T transmis depuis l'émetteur de MontLambert )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Boulogne - MontLambert ####
++#R1
++T 586000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 626000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 666000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 690000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 714000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Bourges dvb-apps/util/scan/dvb-t/fr-Bourges
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Bourges  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Bourges        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Bourges - France (DVB-T transmitter of Bourges ( CollinesduSancerrois ) )
++# Bourges - France (signal DVB-T transmis depuis l'émetteur de CollinesduSancerrois )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Bourges - CollinesduSancerrois ####
++#R1
++T 586000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 498000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 522000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 786000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 562000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Brest dvb-apps/util/scan/dvb-t/fr-Brest
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Brest    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Brest  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,9 @@
++# Brest - France
++# Emetteur du Roch Tredudon
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 546000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE
++T 482000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE
++T 506000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE
++T 490000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE
++T 530000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE
++T 514000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Brive dvb-apps/util/scan/dvb-t/fr-Brive
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Brive    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Brive  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Brive - France (DVB-T transmitter of Brive ( Lissac ) )
++# Brive - France (signal DVB-T transmis depuis l'émetteur de Lissac )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Brive - Lissac ####
++#R1
++T 530000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 634000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 610000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 714000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 658000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 682000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Caen dvb-apps/util/scan/dvb-t/fr-Caen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Caen     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Caen   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Caen - France (DVB-T transmitter of Caen ( CaenNord ) )
++# Caen - France (signal DVB-T transmis depuis l'émetteur de CaenNord )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Caen - CaenNord ####
++#R1
++T 554000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 546000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 562000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 570000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 706000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 770000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Caen-Pincon dvb-apps/util/scan/dvb-t/fr-Caen-Pincon
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Caen-Pincon      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Caen-Pincon    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Caen - France (DVB-T transmitter of Caen ( MontPinçon ) )
++# Caen - France (signal DVB-T transmis depuis l'émetteur de MontPinçon )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Caen - MontPinçon ####
++#R1
++T 514000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 578000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 490000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 538000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 770000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Cannes dvb-apps/util/scan/dvb-t/fr-Cannes
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Cannes   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Cannes 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Cannes - France (DVB-T transmitter of Cannes ( Vallauris ) )
++# Cannes - France (signal DVB-T transmis depuis l'émetteur de Vallauris )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Cannes - Vallauris ####
++#R1
++T 490000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 514000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 578000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 730000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 690000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 642000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Carcassonne dvb-apps/util/scan/dvb-t/fr-Carcassonne
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Carcassonne      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Carcassonne    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Carcassonne - France (DVB-T transmitter of Carcassonne ( MontagneNoire ) )
++# Carcassonne - France (signal DVB-T transmis depuis l'émetteur de MontagneNoire )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Carcassonne - MontagneNoire ####
++#R1
++T 586000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 554000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 778000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 762000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 802000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 786000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Chambery dvb-apps/util/scan/dvb-t/fr-Chambery
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Chambery 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Chambery       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,30 @@
++# Chambéry - France (DVB-T transmitter of Chambéry ( Nondéfini ) )
++# Chambéry - France (signal DVB-T transmis depuis l'émetteur de Nondéfini )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Chambéry - Nondéfini ####
++#R1
++#T FREQ1 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++#T FREQ2 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++#T FREQ3 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++#T FREQ4 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++#T FREQ5 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++#T FREQ6 8MHz AUTO NONE QAM64 8k AUTO NONE
++##############################################################
++# en Avril 2006, l'emetteur pour Chambéry n'etait pas defini
++#  Vous devez donc modifier les frequences manuellement.
++# SVP Renvoyez le fichier mis a jour aux contacts ci-dessus.
++##############################################################
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Chartres dvb-apps/util/scan/dvb-t/fr-Chartres
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Chartres 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Chartres       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Chartres - France (DVB-T transmitter of Chartres ( Montlandon ) )
++# Chartres - France (signal DVB-T transmis depuis l'émetteur de Montlandon )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Chartres - Montlandon ####
++#R1
++T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 610000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 754000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 554000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 634000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Chennevieres dvb-apps/util/scan/dvb-t/fr-Chennevieres
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Chennevieres     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Chennevieres   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# ParisEst - France (DVB-T transmitter of ParisEst ( Chennevières ) )
++# ParisEst - France (signal DVB-T transmis depuis l'émetteur de Chennevières )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### ParisEst - Chennevières ####
++#R1
++T 586000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 786000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 714000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 762000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Cherbourg dvb-apps/util/scan/dvb-t/fr-Cherbourg
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Cherbourg        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Cherbourg      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Cherbourg - France (DVB-T transmitter of Cherbourg ( Digosville ) )
++# Cherbourg - France (signal DVB-T transmis depuis l'émetteur de Digosville )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Cherbourg - Digosville ####
++#R1
++T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 578000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 730000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 762000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 562000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-ClermontFerrand dvb-apps/util/scan/dvb-t/fr-ClermontFerrand
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-ClermontFerrand  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-ClermontFerrand        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Clermont-Ferrand - France (DVB-T transmitter of Clermont-Ferrand ( PuydeDôme ) )
++# Clermont-Ferrand - France (signal DVB-T transmis depuis l'émetteur de PuydeDôme )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Clermont-Ferrand - PuydeDôme ####
++#R1
++T 706000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 554000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 730000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 578000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 562000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Cluses dvb-apps/util/scan/dvb-t/fr-Cluses
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Cluses   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Cluses 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,23 @@
++# Cluses - France (DVB-T transmitter of Cluses ( St Sigismond ) )
++# Cluses - France (signal DVB-T transmis depuis l'émetteur de St Sigismond )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Cluses - Nondéfini ####
++#R1
++T 490000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 514000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 538000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 586000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 618000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Dieppe dvb-apps/util/scan/dvb-t/fr-Dieppe
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Dieppe   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Dieppe 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Dieppe - France (DVB-T transmitter of Dieppe ( Neuville ) )
++# Dieppe - France (signal DVB-T transmis depuis l'émetteur de Neuville )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Dieppe - Neuville ####
++#R1
++T 762000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 642000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 666000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 618000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 786000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Dijon dvb-apps/util/scan/dvb-t/fr-Dijon
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Dijon    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Dijon  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,28 @@
++# Dijon - France (DVB-T transmitter of Dijon ( Nuit Saint Georges ) )
++# Dijon - France (signal DVB-T transmis depuis l'émetteur de Nuit Saint Georges )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# Fichier mis à jour par Maxence Antonczyk <maxantz@yahoo.fr>
++# le Dimanche 7 Septembre 2008, à 13h00
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Dijon - Nuit Saint Georges ####
++#R1 (France 2,France 3,France 5,Arte,LCP/Public Sénat, Chaîne Locale)
++T 506000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2 (I-Télé,BFM TV,Direct 8,Gulli,Virgin 17,France 4)
++T 706000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3 (Canal+,Canal+ Cinéma,Canal+ Sport,Planète,Canal J,TPS Star)
++T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4 (M6,W9,NT1,TF6,Paris Première, AB1)
++T 834000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++#T 562000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6 (TF1,TNC,NRJ 12,LCI,Eurosport France)
++T 530000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Dunkerque dvb-apps/util/scan/dvb-t/fr-Dunkerque
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Dunkerque        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Dunkerque      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,30 @@
++# Dunkerque - France (DVB-T transmitter of Dunkerque ( Nondéfini ) )
++# Dunkerque - France (signal DVB-T transmis depuis l'émetteur de Nondéfini )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Dunkerque - Nondéfini ####
++#R1
++#T FREQ1 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++#T FREQ2 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++#T FREQ3 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++#T FREQ4 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++#T FREQ5 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++#T FREQ6 8MHz AUTO NONE QAM64 8k AUTO NONE
++##############################################################
++# en Avril 2006, l'emetteur pour Dunkerque n'etait pas defini
++#  Vous devez donc modifier les frequences manuellement.
++# SVP Renvoyez le fichier mis a jour aux contacts ci-dessus.
++##############################################################
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Epinal dvb-apps/util/scan/dvb-t/fr-Epinal
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Epinal   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Epinal 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Epinal - France (DVB-T transmitter of Epinal ( BoisdelaVierge ) )
++# Epinal - France (signal DVB-T transmis depuis l'émetteur de BoisdelaVierge )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Epinal - BoisdelaVierge ####
++#R1
++T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 682000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 754000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 802000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 778000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Evreux dvb-apps/util/scan/dvb-t/fr-Evreux
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Evreux   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Evreux 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Evreux - France (DVB-T transmitter of Evreux ( Netreville ) )
++# Evreux - France (signal DVB-T transmis depuis l'émetteur de Netreville )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Evreux - Netreville ####
++#R1
++T 722000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 674000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 626000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 690000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 650000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Forbach dvb-apps/util/scan/dvb-t/fr-Forbach
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Forbach  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Forbach        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,30 @@
++# Forbach - France (DVB-T transmitter of Forbach ( Nondéfini ) )
++# Forbach - France (signal DVB-T transmis depuis l'émetteur de Nondéfini )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Forbach - Nondéfini ####
++#R1
++#T FREQ1 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++#T FREQ2 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++#T FREQ3 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++#T FREQ4 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++#T FREQ5 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++#T FREQ6 8MHz AUTO NONE QAM64 8k AUTO NONE
++##############################################################
++# en Avril 2006, l'emetteur pour Forbach n'etait pas defini
++#  Vous devez donc modifier les frequences manuellement.
++# SVP Renvoyez le fichier mis a jour aux contacts ci-dessus.
++##############################################################
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Gex dvb-apps/util/scan/dvb-t/fr-Gex
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Gex      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Gex    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,30 @@
++# Gex - France (DVB-T transmitter of Gex ( Nondéfini ) )
++# Gex - France (signal DVB-T transmis depuis l'émetteur de Nondéfini )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Gex - Nondéfini ####
++#R1
++#T FREQ1 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++#T FREQ2 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++#T FREQ3 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++#T FREQ4 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++#T FREQ5 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++#T FREQ6 8MHz AUTO NONE QAM64 8k AUTO NONE
++##############################################################
++# en Avril 2006, l'emetteur pour Gex n'etait pas defini
++#  Vous devez donc modifier les frequences manuellement.
++# SVP Renvoyez le fichier mis a jour aux contacts ci-dessus.
++##############################################################
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Grenoble dvb-apps/util/scan/dvb-t/fr-Grenoble
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Grenoble 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Grenoble       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Grenoble - France (DVB-T transmitter of Grenoble ( ToursansVenin ) )
++# Grenoble - France (signal DVB-T transmis depuis l'émetteur de ToursansVenin )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Grenoble - ToursansVenin ####
++#R1
++T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 474000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 498000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 554000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 522000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 578000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Gueret dvb-apps/util/scan/dvb-t/fr-Gueret
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Gueret   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Gueret 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Guéret - France (DVB-T transmitter of Guéret ( StLégerleGueretois ) )
++# Guéret - France (signal DVB-T transmis depuis l'émetteur de StLégerleGueretois )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Guéret - StLégerleGueretois ####
++#R1
++T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 554000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 722000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 746000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 578000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 562000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Hirson dvb-apps/util/scan/dvb-t/fr-Hirson
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Hirson   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Hirson 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,30 @@
++# Hirson - France (DVB-T transmitter of Hirson ( Nondéfini ) )
++# Hirson - France (signal DVB-T transmis depuis l'émetteur de Nondéfini )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Hirson - Nondéfini ####
++#R1
++#T FREQ1 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++#T FREQ2 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++#T FREQ3 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++#T FREQ4 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++#T FREQ5 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++#T FREQ6 8MHz AUTO NONE QAM64 8k AUTO NONE
++##############################################################
++# en Avril 2006, l'emetteur pour Hirson n'etait pas defini
++#  Vous devez donc modifier les frequences manuellement.
++# SVP Renvoyez le fichier mis a jour aux contacts ci-dessus.
++##############################################################
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Hyeres dvb-apps/util/scan/dvb-t/fr-Hyeres
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Hyeres   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Hyeres 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Hyères - France (DVB-T transmitter of Hyères ( CapBenat ) )
++# Hyères - France (signal DVB-T transmis depuis l'émetteur de CapBenat )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Hyères - CapBenat ####
++#R1
++T 490000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 666000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 562000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 514000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 538000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-LaRochelle dvb-apps/util/scan/dvb-t/fr-LaRochelle
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-LaRochelle       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-LaRochelle     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Rochelle(La) - France (DVB-T transmitter of Rochelle(La) ( Mireuil ) )
++# Rochelle(La) - France (signal DVB-T transmis depuis l'émetteur de Mireuil )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Rochelle(La) - Mireuil ####
++#R1
++T 730000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 778000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 802000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 706000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 754000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Laval dvb-apps/util/scan/dvb-t/fr-Laval
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Laval    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Laval  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Laval - France (DVB-T transmitter of Laval ( MontRochard ) )
++# Laval - France (signal DVB-T transmis depuis l'émetteur de MontRochard )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Laval - MontRochard ####
++#R1
++T 778000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 610000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 754000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 794000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 802000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-LeCreusot dvb-apps/util/scan/dvb-t/fr-LeCreusot
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-LeCreusot        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-LeCreusot      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Creusot(Le) - France (DVB-T transmitter of Creusot(Le) ( MontStVincent ) )
++# Creusot(Le) - France (signal DVB-T transmis depuis l'émetteur de MontStVincent )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Creusot(Le) - MontStVincent ####
++#R1
++T 770000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 618000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 498000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 794000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 818000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 594000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-LeHavre dvb-apps/util/scan/dvb-t/fr-LeHavre
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-LeHavre  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-LeHavre        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Havre(Le) - France (DVB-T transmitter of Havre(Le) ( Harfleur ) )
++# Havre(Le) - France (signal DVB-T transmis depuis l'émetteur de Harfleur )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Havre(Le) - Harfleur ####
++#R1
++T 690000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 642000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 762000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 770000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-LeMans dvb-apps/util/scan/dvb-t/fr-LeMans
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-LeMans   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-LeMans 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,21 @@
++# Le Mans - France (DVB-T transmitter of Mayet)
++# Le Mans - France (signal DVB-T transmis depuis l'émetteur de Mayet   )
++# Pour plus d'informations vous pouvez consulter :
++#  - le topic sur l'émetteur de Mayet sur le forum du site tvnt.net :
++#      http://www.tvnt.net/forum/viewtopic.php?t=48
++#  - le site de TDF : http://tnt.niv2.com/72100-LE-MANS.html
++# contact : Matthieu Duchemin <alkahan@free.fr>
++
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# R1 : Canal 26
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# R2 : Canal 23
++T 490000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# R3 : Canal 56
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# R4 : Canal 31
++T 554000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# R5 : Canal 37
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# R6 : Canal 36
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-LePuyEnVelay dvb-apps/util/scan/dvb-t/fr-LePuyEnVelay
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-LePuyEnVelay     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-LePuyEnVelay   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# PuyenVelay(Le) - France (DVB-T transmitter of PuyenVelay(Le) ( Agglomération ) )
++# PuyenVelay(Le) - France (signal DVB-T transmis depuis l'émetteur de Agglomération )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### PuyenVelay(Le) - Agglomération ####
++#R1
++T 666000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 642000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 714000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 690000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 514000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Lille dvb-apps/util/scan/dvb-t/fr-Lille
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Lille    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Lille  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,30 @@
++# Lille - France (DVB-T transmitter of Lille ( Nondéfini ) )
++# Lille - France (signal DVB-T transmis depuis l'émetteur de Nondéfini )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Lille - Nondéfini ####
++#R1
++#T FREQ1 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++#T FREQ2 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++#T FREQ3 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++#T FREQ4 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++#T FREQ5 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++#T FREQ6 8MHz AUTO NONE QAM64 8k AUTO NONE
++##############################################################
++# en Avril 2006, l'emetteur pour Lille n'etait pas defini
++#  Vous devez donc modifier les frequences manuellement.
++# SVP Renvoyez le fichier mis a jour aux contacts ci-dessus.
++##############################################################
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Lille-Lambersart dvb-apps/util/scan/dvb-t/fr-Lille-Lambersart
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Lille-Lambersart 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Lille-Lambersart       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Lille - France (DVB-T transmitter of Lille ( Lambersart ) )
++# Lille - France (signal DVB-T transmis depuis l'émetteur de Lambersart )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Lille - Lambersart ####
++#R1
++T 594000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 538000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 562000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 546000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 570000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 586000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-LilleT2 dvb-apps/util/scan/dvb-t/fr-LilleT2
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-LilleT2  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-LilleT2        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,13 @@
++# Lille - France (DVB-T transmitter of Lambersart)
++#offset of 167000 for Cinergy T2. Other type of card users need to replace 167 by 000
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#R2
++T 538167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#R4
++T 546167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#R3
++T 562167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#R6
++T 586167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#R1
++T 594167000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Limoges dvb-apps/util/scan/dvb-t/fr-Limoges
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Limoges  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Limoges        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Limoges - France (DVB-T transmitter of Limoges ( Agglomération ) )
++# Limoges - France (signal DVB-T transmis depuis l'émetteur de Agglomération )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Limoges - Agglomération ####
++#R1
++T 826000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 778000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 802000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 578000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 674000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Longwy dvb-apps/util/scan/dvb-t/fr-Longwy
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Longwy   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Longwy 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,30 @@
++# Longwy - France (DVB-T transmitter of Longwy ( Nondéfini ) )
++# Longwy - France (signal DVB-T transmis depuis l'émetteur de Nondéfini )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Longwy - Nondéfini ####
++#R1
++#T FREQ1 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++#T FREQ2 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++#T FREQ3 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++#T FREQ4 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++#T FREQ5 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++#T FREQ6 8MHz AUTO NONE QAM64 8k AUTO NONE
++##############################################################
++# en Avril 2006, l'emetteur pour Longwy n'etait pas defini
++#  Vous devez donc modifier les frequences manuellement.
++# SVP Renvoyez le fichier mis a jour aux contacts ci-dessus.
++##############################################################
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Lorient dvb-apps/util/scan/dvb-t/fr-Lorient
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Lorient  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Lorient        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Lorient - France (DVB-T transmitter of Lorient ( Ploemer ) )
++# Lorient - France (signal DVB-T transmis depuis l'émetteur de Ploemer )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Lorient - Ploemer ####
++#R1
++T 554000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 586000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 818000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 570000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 794000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 562000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Lyon-Fourviere dvb-apps/util/scan/dvb-t/fr-Lyon-Fourviere
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Lyon-Fourviere   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Lyon-Fourviere 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,18 @@
++# Lyon - France (DVB-T transmitter of Fourvière)
++# Lyon - France (signal DVB-T transmis depuis l'émetteur de Fourvière)
++# see : http://tnt.niv2.com/69000-LYON.html
++# contact : Nicolas Estre <n_estre@yahoo.fr>
++
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# R1 : Canal 56
++T 754167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# R2 : Canal 36
++T 594167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# R3 : Canal 21
++T 474167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# R4 : Canal 54
++T 738167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# R5 : Canal 27
++T 522167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# R6 : Canal 24
++T 498167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Lyon-Pilat dvb-apps/util/scan/dvb-t/fr-Lyon-Pilat
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Lyon-Pilat       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Lyon-Pilat     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,17 @@
++# Lyon - France (DVB-T transmitter of Mt Pilat)
++# Lyon - France (signal DVB-T transmis depuis l'émetteur du Mont Pilat)
++# see : http://tnt.niv2.com/69000-LYON.html
++# contact : Nicolas Estre <n_estre@yahoo.fr>
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# R1 : Canal 45
++T 666000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# R2 : Canal 36
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# R3 : Canal 39
++T 618000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# R4 : Canal 54
++T 738000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# R5 : Canal 42
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# R6 : Canal 47
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Macon dvb-apps/util/scan/dvb-t/fr-Macon
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Macon    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Macon  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,30 @@
++# Mâcon - France (DVB-T transmitter of Mâcon ( Nondéfini ) )
++# Mâcon - France (signal DVB-T transmis depuis l'émetteur de Nondéfini )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Mâcon - Nondéfini ####
++#R1
++#T FREQ1 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++#T FREQ2 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++#T FREQ3 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++#T FREQ4 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++#T FREQ5 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++#T FREQ6 8MHz AUTO NONE QAM64 8k AUTO NONE
++##############################################################
++# en Avril 2006, l'emetteur pour Mâcon n'etait pas defini
++#  Vous devez donc modifier les frequences manuellement.
++# SVP Renvoyez le fichier mis a jour aux contacts ci-dessus.
++##############################################################
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Mantes dvb-apps/util/scan/dvb-t/fr-Mantes
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Mantes   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Mantes 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Mantes - France (DVB-T transmitter of Mantes ( MaudétourenVexin ) )
++# Mantes - France (signal DVB-T transmis depuis l'émetteur de MaudétourenVexin )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Mantes - MaudétourenVexin ####
++#R1
++T 690000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 610000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 650000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 674000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 714000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 626000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Marseille dvb-apps/util/scan/dvb-t/fr-Marseille
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Marseille        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Marseille      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 506000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 530000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 802000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Maubeuge dvb-apps/util/scan/dvb-t/fr-Maubeuge
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Maubeuge 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Maubeuge       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,30 @@
++# Maubeuge - France (DVB-T transmitter of Maubeuge ( Nondéfini ) )
++# Maubeuge - France (signal DVB-T transmis depuis l'émetteur de Nondéfini )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Maubeuge - Nondéfini ####
++#R1
++#T FREQ1 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++#T FREQ2 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++#T FREQ3 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++#T FREQ4 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++#T FREQ5 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++#T FREQ6 8MHz AUTO NONE QAM64 8k AUTO NONE
++##############################################################
++# en Avril 2006, l'emetteur pour Maubeuge n'etait pas defini
++#  Vous devez donc modifier les frequences manuellement.
++# SVP Renvoyez le fichier mis a jour aux contacts ci-dessus.
++##############################################################
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Meaux dvb-apps/util/scan/dvb-t/fr-Meaux
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Meaux    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Meaux  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Meaux - France (DVB-T transmitter of Meaux ( Mareuil ) )
++# Meaux - France (signal DVB-T transmis depuis l'émetteur de Mareuil )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Meaux - Mareuil ####
++#R1
++T 746000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 818000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 786000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 666000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 642000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Mende dvb-apps/util/scan/dvb-t/fr-Mende
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Mende    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Mende  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Mende - France (DVB-T transmitter of Mende ( TrucdeFortunio ) )
++# Mende - France (signal DVB-T transmis depuis l'émetteur de TrucdeFortunio )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Mende - TrucdeFortunio ####
++#R1
++T 522000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 474000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 498000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 690000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 562000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 610000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Menton dvb-apps/util/scan/dvb-t/fr-Menton
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Menton   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Menton 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Menton - France (DVB-T transmitter of Menton ( CapMartin ) )
++# Menton - France (signal DVB-T transmis depuis l'émetteur de CapMartin )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Menton - CapMartin ####
++#R1
++T 682000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 554000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 842000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 634000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 658000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Metz dvb-apps/util/scan/dvb-t/fr-Metz
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Metz     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Metz   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,30 @@
++# Metz - France (DVB-T transmitter of Metz ( Nondéfini ) )
++# Metz - France (signal DVB-T transmis depuis l'émetteur de Nondéfini )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Metz - Nondéfini ####
++#R1
++#T FREQ1 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++#T FREQ2 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++#T FREQ3 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++#T FREQ4 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++#T FREQ5 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++#T FREQ6 8MHz AUTO NONE QAM64 8k AUTO NONE
++##############################################################
++# en Avril 2006, l'emetteur pour Metz n'etait pas defini
++#  Vous devez donc modifier les frequences manuellement.
++# SVP Renvoyez le fichier mis a jour aux contacts ci-dessus.
++##############################################################
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Mezieres dvb-apps/util/scan/dvb-t/fr-Mezieres
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Mezieres 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Mezieres       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,30 @@
++# Mézières - France (DVB-T transmitter of Mézières ( Nondéfini ) )
++# Mézières - France (signal DVB-T transmis depuis l'émetteur de Nondéfini )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Mézières - Nondéfini ####
++#R1
++#T FREQ1 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++#T FREQ2 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++#T FREQ3 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++#T FREQ4 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++#T FREQ5 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++#T FREQ6 8MHz AUTO NONE QAM64 8k AUTO NONE
++##############################################################
++# en Avril 2006, l'emetteur pour Mézières n'etait pas defini
++#  Vous devez donc modifier les frequences manuellement.
++# SVP Renvoyez le fichier mis a jour aux contacts ci-dessus.
++##############################################################
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Montbeliard dvb-apps/util/scan/dvb-t/fr-Montbeliard
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Montbeliard      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Montbeliard    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,18 @@
++# Montbéliard - France (DVB-T transmitter of Montbéliard "Fort Lachaux" )
++# Montbéliard - France (signal DVB-T transmis depuis l'émetteur de Fort Lachaux )
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# multiplex R1 (GR1), canal 29V + offset 167000 : FRANCE 2 SD , FRANCE 5 , ARTE SD , La Chaîne Parlementaire/Public Sénat , FRANCE 3 , FRANCE 3 Franche-Comté
++T 538167000 8MHz AUTO NONE QAM64 8k AUTO NONE
++# multiplex R3 (CNH), canal 43V + offset 167000 : CANAL+ , CANAL+HD , CANAL+ CINEMA , CANAL+ SPORT , PLANETE , CANAL J et TPS STAR
++T 650167000 8MHz AUTO NONE QAM64 8k AUTO NONE
++# multiplex R2 (NTN), canal 55V + offset 167000 : DIRECT 8 , BFM TV , I>TELE , FRANCE 4 , VIRGIN 17 , GULLI et France 4
++T 746167000 8MHz AUTO NONE QAM64 8k AUTO NONE
++# multiplex R6 (SMR6), canal 32V + offset 167000 : TF1 SD , NRJ 12 , TMC , EUROSPORT , LCI et TF6
++T 562167000 8MHz AUTO NONE QAM64 8k AUTO NONE
++# Télévision Suisse, canal 56V + offset 000000 : TSR1 , TSR2 , TSI1 et SF 1
++T 754000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++# multiplex R4 (MULTI4), canal 58V + offset 167000 : ARTE HD , PARIS PREMIERE, M6 SD , W9 , NT1
++T 770167000 8MHz AUTO NONE QAM64 8k AUTO NONE
++# multiplex R5 (???), canal ??? : TF1 HD , FRANCE 2 HD, M6 HD
++# canal d'émission pas encore défini (février 2009)
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Montlucon dvb-apps/util/scan/dvb-t/fr-Montlucon
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Montlucon        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Montlucon      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Montluçon - France (DVB-T transmitter of Montluçon ( Agglomération ) )
++# Montluçon - France (signal DVB-T transmis depuis l'émetteur de Agglomération )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Montluçon - Agglomération ####
++#R1
++T 618000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 730000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 746000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 826000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Montpellier dvb-apps/util/scan/dvb-t/fr-Montpellier
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Montpellier      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Montpellier    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Montpellier - France (DVB-T transmitter of Montpellier ( SaintBaudille ) )
++# Montpellier - France (signal DVB-T transmis depuis l'émetteur de SaintBaudille )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Montpellier - SaintBaudille ####
++#R1
++T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 746000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 714000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 722000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Mulhouse dvb-apps/util/scan/dvb-t/fr-Mulhouse
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Mulhouse 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Mulhouse       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,26 @@
++# Mulhouse - France (DVB-T transmitter of Mulhouse ( Belvédère ) )
++# Mulhouse - France (signal DVB-T transmis depuis l'émetteur du Belvédère )
++#
++# Fichier réalisé par :
++# IUT COLMAR DEPARTEMENT RESEAUX ET TELECOMMUNICATIONS
++# Novembre 2007
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++
++# R1 - ch 53 : France 2, 3 (Alsace), 5, LCP et Arte (France)
++T 730000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++
++# R2 - ch 55 : I-TELE, BFM TV, Direct 8, Gulli, Virgin 17 (ex-Europe 2 TV) et France 4
++T 746000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++
++# R3 - ch 54 : TV payante : CANAL+, CANAL+ CINEMA, CANAL+ SPORT, PLANETE, CANAL J et TPS STAR
++T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++
++# R4 - ch 37 : M6, W9 et NT1 + TV payante : PARIS PREMIERE, TF6 et AB1
++T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++
++# R5
++# ch 66, candidat a la TVHD
++
++# R6 - ch 65 : TF 1, NRJ 12 et TMC + TV payante : Eurosport France et LCI
++T 826000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Nancy dvb-apps/util/scan/dvb-t/fr-Nancy
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Nancy    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Nancy  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Nancy - France (DVB-T transmitter of Nancy ( Nondéfini ) )
++# Nancy - France (signal DVB-T transmis depuis l'émetteur de Nondéfini )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Nancy - Nondéfini ####
++#R1
++T 522166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#R2
++T 682166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#R3
++T 794166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#R4
++T 770166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#R5
++T 498166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#R6
++T 826166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Nantes dvb-apps/util/scan/dvb-t/fr-Nantes
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Nantes   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Nantes 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,8 @@
++# Nantes - France
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 498000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 506000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 530000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 802000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-NeufchatelEnBray dvb-apps/util/scan/dvb-t/fr-NeufchatelEnBray
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-NeufchatelEnBray 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-NeufchatelEnBray       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Neufchatel-en-Bray - France (DVB-T transmitter of Neufchatel-en-Bray ( Croixdalle ) )
++# Neufchatel-en-Bray - France (signal DVB-T transmis depuis l'émetteur de Croixdalle )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Neufchatel-en-Bray - Croixdalle ####
++#R1
++T 746000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 722000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 522000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 498000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 770000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Nice dvb-apps/util/scan/dvb-t/fr-Nice
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Nice     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Nice   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Nice - France (DVB-T transmitter of Nice ( MontAlban ) )
++# Nice - France (signal DVB-T transmis depuis l'émetteur de MontAlban )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Nice - MontAlban ####
++#R1
++T 610000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 554000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 578000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 690000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 642000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Niort dvb-apps/util/scan/dvb-t/fr-Niort
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Niort    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Niort  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Niort - France (DVB-T transmitter of Niort-Maisonnay)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 498000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE
++T 602000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE
++T 738000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE
++T 778000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE
++T 802000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Orleans dvb-apps/util/scan/dvb-t/fr-Orleans
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Orleans  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Orleans        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,17 @@
++# Orléans / France
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#
++# R2: canal 38 : direct8 TMC Gulli europe2 bfm itélé
++T 610166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++
++# R1: canal 46 : F2 F3 F4 F5 arte LCP
++T 674166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++
++# R4: canal 48 : M6 W9 NT1
++T 690166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++
++# R6: canal 51 : TF1 NRJ12
++T 714166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++
++# R3: canal 63 : canalplus
++T 810166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Paris dvb-apps/util/scan/dvb-t/fr-Paris
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Paris    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Paris  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,19 @@
++# Paris - France - various DVB-T transmitters
++# contributed by Alexis de Lattre <alexis@via.ecp.fr>
++# Paris - Tour Eiffel      : 21 24 27 29 32 35
++# Paris Est - Chennevières : 35 51 54 57 60 63
++# Paris Nord - Sannois     : 35 51 54 57 60 63
++# Paris Sud - Villebon     : 35 51 56 57 60 63
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 474166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 498166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 522166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 538166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 562166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 586166000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
++T 714166000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
++T 738166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 754166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 762166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 786166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 810166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Parthenay dvb-apps/util/scan/dvb-t/fr-Parthenay
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Parthenay        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Parthenay      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Parthenay - France (DVB-T transmitter of Parthenay ( Amailloux ) )
++# Parthenay - France (signal DVB-T transmis depuis l'émetteur de Amailloux )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Parthenay - Amailloux ####
++#R1
++T 594000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 778000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 802000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 762000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 690000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Perpignan dvb-apps/util/scan/dvb-t/fr-Perpignan
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Perpignan        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Perpignan      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Perpignan - France (DVB-T transmitter of Perpignan ( PicdeNeulos ) )
++# Perpignan - France (signal DVB-T transmis depuis l'émetteur de PicdeNeulos )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Perpignan - PicdeNeulos ####
++#R1
++T 490000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 474000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 498000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 514000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 522000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 618000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Poitiers dvb-apps/util/scan/dvb-t/fr-Poitiers
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Poitiers 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Poitiers       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Poitiers - France (DVB-T transmitter of Poitiers ( Agglomération ) )
++# Poitiers - France (signal DVB-T transmis depuis l'émetteur de Agglomération )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Poitiers - Agglomération ####
++#R1
++T 706000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 778000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 802000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 730000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 754000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 794000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Privas dvb-apps/util/scan/dvb-t/fr-Privas
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Privas   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Privas 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Privas - France (DVB-T transmitter of Privas ( Sud ) )
++# Privas - France (signal DVB-T transmis depuis l'émetteur de Sud )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Privas - Sud ####
++#R1
++T 658000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 706000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 634000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 546000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 570000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Reims dvb-apps/util/scan/dvb-t/fr-Reims
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Reims    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Reims  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Reims - France (DVB-T transmitter of Reims ( Hautvillers ) )
++# Reims - France (signal DVB-T transmis depuis l'émetteur de Hautvillers )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Reims - Hautvillers ####
++#R1
++T 562000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 554000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 578000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 666000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 642000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Rennes dvb-apps/util/scan/dvb-t/fr-Rennes
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Rennes   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Rennes 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Rennes - France
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 562000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE
++T 586000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE
++T 650000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE
++T 674000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE
++T 626000000 8MHz 1/2 NONE QAM16 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Roanne dvb-apps/util/scan/dvb-t/fr-Roanne
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Roanne   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Roanne 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Roanne - France (DVB-T transmitter of Roanne ( Perreux ) )
++# Roanne - France (signal DVB-T transmis depuis l'émetteur de Perreux )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Roanne - Perreux ####
++#R1
++T 474000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 786000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 498000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 522000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Rouen dvb-apps/util/scan/dvb-t/fr-Rouen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Rouen    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Rouen  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,8 @@
++# Rouen - France
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 538000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 474000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 498000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 562000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-SaintEtienne dvb-apps/util/scan/dvb-t/fr-SaintEtienne
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-SaintEtienne     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-SaintEtienne   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Saint-Etienne - France (DVB-T transmitter of Saint-Etienne ( CroixduGuisay ) )
++# Saint-Etienne - France (signal DVB-T transmis depuis l'émetteur de CroixduGuisay )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Saint-Etienne - CroixduGuisay ####
++#R1
++T 706000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 490000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 618000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 538000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 514000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-SaintRaphael dvb-apps/util/scan/dvb-t/fr-SaintRaphael
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-SaintRaphael     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-SaintRaphael   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Saint-Raphaël - France (DVB-T transmitter of Saint-Raphaël ( Picdel'Ours ) )
++# Saint-Raphaël - France (signal DVB-T transmis depuis l'émetteur de Picdel'Ours )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Saint-Raphaël - Picdel'Ours ####
++#R1
++T 490000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 514000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 578000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 730000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 690000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 642000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Sannois dvb-apps/util/scan/dvb-t/fr-Sannois
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Sannois  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Sannois        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# ParisNord - France (DVB-T transmitter of ParisNord ( Sannois ) )
++# ParisNord - France (signal DVB-T transmis depuis l'émetteur de Sannois )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### ParisNord - Sannois ####
++#R1
++T 586000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 786000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 714000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 762000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Sarrebourg dvb-apps/util/scan/dvb-t/fr-Sarrebourg
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Sarrebourg       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Sarrebourg     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,30 @@
++# Sarrebourg - France (DVB-T transmitter of Sarrebourg ( Nondéfini ) )
++# Sarrebourg - France (signal DVB-T transmis depuis l'émetteur de Nondéfini )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Sarrebourg - Nondéfini ####
++#R1
++#T FREQ1 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++#T FREQ2 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++#T FREQ3 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++#T FREQ4 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++#T FREQ5 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++#T FREQ6 8MHz AUTO NONE QAM64 8k AUTO NONE
++##############################################################
++# en Avril 2006, l'emetteur pour Sarrebourg n'etait pas defini
++#  Vous devez donc modifier les frequences manuellement.
++# SVP Renvoyez le fichier mis a jour aux contacts ci-dessus.
++##############################################################
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Sens dvb-apps/util/scan/dvb-t/fr-Sens
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Sens     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Sens   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Sens - France (DVB-T transmitter of Sens ( GisylesNobles ) )
++# Sens - France (signal DVB-T transmis depuis l'émetteur de GisylesNobles )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Sens - GisylesNobles ####
++#R1
++T 778000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 794000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 770000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 690000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 802000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Strasbourg dvb-apps/util/scan/dvb-t/fr-Strasbourg
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Strasbourg       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Strasbourg     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,18 @@
++# Strasbourg - France (DVB-T transmitter of Strasbourg (Nordheim))
++# contributed by Benjamin Zores <ben@geexbox.org>
++#
++# Strasbourg - Nordheim: 22 47 48 51 61 69
++# See http://www.tvnt.net/V2/pages/342/medias/pro-bo-doc-tk-frequences_tnt.pdf
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE
++T 618000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 690000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 722000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE
++T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE
++T 794000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 858000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Toulon dvb-apps/util/scan/dvb-t/fr-Toulon
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Toulon   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Toulon 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Toulon - France (DVB-T transmitter of Toulon ( CapSicié ) )
++# Toulon - France (signal DVB-T transmis depuis l'émetteur de CapSicié )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Toulon - CapSicié ####
++#R1
++T 746000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 682000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 706000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 730000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 722000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Toulouse dvb-apps/util/scan/dvb-t/fr-Toulouse
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Toulouse 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Toulouse       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,8 @@
++# Toulouse - France (DVB-T transmitter of Bohnoure)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 754167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 698167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 722167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 714167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 746167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 730167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Toulouse-Midi dvb-apps/util/scan/dvb-t/fr-Toulouse-Midi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Toulouse-Midi    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Toulouse-Midi  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Toulouse - France (DVB-T transmitter of Toulouse ( PicduMidi ) )
++# Toulouse - France (signal DVB-T transmis depuis l'émetteur de PicduMidi )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Toulouse - PicduMidi ####
++#R1
++T 738000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 690000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 706000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 482000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 514000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 594000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Tours dvb-apps/util/scan/dvb-t/fr-Tours
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Tours    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Tours  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Tours - France (DVB-T transmitter of Tours ( Chissay ) )
++# Tours - France (signal DVB-T transmis depuis l'émetteur de Chissay )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Tours - Chissay ####
++#R1
++T 578000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 610000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 810000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 690000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 714000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Troyes dvb-apps/util/scan/dvb-t/fr-Troyes
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Troyes   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Troyes 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Troyes - France (DVB-T transmitter of Troyes ( LesRiceys ) )
++# Troyes - France (signal DVB-T transmis depuis l'émetteur de LesRiceys )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Troyes - LesRiceys ####
++#R1
++T 482000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 594000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 634000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 514000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 506000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 530000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Ussel dvb-apps/util/scan/dvb-t/fr-Ussel
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Ussel    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Ussel  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Ussel - France (DVB-T transmitter of Ussel ( Meymac ) )
++# Ussel - France (signal DVB-T transmis depuis l'émetteur de Meymac )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Ussel - Meymac ####
++#R1
++T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 634000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 722000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 746000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 658000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 682000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Valence dvb-apps/util/scan/dvb-t/fr-Valence
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Valence  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Valence        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Valence - France (DVB-T transmitter of Valence ( StRomaindeLerps ) )
++# Valence - France (signal DVB-T transmis depuis l'émetteur de StRomaindeLerps )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Valence - StRomaindeLerps ####
++#R1
++T 706000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++T 698000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++T 722000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++T 746000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++T 546000000 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++T 570000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Valenciennes dvb-apps/util/scan/dvb-t/fr-Valenciennes
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Valenciennes     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Valenciennes   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,30 @@
++# Valenciennes - France (DVB-T transmitter of Valenciennes ( Nondéfini ) )
++# Valenciennes - France (signal DVB-T transmis depuis l'émetteur de Nondéfini )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Valenciennes - Nondéfini ####
++#R1
++#T FREQ1 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++#T FREQ2 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++#T FREQ3 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++#T FREQ4 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++#T FREQ5 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++#T FREQ6 8MHz AUTO NONE QAM64 8k AUTO NONE
++##############################################################
++# en Avril 2006, l'emetteur pour Valenciennes n'etait pas defini
++#  Vous devez donc modifier les frequences manuellement.
++# SVP Renvoyez le fichier mis a jour aux contacts ci-dessus.
++##############################################################
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Vannes dvb-apps/util/scan/dvb-t/fr-Vannes
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Vannes   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Vannes 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Vannes / France
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 674167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 698167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 762167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 778167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 818167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Villebon dvb-apps/util/scan/dvb-t/fr-Villebon
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Villebon 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Villebon       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,22 @@
++# Paris - France (DVB-T transmitter of Villebon )
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++
++# Villebon - France (DVB-T transmitter of Villebon (South of Paris))
++# Villebon - France (signal DVB-T transmis depuis l'émetteur de Villebon (Sud de Paris))
++# see : http://tnt.niv2.com/91140-VILLEBON-SUR-YVETTE.html
++# contact : Nicolas Estre <n_estre@yahoo.fr>
++
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### VILLEBON SUR YVETTE ####
++#R1 35
++T 586000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
++#R2 56
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#R3 60
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#R4 63
++T 810000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#R5 51
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#R6 57
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Vittel dvb-apps/util/scan/dvb-t/fr-Vittel
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Vittel   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Vittel 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,30 @@
++# Vittel - France (DVB-T transmitter of Vittel ( Nondéfini ) )
++# Vittel - France (signal DVB-T transmis depuis l'émetteur de Nondéfini )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Vittel - Nondéfini ####
++#R1
++#T FREQ1 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++#T FREQ2 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++#T FREQ3 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++#T FREQ4 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++#T FREQ5 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++#T FREQ6 8MHz AUTO NONE QAM64 8k AUTO NONE
++##############################################################
++# en Avril 2006, l'emetteur pour Vittel n'etait pas defini
++#  Vous devez donc modifier les frequences manuellement.
++# SVP Renvoyez le fichier mis a jour aux contacts ci-dessus.
++##############################################################
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Voiron dvb-apps/util/scan/dvb-t/fr-Voiron
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/fr-Voiron   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/fr-Voiron 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,30 @@
++# Voiron - France (DVB-T transmitter of Voiron ( Nondéfini ) )
++# Voiron - France (signal DVB-T transmis depuis l'émetteur de Nondéfini )
++#
++# ATTENTION ! Ce fichier a ete construit automatiquement a partir
++# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
++# en Avril 2006. Si vous constatez des problemes et voulez apporter des
++# modifications au fichier, envoyez le fichier modifie a
++# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
++# ou a l'auteur du fichier :
++# Nicolas Estre <n_estre@yahoo.fr>
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#### Voiron - Nondéfini ####
++#R1
++#T FREQ1 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R2
++#T FREQ2 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R3
++#T FREQ3 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R4
++#T FREQ4 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R5
++#T FREQ5 8MHz AUTO NONE QAM64 8k AUTO NONE
++#R6
++#T FREQ6 8MHz AUTO NONE QAM64 8k AUTO NONE
++##############################################################
++# en Avril 2006, l'emetteur pour Voiron n'etait pas defini
++#  Vous devez donc modifier les frequences manuellement.
++# SVP Renvoyez le fichier mis a jour aux contacts ci-dessus.
++##############################################################
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/gr-Athens dvb-apps/util/scan/dvb-t/gr-Athens
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/gr-Athens   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/gr-Athens 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Initial scan config for Digital DVB-T (Ert) in Athens Greece
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 690000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/hk-HongKong dvb-apps/util/scan/dvb-t/hk-HongKong
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/hk-HongKong 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/hk-HongKong       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,18 @@
++# Hong Kong (DMB-TH)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++
++# TVB (band 35)
++T 586000000 8MHz AUTO NONE QAM64 8k 1/32 NONE
++# ATV (band 37)
++T 602000000 8MHz AUTO NONE QAM64 8k 1/32 NONE
++
++# Simulcast (band 22)
++T 482000000 8MHz AUTO NONE QAM64 8k 1/32 NONE
++# Simulcast (band 30)
++T 546000000 8MHz AUTO NONE QAM64 8k 1/32 NONE
++# Simulcast (band 32)
++T 562000000 8MHz AUTO NONE QAM64 8k 1/32 NONE
++# Simulcast (band 40)
++T 628000000 8MHz AUTO NONE QAM64 8k 1/32 NONE
++# Simulcast (band 43)
++T 650000000 8MHz AUTO NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/hr-Zagreb dvb-apps/util/scan/dvb-t/hr-Zagreb
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/hr-Zagreb   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/hr-Zagreb 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# DVB-T Hamburg
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 522000000 8MHz 3/4 NONE AUTO 8k 1/32 NONE     # CH27:
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/is-Reykjavik dvb-apps/util/scan/dvb-t/is-Reykjavik
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/is-Reykjavik        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/is-Reykjavik      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,13 @@
++# Initial scan config for Digital Ísland in Iceland
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 690000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 698000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 738000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 794000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 818000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Aosta dvb-apps/util/scan/dvb-t/it-Aosta
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Aosta    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/it-Aosta  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,21 @@
++# Italia / Aosta (it-Aosta) -- mailto: Marco <lovebuzz@email.it>
++#
++# A me funziona solo il Mux Mediaset 2 non riesco a capire come mai...
++# (magari colpa della mia pinnacle pctv 301i saa7133)
++# Gli altri Mux inseriti li ho inseriti come da sito http://www.digitv.it...
++#
++# Chi avesse news o riuscisse a venirne a capo usando anche gli altri mux potrebbe scrivermi
++#  inviare una maila kaffeine-user@lists.sf.net per aggiornare/correggere questo file...
++#
++# MUX-A RAI
++T 226500000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX MEDIASET 1
++T 474000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MBONE
++T 746000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX DFREE
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX MEDIASET 2
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# TIMB1
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Bari dvb-apps/util/scan/dvb-t/it-Bari
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Bari     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/it-Bari   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,18 @@
++# Italy, Bari
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# MUX-A RAI
++T 219500000 7MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX-B RAI
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX MEDIASET 1
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX DFREE
++T 226500000 7MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX MEDIASET 2
++T 826000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MBONE
++T 498000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# TIMB1
++T 530000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# TeleNorba, TelePuglia, altro...
++T 794000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Bologna dvb-apps/util/scan/dvb-t/it-Bologna
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Bologna  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/it-Bologna        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,28 @@
++# DVB-T Collserola (Barcelona)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#TeleSanterno
++T 186000000 7MHz 2/3 NONE QAM64 8k 1/32 NONE
++#RaiA
++T 203500000 7MHz 2/3 NONE QAM64 8k 1/32 NONE
++#Sestarete / Rete 7
++T 212500000 7MHz 2/3 NONE QAM64 8k 1/32 NONE
++#Modena
++T 219500000 7MHz 2/3 NONE QAM64 8k 1/32 NONE
++#ReteA, Camera e Senato
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#Sestarete / Rete 7
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#DFree
++T 634000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#Mediaset Mux-B
++T 698000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#La7
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#RaiB
++T 722000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#Mediaset Mux-A
++T 794000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#TeleSanterno
++T 802000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#LA7-2
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Bolzano dvb-apps/util/scan/dvb-t/it-Bolzano
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Bolzano  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/it-Bolzano        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# DVB-T Bolzano
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++
++#RAS DVB-t  NETWORK
++T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Cagliari dvb-apps/util/scan/dvb-t/it-Cagliari
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Cagliari 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/it-Cagliari       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,23 @@
++# DVB-T Cagliari
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 205500000 7MHz 3/4 NONE QAM64 8k 1/32 NONE
++T 506000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 514000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
++T 522000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 562000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
++T 594000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 642000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 674000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 698000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 722000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 730000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
++T 746000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 762000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
++T 786000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
++T 818000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Caivano dvb-apps/util/scan/dvb-t/it-Caivano
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Caivano  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/it-Caivano        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,17 @@
++# DVB-T Caivano (Naples) 80023
++# 30/10/2008 by Nicola Costanzo
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 690000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX DFREE
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX MEDIASET 1
++T 810000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX MEDIASET 2
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX LA7/MTV
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# TIMB1
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX-A RAI
++T 722000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Catania dvb-apps/util/scan/dvb-t/it-Catania
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Catania  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/it-Catania        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,27 @@
++# it-Catania
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++
++# MUX DFREE (Canale 5,Italia1,SportItalia,LCI,RadioItalia Tv)
++T 810000000      8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 690000000      8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 618000000      8MHz 2/3 NONE QAM64 8k 1/32 NONE
++
++# MUX LA7/MTV (La 7,MTV ITALIA,Canale D,Music Box)
++#T 586000000      8MHz 2/3 NONE QAM64 8k 1/32 NONE
++
++# MUX RTI (Rete 4,Class News,Sole 24 Ore TV,BBC World)
++T 586000000      8MHz 2/3 NONE QAM64 8k 1/32 NONE
++
++# MUX MEDIASET 1
++T 226500000      8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 834000000      8MHz 2/3 NONE QAM64 8k 1/32 NONE
++
++# MUX MEDIASET 2
++T 818000000      8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 650000000      8MHz 2/3 NONE QAM64 8k 1/32 NONE
++
++# MUX-A RAI (Rai Utile,Rai Doc,RaiSportSAT,RaiNews24,Rai EDU1)
++T 610000000      8MHz 2/3 NONE QAM64 8k 1/32 NONE
++
++# MUX-B RAI (Rai Utile,Rai Doc,RaiSportSAT,RaiNews24,Rai EDU1)
++T 482000000      8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Conero dvb-apps/util/scan/dvb-t/it-Conero
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Conero   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/it-Conero 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,8 @@
++# Italia / Conero (it-Conero) -- mailto: simon <f.simon@email.it>
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# C50
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# C46
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# C21
++T 474000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Firenze dvb-apps/util/scan/dvb-t/it-Firenze
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Firenze  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/it-Firenze        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,20 @@
++# This channel list is made by Michele Ficarra
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# MUX-A RAI
++T 554000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX-B RAI
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX MEDIASET 1
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX MEDIASET 2
++T 826000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX La7/MTV
++T 618000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX DFREE
++T 738000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX MBON
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX Digitoscana
++T 219500000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX Tele37
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Genova dvb-apps/util/scan/dvb-t/it-Genova
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Genova   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/it-Genova 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,12 @@
++# Italia / Genova (it-Genova) - Angelo Conforti <angeloxx@angeloxx.it>
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# MUX-A RAI
++T 498000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX-B RAI
++T 219500000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX La7/MTV
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX DFREE
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX Mediaset
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Livorno dvb-apps/util/scan/dvb-t/it-Livorno
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Livorno  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/it-Livorno        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,15 @@
++# This channel list is made by G.U.L.LI. LIvorno's Linux Users Group
++# Thanks to: Alessandro Guarguaglini, Stefano Lenzi
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# MUX-A RAI
++T 698000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX-B RAI
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX MEDIASET 1
++T 618000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX MEDIASET 2
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX La7/MTV
++T 818000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX DFREE
++T 586000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Milano dvb-apps/util/scan/dvb-t/it-Milano
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Milano   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/it-Milano 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,15 @@
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# MUX-A RAI
++T 818000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX-B RAI
++T 482000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX-A MEDIASET
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX-A MEDIASET-2
++T 618000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX La7/MTV
++T 506000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX DFREE
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX DFREE 2
++T 538000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Pagnacco dvb-apps/util/scan/dvb-t/it-Pagnacco
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Pagnacco 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/it-Pagnacco       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,27 @@
++# Italia / Pagnacco (it-Pagnacco)
++# DVB-T Pagnacco (Italia)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++
++# MUX-A RAI
++
++T 602000000 8MHz 3/4 NONE QAM64 8k 1/32 NONE
++
++# MUX-B RAI
++
++T 490000000 8MHz 3/4 NONE QAM64 8k 1/32 NONE
++T 226500000 8MHz 3/4 NONE QAM64 8k 1/32 NONE
++
++# MUX-Dfree
++
++T 634000000 8MHz 3/4 NONE QAM64 8k 1/32 NONE
++T 594000000 8MHz 3/4 NONE QAM64 8k 1/32 NONE
++
++# MUX-LA7/MTV
++
++T 522000000 8MHz 3/4 NONE QAM64 8k 1/32 NONE
++
++# Mediaset
++
++T 818000000 8MHz 3/4 NONE QAM64 8k 1/32 NONE
++
++# Europa
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Palermo dvb-apps/util/scan/dvb-t/it-Palermo
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Palermo  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/it-Palermo        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,23 @@
++# Palermo, Italy
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++
++# MUX DFREE (Canale 5,Italia1,SportItalia,LCI,RadioItalia Tv)
++T 754000000      8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 602000000      8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 850000000      8MHz 2/3 NONE QAM64 8k 1/32 NONE
++
++# MUX LA7/MTV (La 7,MTV ITALIA,Canale D,Music Box)
++#T 730000000      8MHz 2/3 NONE QAM64 8k 1/32 NONE
++
++# MUX RTI (Rete 4,Class News,Sole 24 Ore TV,BBC World)
++T 842000000      8MHz 2/3 NONE QAM64 8k 1/32 NONE
++
++# MUX MEDIASET 2
++T 682000000      8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 650000000      8MHz 2/3 NONE QAM64 8k 1/32 NONE
++
++# MUX-A RAI (Rai Utile,Rai Doc,RaiSportSAT,RaiNews24,Rai EDU1)
++T 610000000      8MHz 2/3 NONE QAM64 8k 1/32 NONE
++
++# MUX-B RAI (Rai Utile,Rai Doc,RaiSportSAT,RaiNews24,Rai EDU1)
++T 482000000      8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Pescara dvb-apps/util/scan/dvb-t/it-Pescara
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Pescara  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/it-Pescara        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,15 @@
++# Italy, Pescara San Silvestro
++# Antonio de Vincentiis, www.devincentiis.it, Montesilvano (PE)
++# update 06.02.2009
++# MUX-A RAI canale: VHF-E polarizzazione: O
++T 186000000 7MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX-B RAI canale: VHF-F polarizzazione: O
++T 194500000 7MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX MEDIASET 1 canale: UHF-69 polarizzazione: V
++T 858000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX DFREE canale: UHF-56 polarizzazione: V
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX MEDIASET 2 canale: UHF-49 polarizzazione: V
++T 698000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MBONE canale: UHF-34 polarizzazione: V
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Pisa dvb-apps/util/scan/dvb-t/it-Pisa
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Pisa     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/it-Pisa   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,18 @@
++# This channel list is made by G.U.L.LI. LIvorno's Linux Users Group
++# Thanks to: Alessandro Guarguaglini, Stefano Lenzi
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# MUX-A RAI
++T 698000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX-B RAI
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX MEDIASET 1
++T 634000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 618000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX DFREE
++T 746000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX MEDIASET 2
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX MBONE
++T 818000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX TIMB1
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Roma dvb-apps/util/scan/dvb-t/it-Roma
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Roma     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/it-Roma   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,16 @@
++# DVB-T Roma
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# MUX DFREE
++T 810000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX La7/MTV
++T 730000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX MEDIASET 1
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX MEDIASET 2
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX-A RAI
++T 698000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX-B RAI
++T 186000000 7MHz 2/3 NONE QAM64 8k 1/32 NONE
++# SUPER 3
++T 538000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Sassari dvb-apps/util/scan/dvb-t/it-Sassari
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Sassari  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/it-Sassari        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,33 @@
++# DVB-T Sassari Channels List by frippertronics@alice.it ;)
++# MUX DFREE
++T 746000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX LA7/MTV
++T 826000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX MEDIASET1
++T 802000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX MEDIASET2
++T 634000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX-A RAI
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 530000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX-B RAI
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 858000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MBONE
++T 738000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# TCS
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# VIDEOLINA
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# TIMEDIA MUX A
++T 818000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# T 474000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 810000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# TIMEDIA MUX B
++T 177500000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# T 177500000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# SUPER TV
++# T 650000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-S-Stefano_al_mare dvb-apps/util/scan/dvb-t/it-S-Stefano_al_mare
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-S-Stefano_al_mare        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/it-S-Stefano_al_mare      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,19 @@
++#DVB Santo Stefano al mare (IM)
++#Aggiornato al 10/08/2008
++#Fonte: DGTVI.it
++#s-stefano@email.it
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#MUX-A RAI
++T 586000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#MUX-B RAI
++T 666000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#MUX MEDIASET 1
++T 570000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#MUX MEDIASET 2
++T 482000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#MUX MBONE
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#MUX DFREE
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#MUX TIMB 1
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Torino dvb-apps/util/scan/dvb-t/it-Torino
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Torino   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/it-Torino 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,13 @@
++# DVB-T Torino (Italia)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#MUX-A RAI
++T 834000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
++#MUX-B RAI
++T 514000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
++#MUX RTI
++T 474000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
++#MUX LA7
++T 850000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
++T 602000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
++#MUX DFREE
++T 650000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Trieste dvb-apps/util/scan/dvb-t/it-Trieste
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Trieste  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/it-Trieste        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,23 @@
++# Trieste, Italy
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# MUX MEDIASET 1 (Class News, 24Ore TV, Coming soon, BBC World, Boing, Mediaset Premium)
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++T 474000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#
++# MUX-B RAI (Rai Doc-Futura, RaiSportSAT, RaiNotizie24, Rai EDU1, Sat2000, Radio1, Radio2, Radio3, FDAuditorium)
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#
++# MUX-A RAI (Rai Uno, Rai Due, Rai Tre, Rai Utile)
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#
++# MUX DFREE (Rete 4, Italia 1, Sportitalia, LCI / Prima, Si Live24)
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#
++# MUX (All Music)
++T 666000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#
++# MUX (Triveneta)
++T 698000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++#
++# MUX (La7 Telemarket Retecapri MTv italia Sitcom Uno)
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Varese dvb-apps/util/scan/dvb-t/it-Varese
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Varese   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/it-Varese 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,16 @@
++# Italia / Varese -- mailto: b.gabriele <gb.dvbch@dveprojects.com>
++#
++# From: http://www.dgtvi.it/copertura.aspx
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#
++# MUX-A RAI  VHF H2 226,5 O CAMPO DEI FIORI
++T 226500000 7MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX DFREE UHF C50 706 V CAMPO DEI FIORI
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX LA7-MTV UHF C37 602 V CAMPO DEI FIORI
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX RTI UHF C26 514 O CAMPO DEI FIORI PRIMA CAPPELLA
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# MUX RTI UHF C38 514 V CAMPO DEI FIORI ALBERGO
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Venezia dvb-apps/util/scan/dvb-t/it-Venezia
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Venezia  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/it-Venezia        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,19 @@
++# Italia / Venzia (it-Venezia) -- mailto: Rob <rob.davis@libero.it>
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++#
++# According to Eurosat 1/2006
++#
++# C50 - MediaSet
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# C37 - Rai A - Doesn't work in Mestre though
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# C23 -Rai B
++T 490000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# C64 DFree
++T 818000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# C65 La 7
++T 826000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# C58 Mediaset 2
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# C36 DFree
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Verona dvb-apps/util/scan/dvb-t/it-Verona
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/it-Verona   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/it-Verona 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,19 @@
++# Italia / Verona / Sommacampagna - 02/03/2009
++# Italia / Verona / Zevio - 28/02/2009
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# C26 - TIMB1
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# C34 - Mux B Rai
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# C41 - Mux  DFree
++T 634000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# C54 - MBone
++T 738000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# C58 - Rete All Music
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# C61 - Mux Mediaset 2
++T 794000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# C64 - Mux DFree
++T 818000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
++# C67 - Mediaset 1
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/lu-All dvb-apps/util/scan/dvb-t/lu-All
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/lu-All      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/lu-All    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# DVB-T Luxembourg [2007-11-18]
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 191500000 7MHz 2/3 NONE QAM16 8k 1/8 NONE  # Kanal 7   M6, RTL 8, LUXE.TV
++T 498000000 8MHz 2/3 NONE QAM64 8k 1/16 NONE # Kanal 24  club RTL, RTL TVI, plug TV, RTL 4, RTL 5, RTL 7
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/16 NONE # Kanal 27  RTL TeleLetz, 2 ten RTL
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/lv-Riga dvb-apps/util/scan/dvb-t/lv-Riga
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/lv-Riga     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/lv-Riga   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++# Latvia - Riga (lv-Riga)
++# Generated by Raimonds Cicans
++# UTF8 encoding
++
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++
++# DLRTC
++T 610000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE # Weak signal! Vājš signāls! Слабый сигнал!
++
++# Baltkom TV
++T 650000000 8MHz 3/4 NONE QAM64 8k 1/16 NONE
++T 658000000 8MHz 1/2 NONE QPSK 8k 1/4 NONE
++T 666000000 8MHz 3/4 NONE QAM64 8k 1/16 NONE
++T 690000000 8MHz 3/4 NONE QAM64 8k 1/16 NONE
++T 778000000 8MHz 3/4 NONE QAM64 8k 1/16 NONE
++T 834000000 8MHz 3/4 NONE QAM64 8k 1/16 NONE
++
++# WARNING!
++# Some applications detect incorrect guard-interval.
++
++# UZMANĪBU!
++# Dažas programmas nekorekti nosaka "guard-interval" parametru.
++
++# ВНИМАНИЕ!
++# Некоторые программы некорректно определяют параметр "guard-interval"
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/nl-All dvb-apps/util/scan/dvb-t/nl-All
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/nl-All      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/nl-All    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,42 @@
++# The Netherlands, whole country
++# Created from http://radio-tv-nederland.nl/TV%20zenderlijst%20Nederland.xls
++# and http://radio-tv-nederland.nl/dvbt/dvbt-lokaal.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 474000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
++T 474000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 482000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
++T 490000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 498000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 514000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
++T 538000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
++T 538000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 546000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
++T 554000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 562000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
++T 562000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 570000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 578000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 586000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 618000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
++T 642000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
++T 666000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 690000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
++T 706000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 722000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
++T 738000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
++T 738000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 746000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 786000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
++T 818000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
++T 818000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 826000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
++T 834000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
++T 850000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/nl-AlphenaandenRijn dvb-apps/util/scan/dvb-t/nl-AlphenaandenRijn
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/nl-AlphenaandenRijn 2004-01-25 17:50:15.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/nl-AlphenaandenRijn       1970-01-01 01:00:00.000000000 +0100
+@@ -1,7 +0,0 @@
+-# Digitenne (Alphen aan den Rijn, The Netherlands)
+-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy        
+-T 474000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
+-T 578000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
+-T 722000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
+-T 762000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
+-T 818000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/nl-Randstad dvb-apps/util/scan/dvb-t/nl-Randstad
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/nl-Randstad 2004-01-25 17:50:15.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/nl-Randstad       1970-01-01 01:00:00.000000000 +0100
+@@ -1,7 +0,0 @@
+-# Digitenne (Randstad, The Netherlands)
+-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy        
+-T 474000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
+-T 490000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
+-T 578000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
+-T 762000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
+-T 818000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/no-Trondelag_Stjordal dvb-apps/util/scan/dvb-t/no-Trondelag_Stjordal
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/no-Trondelag_Stjordal       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/no-Trondelag_Stjordal     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Norway / Trondelag / Stjordal
++# modified according to data automatically generated by w_scan
++# free (nrk) channels are on 658000000
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/nz-Waiatarua dvb-apps/util/scan/dvb-t/nz-Waiatarua
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/nz-Waiatarua        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/nz-Waiatarua      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,13 @@
++# Waiatarua, Auckland NZ
++#
++# Channel allocation details for NZ can be found at
++# http://www.rsm.govt.nz/cms/policy-and-planning/current-projects/broadcasting/digital-television-2007-frequency-plan
++#
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++
++# Multiplex DA
++T 538000000 8MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Multiplex DB
++T 570000000 8MHz 3/4 NONE QAM64 8k 1/16 NONE
++# Multiplex DC
++T 666000000 8MHz 3/4 NONE QAM64 8k 1/16 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/pl-Rzeszow dvb-apps/util/scan/dvb-t/pl-Rzeszow
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/pl-Rzeszow  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/pl-Rzeszow        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Rzeszow / Sucha Gora, South-East Poland
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/pl-Warszawa dvb-apps/util/scan/dvb-t/pl-Warszawa
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/pl-Warszawa 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/pl-Warszawa       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Warsaw / PKiN, Central Poland
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 690000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
++T 746000000 8MHz 5/6 NONE QAM16 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/pl-Wroclaw dvb-apps/util/scan/dvb-t/pl-Wroclaw
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/pl-Wroclaw  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/pl-Wroclaw        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Wroclaw / Zorawina, South-West Poland
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 530000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Alvdalen_Brunnsberg dvb-apps/util/scan/dvb-t/se-Alvdalen_Brunnsberg
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Alvdalen_Brunnsberg      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Alvdalen_Brunnsberg    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Älvdalen/Brunnsberg
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Alvdalsasen dvb-apps/util/scan/dvb-t/se-Alvdalsasen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Alvdalsasen      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Alvdalsasen    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Älvdalsåsen
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Alvsbyn dvb-apps/util/scan/dvb-t/se-Alvsbyn
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Alvsbyn  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Alvsbyn        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Sweden - Älvsbyn
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Amot dvb-apps/util/scan/dvb-t/se-Amot
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Amot     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Amot   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Åmot
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Angebo dvb-apps/util/scan/dvb-t/se-Angebo
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Angebo   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Angebo 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Ängebo
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 802000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Angelholm_Vegeholm dvb-apps/util/scan/dvb-t/se-Angelholm_Vegeholm
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Angelholm_Vegeholm       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Angelholm_Vegeholm     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Sweden - Ängelholm/Vegeholm
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 506000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 634000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 818000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 794000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ange_Snoberg dvb-apps/util/scan/dvb-t/se-Ange_Snoberg
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ange_Snoberg     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Ange_Snoberg   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Ånge/Snöberg
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Arvidsjaur_Jultrask dvb-apps/util/scan/dvb-t/se-Arvidsjaur_Jultrask
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Arvidsjaur_Jultrask      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Arvidsjaur_Jultrask    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Arvidsjaur/Julträsk
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Aspeboda dvb-apps/util/scan/dvb-t/se-Aspeboda
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Aspeboda 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Aspeboda       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Aspeboda
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Atvidaberg dvb-apps/util/scan/dvb-t/se-Atvidaberg
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Atvidaberg       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Atvidaberg     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Åtvidaberg
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Avesta_Krylbo dvb-apps/util/scan/dvb-t/se-Avesta_Krylbo
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Avesta_Krylbo    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Avesta_Krylbo  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Avesta/Krylbo
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Backefors dvb-apps/util/scan/dvb-t/se-Backefors
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Backefors        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Backefors      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Sweden - Bäckefors
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 586000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 754000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 482000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 506000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 826000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Bankeryd dvb-apps/util/scan/dvb-t/se-Bankeryd
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Bankeryd 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Bankeryd       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Bankeryd
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Bergsjo_Balleberget dvb-apps/util/scan/dvb-t/se-Bergsjo_Balleberget
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Bergsjo_Balleberget      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Bergsjo_Balleberget    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Bergsjö/Bålleberget
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Bergvik dvb-apps/util/scan/dvb-t/se-Bergvik
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Bergvik  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Bergvik        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Bergvik
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Bollebygd dvb-apps/util/scan/dvb-t/se-Bollebygd
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Bollebygd        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Bollebygd      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Bollebygd
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Bollnas dvb-apps/util/scan/dvb-t/se-Bollnas
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Bollnas  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Bollnas        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Bollnäs
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 538000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 578000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 618000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Boras_Dalsjofors dvb-apps/util/scan/dvb-t/se-Boras_Dalsjofors
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Boras_Dalsjofors 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Boras_Dalsjofors       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Sweden - Borås/Dalsjöfors
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 738000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 538000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 594000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 794000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Boras_Sjobo dvb-apps/util/scan/dvb-t/se-Boras_Sjobo
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Boras_Sjobo      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Boras_Sjobo    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Borås/Sjöbo
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 810000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Borlange_Idkerberget dvb-apps/util/scan/dvb-t/se-Borlange_Idkerberget
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Borlange_Idkerberget     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Borlange_Idkerberget   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Borlänge/Idkerberget
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Borlange_Nygardarna dvb-apps/util/scan/dvb-t/se-Borlange_Nygardarna
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Borlange_Nygardarna      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Borlange_Nygardarna    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Borlänge/Nygårdarna
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Bottnaryd_Ryd dvb-apps/util/scan/dvb-t/se-Bottnaryd_Ryd
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Bottnaryd_Ryd    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Bottnaryd_Ryd  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Bottnaryd/Ryd
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Bromsebro dvb-apps/util/scan/dvb-t/se-Bromsebro
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Bromsebro        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Bromsebro      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Brömsebro
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Bruzaholm dvb-apps/util/scan/dvb-t/se-Bruzaholm
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Bruzaholm        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Bruzaholm      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Bruzaholm
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Byxelkrok dvb-apps/util/scan/dvb-t/se-Byxelkrok
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Byxelkrok        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Byxelkrok      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Byxelkrok
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Dadran dvb-apps/util/scan/dvb-t/se-Dadran
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Dadran   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Dadran 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Dådran
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Dalfors dvb-apps/util/scan/dvb-t/se-Dalfors
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Dalfors  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Dalfors        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Dalfors
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Dalstuga dvb-apps/util/scan/dvb-t/se-Dalstuga
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Dalstuga 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Dalstuga       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Dalstuga
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Degerfors dvb-apps/util/scan/dvb-t/se-Degerfors
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Degerfors        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Degerfors      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Degerfors
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 738000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Delary dvb-apps/util/scan/dvb-t/se-Delary
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Delary   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Delary 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Delary
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Djura dvb-apps/util/scan/dvb-t/se-Djura
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Djura    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Djura  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Djura
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Drevdagen dvb-apps/util/scan/dvb-t/se-Drevdagen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Drevdagen        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Drevdagen      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Drevdagen
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Duvnas dvb-apps/util/scan/dvb-t/se-Duvnas
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Duvnas   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Duvnas 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Duvnäs
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Duvnas_Basna dvb-apps/util/scan/dvb-t/se-Duvnas_Basna
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Duvnas_Basna     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Duvnas_Basna   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Duvnäs/Bäsna
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Edsbyn dvb-apps/util/scan/dvb-t/se-Edsbyn
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Edsbyn   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Edsbyn 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Edsbyn
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Emmaboda_Balshult dvb-apps/util/scan/dvb-t/se-Emmaboda_Balshult
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Emmaboda_Balshult        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Emmaboda_Balshult      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Emmaboda/Bälshult
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 474000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Enviken dvb-apps/util/scan/dvb-t/se-Enviken
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Enviken  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Enviken        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Enviken
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 474000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Fagersta dvb-apps/util/scan/dvb-t/se-Fagersta
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Fagersta 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Fagersta       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Fagersta
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Falerum_Centrum dvb-apps/util/scan/dvb-t/se-Falerum_Centrum
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Falerum_Centrum  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Falerum_Centrum        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Falerum/Centrum
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Falun_Lovberget dvb-apps/util/scan/dvb-t/se-Falun_Lovberget
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Falun_Lovberget  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Falun_Lovberget        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Falun/Lövberget
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Farila dvb-apps/util/scan/dvb-t/se-Farila
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Farila   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Farila 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Färila
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Faro_Ajkerstrask dvb-apps/util/scan/dvb-t/se-Faro_Ajkerstrask
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Faro_Ajkerstrask 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Faro_Ajkerstrask       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Fårö/Ajkersträsk
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Farosund_Bunge dvb-apps/util/scan/dvb-t/se-Farosund_Bunge
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Farosund_Bunge   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Farosund_Bunge 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Sweden - Fårösund/Bunge
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Filipstad_Klockarhojden dvb-apps/util/scan/dvb-t/se-Filipstad_Klockarhojden
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Filipstad_Klockarhojden  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Filipstad_Klockarhojden        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Filipstad/Klockarhöjden
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Finnveden dvb-apps/util/scan/dvb-t/se-Finnveden
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Finnveden        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Finnveden      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Finnveden
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Fredriksberg dvb-apps/util/scan/dvb-t/se-Fredriksberg
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Fredriksberg     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Fredriksberg   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Fredriksberg
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Fritsla dvb-apps/util/scan/dvb-t/se-Fritsla
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Fritsla  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Fritsla        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Fritsla
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Furudal dvb-apps/util/scan/dvb-t/se-Furudal
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Furudal  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Furudal        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Furudal
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gallivare dvb-apps/util/scan/dvb-t/se-Gallivare
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gallivare        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Gallivare      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Gällivare
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Garpenberg_Kuppgarden dvb-apps/util/scan/dvb-t/se-Garpenberg_Kuppgarden
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Garpenberg_Kuppgarden    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Garpenberg_Kuppgarden  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Garpenberg/Kuppgården
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gavle dvb-apps/util/scan/dvb-t/se-Gavle
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gavle    2004-01-25 15:33:02.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Gavle  1970-01-01 01:00:00.000000000 +0100
+@@ -1,6 +0,0 @@
+-# Gavle (Senda/Boxer Sweden)
+-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+-T 498000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+-T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+-T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gavle_Skogmur dvb-apps/util/scan/dvb-t/se-Gavle_Skogmur
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gavle_Skogmur    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Gavle_Skogmur  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Gävle/Skogmur
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 498000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gnarp dvb-apps/util/scan/dvb-t/se-Gnarp
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gnarp    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Gnarp  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Gnarp
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gnesta dvb-apps/util/scan/dvb-t/se-Gnesta
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gnesta   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Gnesta 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Gnesta
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gnosjo_Marieholm dvb-apps/util/scan/dvb-t/se-Gnosjo_Marieholm
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gnosjo_Marieholm 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Gnosjo_Marieholm       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Gnosjö/Marieholm
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Goteborg_Brudaremossen dvb-apps/util/scan/dvb-t/se-Goteborg_Brudaremossen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Goteborg_Brudaremossen   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Goteborg_Brudaremossen 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Sweden - Göteborg/Brudaremossen
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 594000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 818000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Goteborg_Slattadamm dvb-apps/util/scan/dvb-t/se-Goteborg_Slattadamm
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Goteborg_Slattadamm      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Goteborg_Slattadamm    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Sweden - Göteborg/Slättadamm
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 594000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 818000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gullbrandstorp dvb-apps/util/scan/dvb-t/se-Gullbrandstorp
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gullbrandstorp   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Gullbrandstorp 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Gullbrandstorp
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gunnarsbo dvb-apps/util/scan/dvb-t/se-Gunnarsbo
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gunnarsbo        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Gunnarsbo      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Gunnarsbo
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gusum dvb-apps/util/scan/dvb-t/se-Gusum
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Gusum    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Gusum  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Gusum
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hagfors_Varmullsasen dvb-apps/util/scan/dvb-t/se-Hagfors_Varmullsasen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hagfors_Varmullsasen     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Hagfors_Varmullsasen   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Hagfors/Värmullsåsen
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 802000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hallaryd dvb-apps/util/scan/dvb-t/se-Hallaryd
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hallaryd 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Hallaryd       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Hallaryd
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hallbo dvb-apps/util/scan/dvb-t/se-Hallbo
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hallbo   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Hallbo 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Hällbo
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Halmstad_Hamnen dvb-apps/util/scan/dvb-t/se-Halmstad_Hamnen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Halmstad_Hamnen  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Halmstad_Hamnen        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Halmstad/Hamnen
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Halmstad_Oskarstrom dvb-apps/util/scan/dvb-t/se-Halmstad_Oskarstrom
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Halmstad_Oskarstrom      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Halmstad_Oskarstrom    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Halmstad/Oskarström
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 474000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 530000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 610000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 666000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Harnosand_Harnon dvb-apps/util/scan/dvb-t/se-Harnosand_Harnon
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Harnosand_Harnon 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Harnosand_Harnon       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Härnösand/Härnön
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hassela dvb-apps/util/scan/dvb-t/se-Hassela
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hassela  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Hassela        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Hassela
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Havdhem dvb-apps/util/scan/dvb-t/se-Havdhem
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Havdhem  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Havdhem        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Sweden - Havdhem
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hedemora dvb-apps/util/scan/dvb-t/se-Hedemora
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hedemora 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Hedemora       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Hedemora
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Helsingborg_Olympia dvb-apps/util/scan/dvb-t/se-Helsingborg_Olympia
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Helsingborg_Olympia      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Helsingborg_Olympia    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Sweden - Helsingborg/Olympia
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 506000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 634000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 818000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 794000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hennan dvb-apps/util/scan/dvb-t/se-Hennan
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hennan   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Hennan 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Hennan
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hestra_Aspas dvb-apps/util/scan/dvb-t/se-Hestra_Aspas
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hestra_Aspas     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Hestra_Aspas   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Hestra/Äspås
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hjo_Grevback dvb-apps/util/scan/dvb-t/se-Hjo_Grevback
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hjo_Grevback     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Hjo_Grevback   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Hjo/Grevbäck
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hofors dvb-apps/util/scan/dvb-t/se-Hofors
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hofors   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Hofors 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Hofors
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 586000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hogfors dvb-apps/util/scan/dvb-t/se-Hogfors
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hogfors  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Hogfors        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Högfors
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hogsby_Virstad dvb-apps/util/scan/dvb-t/se-Hogsby_Virstad
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hogsby_Virstad   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Hogsby_Virstad 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Högsby/Virstad
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Holsbybrunn_Holsbyholm dvb-apps/util/scan/dvb-t/se-Holsbybrunn_Holsbyholm
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Holsbybrunn_Holsbyholm   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Holsbybrunn_Holsbyholm 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Holsbybrunn/Holsbyholm
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Horby_Sallerup dvb-apps/util/scan/dvb-t/se-Horby_Sallerup
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Horby_Sallerup   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Horby_Sallerup 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Sweden - Hörby/Sallerup
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 506000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 634000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 818000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 794000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Horken dvb-apps/util/scan/dvb-t/se-Horken
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Horken   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Horken 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Hörken
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hudiksvall_Forsa dvb-apps/util/scan/dvb-t/se-Hudiksvall_Forsa
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hudiksvall_Forsa 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Hudiksvall_Forsa       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Hudiksvall/Forsa
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 578000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 618000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hudiksvall_Galgberget dvb-apps/util/scan/dvb-t/se-Hudiksvall_Galgberget
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Hudiksvall_Galgberget    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Hudiksvall_Galgberget  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Hudiksvall/Galgberget
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Huskvarna dvb-apps/util/scan/dvb-t/se-Huskvarna
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Huskvarna        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Huskvarna      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Huskvarna
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Idre dvb-apps/util/scan/dvb-t/se-Idre
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Idre     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Idre   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Idre
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ingatorp dvb-apps/util/scan/dvb-t/se-Ingatorp
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ingatorp 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Ingatorp       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Ingatorp
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ingvallsbenning dvb-apps/util/scan/dvb-t/se-Ingvallsbenning
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ingvallsbenning  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Ingvallsbenning        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Ingvallsbenning
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Irevik dvb-apps/util/scan/dvb-t/se-Irevik
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Irevik   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Irevik 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Irevik
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Jamjo dvb-apps/util/scan/dvb-t/se-Jamjo
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Jamjo    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Jamjo  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Jämjö
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 498000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Jarnforsen dvb-apps/util/scan/dvb-t/se-Jarnforsen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Jarnforsen       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Jarnforsen     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Järnforsen
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Jarvso dvb-apps/util/scan/dvb-t/se-Jarvso
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Jarvso   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Jarvso 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Järvsö
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 738000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Jokkmokk_Tjalmejaure dvb-apps/util/scan/dvb-t/se-Jokkmokk_Tjalmejaure
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Jokkmokk_Tjalmejaure     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Jokkmokk_Tjalmejaure   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Jokkmokk/Tjalmejaure
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 586000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 738000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Jonkoping_Bondberget dvb-apps/util/scan/dvb-t/se-Jonkoping_Bondberget
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Jonkoping_Bondberget     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Jonkoping_Bondberget   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Jönköping/Bondberget
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 586000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kalix dvb-apps/util/scan/dvb-t/se-Kalix
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kalix    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Kalix  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Kalix
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 706000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 770000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 786000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 746000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Karbole dvb-apps/util/scan/dvb-t/se-Karbole
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Karbole  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Karbole        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Kårböle
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Karlsborg_Vaberget dvb-apps/util/scan/dvb-t/se-Karlsborg_Vaberget
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Karlsborg_Vaberget       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Karlsborg_Vaberget     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Karlsborg/Vaberget
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Karlshamn dvb-apps/util/scan/dvb-t/se-Karlshamn
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Karlshamn        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Karlshamn      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Karlshamn
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 746000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 498000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 642000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 522000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Karlskrona_Vamo dvb-apps/util/scan/dvb-t/se-Karlskrona_Vamo
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Karlskrona_Vamo  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Karlskrona_Vamo        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Karlskrona/Vämö
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 746000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 498000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 642000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 522000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Karlstad_Sormon dvb-apps/util/scan/dvb-t/se-Karlstad_Sormon
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Karlstad_Sormon  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Karlstad_Sormon        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,9 @@
++# Sweden - Karlstad Sörmon Valid from 2007 09 26. Ver. 2 Correct FEC
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++# Channels
++# Mux3=30
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++# Mux4=42
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++# Mux1=43
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kaxholmen_Vistakulle dvb-apps/util/scan/dvb-t/se-Kaxholmen_Vistakulle
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kaxholmen_Vistakulle     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Kaxholmen_Vistakulle   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Kaxholmen/Vistakulle
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 474000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kinnastrom dvb-apps/util/scan/dvb-t/se-Kinnastrom
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kinnastrom       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Kinnastrom     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Kinnaström
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kiruna_Kirunavaara dvb-apps/util/scan/dvb-t/se-Kiruna_Kirunavaara
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kiruna_Kirunavaara       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Kiruna_Kirunavaara     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Kiruna/Kirunavaara
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 586000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kisa dvb-apps/util/scan/dvb-t/se-Kisa
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kisa     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Kisa   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Sweden - Kisa
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 538000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Knared dvb-apps/util/scan/dvb-t/se-Knared
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Knared   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Knared 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Knäred
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kopmanholmen dvb-apps/util/scan/dvb-t/se-Kopmanholmen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kopmanholmen     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Kopmanholmen   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Köpmanholmen
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 474000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kopparberg dvb-apps/util/scan/dvb-t/se-Kopparberg
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kopparberg       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Kopparberg     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Kopparberg
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kramfors_Lugnvik dvb-apps/util/scan/dvb-t/se-Kramfors_Lugnvik
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kramfors_Lugnvik 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Kramfors_Lugnvik       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Kramfors/Lugnvik
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 498000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kristinehamn_Utsiktsberget dvb-apps/util/scan/dvb-t/se-Kristinehamn_Utsiktsberget
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kristinehamn_Utsiktsberget       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Kristinehamn_Utsiktsberget     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Kristinehamn/Utsiktsberget
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 546000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 522000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 642000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 626000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kungsater dvb-apps/util/scan/dvb-t/se-Kungsater
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kungsater        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Kungsater      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Kungsäter
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kungsberget_GI dvb-apps/util/scan/dvb-t/se-Kungsberget_GI
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Kungsberget_GI   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Kungsberget_GI 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Kungsberget/GI
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 738000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Langshyttan dvb-apps/util/scan/dvb-t/se-Langshyttan
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Langshyttan      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Langshyttan    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Långshyttan
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Langshyttan_Engelsfors dvb-apps/util/scan/dvb-t/se-Langshyttan_Engelsfors
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Langshyttan_Engelsfors   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Langshyttan_Engelsfors 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Långshyttan/Engelsfors
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Leksand_Karingberget dvb-apps/util/scan/dvb-t/se-Leksand_Karingberget
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Leksand_Karingberget     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Leksand_Karingberget   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Leksand/Käringberget
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Lerdala dvb-apps/util/scan/dvb-t/se-Lerdala
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Lerdala  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Lerdala        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Lerdala
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Lilltjara_Digerberget dvb-apps/util/scan/dvb-t/se-Lilltjara_Digerberget
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Lilltjara_Digerberget    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Lilltjara_Digerberget  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Lilltjära/Digerberget
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Limedsforsen dvb-apps/util/scan/dvb-t/se-Limedsforsen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Limedsforsen     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Limedsforsen   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Limedsforsen
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Lindshammar_Ramkvilla dvb-apps/util/scan/dvb-t/se-Lindshammar_Ramkvilla
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Lindshammar_Ramkvilla    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Lindshammar_Ramkvilla  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Lindshammar/Ramkvilla
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Linkoping_Vattentornet dvb-apps/util/scan/dvb-t/se-Linkoping_Vattentornet
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Linkoping_Vattentornet   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Linkoping_Vattentornet 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Sweden - Linköping/Vattentornet
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 474000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ljugarn dvb-apps/util/scan/dvb-t/se-Ljugarn
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ljugarn  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Ljugarn        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Ljugarn
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Loffstrand dvb-apps/util/scan/dvb-t/se-Loffstrand
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Loffstrand       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Loffstrand     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Loffstrand
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 506000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 650000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 762000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 770000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Lonneberga dvb-apps/util/scan/dvb-t/se-Lonneberga
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Lonneberga       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Lonneberga     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Lönneberga
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Lorstrand dvb-apps/util/scan/dvb-t/se-Lorstrand
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Lorstrand        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Lorstrand      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Lörstrand
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ludvika_Bjorkasen dvb-apps/util/scan/dvb-t/se-Ludvika_Bjorkasen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ludvika_Bjorkasen        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Ludvika_Bjorkasen      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Ludvika/Björkåsen
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 498000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 474000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Lumsheden_Trekanten dvb-apps/util/scan/dvb-t/se-Lumsheden_Trekanten
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Lumsheden_Trekanten      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Lumsheden_Trekanten    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Lumsheden/Trekanten
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Lycksele_Knaften dvb-apps/util/scan/dvb-t/se-Lycksele_Knaften
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Lycksele_Knaften 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Lycksele_Knaften       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Lycksele/Knaften
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Mahult dvb-apps/util/scan/dvb-t/se-Mahult
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Mahult   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Mahult 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Mahult
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Malmo_Jagersro dvb-apps/util/scan/dvb-t/se-Malmo_Jagersro
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Malmo_Jagersro   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Malmo_Jagersro 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Sweden - Malmö/Jägersro
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 506000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 634000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 818000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 794000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Malung dvb-apps/util/scan/dvb-t/se-Malung
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Malung   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Malung 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Malung
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 474000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Mariannelund dvb-apps/util/scan/dvb-t/se-Mariannelund
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Mariannelund     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Mariannelund   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Mariannelund
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Markaryd_Hualtet dvb-apps/util/scan/dvb-t/se-Markaryd_Hualtet
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Markaryd_Hualtet 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Markaryd_Hualtet       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Markaryd/Hualtet
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Matfors dvb-apps/util/scan/dvb-t/se-Matfors
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Matfors  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Matfors        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Matfors
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Molnbo_Tallstugan dvb-apps/util/scan/dvb-t/se-Molnbo_Tallstugan
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Molnbo_Tallstugan        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Molnbo_Tallstugan      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,2 @@
++# Sweden - Mölnbo/Tallstugan
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Molndal_Vasterberget dvb-apps/util/scan/dvb-t/se-Molndal_Vasterberget
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Molndal_Vasterberget     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Molndal_Vasterberget   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Sweden - Mölndal/Västerberget
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 594000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 818000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Mora_Eldris dvb-apps/util/scan/dvb-t/se-Mora_Eldris
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Mora_Eldris      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Mora_Eldris    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Mora/Eldris
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 586000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Motala_Ervasteby dvb-apps/util/scan/dvb-t/se-Motala_Ervasteby
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Motala_Ervasteby 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Motala_Ervasteby       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Sweden - Motala/Ervasteby
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 474000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Mullsjo_Torestorp dvb-apps/util/scan/dvb-t/se-Mullsjo_Torestorp
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Mullsjo_Torestorp        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Mullsjo_Torestorp      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Mullsjö/Torestorp
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 850000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Nassjo dvb-apps/util/scan/dvb-t/se-Nassjo
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Nassjo   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Nassjo 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Nässjö
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 586000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Navekvarn dvb-apps/util/scan/dvb-t/se-Navekvarn
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Navekvarn        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Navekvarn      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Nävekvarn
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Norrahammar dvb-apps/util/scan/dvb-t/se-Norrahammar
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Norrahammar      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Norrahammar    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Norrahammar
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 738000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Norrkoping_Krokek dvb-apps/util/scan/dvb-t/se-Norrkoping_Krokek
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Norrkoping_Krokek        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Norrkoping_Krokek      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Sweden - Norrköping/Krokek
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 802000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Norrtalje_Sodra_Bergen dvb-apps/util/scan/dvb-t/se-Norrtalje_Sodra_Bergen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Norrtalje_Sodra_Bergen   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Norrtalje_Sodra_Bergen 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Sweden - Norrtälje/Södra Bergen
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Nykoping dvb-apps/util/scan/dvb-t/se-Nykoping
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Nykoping 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Nykoping       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Nyköping
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 498000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Orebro_Lockhyttan dvb-apps/util/scan/dvb-t/se-Orebro_Lockhyttan
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Orebro_Lockhyttan        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Orebro_Lockhyttan      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Sweden - Örebro/Lockhyttan
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 586000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 538000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ornskoldsvik_As dvb-apps/util/scan/dvb-t/se-Ornskoldsvik_As
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ornskoldsvik_As  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Ornskoldsvik_As        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Örnsköldsvik/Ås
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 474000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Oskarshamn dvb-apps/util/scan/dvb-t/se-Oskarshamn
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Oskarshamn       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Oskarshamn     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Oskarshamn
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 802000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ostersund_Brattasen dvb-apps/util/scan/dvb-t/se-Ostersund_Brattasen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ostersund_Brattasen      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Ostersund_Brattasen    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Sweden - Östersund/Brattåsen
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 738000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Osthammar_Valo dvb-apps/util/scan/dvb-t/se-Osthammar_Valo
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Osthammar_Valo   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Osthammar_Valo 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Sweden - Östhammar/Valö
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 474000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Overkalix dvb-apps/util/scan/dvb-t/se-Overkalix
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Overkalix        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Overkalix      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Överkalix
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 706000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 770000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 786000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 746000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Oxberg dvb-apps/util/scan/dvb-t/se-Oxberg
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Oxberg   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Oxberg 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Oxberg
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 738000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Pajala dvb-apps/util/scan/dvb-t/se-Pajala
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Pajala   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Pajala 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Pajala
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE #Teracom_Mux_2
++T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE #Teracom_Mux_3
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE #Teracom_Mux_1
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE #Teracom_Mux_4
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Paulistom dvb-apps/util/scan/dvb-t/se-Paulistom
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Paulistom        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Paulistom      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Paulistöm
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Rattvik dvb-apps/util/scan/dvb-t/se-Rattvik
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Rattvik  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Rattvik        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Rättvik
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 530000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Rengsjo dvb-apps/util/scan/dvb-t/se-Rengsjo
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Rengsjo  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Rengsjo        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Rengsjö
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Rorbacksnas dvb-apps/util/scan/dvb-t/se-Rorbacksnas
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Rorbacksnas      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Rorbacksnas    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Rörbäcksnäs
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 538000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sagmyra dvb-apps/util/scan/dvb-t/se-Sagmyra
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sagmyra  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Sagmyra        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Sågmyra
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Salen dvb-apps/util/scan/dvb-t/se-Salen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Salen    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Salen  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Sälen
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Salfjallet dvb-apps/util/scan/dvb-t/se-Salfjallet
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Salfjallet       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Salfjallet     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Sälfjället
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sarna_Mickeltemplet dvb-apps/util/scan/dvb-t/se-Sarna_Mickeltemplet
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sarna_Mickeltemplet      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Sarna_Mickeltemplet    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Särna/Mickeltemplet
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 538000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Satila dvb-apps/util/scan/dvb-t/se-Satila
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Satila   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Satila 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Sätila
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Saxdalen dvb-apps/util/scan/dvb-t/se-Saxdalen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Saxdalen 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Saxdalen       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Saxdalen
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Siljansnas_Uvberget dvb-apps/util/scan/dvb-t/se-Siljansnas_Uvberget
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Siljansnas_Uvberget      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Siljansnas_Uvberget    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Siljansnäs/Uvberget
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Skarstad dvb-apps/util/scan/dvb-t/se-Skarstad
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Skarstad 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Skarstad       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Skärstad
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Skattungbyn dvb-apps/util/scan/dvb-t/se-Skattungbyn
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Skattungbyn      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Skattungbyn    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Skattungbyn
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Skelleftea dvb-apps/util/scan/dvb-t/se-Skelleftea
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Skelleftea       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Skelleftea     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Skellefteå
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Skene_Nycklarberget dvb-apps/util/scan/dvb-t/se-Skene_Nycklarberget
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Skene_Nycklarberget      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Skene_Nycklarberget    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Skene/Nycklarberget
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Skovde dvb-apps/util/scan/dvb-t/se-Skovde
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Skovde   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Skovde 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Sweden - Skövde
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 498000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Smedjebacken_Uvberget dvb-apps/util/scan/dvb-t/se-Smedjebacken_Uvberget
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Smedjebacken_Uvberget    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Smedjebacken_Uvberget  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Smedjebacken/Uvberget
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 562000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 802000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Soderhamn dvb-apps/util/scan/dvb-t/se-Soderhamn
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Soderhamn        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Soderhamn      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Söderhamn
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 810000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Soderkoping dvb-apps/util/scan/dvb-t/se-Soderkoping
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Soderkoping      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Soderkoping    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Söderköping
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sodertalje_Ragnhildsborg dvb-apps/util/scan/dvb-t/se-Sodertalje_Ragnhildsborg
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sodertalje_Ragnhildsborg 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Sodertalje_Ragnhildsborg       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,8 @@
++# Sweden - Södertälje/Ragnhildsborg
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 538000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Solleftea_Hallsta dvb-apps/util/scan/dvb-t/se-Solleftea_Hallsta
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Solleftea_Hallsta        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Solleftea_Hallsta      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Sollefteå/Hallsta
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Solleftea_Multra dvb-apps/util/scan/dvb-t/se-Solleftea_Multra
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Solleftea_Multra 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Solleftea_Multra       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Sollefteå/Multrå
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 498000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sorsjon dvb-apps/util/scan/dvb-t/se-Sorsjon
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sorsjon  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Sorsjon        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Sörsjön
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Stockholm_Marieberg dvb-apps/util/scan/dvb-t/se-Stockholm_Marieberg
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Stockholm_Marieberg      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Stockholm_Marieberg    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Sweden - Stockholm/Marieberg
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Stockholm_Nacka dvb-apps/util/scan/dvb-t/se-Stockholm_Nacka
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Stockholm_Nacka  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Stockholm_Nacka        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,8 @@
++# Sweden - Stockholm/Nacka
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE   # Teracom_Mux_1
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE   # Teracom_Mux_2
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE   # Teracom_Mux_3
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE   # Teracom_Mux_4
++T 746000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE   # Teracom_Mux_5
++T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE   # Teracom_Mux_6
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Stora_Skedvi dvb-apps/util/scan/dvb-t/se-Stora_Skedvi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Stora_Skedvi     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Stora_Skedvi   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Stora Skedvi
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Storfjaten dvb-apps/util/scan/dvb-t/se-Storfjaten
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Storfjaten       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Storfjaten     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Storfjäten
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Storuman dvb-apps/util/scan/dvb-t/se-Storuman
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Storuman 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Storuman       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Storuman
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Stromstad dvb-apps/util/scan/dvb-t/se-Stromstad
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Stromstad        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Stromstad      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Sweden - Strömstad
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 730000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 754000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 554000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 506000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 530000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Styrsjobo dvb-apps/util/scan/dvb-t/se-Styrsjobo
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Styrsjobo        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Styrsjobo      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Styrsjöbo
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sundborn dvb-apps/util/scan/dvb-t/se-Sundborn
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sundborn 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Sundborn       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Sundborn
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sundsbruk dvb-apps/util/scan/dvb-t/se-Sundsbruk
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sundsbruk        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Sundsbruk      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Sundsbruk
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sundsvall_S_Stadsberget dvb-apps/util/scan/dvb-t/se-Sundsvall_S_Stadsberget
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sundsvall_S_Stadsberget  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Sundsvall_S_Stadsberget        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Sweden - Sundsvall/S Stadsberget
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sunne_Blabarskullen dvb-apps/util/scan/dvb-t/se-Sunne_Blabarskullen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sunne_Blabarskullen      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Sunne_Blabarskullen    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Sunne/Blåbärskullen
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Svartnas dvb-apps/util/scan/dvb-t/se-Svartnas
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Svartnas 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Svartnas       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Svartnäs
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sveg_Brickan dvb-apps/util/scan/dvb-t/se-Sveg_Brickan
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Sveg_Brickan     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Sveg_Brickan   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Sveg/Brickan
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Taberg dvb-apps/util/scan/dvb-t/se-Taberg
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Taberg   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Taberg 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Taberg
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Tandadalen dvb-apps/util/scan/dvb-t/se-Tandadalen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Tandadalen       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Tandadalen     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Tandådalen
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Tasjo dvb-apps/util/scan/dvb-t/se-Tasjo
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Tasjo    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Tasjo  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Tåsjö
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Tollsjo dvb-apps/util/scan/dvb-t/se-Tollsjo
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Tollsjo  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Tollsjo        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Töllsjö
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Torsby_Bada dvb-apps/util/scan/dvb-t/se-Torsby_Bada
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Torsby_Bada      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Torsby_Bada    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Torsby/Bada
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 802000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Tranas_Bredkarr dvb-apps/util/scan/dvb-t/se-Tranas_Bredkarr
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Tranas_Bredkarr  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Tranas_Bredkarr        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Tranås/Bredkärr
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Tranemo dvb-apps/util/scan/dvb-t/se-Tranemo
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Tranemo  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Tranemo        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Tranemo
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 706000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Transtrand_Bolheden dvb-apps/util/scan/dvb-t/se-Transtrand_Bolheden
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Transtrand_Bolheden      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Transtrand_Bolheden    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Transtrand/Bolheden
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Traryd_Betas dvb-apps/util/scan/dvb-t/se-Traryd_Betas
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Traryd_Betas     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Traryd_Betas   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Traryd/Betås
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 730000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Trollhattan dvb-apps/util/scan/dvb-t/se-Trollhattan
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Trollhattan      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Trollhattan    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Sweden - Trollhättan
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 730000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 754000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 554000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 506000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 530000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Trosa dvb-apps/util/scan/dvb-t/se-Trosa
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Trosa    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Trosa  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Trosa
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Tystberga dvb-apps/util/scan/dvb-t/se-Tystberga
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Tystberga        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Tystberga      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Tystberga
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Uddevalla_Herrestad dvb-apps/util/scan/dvb-t/se-Uddevalla_Herrestad
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Uddevalla_Herrestad      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Uddevalla_Herrestad    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Sweden - Uddevalla/Herrestad
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 730000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 754000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 554000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 506000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 530000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ullared dvb-apps/util/scan/dvb-t/se-Ullared
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ullared  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Ullared        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Ullared
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ulricehamn dvb-apps/util/scan/dvb-t/se-Ulricehamn
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ulricehamn       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Ulricehamn     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Ulricehamn
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 842000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ulvshyttan_Porjus dvb-apps/util/scan/dvb-t/se-Ulvshyttan_Porjus
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ulvshyttan_Porjus        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Ulvshyttan_Porjus      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Ulvshyttan/Porjus
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Uppsala_Rickomberga dvb-apps/util/scan/dvb-t/se-Uppsala_Rickomberga
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Uppsala_Rickomberga      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Uppsala_Rickomberga    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Uppsala/Rickomberga
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Uppsala_Vedyxa dvb-apps/util/scan/dvb-t/se-Uppsala_Vedyxa
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Uppsala_Vedyxa   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Uppsala_Vedyxa 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Sweden - Uppsala/Vedyxa
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 474000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vaddo_Elmsta dvb-apps/util/scan/dvb-t/se-Vaddo_Elmsta
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vaddo_Elmsta     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Vaddo_Elmsta   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Väddö/Elmsta
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Valdemarsvik dvb-apps/util/scan/dvb-t/se-Valdemarsvik
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Valdemarsvik     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Valdemarsvik   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# Sweden - Valdemarsvik
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 794000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vannas_Granlundsberget dvb-apps/util/scan/dvb-t/se-Vannas_Granlundsberget
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vannas_Granlundsberget   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Vannas_Granlundsberget 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Vännäs/Granlundsberget
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 786000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 722000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vansbro_Hummelberget dvb-apps/util/scan/dvb-t/se-Vansbro_Hummelberget
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vansbro_Hummelberget     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Vansbro_Hummelberget   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Vansbro/Hummelberget
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Varberg_Grimeton dvb-apps/util/scan/dvb-t/se-Varberg_Grimeton
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Varberg_Grimeton 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Varberg_Grimeton       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Varberg/Grimeton
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 474000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 530000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 610000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 666000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vasteras_Lillharad dvb-apps/util/scan/dvb-t/se-Vasteras_Lillharad
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vasteras_Lillharad       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Vasteras_Lillharad     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Sweden - Västerås/Lillhärad
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 554000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vastervik_Farhult dvb-apps/util/scan/dvb-t/se-Vastervik_Farhult
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vastervik_Farhult        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Vastervik_Farhult      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Västervik/Fårhult
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 498000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 546000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vaxbo dvb-apps/util/scan/dvb-t/se-Vaxbo
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vaxbo    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Vaxbo  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Växbo
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 682000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vessigebro dvb-apps/util/scan/dvb-t/se-Vessigebro
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vessigebro       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Vessigebro     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Vessigebro
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 762000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vetlanda_Nye dvb-apps/util/scan/dvb-t/se-Vetlanda_Nye
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vetlanda_Nye     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Vetlanda_Nye   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Vetlanda/Nye
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vikmanshyttan dvb-apps/util/scan/dvb-t/se-Vikmanshyttan
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vikmanshyttan    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Vikmanshyttan  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Vikmanshyttan
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 538000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Virserum dvb-apps/util/scan/dvb-t/se-Virserum
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Virserum 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Virserum       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Virserum
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 738000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Visby_Follingbo dvb-apps/util/scan/dvb-t/se-Visby_Follingbo
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Visby_Follingbo  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Visby_Follingbo        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Sweden - Visby/Follingbo
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 634000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 714000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 690000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 770000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Visby_Hamnen dvb-apps/util/scan/dvb-t/se-Visby_Hamnen
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Visby_Hamnen     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Visby_Hamnen   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Sweden - Visby/Hamnen
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 522000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 586000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Visingso dvb-apps/util/scan/dvb-t/se-Visingso
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Visingso 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Visingso       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Visingsö
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vislanda_Nydala dvb-apps/util/scan/dvb-t/se-Vislanda_Nydala
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Vislanda_Nydala  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Vislanda_Nydala        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Sweden - Vislanda/Nydala
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 626000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
++T 602000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Voxna dvb-apps/util/scan/dvb-t/se-Voxna
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Voxna    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Voxna  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Voxna
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ystad_Metallgatan dvb-apps/util/scan/dvb-t/se-Ystad_Metallgatan
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Ystad_Metallgatan        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Ystad_Metallgatan      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Sweden - Ystad/Metallgatan
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 506000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 634000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 818000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
++T 794000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Yttermalung dvb-apps/util/scan/dvb-t/se-Yttermalung
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/se-Yttermalung      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/se-Yttermalung    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,3 @@
++# Sweden - Yttermalung
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/sk-BanskaBystrica dvb-apps/util/scan/dvb-t/sk-BanskaBystrica
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/sk-BanskaBystrica   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/sk-BanskaBystrica 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# DVB-T Banska Bystrica (Banska Bystrica, Slovak Republic)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++
++T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/sk-Bratislava dvb-apps/util/scan/dvb-t/sk-Bratislava
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/sk-Bratislava       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/sk-Bratislava     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# DVB-T Bratislava (Bratislava, Slovak Republic)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++
++T 834000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/sk-Kosice dvb-apps/util/scan/dvb-t/sk-Kosice
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/sk-Kosice   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/sk-Kosice 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,4 @@
++# DVB-T Kosice (Kosice, Slovak Republic)
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++
++T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/tw-Kaohsiung dvb-apps/util/scan/dvb-t/tw-Kaohsiung
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/tw-Kaohsiung        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/tw-Kaohsiung      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++# Taiwan - Kaohsiung, southern Taiwan
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 545000000 6MHz 2/3 NONE QAM16 8k 1/4 NONE
++T 545000000 6MHz 2/3 NONE QAM16 8k 1/8 NONE
++T 557000000 6MHz 2/3 NONE QAM16 8k 1/4 NONE
++T 557000000 6MHz 2/3 NONE QAM16 8k 1/8 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/tw-Taipei dvb-apps/util/scan/dvb-t/tw-Taipei
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/tw-Taipei   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/tw-Taipei 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# Taiwan - Taipei, northern Taiwan
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 533000000 6MHz 1/2 NONE QAM16 8k 1/8 NONE
++T 545000000 6MHz 2/3 NONE QAM16 8k 1/8 NONE
++T 557000000 6MHz 2/3 NONE QAM16 8k 1/4 NONE
++T 581000000 6MHz 2/3 NONE QAM16 8k 1/4 NONE
++T 593000000 6MHz 2/3 NONE QAM16 8k 1/4 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Aberdare dvb-apps/util/scan/dvb-t/uk-Aberdare
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Aberdare 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Aberdare       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Aberdare
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 530167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 562167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 489833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 513833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 538167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 570167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Angus dvb-apps/util/scan/dvb-t/uk-Angus
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Angus    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Angus  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Angus
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 850000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 834167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 777833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 801833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 753833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 825833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-BeaconHill dvb-apps/util/scan/dvb-t/uk-BeaconHill
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-BeaconHill       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-BeaconHill     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Beacon Hill
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 721833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 794167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 770167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 738167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 753833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 818167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Belmont dvb-apps/util/scan/dvb-t/uk-Belmont
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Belmont  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Belmont        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Belmont
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 546000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 690000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 850000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 834000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 786000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 762167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Bilsdale dvb-apps/util/scan/dvb-t/uk-Bilsdale
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Bilsdale 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Bilsdale       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Bilsdale
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 578167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 474000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 554000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 498167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 522167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 642000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-BlackHill dvb-apps/util/scan/dvb-t/uk-BlackHill
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-BlackHill        2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-BlackHill      2009-06-21 13:29:06.000000000 +0200
+@@ -1,3 +1,10 @@
+-# uk BlackHill
++# UK, Black Hill
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 634167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 634167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 682167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 658167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 714167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 746000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 826000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Blaenplwyf dvb-apps/util/scan/dvb-t/uk-Blaenplwyf
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Blaenplwyf       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Blaenplwyf     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Blaenplwyf
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 530167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 482167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 506167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 562167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 538167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 570167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-BluebellHill dvb-apps/util/scan/dvb-t/uk-BluebellHill
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-BluebellHill     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-BluebellHill   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Bluebell Hill
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 778000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 498000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 522000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 665833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 641833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 618000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Bressay dvb-apps/util/scan/dvb-t/uk-Bressay
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Bressay  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Bressay        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Bressay
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 474000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 497833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 521833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 553833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 834000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 850000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-BrierleyHill dvb-apps/util/scan/dvb-t/uk-BrierleyHill
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-BrierleyHill     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-BrierleyHill   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Brierley Hill
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 850000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 825833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 753833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 777833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 834167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 801833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-BristolIlchesterCres dvb-apps/util/scan/dvb-t/uk-BristolIlchesterCres
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-BristolIlchesterCres     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-BristolIlchesterCres   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Bristol Ilchester Cres.
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 697833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 618000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 634167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 658167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 682167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 714167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-BristolKingsWeston dvb-apps/util/scan/dvb-t/uk-BristolKingsWeston
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-BristolKingsWeston       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-BristolKingsWeston     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Bristol King's Weston
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 482000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 506000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 530000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 562000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 546000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 578000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Bromsgrove dvb-apps/util/scan/dvb-t/uk-Bromsgrove
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Bromsgrove       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Bromsgrove     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Bromsgrove
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 578167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 537833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 569833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 489833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 513833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 545833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-BrougherMountain dvb-apps/util/scan/dvb-t/uk-BrougherMountain
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-BrougherMountain 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-BrougherMountain       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Brougher Mountain
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 546167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 578167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 490167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 514167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 538167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 570167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Caldbeck dvb-apps/util/scan/dvb-t/uk-Caldbeck
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Caldbeck 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Caldbeck       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Caldbeck
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 506000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 490000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 514167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 618000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 666000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 642000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-CaradonHill dvb-apps/util/scan/dvb-t/uk-CaradonHill
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-CaradonHill      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-CaradonHill    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Caradon Hill
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 578000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 553833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 690000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 474000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 497833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 522000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Carmel dvb-apps/util/scan/dvb-t/uk-Carmel
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Carmel   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Carmel 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Carmel
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 746000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 825833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 777833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 801833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 850000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 834167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Chatton dvb-apps/util/scan/dvb-t/uk-Chatton
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Chatton  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Chatton        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Chatton
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 626167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 706167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 650167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 674167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 682167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 714167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Chesterfield dvb-apps/util/scan/dvb-t/uk-Chesterfield
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Chesterfield     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Chesterfield   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Chesterfield
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 578167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 626000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 650000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 674000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 706000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 722000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Craigkelly dvb-apps/util/scan/dvb-t/uk-Craigkelly
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Craigkelly       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Craigkelly     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Craigkelly
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 570000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 538000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 489833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 513833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 642000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 618000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-CrystalPalace dvb-apps/util/scan/dvb-t/uk-CrystalPalace
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-CrystalPalace    2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-CrystalPalace  2009-06-21 13:29:06.000000000 +0200
+@@ -1,3 +1,10 @@
+-# Crystal Palace
++# UK, Crystal Palace
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 505833333 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 505833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 481833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 561833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 529833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 578167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 537833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Darvel dvb-apps/util/scan/dvb-t/uk-Darvel
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Darvel   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Darvel 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Darvel
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 481833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 505833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 561833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 529833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 546167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 578000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Divis dvb-apps/util/scan/dvb-t/uk-Divis
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Divis    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Divis  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Divis
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 538000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 569833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 489833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 513833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 690000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 578167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Dover dvb-apps/util/scan/dvb-t/uk-Dover
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Dover    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Dover  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,14 @@
++# UK, Dover
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 850000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 794167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 745833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 770167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 762167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 785833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++# UK, Dover B
++T 666000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 642000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 618167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Durris dvb-apps/util/scan/dvb-t/uk-Durris
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Durris   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Durris 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Durris
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 546000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 578000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 722167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 713833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 634000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 658000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Eitshal dvb-apps/util/scan/dvb-t/uk-Eitshal
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Eitshal  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Eitshal        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Eitshal
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 578167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 546167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 481833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 505833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 529833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 561833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-EmleyMoor dvb-apps/util/scan/dvb-t/uk-EmleyMoor
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-EmleyMoor        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-EmleyMoor      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Emley Moor
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 722167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 625833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 649833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 673833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 705833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 697833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Fenham dvb-apps/util/scan/dvb-t/uk-Fenham
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Fenham   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Fenham 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Fenham
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 545833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 482167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 506167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 530167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 562167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 762167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Fenton dvb-apps/util/scan/dvb-t/uk-Fenton
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Fenton   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Fenton 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Fenton
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 577833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 545833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 482167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 506167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 530167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 562167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Ferryside dvb-apps/util/scan/dvb-t/uk-Ferryside
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Ferryside        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Ferryside      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,8 @@
++# UK, Ferryside
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 474167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 545833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 498000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 522000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Guildford dvb-apps/util/scan/dvb-t/uk-Guildford
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Guildford        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Guildford      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Guildford
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 697833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 658167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 634167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 714167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 682167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 738000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Hannington dvb-apps/util/scan/dvb-t/uk-Hannington
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Hannington       2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Hannington     2009-06-21 13:29:06.000000000 +0200
+@@ -1,3 +1,10 @@
+-# Hannington, North Hampshire
++# UK, Hannington
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+ T 706000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 650167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 626167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 674167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 658167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 634167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Hastings dvb-apps/util/scan/dvb-t/uk-Hastings
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Hastings 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Hastings       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Hastings
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 553833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 521833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 474000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 497833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 810000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 786000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Heathfield dvb-apps/util/scan/dvb-t/uk-Heathfield
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Heathfield       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Heathfield     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Heathfield
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 578000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 538000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 689833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 681833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 738000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 713833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-HemelHempstead dvb-apps/util/scan/dvb-t/uk-HemelHempstead
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-HemelHempstead   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-HemelHempstead 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Hemel Hempstead
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 690167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 746000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 786167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 777833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 802000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 826000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-HuntshawCross dvb-apps/util/scan/dvb-t/uk-HuntshawCross
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-HuntshawCross    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-HuntshawCross  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,13 @@
++# UK, Huntshaw Cross
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 737833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 769833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 793833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 817833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 729833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 761833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++# UK, Huntshaw Cross B
++T 714000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 682000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Idle dvb-apps/util/scan/dvb-t/uk-Idle
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Idle     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Idle   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Idle
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 666000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 730000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 578000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 754000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 545833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 642000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-KeelylangHill dvb-apps/util/scan/dvb-t/uk-KeelylangHill
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-KeelylangHill    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-KeelylangHill  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Keelylang Hill
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 690167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 722167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 634167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 658167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 682167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 714167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Keighley dvb-apps/util/scan/dvb-t/uk-Keighley
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Keighley 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Keighley       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Keighley
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 690000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 850000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 834000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 729833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 546000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 578000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-KilveyHill dvb-apps/util/scan/dvb-t/uk-KilveyHill
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-KilveyHill       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-KilveyHill     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Kilvey Hill
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 505833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 481833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 529833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 561833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 474000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 553833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-KnockMore dvb-apps/util/scan/dvb-t/uk-KnockMore
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-KnockMore        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-KnockMore      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Knock More
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 578167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 546167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 730000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 762167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 786000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 753833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Lancaster dvb-apps/util/scan/dvb-t/uk-Lancaster
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Lancaster        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Lancaster      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Lancaster
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 530167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 482167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 506167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 562167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 578000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 545833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-LarkStoke dvb-apps/util/scan/dvb-t/uk-LarkStoke
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-LarkStoke        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-LarkStoke      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Lark Stoke
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 474000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 554000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 498167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 522167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 762000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 786000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Limavady dvb-apps/util/scan/dvb-t/uk-Limavady
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Limavady 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Limavady       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Limavady
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 842000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 769833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 730000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 761833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 786167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 810167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Llanddona dvb-apps/util/scan/dvb-t/uk-Llanddona
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Llanddona        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Llanddona      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Llanddona
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 706000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 738167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 770167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 794167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 818167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 674000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Malvern dvb-apps/util/scan/dvb-t/uk-Malvern
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Malvern  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Malvern        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Malvern
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 722167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 618000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 682000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 658000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 714000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 634000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Mendip dvb-apps/util/scan/dvb-t/uk-Mendip
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Mendip   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Mendip 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Mendip
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 778167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 746167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 802167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 826167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 754167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 842000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Midhurst dvb-apps/util/scan/dvb-t/uk-Midhurst
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Midhurst 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Midhurst       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Midhurst
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 754167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 826167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 802167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 778167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 817833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 786167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Moel-y-Parc dvb-apps/util/scan/dvb-t/uk-Moel-y-Parc
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Moel-y-Parc      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Moel-y-Parc    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Moel-y-Parc
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 738000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 770000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 794000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 818000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 546000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 578000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Nottingham dvb-apps/util/scan/dvb-t/uk-Nottingham
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Nottingham       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Nottingham     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Nottingham
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 618000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 842000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 730000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 810000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 538000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 778000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-OliversMount dvb-apps/util/scan/dvb-t/uk-OliversMount
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-OliversMount     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-OliversMount   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Oliver's Mount
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 698000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 842167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 738167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 770167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 794167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 818167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Oxford dvb-apps/util/scan/dvb-t/uk-Oxford
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Oxford   2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Oxford 2009-06-21 13:29:06.000000000 +0200
+@@ -1,3 +1,10 @@
+-# Oxford
++# UK, Oxford
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 578000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 578000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 850000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 713833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 721833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 690000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 538000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-PendleForest dvb-apps/util/scan/dvb-t/uk-PendleForest
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-PendleForest     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-PendleForest   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Pendle Forest
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 474000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 497833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 521833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 553833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 545833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 578000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Plympton dvb-apps/util/scan/dvb-t/uk-Plympton
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Plympton 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Plympton       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Plympton
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 722000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 842167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 833833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 785833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 809833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 754000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-PontopPike dvb-apps/util/scan/dvb-t/uk-PontopPike
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-PontopPike       2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-PontopPike     2009-06-21 13:29:06.000000000 +0200
+@@ -1,3 +1,10 @@
+-# Pontop Pike, UK
++# UK, Pontop Pike
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 690000000 8MHz 1/2 NONE QAM16 2k 1/32 NONE
++T 690000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 746167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 778167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 802167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 826167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 729833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Pontypool dvb-apps/util/scan/dvb-t/uk-Pontypool
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Pontypool        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Pontypool      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Pontypool
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 722000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 690000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 642000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 666000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 482167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 530167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Presely dvb-apps/util/scan/dvb-t/uk-Presely
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Presely  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Presely        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Presely
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 682167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 714167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 618000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 641833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 665833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 697833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Redruth dvb-apps/util/scan/dvb-t/uk-Redruth
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Redruth  2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Redruth        2009-06-21 13:29:06.000000000 +0200
+@@ -1,3 +1,10 @@
+-# Redruth, Cornwall
++# UK, Redruth
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+ T 618000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 642167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 666167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 697833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 650167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 705833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Reigate dvb-apps/util/scan/dvb-t/uk-Reigate
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Reigate  2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Reigate        2009-06-21 13:29:06.000000000 +0200
+@@ -1,3 +1,10 @@
+-# Reigate
++# UK, Reigate
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 554000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 554000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 474000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 498000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 522000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 618167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 834000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-RidgeHill dvb-apps/util/scan/dvb-t/uk-RidgeHill
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-RidgeHill        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-RidgeHill      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Ridge Hill
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 730000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 762000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 786000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 810000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 642000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 666000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Rosemarkie dvb-apps/util/scan/dvb-t/uk-Rosemarkie
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Rosemarkie       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Rosemarkie     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Rosemarkie
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 682167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 714167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 633833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 657833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 674167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 706167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Rosneath dvb-apps/util/scan/dvb-t/uk-Rosneath
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Rosneath 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Rosneath       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Rosneath
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 842000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 729833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 761833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 785833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 809833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 690000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Rowridge dvb-apps/util/scan/dvb-t/uk-Rowridge
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Rowridge 2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Rowridge       2009-06-21 13:29:06.000000000 +0200
+@@ -1,3 +1,10 @@
+-# Rowridge, Isle of Wight
++# UK, Rowridge
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 489833333 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 489833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 530000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 545833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 562167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 513833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 570167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-RumsterForest dvb-apps/util/scan/dvb-t/uk-RumsterForest
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-RumsterForest    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-RumsterForest  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Rumster Forest
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 530167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 482167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 506167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 562167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 802000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 778000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Saddleworth dvb-apps/util/scan/dvb-t/uk-Saddleworth
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Saddleworth      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Saddleworth    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Saddleworth
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 682000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 633833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 657833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 713833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 618167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 738000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Salisbury dvb-apps/util/scan/dvb-t/uk-Salisbury
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Salisbury        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Salisbury      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Salisbury
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 745833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 753833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 777833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 801833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 826000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 721833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-SandyHeath dvb-apps/util/scan/dvb-t/uk-SandyHeath
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-SandyHeath       2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-SandyHeath     2009-06-21 13:29:06.000000000 +0200
+@@ -1,3 +1,10 @@
+-# Sandy Heath
++# UK, Sandy Heath
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 641833334 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 641833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 665833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 650167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 842000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 626167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 674167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Selkirk dvb-apps/util/scan/dvb-t/uk-Selkirk
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Selkirk  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Selkirk        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Selkirk
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 730167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 762167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 786167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 810167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 834167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 754167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Sheffield dvb-apps/util/scan/dvb-t/uk-Sheffield
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Sheffield        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Sheffield      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Sheffield
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 618000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 730000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 762000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 786000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 666000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 642000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-StocklandHill dvb-apps/util/scan/dvb-t/uk-StocklandHill
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-StocklandHill    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-StocklandHill  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Stockland Hill
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 481833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 529833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 505833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 561833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 546167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 578167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Storeton dvb-apps/util/scan/dvb-t/uk-Storeton
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Storeton 2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Storeton       2009-06-21 13:29:06.000000000 +0200
+@@ -1,3 +1,10 @@
+-# Storeton, Wirral
++# UK, Storeton
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+ T 546167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 578167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 490167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 514167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 538167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 570167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Sudbury dvb-apps/util/scan/dvb-t/uk-Sudbury
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Sudbury  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Sudbury        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,12 @@
++# UK, Sudbury
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 698167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 850000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 690167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 618000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 738000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 706167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++# UK, Sudbury B
++T 754000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-SuttonColdfield dvb-apps/util/scan/dvb-t/uk-SuttonColdfield
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-SuttonColdfield  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-SuttonColdfield        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Sutton Coldfield
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 634167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 658167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 682167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 714167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 722167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 746000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Tacolneston dvb-apps/util/scan/dvb-t/uk-Tacolneston
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Tacolneston      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Tacolneston    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Tacolneston
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 810000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 786000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 730167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 769833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 794000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 818000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-TheWrekin dvb-apps/util/scan/dvb-t/uk-TheWrekin
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-TheWrekin        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-TheWrekin      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,15 @@
++# UK, The Wrekin
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 474000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 554000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 498167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 522167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 730000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 762000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++# UK, The Wrekin B
++T 618167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 698000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 642000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 666000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Torosay dvb-apps/util/scan/dvb-t/uk-Torosay
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Torosay  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Torosay        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Torosay
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 490167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 514167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 538167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 570167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 474000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 553833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-TunbridgeWells dvb-apps/util/scan/dvb-t/uk-TunbridgeWells
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-TunbridgeWells   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-TunbridgeWells 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Tunbridge Wells
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 746000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 794000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 642167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 666167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 618000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 778000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Waltham dvb-apps/util/scan/dvb-t/uk-Waltham
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Waltham  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Waltham        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Waltham
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 698000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 490000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 514000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 570000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 666000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 642000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Wenvoe dvb-apps/util/scan/dvb-t/uk-Wenvoe
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-Wenvoe   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-Wenvoe 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Wenvoe
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 546000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 578000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 625833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 705833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 649833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 673833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-WhitehawkHill dvb-apps/util/scan/dvb-t/uk-WhitehawkHill
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-WhitehawkHill    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-WhitehawkHill  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,10 @@
++# UK, Whitehawk Hill
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 834000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 706000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 746000000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 690000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 770167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 794167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-WinterHill dvb-apps/util/scan/dvb-t/uk-WinterHill
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/uk-WinterHill       2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/uk-WinterHill     2009-06-21 13:29:06.000000000 +0200
+@@ -1,3 +1,13 @@
+-# Winter Hill, North-West England
++# UK, Winter Hill
++# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
++# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
+ # T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+-T 754166670 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 754167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 834167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 850167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
++T 842167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 786167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 810167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++# UK, Winter Hill B
++T 650000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
++T 626000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/vn-Hanoi dvb-apps/util/scan/dvb-t/vn-Hanoi
+--- linuxtv-dvb-apps-1.1.1/util/scan/dvb-t/vn-Hanoi    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/dvb-t/vn-Hanoi  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,5 @@
++# Hanoi - Vietnam - DVB-T by VTC
++# contributed by Pham Thanh Nam <phamthanhnam.ptn@gmail.com>
++# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
++T 514000000 8MHz 3/4 NONE QAM64 2k 1/32 NONE
++T 578000000 8MHz 3/4 NONE QAM64 2k 1/32 NONE
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/list.h dvb-apps/util/scan/list.h
+--- linuxtv-dvb-apps-1.1.1/util/scan/list.h    2006-05-18 01:33:27.000000000 +0200
++++ dvb-apps/util/scan/list.h  2009-06-21 13:29:06.000000000 +0200
+@@ -26,7 +26,7 @@
+ } while (0)
+ /*
+- * Insert a new entry between two known consecutive entries. 
++ * Insert a new entry between two known consecutive entries.
+  *
+  * This is only for internal list manipulation where we know
+  * the prev/next entries already!
+@@ -98,7 +98,7 @@
+ static __inline__ void list_del_init(struct list_head *entry)
+ {
+       __list_del(entry->prev, entry->next);
+-      INIT_LIST_HEAD(entry); 
++      INIT_LIST_HEAD(entry);
+ }
+ /**
+@@ -126,7 +126,7 @@
+  */
+ #define list_for_each(pos, head) \
+       for (pos = (head)->next; pos != (head); pos = pos->next)
+-              
++
+ /**
+  * list_for_each_safe -       iterate over a list safe against removal of list entry
+  * @pos:      the &struct list_head to use as a loop counter.
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/lnb.c dvb-apps/util/scan/lnb.c
+--- linuxtv-dvb-apps-1.1.1/util/scan/lnb.c     2006-05-18 01:33:25.000000000 +0200
++++ dvb-apps/util/scan/lnb.c   2009-06-21 13:29:06.000000000 +0200
+@@ -1,6 +1,7 @@
+ #include <stdlib.h>
+ #include <string.h>
+ #include <ctype.h>
++#include <linux/types.h>
+ #include "lnb.h"
+ static char *univ_desc[] = {
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/lnb.h dvb-apps/util/scan/lnb.h
+--- linuxtv-dvb-apps-1.1.1/util/scan/lnb.h     2006-05-18 01:33:27.000000000 +0200
++++ dvb-apps/util/scan/lnb.h   2009-06-21 13:29:06.000000000 +0200
+@@ -1,4 +1,3 @@
+-
+ struct lnb_types_st {
+       char    *name;
+       char    **desc;
+@@ -21,4 +20,3 @@
+ int
+ lnb_decode(char *str, struct lnb_types_st *lnbp);
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/Makefile dvb-apps/util/scan/Makefile
+--- linuxtv-dvb-apps-1.1.1/util/scan/Makefile  2006-05-18 01:34:53.000000000 +0200
++++ dvb-apps/util/scan/Makefile        2009-06-21 13:29:06.000000000 +0200
+@@ -1,21 +1,41 @@
++# Makefile for linuxtv.org dvb-apps/util/scan
+-CC = gcc
+-CFLAGS = -MD -g -Wall -O2 -I../../include
+-LFLAGS = -g -Wall
++objects  = atsc_psip_section.o \
++           diseqc.o            \
++           dump-vdr.o          \
++           dump-zap.o          \
++           lnb.o               \
++           scan.o              \
++           section.o
+-OBJS = diseqc.o dump-zap.o dump-vdr.o scan.o lnb.o section.o atsc_psip_section.o
+-SRCS = $(OBJS:.o=.c)
++binaries = scan
+-TARGET = scan
++inst_bin = $(binaries)
+-$(TARGET): $(OBJS)
+-      $(CC) $(LFLAGS) -o $(TARGET) $(OBJS)
++removing = atsc_psip_section.c atsc_psip_section.h
+-.c.o:
+-      $(CC) $(CFLAGS) -c $< -o $@
++CPPFLAGS += -DDATADIR=\"$(prefix)/share\"
+-clean:
+-      $(RM) *.o *.d $(TARGET)
++.PHONY: all
+--include $(wildcard *.d) dummy
++all: $(binaries)
++
++$(binaries): $(objects)
++$(objects): atsc_psip_section.c atsc_psip_section.h
++
++atsc_psip_section.c atsc_psip_section.h:
++      perl section_generate.pl atsc_psip_section.pl
++
++include ../../Make.rules
++
++install::
++      @echo installing scan files
++      @mkdir -p $(DESTDIR)$(sharedir)/dvb/atsc
++      @mkdir -p $(DESTDIR)$(sharedir)/dvb/dvb-c
++      @mkdir -p $(DESTDIR)$(sharedir)/dvb/dvb-s
++      @mkdir -p $(DESTDIR)$(sharedir)/dvb/dvb-t
++      @install -m 664 atsc/* $(DESTDIR)$(sharedir)/dvb/atsc/
++      @install -m 664 dvb-c/* $(DESTDIR)$(sharedir)/dvb/dvb-c/
++      @install -m 664 dvb-s/* $(DESTDIR)$(sharedir)/dvb/dvb-s/
++      @install -m 664 dvb-t/* $(DESTDIR)$(sharedir)/dvb/dvb-t/
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/README dvb-apps/util/scan/README
+--- linuxtv-dvb-apps-1.1.1/util/scan/README    2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/scan/README  2009-06-21 13:29:06.000000000 +0200
+@@ -1,18 +1,20 @@
+-Hi,
++This is a little channel scan utility to generate szap/tzap/czap/azap
++compatible channel lists. An atsc/dvbscan does not do a frequency scan, however,
++so you must manually provide the data for tuning to one or more start
++transponders. A number of initial-tuning-data files are provided for various
++dvb-c, dvb-s, dvb-t and atsc networks around the world. If you make a new one
++feel free to submit it to the linux-dvb mailing list
++http://www.linuxtv.org/lists.php.
+-this is a little channel scan utility to generate szap/tzap/czap compatible 
+-channel lists. Scan does not do a frequency scan, however, so you must
+-manually provide the data for tuning to one or more start transponders.
+-A number of initial-tuning-data files are provided for various dvb-c, dvb-s
+-and dvb-t networks around the world. If you make a new one feel free to
+-submit it to the linux-dvb mailing list http://linuxtv.org/mailinglists.xml.
++Basic usage: ./dvbscan dvb-s/Astra-19.2E | tee mychannels.conf
++or           ./atscscan atsc/us-NTSC-center-frequencies-8VSB
+-Basic usage: ./scan dvb-s/Astra-19.2E | tee mychannels.conf
++If you want it to check a specific frequency, tune to that frequency
++(e.g. using szap/tzap/czap/azap) and then use './dvbscan -c' or './atscscan -c'.
+-If you want it to check a specific frequency, tune to that frequency 
+-(e.g. using szap/tzap/czap) and then use './scan -c'.
++For more scan options see ./dvbscan -h or ./atscscan -h
+-For more scan options see ./scan -h.
++atscscan is _just_ a copy of dvbscan to not confuse ATSC-user.
+ Good luck,
+-Holger + Johannes
++Holger + Johannes + Patrick (beat me for ATSC)
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/scan.c dvb-apps/util/scan/scan.c
+--- linuxtv-dvb-apps-1.1.1/util/scan/scan.c    2006-05-18 01:33:25.000000000 +0200
++++ dvb-apps/util/scan/scan.c  2009-06-21 13:29:06.000000000 +0200
+@@ -61,9 +61,9 @@
+ static int vdr_dump_channum;
+ static int no_ATSC_PSIP;
+ static int ATSC_type=1;
+-static int ca_select = 1;
++static int ca_select = -1;
+ static int serv_select = 7;
+-static int vdr_version = 2;
++static int vdr_version = 3;
+ static struct lnb_types_st lnb_type;
+ static int unique_anon_services;
+@@ -130,6 +130,7 @@
+       struct list_head list;
+       struct list_head services;
+       int network_id;
++      int original_network_id;
+       int transport_stream_id;
+       enum fe_type type;
+       struct dvb_frontend_parameters param;
+@@ -236,6 +237,7 @@
+ static void copy_transponder(struct transponder *d, struct transponder *s)
+ {
+       d->network_id = s->network_id;
++      d->original_network_id = s->original_network_id;
+       d->transport_stream_id = s->transport_stream_id;
+       d->type = s->type;
+       memcpy(&d->param, &s->param, sizeof(d->param));
+@@ -755,12 +757,15 @@
+               switch (buf[0]) {
+               case 0x01:
+               case 0x02:
++              case 0x1b: /* H.264 video stream */
+                       moreverbose("  VIDEO     : PID 0x%04x\n", elementary_pid);
+                       if (s->video_pid == 0)
+                               s->video_pid = elementary_pid;
+                       break;
+               case 0x03:
+               case 0x81: /* Audio per ATSC A/53B [2] Annex B */
++              case 0x0f: /* ADTS Audio Stream - usually AAC */
++              case 0x11: /* ISO/IEC 14496-3 Audio with LATM transport */
+               case 0x04:
+                       moreverbose("  AUDIO     : PID 0x%04x\n", elementary_pid);
+                       if (s->audio_num < AUDIO_CHAN_MAX) {
+@@ -772,6 +777,12 @@
+                               warning("more than %i audio channels, truncating\n",
+                                    AUDIO_CHAN_MAX);
+                       break;
++              case 0x07:
++                      moreverbose("  MHEG      : PID 0x%04x\n", elementary_pid);
++                      break;
++              case 0x0B:
++                      moreverbose("  DSM-CC    : PID 0x%04x\n", elementary_pid);
++                      break;
+               case 0x06:
+                       if (find_descriptor(0x56, buf + 5, ES_info_len, NULL, NULL)) {
+                               moreverbose("  TELETEXT  : PID 0x%04x\n", elementary_pid);
+@@ -860,6 +871,7 @@
+               memset(&tn, 0, sizeof(tn));
+               tn.type = -1;
+               tn.network_id = network_id;
++              tn.original_network_id = (buf[2] << 8) | buf[3];
+               tn.transport_stream_id = transport_stream_id;
+               parse_descriptors (NIT, buf + 6, descriptors_loop_len, &tn);
+@@ -1462,21 +1474,34 @@
+       }
+       if (t->type == FE_QPSK) {
+-              int hiband = 0;
++              if (lnb_type.high_val) {
++                      if (lnb_type.switch_val) {
++                              /* Voltage-controlled switch */
++                              int hiband = 0;
+-              if (lnb_type.switch_val && lnb_type.high_val &&
+-                      p.frequency >= lnb_type.switch_val)
+-                      hiband = 1;
++                              if (p.frequency >= lnb_type.switch_val)
++                                      hiband = 1;
+-              setup_switch (frontend_fd,
+-                            switch_pos,
+-                            t->polarisation == POLARISATION_VERTICAL ? 0 : 1,
+-                            hiband);
+-              usleep(50000);
+-              if (hiband)
+-                      p.frequency = abs(p.frequency - lnb_type.high_val);
+-              else
++                              setup_switch (frontend_fd,
++                                            switch_pos,
++                                            t->polarisation == POLARISATION_VERTICAL ? 0 : 1,
++                                            hiband);
++                              usleep(50000);
++                              if (hiband)
++                                      p.frequency = abs(p.frequency - lnb_type.high_val);
++                              else
++                                      p.frequency = abs(p.frequency - lnb_type.low_val);
++                      } else {
++                              /* C-Band Multipoint LNBf */
++                              p.frequency = abs(p.frequency - (t->polarisation == POLARISATION_VERTICAL ?
++                                              lnb_type.low_val: lnb_type.high_val));
++                      }
++              } else  {
++                      /* Monopoint LNBf without switch */
+                       p.frequency = abs(p.frequency - lnb_type.low_val);
++              }
++              if (verbosity >= 2)
++                      dprintf(1,"DVB-S IF freq is %d\n",p.frequency);
+       }
+       if (ioctl(frontend_fd, FE_SET_FRONTEND, &p) == -1) {
+@@ -1991,7 +2016,7 @@
+                                                   //FIXME: s->subtitling_pid
+                                                   s->ac3_pid,
+                                                   s->service_id,
+-                                                  t->network_id,
++                                                  t->original_network_id,
+                                                   s->transport_stream_id,
+                                                   t->orbital_pos,
+                                                   t->we_flag,
+@@ -2066,14 +2091,15 @@
+       "       -5      multiply all filter timeouts by factor 5\n"
+       "               for non-DVB-compliant section repitition rates\n"
+       "       -o fmt  output format: 'zap' (default), 'vdr' or 'pids' (default with -c)\n"
+-      "       -x N    Conditional Axcess, (default 1)\n"
++      "       -x N    Conditional Access, (default -1)\n"
+       "               N=0 gets only FTA channels\n"
++      "               N=-1 gets all channels\n"
+       "               N=xxx sets ca field in vdr output to :xxx:\n"
+       "       -t N    Service select, Combined bitfield parameter.\n"
+       "               1 = TV, 2 = Radio, 4 = Other, (default 7)\n"
+       "       -p      for vdr output format: dump provider name\n"
+-      "       -e N    VDR version, default 2 for VDR-1.2.x\n"
+-      "               ANYTHING ELSE GIVES NONZERO NIT and TID\n"
++      "       -e N    VDR version, default 3 for VDR-1.3.x and newer\n"
++      "               value 2 sets NIT and TID to zero\n"
+       "               Vdr version 1.3.x and up implies -p.\n"
+       "       -l lnb-type (DVB-S Only) (use -l help to print types) or \n"
+       "       -l low[,high[,switch]] in Mhz\n"
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/scan.h dvb-apps/util/scan/scan.h
+--- linuxtv-dvb-apps-1.1.1/util/scan/scan.h    2006-05-18 01:33:27.000000000 +0200
++++ dvb-apps/util/scan/scan.h  2009-06-21 13:29:06.000000000 +0200
+@@ -26,4 +26,3 @@
+ #define verbosedebug(msg...) dpprintf(6, msg)
+ #endif
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/scan/section_generate.pl dvb-apps/util/scan/section_generate.pl
+--- linuxtv-dvb-apps-1.1.1/util/scan/section_generate.pl       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/scan/section_generate.pl     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,92 @@
++#!/usr/bin/perl -w
++
++use strict;
++
++die "no section perl file given" unless @ARGV;
++
++my $h = require($ARGV[0]);
++
++our $basename;
++our $debug = $ARGV[1];
++
++($basename) = $ARGV[0] =~ /([a-zA-Z0-9_\-_]+).pl/;
++
++local *H;
++local *C;
++
++h_header();
++c_header();
++
++foreach (sort keys %{$h}) {
++      foreach my $item (@{$h->{$_}}) {
++              if ($_ eq "descriptors") {
++                      printf H ("#define %s_ID 0x%02X\n",uc($item->{name}),$item->{id});
++              }
++
++              do_it  ($item->{name},$item->{elements});
++      }
++}
++
++h_footer();
++c_footer();
++
++sub type
++{
++      if ($_[0] > 16) {
++              return "u32";
++      } elsif ($_[0] > 8) {
++              return "u16";
++      } else {
++              return "u8 ";
++      }
++}
++
++sub do_it
++{
++      my ($name,$val) = @_;
++      print H "struct $name {\n";
++
++      print C <<EOL;
++struct $name read_$name(const u8 *b)
++{
++      struct $name v;
++EOL
++      my $offs = 0;
++      for (my $i = 0; $i < scalar @{$val}; $i+=2) {
++              printf H ("\t\t%s %-25s :%2d;\n",type($val->[$i+1]),$val->[$i],$val->[$i+1]);
++
++              printf C ("\tv.%-25s = getBits(b,%3d,%2d);\n",$val->[$i],$offs,$val->[$i+1]);
++              printf C ("\tfprintf(stderr,\"  %s = %%x %%d\\n\",v.%s,v.%s);\n",$val->[$i],$val->[$i],$val->[$i]) if $debug;
++              $offs += $val->[$i+1];
++      }
++      print H "} PACKED;\n";
++      print H "struct $name read_$name(const u8 *);\n\n";
++
++      print C "\treturn v;\n}\n\n"
++}
++
++sub h_header
++{
++      open(H,">$basename.h");
++      print H "#ifndef __".uc($basename)."_H_\n";
++      print H "#define __".uc($basename)."_H_\n\n";
++      print H "#include \"section.h\"\n\n";
++}
++
++sub c_header
++{
++      open(C,">$basename.c");
++      print C "#include \"$basename.h\"\n\n";
++}
++
++
++sub c_footer
++{
++      close(C);
++}
++
++sub h_footer
++{
++      print H "#endif\n";
++      close(H);
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/azap.c dvb-apps/util/szap/azap.c
+--- linuxtv-dvb-apps-1.1.1/util/szap/azap.c    2006-05-18 01:31:40.000000000 +0200
++++ dvb-apps/util/szap/azap.c  2009-06-21 13:29:06.000000000 +0200
+@@ -103,7 +103,10 @@
+                       return -3;      /*  to fit in 32 bit */
+       };
++      errno = 0;
+       *val = strtol(number, NULL, 10);
++      if (errno == ERANGE)
++              return -4;
+       return 0;
+ }
+@@ -189,9 +192,9 @@
+       if ((err = try_parse_param(fd,
+                                  modulation_list, LIST_SIZE(modulation_list),
+-                                 (int *) &frontend->u.vsb.modulation,
+-                                 "modulation")))
++                                 &tmp, "modulation")))
+               return -4;
++      frontend->u.vsb.modulation = tmp;
+       if ((err = try_parse_int(fd, vpid, "Video PID")))
+               return -5;
+@@ -389,4 +392,3 @@
+       return 0;
+ }
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/atsc/make_atsc_chanconf.pl dvb-apps/util/szap/channels-conf/atsc/make_atsc_chanconf.pl
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/atsc/make_atsc_chanconf.pl  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/szap/channels-conf/atsc/make_atsc_chanconf.pl        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,110 @@
++#!/usr/bin/perl
++
++# Angel Li sent me this script to help in setting up a
++# ~/.azap/channels.conf file automagicly.  This probbably
++# isn't the final version
++
++ use LWP;
++ use HTML::Form;
++ use HTTP::Cookies;
++ use XML::XPath;
++ use XML::XPath::XMLParser;
++
++ #$DEBUG = 1;
++
++ #
++ # Center frequencies for NTSC channels
++ #
++ @ntsc = (
++       0,  0,  57,  63,  69,  79,  85, 177, 183, 189,
++      195, 201, 207, 213, 473, 479, 485, 491, 497, 503,
++      509, 515, 521, 527, 533, 539, 545, 551, 557, 563,
++      569, 575, 581, 587, 593, 599, 605, 611, 617, 623,
++      629, 635, 641, 647, 653, 659, 665, 671, 677, 683,
++      689, 695, 701, 707, 713, 719, 725, 731, 737, 743,
++      749, 755, 761, 767, 773, 779, 785, 791, 797, 803,
++ );
++
++ $ZIPCODE = 'txtZipcode';
++ $XML = 'stationXml';
++ $WEBSITE = 'http://www.antennaweb.org';
++
++ $zipCode = $ARGV[0];
++ unless ($zipCode) {
++      die "Zipcode missing on the command line";
++ }
++ unless ($zipCode =~ /^\d\d\d\d\d$/) {
++      die "Illegal zipcode: $zipCode";
++ }
++
++ $ua = LWP::UserAgent->new;
++ $ua->cookie_jar({});
++ push @{$ua->requests_redirectable}, 'POST';
++ $response = $ua->get($WEBSITE);
++ if ($response->is_success) {
++      $form = HTML::Form->parse($response);
++      $request = $form->click("btnStart");
++      $response2 = $ua->request($request);
++      if ($response2->is_success) {
++              $form2 = HTML::Form->parse($response2);
++              $form2->param($ZIPCODE, $zipCode);
++              $request2 = $form2->click("btnSubmit");
++              $response3 = $ua->request($request2);
++              $form3 = HTML::Form->parse($response3);
++              $request3 = $form3->click("btnContinue");
++              $response4 = $ua->request($request3);
++              if ($response4->is_success) {
++                      $form4 = HTML::Form->parse($response4);
++                      $xml = $form4->value($XML);
++                      $xml =~ s/%22/"/g;
++                      $xml =~ s/%2c/,/g;
++                      $xml =~ s/%2f/\//g;
++                      $xml =~ s/%3c/</g;
++                      $xml =~ s/%3d/=/g;
++                      $xml =~ s/%3e/>/g;
++                      $xml =~ s/\+/ /g;
++                      genConf($xml);
++                      exit(0);
++              }
++              else {
++                      print STDERR "Could not submit zipcode: $zipCode\n";
++                      die $response3->status_line;
++              }
++      }
++      print STDERR "Could not reach zipcode page";
++      die $response2->status_line;
++ }
++ else {
++      print STDERR "Error reaching $WEBSITE\n";
++      die $response->status_line;
++ }
++
++ sub genConf {
++      my($xml) = @_;
++      my($s);
++      my($callSign);
++      my($channel);
++      my($c);
++      my($psipChannel);
++      my($freq);
++
++      $xp = XML::XPath->new(xml => $xml);
++      foreach $s ($xp->find('//Station[BroadcastType="D"]')->get_nodelist) {
++      if ($s->find('LiveStatus')->string_value eq "1") {
++              $callSign = $s->find('CallSign')->string_value;
++              $callSign =~ s/-DT//;
++              $channel = $s->find('Channel')->string_value; # Channel to tune
++              $psipChannel = $s->find('PsipChannel')->string_value;
++
++              if ($DEBUG) {
++                      print STDERR $callSign, "\t", $channel, " -> ", $psipChannel, "\n";
++              }
++
++              $psipChannel =~ s/\.\d+$//;
++              $freq = $ntsc[$channel]*1000000;
++              if ($freq) {
++                      print $callSign, ":", $freq, ":8VSB:0:0\n";
++              }
++      }
++ }
++ }
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/atsc/us-Raleigh-Durham dvb-apps/util/szap/channels-conf/atsc/us-Raleigh-Durham
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/atsc/us-Raleigh-Durham      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/szap/channels-conf/atsc/us-Raleigh-Durham    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,8 @@
++# Most of the major channels in the Raleigh Durham Area.  Frequencies the NTSC center freq.
++WRAL:707000000:8VSB:33:36
++WNCN:719000000:8VSB:49:52
++WTVD:701000000:8VSB:49:52
++WRAZ:683000000:8VSB:49:52
++WUNC:743000000:8VSB:49:52
++WRDU:551000000:8VSB:33:36
++WLFL:731000000:8VSB:33:36
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-c/de-Berlin dvb-apps/util/szap/channels-conf/dvb-c/de-Berlin
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-c/de-Berlin     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/szap/channels-conf/dvb-c/de-Berlin   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,171 @@
++3sat:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:210:220
++ARD-Online-Kanal:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1805
++CNBC:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:510:520
++DLF-Köln:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:810
++DLR-Berlin:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:710
++EinsExtra:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:101:102
++EinsFestival:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:201:202
++EinsMuXx:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:301:302
++EuroNews:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2221:2233
++Eurosport:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:410:420
++Fritz:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:901
++KiKa:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:310:320
++MDR FERNSEHEN:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:401:402
++MDR KULTUR:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:801
++MDR info:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1101
++MHP ARD Online-Kanal:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:102
++NDR Fernsehen:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2401:2402
++ORB-Fernsehen:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:501:502
++RADIOmultikulti:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1301
++Radio 3:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:701
++SFB1:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:601:602
++SWR2:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1401
++SÜDWEST BW:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:801:802
++SÜDWEST RP:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:3101:3102
++WDR 3:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1501
++WDR 5:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1601
++ZDF:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:110:120
++ZDFdigitext:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++ZDFdokukanal:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:660:670
++ZDFinfokanal:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:610:620
++ZDFtheaterkanal:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++JUMP:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1001
++SPUTNIK:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1201
++Österreich 1:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:169
++ATV 2:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:631:632
++ATV 2:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:631:632
++Adagio:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++All Jazz:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++Avante:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:741:743
++B5 aktuell:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3101
++BBC Prime:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:761:762
++BData3:402000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++BData4:402000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++BData5:402000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++BR-alpha:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:701:702
++Barock Fantasie:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++Bayerisches FS:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:201:202
++Bayern 1:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3601
++Bayern 4 Klassik:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3001
++BibelTV:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:731:732
++Bloomberg:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++CLASSICA:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:767:768
++COUNTRY:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:656
++Canal 24 Horas:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:991:992
++Club:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:711:713
++Cristal New Age:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++DANCE:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:304
++DW-tv:610000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:634:632
++Das Erste:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:101:102
++Detskij Mir:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:931:932
++ERT-Sat:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:691:692
++Einstein TV:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:701:702
++Euronews:610000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:597:596
++Eurosport News:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:771:772
++Extreme Sports:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:791:793
++Extreme Sports:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++Fashion TV:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++Fox Kids:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:671:672
++Fox Kids:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:671:673
++GOLD:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:320
++HITLISTE:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:784
++HR XXL:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3501
++JAZZ:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:640
++Jazz legends:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++Kabel Wizard:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++Kanal 7:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++Kanal 7:610000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:49:52
++Kanal D:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:651:652
++Kanal D:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:651:652
++LATIN:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:368
++Landscape:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++Leitseite:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2254:0
++Liberty TV:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:721:723
++MTV Base:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:781:782
++MV-Test:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++Modem-Setup:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++Movie Sounds:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++Musica Antica:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++Musica Camerata:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++NDR Info:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3701
++NTV international:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++NTVI:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:611:612
++Nashe Kino:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:621:622
++NordwestRadio:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3801
++OLD GOLD:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:336
++Opernfestival:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++PCNE:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:681:682
++PREMIERE SPORT INTERACTIVE:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++PREMIERE DIREKT 1:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++PREMIERE DIREKT 2:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++PREMIERE DIREKT 3:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++PREMIERE DIREKT 4:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2815:2816
++PREMIERE EROTIK:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1279:1280
++PREMIERE NOSTALGIE:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2559:2560
++PREMIERE SERIE:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1023:1024
++PREMIERE SPORT 1:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:255:258
++PREMIERE SPORT 2:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:3839:3840
++PREMIERE START:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:255:256
++Parlamentsfernsehen:610000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:33:36
++Phoenix:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:901:902
++Portal:402000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++RTP Internacional:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:661:662
++Rai 1:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:951:952
++Rai 2:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:961:962
++Rai 3:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:971:972
++SCHLAGER:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:384
++SR 1:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3901
++SR Fernsehen Suedwest:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:501:502
++Show TV:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:911:912
++Sinfonica:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++TGRT:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:921:922
++TM V1.0:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++TV Polonia:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:641:642
++TVEi:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:981:982
++TW1:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:751:752
++Test-R:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:701:702
++Travel:610000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:595:594
++VCR-Setup:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++VH1 Classic:610000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:604:603
++Videotext:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++WDR FERNSEHEN:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:601:602
++ZEE TV:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++arte:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:401:403
++hessen fernsehen:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:301:302
++hr-chronos:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3201
++hr-klassik:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3401
++hr2:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3301
++13 TH STREET:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2303:2304
++ALTERNATIVE ROCK:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:544
++BEATE-UHSE.TV:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1023:1024
++CHILLOUT:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:400
++CLASSIC ROCK:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:352
++DISCOVERY CHANNEL:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1791:1792
++DISNEY CHANNEL:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2559:2560
++DEUTSCHE HITS:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:800
++EASY LISTENING:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:608
++Einstein:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++FILM & MUSICAL:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:592
++FOX KIDS:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1279:1280
++GOLDSTAR TV:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:3839:3840
++HARD ROCK:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:816
++HEIMATKANAL:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1535:1536
++HIP HOP/R&B:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:576
++JUNIOR:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:255:256
++K-TOON:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
++KLASSIK POPULÄR:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:624
++KRIMI &CO:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1535:1536
++LOVE SONGS:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:592
++NEW COUNTRY:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:384
++ORCHESTRALE WERKE:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:560
++PLANET:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1791:1792
++PREMIERE 1:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:511:512
++PREMIERE 2:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1791:1793
++PREMIERE 3:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2303:2304
++PREMIERE 4:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:767:768
++PREMIERE 5:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1279:1280
++PREMIERE 6:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1535:1536
++PREMIERE 7:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1023:1024
++SOUL CLASSICS:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:352
++STUDIO UNIVERSAL:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2047:2048
++Sonnenklar TV:402000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-s/Astra-19.2E dvb-apps/util/szap/channels-conf/dvb-s/Astra-19.2E
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-s/Astra-19.2E   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/szap/channels-conf/dvb-s/Astra-19.2E 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,226 @@
++Das Erste:11837:h:0:27500:101:102:28106
++ZDF:11954:h:0:27500:110:120:28006
++3sat:11954:h:0:27500:210:220:28007
++EinsMuXx:12110:h:0:27500:301:302:28203
++EinsFestival:12110:h:0:27500:201:202:28202
++EinsExtra:12110:h:0:27500:101:102:28201
++MDR FERNSEHEN:12110:h:0:27500:401:402:28204
++ORB-Fernsehen:12110:h:0:27500:501:502:28205
++B1 Berlin:12110:h:0:27500:601:602:28206
++SWR Fernsehen:11837:h:0:27500:801:802:28113
++SR Fernsehen Suedwes:11837:h:0:27500:501:502:28110
++hessen fernsehen:11837:h:0:27500:301:302:28108
++WDR FERNSEHEN:11837:h:0:27500:601:602:28111
++Bayerisches FS:11837:h:0:27500:201:202:28107
++N3:12110:h:0:27500:2401:2402:28224
++BR-alpha:11837:h:0:27500:701:702:28112
++KiKa:11954:h:0:27500:310:320:28008
++arte:11836:h:0:27500:401:402:28109
++ZDF Theaterkanal:11954:h:0:27500:1110:1120:28016
++ZDF.info:11954:h:0:27500:610:620:28011
++ZDF.doku:11954:h:0:27500:660:670:28014
++Phoenix:11837:h:0:27500:901:902:28114
++DW-tv:10786:v:0:21997:305:306:9005
++RTL Television:12188:h:0:27500:163:104:12003
++SAT.1:12480:v:0:27500:1791:1792:46
++ProSieben:12480:v:0:27500:255:256:898
++RTL2:12188:h:0:27500:166:128:12020
++Super RTL:12188:h:0:27500:165:120:12040
++KABEL1:12480:v:0:27500:511:512:899
++VOX:12188:h:0:27500:167:136:12060
++tm3:12480:v:0:27500:767:768:897
++Bloomberg TV Germany:12552:v:0:22000:162:99:12160
++EuroNews:11954:h:0:27500:2221:2233:28015
++N24:12480:v:0:27500:2047:2048:47
++n-tv:12670:v:0:22000:162:96:12730
++DSF:12480:v:0:27500:1023:1024:900
++Eurosport:11954:h:0:27500:410:420:28009
++Via 1 - Sch ner Re:12148:h:0:27500:511:512:44
++Home Order Tel:12480:v:0:27500:1279:1280:40
++QVC GERMANY:12552:v:0:22000:165:166:12100
++TW 1:12692:h:0:22000:166:167:13013
++Canal Canarias:12441:v:0:27500:513:681:29700
++ProSieben A:12051:v:0:27500:161:84:20002
++ProSieben CH:12051:v:0:27500:289:290:20001
++Kabel 1 Austria:12051:v:0:27500:166:167:20004
++Kabel 1 Schweiz:12051:v:0:27500:162:163:20003
++CNN Int.:12168:v:0:27500:165:100:28512
++Sky News:12552:v:0:22000:305:306:3995
++Travel:12168:v:0:27500:163:92:28001
++AB SAT / XXL:12266:h:0:27500:164:96:17004
++MOTEURS:12266:h:0:27500:160:80:17000
++HOT GM:12148:h:0:27500:767:768:45
++KTO:12129:v:0:27500:170:120:8411
++LA CINQUIEME:12207:v:0:27500:160:80:8501
++LCP:12207:v:0:27500:165:100:8506
++LibertyTV.com:12611:v:0:22000:941:942:12280
++TV5 Europe:12611:v:0:22000:45:46:12240
++Motors TV:12611:v:0:22000:191:194:12300
++Wishline:12611:v:0:22000:214:216:12320
++TV 5:10786:v:0:21997:164:112:9001
++RTM - MAROC:10786:v:0:21997:162:96:9002
++ESC1 - EGYPTE:10786:v:0:21997:163:104:9003
++RAI 1:10786:v:0:21997:289:290:9004
++RTPI:10786:v:0:21997:300:301:9006
++TV7:10786:v:0:21997:166:128:9007
++ARTE:10786:v:0:21997:167:136:9009
++Colourbars:12611:v:0:22000:48:49:3982
++Alice:12611:v:0:22000:162:96:12200
++Video Italia:12611:v:0:22000:121:122:12220
++ANDALUCIA TV:11934:v:0:27500:166:104:29011
++TVC INT.:12441:v:0:27500:512:660:29701
++TV4:11992:h:0:27500:165:98:20365
++TV Niepokalanow:11876:h:0:27500:161:82:20601
++VIVA:12670:v:0:22000:309:310:12732
++VIVA ZWEI:12552:v:0:22000:171:172:12120
++MTV Central:12699:v:0:22000:3031:3032:28643
++ONYX:12692:h:1:27500:161:84:502
++VIVA polska:11603:h:1:27500:190:191:611
++DeeJay TV:11603:h:1:27500:160:161:602
++NBC:11053:h:1:27500:550:551:8008
++EWTN:10722:h:1:29900:1001:1201:4601
++MTA INTL:10722:h:1:29900:1004:1204:4604
++VOX:11053:h:1:27500:500:501:8002
++SAT.1 A:11053:h:1:27500:511:512:8003
++RTL2 AUSTRIA:11053:h:1:27500:520:521:8004
++ZDF:11053:h:1:27500:570:571:8011
++K-TV:11053:h:1:27500:580:581:8012
++RTL Television:11053:h:1:27500:160:80:8001
++ARTE:11059:v:1:6510:98:99:1
++HOT Italia:11095:h:1:27500:4194:4195:3714
++Olisat:11095:h:1:27500:33:34:3718
++VIVA-POLSKA:11128:h:1:4340:98:99:1
++DW-tv:11195:v:1:9099:101:102:5301
++Canal 24 Horas:11203:h:1:3999:4130:4131:5301
++TV5:11337:v:1:5631:512:640:1
++SAT.1 CH:11603:h:1:27500:101:102:601
++KurdSat:11603:h:1:27500:111:112:603
++ARD "Das Erste":11603:h:1:27500:172:173:606
++RTL 2 CH:11603:h:1:27500:175:176:609
++Super RTL A:11603:h:1:27500:180:181:610
++TV ROMANIA:11622:v:1:27500:227:247:10707
++MRTV:11622:v:1:27500:222:242:10702
++102.5 HIT Ch:11622:v:1:27500:224:244:10704
++TLC SAT:11622:v:1:27500:225:245:10705
++PRO-SAT:11622:v:1:27500:246:226:10706
++Channel SUN:11622:v:1:27500:229:249:10709
++Racing Channel:11622:v:1:27500:228:248:10708
++3 ABN:11622:v:1:27500:221:241:10701
++Bloom.Germany:11642:h:1:27500:1460:1420:4
++Bloomberg TV UK:11642:h:1:27500:1560:1520:4
++Sat 7:11642:h:1:27500:1660:1620:4
++EDTV 1:11746:h:1:27500:4130:4131:9501
++EDTV SPORT:11746:h:1:27500:4386:4387:9502
++EDTV BUSINESS:11746:h:1:27500:4642:4643:9503
++EDTV DRAMA:11746:h:1:27500:4898:4899:9504
++RAI1:11765:v:1:27499:160:80:3401
++RAI2:11765:v:1:27499:161:84:3402
++RAI3:11765:v:1:27499:162:88:3403
++RaiWayTEST2:11765:v:1:27499:516:654:3405
++RAIMOSAICO:11765:v:1:27499:518:8191:3407
++RAINews24:11803:v:1:27500:516:654:3301
++CAMERA DEPUTATI:11803:v:1:27500:517:655:3302
++TELEPACE:11803:v:1:27500:515:653:3304
++RAISPORTSAT:11803:v:1:27500:512:650:3305
++RAINettunoSAT2:11803:v:1:27500:513:651:3306
++RAIeducational:11803:v:1:27500:514:652:3307
++RAINettunoSAT1:11803:v:1:27500:519:657:3308
++SAT2000:11803:v:1:27500:518:656:3309
++I1:11918:v:1:27499:512:650:1
++C5:11918:v:1:27499:513:660:2
++R4:11918:v:1:27499:514:670:3
++Telesierra:12091:h:1:27500:4160:4161:8704
++C. Milagro:12091:h:1:27500:4368:4369:8711
++Italia Sat:12091:h:1:27500:4600:4601:8728
++TVE Internacional:12091:h:1:27500:4208:4209:8707
++Fiesta:12091:h:1:27500:4432:4433:8720
++Retelsat:12091:h:1:27500:4464:4465:8722
++ART EUROPE:12013:h:1:27495:164:96:450
++EGYPT SAT. CH. 2:12013:h:1:27495:166:104:470
++IQRA:12013:h:1:27495:168:112:474
++MAURITANIA TV:12110:v:1:27500:230:231:704
++ARMENIA TV:12110:v:1:27500:240:241:705
++SAILING CHANNEL:12110:v:1:27500:260:261:707
++AL JAZEERA:12110:v:1:27500:270:271:708
++Coming Soon TV:12110:v:1:27500:310:311:717
++SaluteBenessere:12110:v:1:27500:320:321:718
++AH-EDP1:12148:v:1:27499:96:97:7201
++AH-EDP2:12148:v:1:27499:112:113:7202
++Espresso:12148:v:1:27499:192:193:7203
++Alice:12148:v:1:27499:160:161:7220
++Nuvolari:12148:v:1:27499:176:177:7221
++Leonardo:12148:v:1:27499:128:129:7222
++AH-EDP3:12148:v:1:27499:36:37:7205
++OTE Promo:12187:v:1:27500:517:655:1001
++RTS SAT:12187:v:1:27500:519:657:1022
++ERT SAT:12187:v:1:27500:514:652:1102
++EXTRA:12187:v:1:27500:516:654:1106
++TRIAL:12187:v:1:27500:513:651:1108
++Minimax:11303:h:1:19540:300:301:3
++TVN1:12209:h:1:5631:4194:4195:1
++RR TEST:10978:v:1:8998:33:34:1
++TV 5 Thailand:10978:v:1:8998:1057:1058:2
++TEST-1:10978:v:1:8998:3105:3106:4
++FASHION:12244:h:1:27500:123:133:103
++AJARA TV:12244:h:1:27500:127:137:107
++SLO-TV1:12300:v:1:27495:200:201:3201
++POLONIA 1:12302:v:1:27500:205:206:3203
++SUPER 1:12302:v:1:27500:207:208:3207
++NAPOLI INT.:12302:v:1:27500:240:241:3210
++MAGIC:12302:v:1:27500:245:246:3211
++COUNTDOWN:12302:v:1:27500:235:236:3212
++TBNE:12302:v:1:27500:230:231:3213
++NAPOLI CHANNEL:12302:v:1:27500:227:228:3215
++KURDISTAN TV:12302:v:1:27500:225:226:3214
++ATLAS TV:12379:v:1:27500:3022:3032:3002
++TELE 24 SWITZERLAND:12379:v:1:27500:3023:3033:3003
++Abu Dhabi TV:12379:v:1:27500:3024:3034:3004
++RTV MONTENEGRO:12379:v:1:27500:3026:3036:3006
++JAAM-E-JAM 1:12436:h:1:27500:160:80:1
++JAAM-E-JAM 2:12436:h:1:27500:161:82:2
++SAHAR:12436:h:1:27500:162:84:3
++SAHAR 2:12436:h:1:27500:163:86:4
++IRINN:12436:h:1:27500:164:88:5
++Musicmax:11303:h:1:19540:500:501:6
++TEST:12474:h:1:27500:771:8191:10608
++EbS:12474:h:1:27500:101:201:10601
++MOU.2:12474:h:1:27500:42:43:10602
++PINK PLUS:12474:h:1:27500:308:256:10605
++LibertyTV.com:12474:h:1:27500:941:942:10603
++2M Maroc:12474:h:1:27500:601:602:10607
++ZEE TV:12474:h:1:27500:910:911:10604
++WorldNet Europe:12483:v:1:8299:4260:4220:1
++WorldNet:12483:v:1:8299:4560:4520:4
++SICILIA INTERNATIONA:12519:v:1:27499:501:502:8309
++SARDEGNA UNO:12519:v:1:27499:503:504:8310
++EuroMed:12519:v:1:27499:510:511:8312
++TGRT:12519:v:1:27499:505:506:8313
++VIDEOLINA:12519:v:1:27499:515:516:8318
++MEDIOLANUM:12538:h:1:27500:1131:1132:8987
++www.travel:12538:h:1:27500:1180:1183:8992
++MonteCarloSat:12538:h:1:27500:5126:5122:8877
++Bulgaria TV:12538:h:1:27500:4612:4613:8827
++TVN1:12571:h:1:5631:4194:4195:1
++JSTV 1:12595:v:1:27500:2000:2001:8213
++JSTV 2:12595:v:1:27500:2011:2013:8214
++MBC:12595:v:1:27500:160:80:8201
++ANN:12595:v:1:27500:161:84:8202
++BET:12595:v:1:27500:167:108:8208
++EuroNews:12595:v:1:27500:2221:2231:8211
++Sharjah        Arabs:12653:h:1:27500:1160:1120:1
++Qatar          Arabs:12653:h:1:27500:1260:1220:2
++Saudi 1        Arabs:12653:h:1:27500:1360:1320:3
++Kuwait         Arabs:12653:h:1:27500:1460:1420:4
++Libya          Arabs:12653:h:1:27500:1560:1520:5
++Sudan          Arabs:12653:h:1:27500:1660:1620:6
++Oman           Arabs:12653:h:1:27500:1760:1720:7
++Jordan         Arabs:12653:h:1:27500:1860:1820:8
++IRAQ TV:12653:h:1:27500:1960:1920:9
++Dubai Sport:12653:h:1:27500:1060:1020:10
++Digitaly:12672:v:1:27500:220:221:4203
++Telemarket:12672:v:1:27500:350:351:4211
++eVision:12672:v:1:27500:360:361:4214
++Thai TV5:12672:v:1:27500:200:201:4201
++Studio Europa:12672:v:1:27500:230:231:4204
++Video  Italia:12672:v:1:27500:340:341:4210
++GAME NETWORK:12672:v:1:27500:291:292:4213
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-s/Astra-28.2E dvb-apps/util/szap/channels-conf/dvb-s/Astra-28.2E
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-s/Astra-28.2E   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/szap/channels-conf/dvb-s/Astra-28.2E 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,522 @@
++BBC 1 London:10773:h:0:22000:2304:2306:6301
++BBC 2 England:10773:h:0:22000:2320:2322:6302
++BBC NEWS 24:10773:h:0:22000:2329:2331:6304
++ETV:10773:h:0:22000:2333:2335:6306
++BBC TES 3:10773:h:0:22000:2325:2327:6315
++CBBC Channel:10773:h:0:22000:2325:2327:6317
++CBeebies:10773:h:0:22000:2333:2335:6318
++BBC 1 NI:10773:h:0:22000:2316:2318:6331
++BBC R Cymru:10773:h:0:22000:0:2340:6363
++BBC TES Test:10773:h:0:22000:0:0:6308
++BBC TES 2:10773:h:0:22000:0:0:6309
++BBC FOUR:10773:h:0:22000:0:0:6316
++BBC THREE:10773:h:0:22000:0:0:6319
++[1341]:11469:h:0:27500:521:649:4929
++[1342]:11469:h:0:27500:522:650:4930
++MMS 5:11469:h:0:27500:0:0:5044
++MMS 6:11469:h:0:27500:0:0:5045
++Sky Active:11469:h:0:27500:0:0:5107
++[140a]:11469:h:0:27500:518:646:5130
++[146b]:11469:h:0:27500:512:640:5227
++[146c]:11469:h:0:27500:513:641:5228
++[1016]:11469:h:0:27500:514:642:4118
++[10e9]:11469:h:0:27500:519:647:4329
++[1279]:11469:h:0:27500:520:648:4729
++Sky Customer Service:11469:h:0:27500:0:0:5240
++Directgov - Govt Info:11469:h:0:27500:0:0:5241
++[1596]:11469:h:0:27500:515:643:5526
++[1597]:11469:h:0:27500:516:644:5527
++[159a]:11469:h:0:27500:517:645:5530
++[15a4]:11469:h:0:27500:0:0:5540
++[05dc]:11469:h:0:27500:0:0:1500
++[1017]:11469:h:0:27500:0:0:4119
++Sky Box Office:11469:h:0:27500:0:0:4121
++Sky Box Office:11469:h:0:27500:0:0:4122
++Sky Box Office:11469:h:0:27500:0:0:4123
++Sky Box Office:11469:h:0:27500:0:0:4124
++Sky Box Office:11469:h:0:27500:0:0:4129
++POP:12285:v:0:27500:2311:2312:52500
++3751 PH:12285:v:0:27500:2311:2312:52501
++Chart Show TV:12285:v:0:27500:2309:2310:52505
++3761 PH:12285:v:0:27500:2313:2314:52512
++The Vault:12285:v:0:27500:2322:2323:52515
++Chase-it.tv:12285:v:0:27500:2318:2319:52520
++OBE:12285:v:0:27500:2307:2308:52525
++Tiny Pop:12285:v:0:27500:2316:2317:52530
++Spice Extreme:12285:v:0:27500:2320:2321:52561
++Climax3 - 1:12285:v:0:27500:2324:2325:52562
++Climax3 - 2:12285:v:0:27500:2326:2327:52563
++Climax3 - 3:12285:v:0:27500:2328:2329:52564
++Adult Channel:12285:v:0:27500:2330:2331:52565
++Playboy TV:12285:v:0:27500:2313:2314:52566
++52567:12285:v:0:27500:2330:2331:52567
++3911 PH:12285:v:0:27500:2320:2321:52581
++IDMT:12148:h:0:27500:2307:2308:52200
++ Broadband UK:12148:h:0:27500:2305:2306:52210
++52220:12148:h:0:27500:2309:2310:52220
++Trouble Reload:12148:h:0:27500:2311:2312:52230
++Challenge+1:12148:h:0:27500:2314:2315:52232
++Ftn:12148:h:0:27500:0:0:52231
++[15ff]:10920:h:0:22000:516:644:5631
++D'covery H&L+:10920:h:0:22000:2305:2306:50003
++Eurosportnews:10920:h:0:22000:2307:2308:5009
++Hallmark:10920:h:0:22000:2310:2311:5010
++[13a2]:10920:h:0:22000:512:640:5026
++[13a4]:10920:h:0:22000:514:642:5028
++[13a5]:10920:h:0:22000:515:643:5029
++[05e6]:10920:h:0:22000:0:0:1510
++Sky Box Office:10920:h:0:22000:0:0:4122
++Sky Box Office:10920:h:0:22000:0:0:4123
++Sky Box Office:10920:h:0:22000:0:0:4124
++Sky Box Office:10920:h:0:22000:0:0:4129
++SportxxxBabes:10920:h:0:22000:0:0:4137
++[1393]:10920:h:0:22000:0:0:5011
++[15fb]:10920:h:0:22000:0:0:5627
++SAB TV:12226:h:0:27500:2310:2311:52401
++Performance:12226:h:0:27500:2312:2313:52402
++channel U:12226:h:0:27500:2314:2315:52403
++Gems.tv:12226:h:0:27500:2317:2318:52404
++Soundtrack ch.:12226:h:0:27500:2307:2308:52405
++HorrorChannel:12226:h:0:27500:2342:2343:52406
++Chat Box:12226:h:0:27500:2319:2320:52407
++Golf Channel:12226:h:0:27500:2321:2322:52408
++Ex&Mart TV:12226:h:0:27500:2323:2324:52409
++TVW Select:12226:h:0:27500:2305:2306:52412
++Game In TV:12226:h:0:27500:2335:2336:52414
++Majestic TV:12226:h:0:27500:2340:2341:52415
++18PlusXXX:12226:h:0:27500:0:0:52410
++XXXHousewive:12226:h:0:27500:0:0:52411
++52421:12226:h:0:27500:0:0:52421
++[10ea]:11603:v:0:27500:514:662:4330
++[114e]:11603:v:0:27500:515:663:4430
++[11b2]:11603:v:0:27500:516:664:4530
++[1215]:11603:v:0:27500:521:669:4629
++[1216]:11603:v:0:27500:517:665:4630
++[127a]:11603:v:0:27500:518:666:4730
++[12de]:11603:v:0:27500:519:667:4830
++[13a6]:11603:v:0:27500:512:660:5030
++[1409]:11603:v:0:27500:522:670:5129
++[146a]:11603:v:0:27500:520:668:5226
++[1599]:11603:v:0:27500:523:671:5529
++[15fa]:11603:v:0:27500:513:661:5626
++Sky Box Office:11603:v:0:27500:0:0:4124
++Sky Box Office:11603:v:0:27500:0:0:4129
++MMS 4:11603:v:0:27500:0:0:5043
++MMS 8:11603:v:0:27500:0:0:5047
++[1603]:11603:v:0:27500:0:0:5635
++[05e9]:11603:v:0:27500:0:0:1513
++Sky Box Office:11603:v:0:27500:0:0:4121
++Sky Box Office:11603:v:0:27500:0:0:4122
++Sky Box Office:11603:v:0:27500:0:0:4123
++1391:10935:v:0:22000:2321:2320:5421
++1392:10935:v:0:22000:2305:2320:5422
++1393:10935:v:0:22000:2306:2320:5423
++1394:10935:v:0:22000:2307:2320:5424
++1395:10935:v:0:22000:2308:2320:5425
++1396:10935:v:0:22000:2309:2320:5426
++1397:10935:v:0:22000:2310:2320:5427
++1398:10935:v:0:22000:2311:2320:5428
++1399:10935:v:0:22000:2312:2320:5429
++1471:10935:v:0:22000:2305:2313:5471
++1472:10935:v:0:22000:2306:2314:5472
++1473:10935:v:0:22000:2307:2315:5473
++1474:10935:v:0:22000:2308:2316:5474
++1475:10935:v:0:22000:2309:2317:5475
++1476:10935:v:0:22000:2310:2318:5476
++1477:10935:v:0:22000:2311:2319:5477
++1478:10935:v:0:22000:2312:2320:5478
++[05ea]:10935:v:0:22000:0:0:1514
++1326:10935:v:0:22000:0:0:5307
++1334:10935:v:0:22000:0:0:5310
++SPl:10935:v:0:22000:0:0:5404
++rc:10935:v:0:22000:0:0:5407
++nata:10935:v:0:22000:0:0:5466
++natd:10935:v:0:22000:0:0:5467
++ISM Sky News v6:11507:h:0:27500:2305:2306:9318
++ISM Movies v6:11507:h:0:27500:0:0:9319
++EIA2 Test:11507:h:0:27500:2305:2306:9322
++UK Online test:11507:h:0:27500:0:0:9323
++1784:11507:h:0:27500:2305:2306:9324
++1786:11507:h:0:27500:0:0:9325
++SCS:11507:h:0:27500:0:0:9326
++STT:11507:h:0:27500:2305:2306:9327
++1787:11507:h:0:27500:2305:2306:9329
++5ADT:11507:h:0:27500:2305:2306:9331
++EIA2 Test 6:11507:h:0:27500:2305:2306:9332
++8N2:11507:h:0:27500:0:0:9335
++EIA2 Test 5:11507:h:0:27500:2305:2306:9336
++[2479]:11507:h:0:27500:0:0:9337
++[247a]:11507:h:0:27500:0:0:9338
++7909:11507:h:0:27500:2305:2306:3909
++EIA2 Test 3:11507:h:0:27500:2305:2306:4909
++EIA2 Test 4:11507:h:0:27500:2305:2306:4912
++ISM Test1 v5:11507:h:0:27500:2305:2306:5902
++PlayJam:11507:h:0:27500:0:2445:9306
++PlayMonteCarlo & Roulette:11507:h:0:27500:0:2457:9308
++PlayJam test:11507:h:0:27500:0:2445:9310
++ISM Sky One v6:11507:h:0:27500:2305:2306:9316
++ISM Sports 1 v6:11507:h:0:27500:2305:2306:9317
++[05f3]:11507:h:0:27500:0:0:1523
++Playboy / Adult:11507:h:0:27500:0:0:4128
++Playboy TV:11507:h:0:27500:0:0:4131
++Private Girls:11507:h:0:27500:0:0:4133
++XXX TV:11507:h:0:27500:0:0:4134
++Amateur Babes:11507:h:0:27500:0:0:4135
++[1207]:11507:h:0:27500:0:0:4615
++[1209]:11507:h:0:27500:0:0:4617
++[232d]:11507:h:0:27500:0:0:9005
++YO-YO" test:11507:h:0:27500:0:0:9309
++UCB TV:12070:h:0:27500:2313:2314:52001
++ATN:12070:h:0:27500:2310:2311:52002
++Overload:12070:h:0:27500:2306:2307:52003
++Golf Pro-Shop:12070:h:0:27500:2315:2316:52004
++You TV:12070:h:0:27500:2336:2337:52005
++Escape:12070:h:0:27500:2317:2318:52006
++52007:12070:h:0:27500:2324:2325:52007
++Get Lucky TV:12070:h:0:27500:2319:2320:52008
++[fffe]:12070:h:0:27500:0:0:65534
++Wonderful:12070:h:0:27500:2308:2309:52009
++Musicians Chnl:12070:h:0:27500:2326:2327:52010
++Rangers TV:12070:h:0:27500:2328:2329:52011
++Celtic TV:12070:h:0:27500:2330:2331:52012
++Advert Channel:12070:h:0:27500:2332:2333:52013
++LONDON TV:12070:h:0:27500:2334:2335:52014
++Pure Dance:12070:h:0:27500:0:2312:52025
++Club Asia:12070:h:0:27500:0:2305:52026
++Setanta Sports:12070:h:0:27500:0:0:52021
++Setanta Sports:12070:h:0:27500:0:0:52022
++Setanta PPV2:12070:h:0:27500:0:0:52032
++FilmFour:11565:v:0:27500:2320:2321:50500
++FilmFour +1:11565:v:0:27500:2323:2324:50505
++Film4 Weekly:11565:v:0:27500:2326:2327:50510
++E4:11565:v:0:27500:2329:2330:50515
++Game 6:11565:v:0:27500:0:2336:50540
++Game 7:11565:v:0:27500:0:2342:50541
++Game 8:11565:v:0:27500:0:2344:50542
++FF TEST1:11565:v:0:27500:2320:2321:50543
++PCNE Chinese:11565:v:0:27500:6144:6145:50550
++Bloomberg:11565:v:0:27500:2316:2317:50555
++[05f5]:11565:v:0:27500:0:0:1525
++SCRD4:10861:h:0:22000:0:0:8009
++SBZP:10861:h:0:22000:0:0:8059
++LMIN:10861:h:0:22000:0:0:8108
++TRLN:10861:h:0:22000:0:0:8116
++SCD2:10861:h:0:22000:0:0:8126
++DOMI:10861:h:0:22000:0:0:8145
++WINC:10861:h:0:22000:2325:2326:8164
++The Betting Zone:10861:h:0:22000:0:0:8186
++TLM(Browser):10861:h:0:22000:2342:2344:8888
++Disney Chnl:10861:h:0:22000:2308:2309:9001
++Disney Chnl +1:10861:h:0:22000:2313:2314:9002
++Toon Disney:10861:h:0:22000:2317:2318:9003
++Playhse Disney:10861:h:0:22000:2320:2321:9004
++The Betting Zone:10861:h:0:22000:2336:2338:50008
++[05f6]:10861:h:0:22000:0:0:1526
++ALTU:10861:h:0:22000:0:0:8087
++DCT2 (t51):10861:h:0:22000:0:0:8999
++DCT (t51):10861:h:0:22000:0:0:9000
++Sky Travel +1:10876:v:0:22000:2310:2318:3905
++Sky Travel Active Dummy:10876:v:0:22000:0:0:4911
++Sky Travel:10876:v:0:22000:2308:2309:5005
++5006:10876:v:0:22000:2308:2309:5006
++Sky Trvl Extra:10876:v:0:22000:2305:2306:9312
++[0602]:10876:v:0:22000:0:0:1538
++Tel Sell:12460:h:0:27500:2319:2320:50832
++mSync:12460:h:0:27500:0:0:50837
++NASN:12460:h:0:27500:2322:2323:50839
++Classics TV:12460:h:0:27500:2324:2325:50840
++Information TV:12460:h:0:27500:2326:2327:50841
++Wrestling Chnl:12460:h:0:27500:2329:2330:50842
++TWC Reloaded:12460:h:0:27500:2331:2332:50843
++FRIENDLY TV:12460:h:0:27500:2333:2334:50848
++McColls:12460:h:0:27500:0:2335:50851
++Moto:12460:h:0:27500:0:2336:50852
++Teds FM:12460:h:0:27500:0:2337:50853
++Topps FM:12460:h:0:27500:0:2338:50855
++Kiss:12460:h:0:27500:0:2339:50856
++Smash Hits!:12460:h:0:27500:0:2340:50857
++Kerrang:12460:h:0:27500:0:2341:50858
++The Hits:12460:h:0:27500:0:2342:50859
++Magic:12460:h:0:27500:0:2343:50860
++Q:12460:h:0:27500:0:2344:50861
++MOJO:12460:h:0:27500:0:2345:50862
++Heat:12460:h:0:27500:0:2346:50863
++GlobeCast:12460:h:0:27500:0:2347:50864
++PTV Prime:12460:h:0:27500:2315:2316:50865
++Fashion TV:12460:h:0:27500:0:0:50850
++Best Direct:12246:v:0:27500:2314:2315:53500
++BestDirect+:12246:v:0:27500:2316:2317:53505
++Dating Channel:12246:v:0:27500:2320:2321:53515
++Wine TV:12246:v:0:27500:2323:2324:53520
++Flaunt:12246:v:0:27500:2326:2327:53525
++Scuzz:12246:v:0:27500:2328:2329:53530
++The Amp:12246:v:0:27500:2330:2331:53535
++Radio Caroline:12246:v:0:27500:0:2332:53550
++Amrit Bani:12246:v:0:27500:0:2333:53551
++Desi Radio:12246:v:0:27500:0:2334:53552
++CalvaryRadio:12246:v:0:27500:0:2335:53553
++Apple FM:12246:v:0:27500:0:2336:53554
++TWR:12246:v:0:27500:0:2337:53555
++Spectrum 1:12246:v:0:27500:0:2338:53556
++RTE Europe:12246:v:0:27500:0:2339:53557
++WRN Europe:12246:v:0:27500:0:2340:53558
++Raaj Radio:12246:v:0:27500:0:2341:53559
++On Air:12246:v:0:27500:0:2342:53560
++53561:12246:v:0:27500:0:2306:53561
++PulseUnsignd:12246:v:0:27500:0:2343:53564
++53581:12246:v:0:27500:0:0:53581
++RTE One:10743:h:0:22000:2306:2307:9601
++RTE TWO:10743:h:0:22000:2309:2310:9602
++TG4:10743:h:0:22000:2312:2313:9603
++TV3:10743:h:0:22000:2315:2316:9605
++DW-TV:10743:h:0:22000:2318:2319:9606
++TVEi:10743:h:0:22000:2320:2321:9607
++RTE Radio 1:10743:h:0:22000:0:2322:9611
++RTE 2FM:10743:h:0:22000:0:2323:9612
++RTE R na G:10743:h:0:22000:0:2324:9613
++RTE Lyric fm:10743:h:0:22000:0:2325:9614
++BBC R5 Live:10802:h:0:22000:0:2338:6401
++ETV2:10802:h:0:22000:2304:2306:6407
++BBC 1 Wales:10802:h:0:22000:2304:2306:6411
++BBC 2W:10802:h:0:22000:2321:2323:6412
++BBC 1 Scotland:10802:h:0:22000:2311:2313:6421
++BBC 2 Scotland:10802:h:0:22000:2325:2327:6422
++BBC 2 NI:10802:h:0:22000:2329:2331:6432
++BBC R1:10802:h:0:22000:0:2333:6451
++BBC R2:10802:h:0:22000:0:2334:6452
++BBC R3:10802:h:0:22000:0:2335:6453
++BBC R4 FM:10802:h:0:22000:0:2336:6454
++BBC R4 LW:10802:h:0:22000:0:2337:6455
++BBC R Scot.:10802:h:0:22000:0:2339:6457
++BBC R Wales:10802:h:0:22000:0:2340:6458
++BBC R Ulster:10802:h:0:22000:0:2341:6459
++BBC Asian Nt.:10802:h:0:22000:0:2342:6460
++BBC World Sv.:10802:h:0:22000:0:2343:6461
++ETV3:10802:h:0:22000:0:2333:6462
++BBC 5L SportX:10802:h:0:22000:0:2344:6464
++BBC WS Extra:10802:h:0:22000:0:2345:6465
++1Xtra BBC:10802:h:0:22000:0:2347:6466
++BBC 6 Music:10802:h:0:22000:0:2346:6467
++BBC 7:10802:h:0:22000:0:2348:6468
++BBC R n Gael:10802:h:0:22000:0:2349:6469
++T4 STRM-0:10847:v:0:22000:2305:2306:6900
++T4 STRM-1:10847:v:0:22000:2320:2321:6901
++BBC PARL'MNT:10847:v:0:22000:2327:2328:6902
++BBC 1 East (W):10847:v:0:22000:2338:2339:6903
++BBC 1 CI:10847:v:0:22000:2343:2344:6904
++T4 DEV-0:10847:v:0:22000:2305:2306:6990
++T4 DEV-1:10847:v:0:22000:2320:2321:6991
++T4 DEV-2:10847:v:0:22000:2327:2328:6992
++T4 DEV-3:10847:v:0:22000:2338:2339:6993
++T4 DEV-4:10847:v:0:22000:2343:2344:6994
++BBC 1 W Mids:10788:v:0:22000:2305:2306:10301
++BBC 1 N West:10788:v:0:22000:2318:2319:10302
++BBC 1 Yrks&Lin:10788:v:0:22000:2321:2322:10303
++BBC 1 Yorks:10788:v:0:22000:2324:2325:10304
++BBC 1 E Mids:10788:v:0:22000:2327:2328:10305
++BBC 1 East (E):10788:v:0:22000:2330:2331:10306
++ETV5:10788:v:0:22000:2305:2306:10321
++BBC 1 West:10817:v:0:22000:2305:2306:10351
++BBC 1 S East:10817:v:0:22000:2317:2318:10352
++BBC 1 South:10817:v:0:22000:2320:2321:10353
++BBC 1 S West:10817:v:0:22000:2323:2324:10354
++BBC 1 NE & C:10817:v:0:22000:2326:2327:10355
++BBC 1 Oxford:10817:v:0:22000:2329:2330:10356
++ETV6:10817:v:0:22000:2305:2306:10371
++POP:11426:v:0:27500:2311:2312:52500
++3751 PH:11426:v:0:27500:2311:2312:52501
++Chart Show TV:11426:v:0:27500:2309:2310:52505
++3761 PH:11426:v:0:27500:2313:2314:52512
++The Vault:11426:v:0:27500:2322:2323:52515
++Chase-it.tv:11426:v:0:27500:2318:2319:52520
++OBE:11426:v:0:27500:2307:2308:52525
++Tiny Pop:11426:v:0:27500:2316:2317:52530
++Spice Extreme:11426:v:0:27500:2320:2321:52561
++Climax3 - 1:11426:v:0:27500:2324:2325:52562
++Climax3 - 2:11426:v:0:27500:2326:2327:52563
++Climax3 - 3:11426:v:0:27500:2328:2329:52564
++Adult Channel:11426:v:0:27500:2330:2331:52565
++Playboy TV:11426:v:0:27500:2313:2314:52566
++52567:11426:v:0:27500:2330:2331:52567
++3911 PH:11426:v:0:27500:2320:2321:52581
++Simply Home:11488:v:0:27500:2364:2365:50102
++DTPCad4:11488:v:0:27500:2315:2316:50103
++Shop Vector:11488:v:0:27500:2322:2323:50105
++Simply Ideas:11488:v:0:27500:2324:2325:50115
++Simply Shop.:11488:v:0:27500:2353:2354:50120
++JobsTV:11488:v:0:27500:2366:2367:50125
++GayDateTV:11488:v:0:27500:2361:2362:50130
++Motors TV:11488:v:0:27500:3329:3330:50135
++nation217:11488:v:0:27500:2329:2330:50170
++52536:11488:v:0:27500:2353:2354:50176
++3786 PH:11488:v:0:27500:2342:2343:50177
++Avago Roulette:11488:v:0:27500:0:0:50180
++50181:11488:v:0:27500:2353:2354:50181
++XplicitXXX:11488:v:0:27500:0:0:50175
++3901 PH:11584:h:0:27500:2348:2349:50101
++50621:11584:h:0:27500:0:0:50621
++Gay TV:11584:h:0:27500:2333:2334:50671
++Red Hot Films:11584:h:0:27500:2338:2339:50672
++Red Hot Euro:11584:h:0:27500:2336:2337:50673
++Television X 2:11584:h:0:27500:2326:2327:50674
++Television X 3:11584:h:0:27500:2314:2315:50675
++Television X:11584:h:0:27500:2306:2307:50676
++RedHot All Girl:11584:h:0:27500:2340:2341:50677
++ExpressShop.:11584:h:0:27500:2331:2332:50678
++Real Estate TV:11584:h:0:27500:2329:2330:50679
++Red Hot Only 18:11584:h:0:27500:2311:2312:50680
++Red Hot Wives:11584:h:0:27500:2344:2345:50681
++RH 40+ Wives:11584:h:0:27500:2346:2347:50682
++redhot amateur:11584:h:0:27500:2342:2343:50683
++redhot uktalent:11584:h:0:27500:0:0:50100
++50686:11584:h:0:27500:0:0:50686
++AvaTest:11546:h:0:27500:2319:2320:50446
++SFI:11546:h:0:27500:0:0:50455
++Shop on TV:11546:h:0:27500:2315:2316:50400
++Thane Direct:11546:h:0:27500:2317:2318:50405
++AVAGO:11546:h:0:27500:2319:2320:50410
++SouthForYou:11546:h:0:27500:2313:2314:50420
++Stop + Shop:11546:h:0:27500:2324:2325:50430
++VHR:11546:h:0:27500:2326:2327:50435
++ditg:11546:h:0:27500:0:0:50439
++cso:11546:h:0:27500:2331:2332:50440
++Channel 425:11546:h:0:27500:2355:2357:50445
++Thomas Cook:11526:v:0:27500:2312:2313:50300
++B4:11526:v:0:27500:2361:2362:50305
++Al Jazeera:11526:v:0:27500:2310:2311:50325
++NHS 1:11526:v:0:27500:2314:2315:50370
++NHS 2:11526:v:0:27500:0:2329:50371
++NHS 2:11526:v:0:27500:0:2337:50372
++NHS Direct Interactive:11526:v:0:27500:0:0:50373
++NHS 4:11526:v:0:27500:2345:2347:50374
++SAB TV:11388:h:0:27500:2310:2311:52401
++Performance:11388:h:0:27500:2312:2313:52402
++channel U:11388:h:0:27500:2314:2315:52403
++Gems.tv:11388:h:0:27500:2317:2318:52404
++Soundtrack ch.:11388:h:0:27500:2307:2308:52405
++HorrorChannel:11388:h:0:27500:2342:2343:52406
++Chat Box:11388:h:0:27500:2319:2320:52407
++Golf Channel:11388:h:0:27500:2321:2322:52408
++Ex&Mart TV:11388:h:0:27500:2323:2324:52409
++TVW Select:11388:h:0:27500:2305:2306:52412
++Game In TV:11388:h:0:27500:2335:2336:52414
++Majestic TV:11388:h:0:27500:2340:2341:52415
++52421:11388:h:0:27500:0:0:52421
++18PlusXXX:11388:h:0:27500:0:0:52410
++XXXHousewive:11388:h:0:27500:0:0:52411
++Open Access 2:11642:v:0:27500:2312:2318:50152
++Unlimited TV:11642:v:0:27500:2319:2320:50153
++Racing UK:11642:v:0:27500:2306:2313:50951
++Vectone Bangla:11642:v:0:27500:2325:2326:50952
++VECTONE Urdu:11642:v:0:27500:2328:2329:50953
++VECTONE Tamil:11642:v:0:27500:2331:2332:50954
++VECTONE Bolly:11642:v:0:27500:2334:2335:50955
++Open Access:11642:v:0:27500:2356:2357:50956
++Classic FM TV:11642:v:0:27500:2358:2359:50957
++50959:11642:v:0:27500:2314:2315:50959
++Extreme Sports:11680:v:0:27500:2307:2308:51101
++EuroNews:11680:v:0:27500:2310:2311:51102
++GOD Channel:11680:v:0:27500:2319:2320:51103
++GOD REVIVAL:11680:v:0:27500:2321:2322:51104
++CrossRhythm:11680:v:0:27500:0:2306:51106
++Life TV:11680:v:0:27500:2323:2324:51108
++TBN Europe:11680:v:0:27500:2325:2326:51109
++HollywoodTV:11680:v:0:27500:2327:2328:51112
++GOD 2:11680:v:0:27500:2321:2322:51115
++revelation:11680:v:0:27500:2339:2340:51116
++Live XXX TV:11680:v:0:27500:0:0:51113
++51117:11680:v:0:27500:0:0:51117
++Alphameric1:11680:v:0:27500:0:0:51121
++Alphameric2:11680:v:0:27500:0:0:51122
++CFC TV:11680:v:0:27500:0:0:51105
++mta-muslim tv:11661:h:0:27500:2311:2312:51001
++BEN:11661:h:0:27500:2327:2328:51008
++Abu Dhabi TV:11661:h:0:27500:2329:2330:51009
++TV Travelshop 2:11661:h:0:27500:2370:2371:51010
++CCTV-9:11661:h:0:27500:2333:2334:51011
++Islam Channel:11661:h:0:27500:2337:2338:51014
++51020:11661:h:0:27500:0:2339:51020
++PlayMonteCarlo & Roulette:11661:h:0:27500:0:2319:51022
++2gbstp:11661:h:0:27500:0:0:51013
++Tel Sell:11623:h:0:27500:2319:2320:50832
++mSync:11623:h:0:27500:0:0:50837
++NASN:11623:h:0:27500:2322:2323:50839
++Classics TV:11623:h:0:27500:2324:2325:50840
++Information TV:11623:h:0:27500:2326:2327:50841
++Wrestling Chnl:11623:h:0:27500:2329:2330:50842
++TWC Reloaded:11623:h:0:27500:2331:2332:50843
++FRIENDLY TV:11623:h:0:27500:2333:2334:50848
++McColls:11623:h:0:27500:0:2335:50851
++Moto:11623:h:0:27500:0:2336:50852
++Teds FM:11623:h:0:27500:0:2337:50853
++Topps FM:11623:h:0:27500:0:2338:50855
++Kiss:11623:h:0:27500:0:2339:50856
++Smash Hits!:11623:h:0:27500:0:2340:50857
++Kerrang:11623:h:0:27500:0:2341:50858
++The Hits:11623:h:0:27500:0:2342:50859
++Magic:11623:h:0:27500:0:2343:50860
++Q:11623:h:0:27500:0:2344:50861
++MOJO:11623:h:0:27500:0:2345:50862
++Heat:11623:h:0:27500:0:2346:50863
++GlobeCast:11623:h:0:27500:0:2347:50864
++PTV Prime:11623:h:0:27500:2315:2316:50865
++Fashion TV:11623:h:0:27500:0:0:50850
++ITV1 London:10832:h:0:22000:2305:2307:10000
++ITV News:10832:h:0:22000:2329:2336:10009
++ITV1 Central:10832:h:0:22000:2327:2328:10010
++ITV1 HTV Wales:10832:h:0:22000:2334:2335:10020
++ITV1 HTV West:10832:h:0:22000:2341:2342:10030
++ITV1 W Country:10832:h:0:22000:2348:2349:10040
++G49:10832:h:0:22000:2334:2335:10099
++ITV1 Anglia:10891:h:0:22000:2305:2306:10100
++ITV1 Border:10891:h:0:22000:2327:2328:10110
++ITV1 BorderSco:10891:h:0:22000:2334:2335:10120
++ITV1 Meridian S:10891:h:0:22000:2348:2349:10140
++ITV1 Meridian E:10891:h:0:22000:2341:2342:10141
++ITV1 Tyne Tees:10891:h:0:22000:2355:2356:10150
++ITV1 Yorkshire:10891:h:0:22000:2362:2363:10160
++G53:10891:h:0:22000:2334:2335:10199
++ITV Channel Is:10906:v:0:22000:2326:2328:10200
++Grampian TV:10906:v:0:22000:2333:2334:10210
++Scottish TV:10906:v:0:22000:2340:2341:10220
++UTV:10906:v:0:22000:2347:2348:10230
++ITV2:10906:v:0:22000:2350:2351:10240
++ITV1 Granada:10906:v:0:22000:2305:2306:10250
++ITV3:10906:v:0:22000:2363:2364:10260
++G54:10906:v:0:22000:2357:2358:10299
++6300:10758:v:0:22000:2305:2306:10119
++LONDON TV:11222:h:0:27500:2334:2335:52014
++Setanta Sports:11222:h:0:27500:0:0:52021
++Setanta Sports:11222:h:0:27500:0:0:52022
++Pure Dance:11222:h:0:27500:0:2312:52025
++Club Asia:11222:h:0:27500:0:2305:52026
++Setanta PPV2:11222:h:0:27500:0:0:52032
++[fffe]:11222:h:0:27500:0:0:65534
++UCB TV:11222:h:0:27500:2313:2314:52001
++ATN:11222:h:0:27500:2310:2311:52002
++Overload:11222:h:0:27500:2306:2307:52003
++Golf Pro-Shop:11222:h:0:27500:2315:2316:52004
++You TV:11222:h:0:27500:2336:2337:52005
++Escape:11222:h:0:27500:2317:2318:52006
++52007:11222:h:0:27500:2324:2325:52007
++Get Lucky TV:11222:h:0:27500:2319:2320:52008
++Wonderful:11222:h:0:27500:2308:2309:52009
++Musicians Chnl:11222:h:0:27500:2326:2327:52010
++Rangers TV:11222:h:0:27500:2328:2329:52011
++Celtic TV:11222:h:0:27500:2330:2331:52012
++Advert Channel:11222:h:0:27500:2332:2333:52013
++E4+1:10729:v:0:22000:2306:2307:8300
++3310:10729:v:0:22000:2317:2318:8310
++3315:10729:v:0:22000:0:0:8315
++3320:10729:v:0:22000:0:0:8320
++[fffe]:11264:h:0:22000:0:0:65534
++52101:11264:h:0:22000:2305:2306:52101
++52102:11264:h:0:22000:2307:2308:52102
++52103:11264:h:0:22000:2309:2310:52103
++52104:11264:h:0:22000:2311:2312:52104
++IDMT:11307:h:0:27500:2307:2308:52200
++ Broadband UK:11307:h:0:27500:2305:2306:52210
++52220:11307:h:0:27500:2309:2310:52220
++Trouble Reload:11307:h:0:27500:2311:2312:52230
++Challenge+1:11307:h:0:27500:2314:2315:52232
++Ftn:11307:h:0:27500:0:0:52231
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-s/BrasilSat-B3-84.0W dvb-apps/util/szap/channels-conf/dvb-s/BrasilSat-B3-84.0W
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-s/BrasilSat-B3-84.0W    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/szap/channels-conf/dvb-s/BrasilSat-B3-84.0W  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,39 @@
++NoName:3675:v:0:4285:1110:1211:1
++Rede 21:3688:v:0:2308:308:256:1
++SNG#3 TERRA VIVA:3692:v:0:3200:308:256:1
++TV PONTA PORA       :3697:v:0:3333:1110:1211:1
++Servico 1:3710:v:0:12960:36:37:1
++TV Assembleia:3710:v:0:12960:39:40:2
++Servico 3:3710:v:0:12960:42:43:3
++TV Cultura:3710:v:0:12960:33:34:4
++TV Ra-Tim-Bum:3710:v:0:12960:45:46:5
++Tv Morena:3738:v:0:4710:4096:4097:1
++[6d65]:3754:v:0:5000:0:0:28005
++[6dc9]:3754:v:0:5000:0:0:28105
++[0faa]:3754:v:0:5000:0:0:4010
++[0fb4]:3754:v:0:5000:0:0:4020
++[6d61]:3754:v:0:5000:0:0:28001
++[0f9f]:3754:v:0:5000:0:0:3999
++[0fbe]:3754:v:0:5000:0:0:4030
++[000b]:3754:v:0:5000:0:0:11
++[5014]:3754:v:0:5000:0:0:20500
++STV:3768:v:0:8000:160:80:1
++CANAL 2:3768:v:0:8000:161:84:2
++TELECONF:3768:v:0:8000:162:88:3
++REDETV RO:3805:v:0:3255:4194:4195:1
++Videocom:3858:v:0:4289:1110:1211:1
++TVSULBAHIA:3911:v:0:3255:33:36:2
++TV ARATU BA:3927:v:0:3255:33:36:2
++TV BAND BA:3931:h:0:3255:337:340:21
++TV BAND BA:3932:v:0:3255:337:340:21
++REDE SUPER:3940:v:0:3255:337:340:1
++RBI:3949:v:0:4340:337:340:33
++TV TRIBUNA:3955:v:0:4340:337:340:1
++5                   :3970:v:0:4445:1160:1120:1
++TV EDUCATIVA MS:4013:v:0:3255:337:340:33
++TV Justica:4060:v:0:3330:289:290:1
++CNT GERACAO 1:4075:v:0:4444:289:290:20101
++ASS-LEG-SC:4132:v:0:2532:337:340:33
++EMBRATEL 21:4152:v:0:2300:257:514:1
++SEXY TV:4155:v:0:2170:257:258:1
++BASA:4169:v:0:8140:4141:4140:4
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/au-Adelaide dvb-apps/util/szap/channels-conf/dvb-t/au-Adelaide
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/au-Adelaide   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/szap/channels-conf/dvb-t/au-Adelaide 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,28 @@
++ABC HDTV:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:2307:0:592
++ABC TV Adelaide:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:593
++ABC TV 2:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:594
++ABC TV 3:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:595
++ABC TV 4:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:596
++ABC DiG Radio:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:0:2311:598
++7 Digital:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1281:1282:1360
++7 Digital 1:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1281:1282:1361
++7 Digital 2:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1281:1282:1362
++7 Digital 3:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1281:1282:1363
++7 HD Digital:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1345:1346:1364
++NINE Digital:191625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1105
++NINE HD:191625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:513:0:1112
++TEN Digital:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1617
++TEN Digital 1:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1618
++TEN Digital 2:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1619
++TEN Digital 3:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1620
++TEN Digital:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1621
++TEN Digital 4:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1622
++TEN Digital:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1623
++TEN HD:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:514:0:1624
++Ten Digital:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1625
++SBS HD:564500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:102:103:832
++SBS DIGITAL 1:564500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:81:833
++SBS DIGITAL 2:564500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:162:83:834
++SBS EPG:564500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:163:85:835
++SBS RADIO 1:564500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:201:846
++SBS RADIO 2:564500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:202:847
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/au-Brisbane dvb-apps/util/szap/channels-conf/dvb-t/au-Brisbane
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/au-Brisbane   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/szap/channels-conf/dvb-t/au-Brisbane 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,29 @@
++ABC HDTV:226500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:2307:0:576
++ABC TV Brisbane:226500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:577
++ABC TV 2:226500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:578
++ABC TV 3:226500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:579
++ABC TV 4:226500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:580
++ABC DiG Radio:226500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:0:2310:582
++7 Digital:177500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1025:1026:1344
++7 Digital 1:177500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1025:1026:1345
++7 Digital 2:177500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1025:1026:1346
++7 Digital 3:177500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1025:1026:1347
++7 HD Digital:177500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1089:1090:1348
++Nine Digital:191625000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:513:660:1025
++Nine Guide:191625000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:517:660:1030
++Nine High Definition:191625000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:0:1152
++TEN Digital:219500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1601
++TEN Digital 1:219500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1602
++TEN Digital 2:219500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1603
++TEN Digital 3:219500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1604
++TEN Digital:219500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1605
++TEN Digital 4:219500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1606
++TEN Digital:219500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1607
++TEN HD:219500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:514:0:1608
++TEN Digital:219500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1609
++SBS HD:585625000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:102:103:816
++SBS DIGITAL 1:585625000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:81:817
++SBS DIGITAL 2:585625000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:162:83:818
++SBS EPG:585625000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:163:85:819
++SBS RADIO 1:585625000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:201:830
++SBS RADIO 2:585625000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:202:831
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/au-Hobart dvb-apps/util/szap/channels-conf/dvb-t/au-Hobart
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/au-Hobart     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/szap/channels-conf/dvb-t/au-Hobart   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,18 @@
++ABC HDTV:191625000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:2314:0:624
++ABC TV Hobart:191625000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:625
++ABC2:191625000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:2309:2310:626
++ABC TV:191625000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:627
++ABC DiG Radio:191625000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:0:2317:630
++ABC DiG Jazz:191625000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:0:2318:631
++SBS HD:205500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:102:103:848
++SBS DIGITAL 1:205500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:81:849
++SBS DIGITAL 2:205500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:162:83:850
++SBS EPG:205500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:163:85:851
++SBS RADIO 1:205500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:201:862
++SBS RADIO 2:205500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:202:863
++SCT Hobart:212500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:625:626:2306
++SCT - HD:212500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:3611:0:2338
++WIN TELEVISION:184500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:116:117:1
++WIN HD:184500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:129:130:10
++TDT - SD:219500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:657:658:2071
++TDT - HD:219500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:3511:0:2103
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/au-Melbourne dvb-apps/util/szap/channels-conf/dvb-t/au-Melbourne
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/au-Melbourne  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/szap/channels-conf/dvb-t/au-Melbourne        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,17 @@
++ABC HDTV:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:2307:2308:560
++ABC TV Melbourne:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:561
++ABC DiG Radio:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:0:2310:566
++TEN Digital:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1585
++TEN HD:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:514:0:1592
++Nine Digital:191625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:519:720:1072
++Nine Digital HD:191625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:0:1073
++Nine Guide:191625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:517:700:1074
++7 Digital:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:769:770:1328
++7 HD Digital:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:833:834:1332
++7 Program Guide:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:865:866:1334
++SBS HD:536625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:102:103:784
++SBS DIGITAL 1:536625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:81:785
++SBS DIGITAL 2:536625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:162:83:786
++SBS EPG:536625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:163:85:787
++SBS RADIO 1:536625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:201:798
++SBS RADIO 2:536625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:202:799
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/au-Sydney-NorthShore dvb-apps/util/szap/channels-conf/dvb-t/au-Sydney-NorthShore
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/au-Sydney-NorthShore  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/szap/channels-conf/dvb-t/au-Sydney-NorthShore        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,31 @@
++ABC HDTV:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:2307:0:544
++ABC TV Sydney:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:545
++ABC TV 2:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:546
++ABC TV 3:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:547
++ABC TV 4 :226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:548
++ABC DiG Radio:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:0:2310:550
++Test.:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:0:0:549
++7 Digital:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:513:514:1312
++7 Digital 1:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:513:514:1313
++7 Digital 2:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:513:514:1314
++7 Digital 3:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:513:514:1315
++7 HD Digital:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:577:578:1316
++Program Guide:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:609:610:1318
++NINE DIGITAL:191625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:519:720:1
++NINE HD:191625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:0:5
++NINE GUIDE:191625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:517:720:6
++TEN Digital:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1569
++TEN Digital 1:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1570
++TEN Digital 2:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1571
++TEN Digital 3:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1572
++TEN Digital:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1573
++TEN Digital 4:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1574
++TEN Digital:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1575
++TEN HD:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:514:0:1576
++Ten Digital:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1577
++SBS HD:571500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:102:103:768
++SBS DIGITAL 1:571500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:81:769
++SBS DIGITAL 2:571500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:162:83:770
++SBS EPG:571500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:163:85:772
++SBS RADIO 1:571500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:201:782
++SBS RADIO 2:571500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:202:783
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/cz-Praha dvb-apps/util/szap/channels-conf/dvb-t/cz-Praha
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/cz-Praha      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/szap/channels-conf/dvb-t/cz-Praha    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,16 @@
++CT2.:506000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:512:650:1
++Nova.:506000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:513:661:2
++CT1.:506000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:2325:2326:3
++Prima.:506000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:514:671:4
++Stanice O.:506000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:2322:2323:5
++Radiozurnal.:506000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:652:6
++Praha.:506000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:653:7
++Vltava.:506000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:651:8
++iTV:506000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:9
++Prima:674000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:161:84:1
++CT2:674000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:164:96:4
++TV Program:674000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:2501:2502:5
++RADIO2:674000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:0:2832:6
++RADIO:674000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:0:2831:9
++Proglas:674000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:0:180:11
++Nova.:674000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:205:206:3
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/de-Berlin dvb-apps/util/szap/channels-conf/dvb-t/de-Berlin
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/de-Berlin     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/szap/channels-conf/dvb-t/de-Berlin   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,47 @@
++rbb Brandenburg:522000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1101:1102:11
++rbb Berlin:522000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1201:1202:12
++Phoenix:522000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1301:1302:13
++Das Erste:522000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1401:1402:14
++ARD-MHP-Data:522000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16
++ZDF:570000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:545:546:514
++Info/3sat:570000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:561:562:515
++Doku/KiKa:570000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:593:594:517
++SAT.1:658000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:385:386:16408
++N24:658000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:225:226:16398
++ProSieben:658000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:305:306:16403
++KABEL1:658000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:162:16394
++MDR FERNSEHEN:191500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:101:102:1
++ARD-Online-Kanal:191500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:10
++ARD-MHP-Data:191500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:9
++NDR FERNSEHEN:191500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:301:302:3
++arte:191500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:201:202:2
++Test Programm:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:3841:3842:16624
++SUD enhanced:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16650
++13 TH STREET:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:4273:4274:16651
++BMCO Nokia IPDC Signalling:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16652
++BMCO Nokia IPDC 1:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16653
++BMCO Nokia IPDC 2:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16654
++BMCO Nokia IPDC 3:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16655
++IP Services:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16640
++Media Broadcast Services:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16641
++SUD:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16642
++SUD 1:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16643
++Kathrein Download:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16644
++HUMAX DOWNLOAD SVC:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16645
++BMCO Nokia IPDC 4:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16656
++BMCO Nokia IPDC 5:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16657
++BMCO Nokia IPDC 6:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16658
++BMCO Nokia IPDC 7:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16659
++BMCO Nokia IPDC 8:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16660
++RTL:506000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:337:338:16405
++RTL2:506000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:353:354:16406
++Super RTL:506000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:433:434:16411
++VOX:506000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:545:546:16418
++Südwest BW/RP:177500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:257:258:16
++WDR:177500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:241:242:15
++BBC World:177500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:49:50:16387
++FAB:177500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:3073:3074:16576
++DSF:754000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:129:130:16392
++Testkanal NEUN LIVE:754000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:273:274:16401
++VIVA Plus:754000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:529:530:16417
++Eurosport:754000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:577:578:16420
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/de-Braunschweig dvb-apps/util/szap/channels-conf/dvb-t/de-Braunschweig
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/de-Braunschweig       1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/szap/channels-conf/dvb-t/de-Braunschweig     2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++arte:198500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4385:4386:2
++Phoenix:198500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4401:4402:3
++EinsExtra:198500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4417:4418:4
++Das Erste:198500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4369:4370:128
++ZDF:490000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:545:546:514
++Info/3sat:490000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:561:562:515
++Doku/KiKa:490000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:593:594:517
++RTL Television:498000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:337:338:16405
++RTL2:498000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:353:354:16406
++Super RTL:498000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:369:370:16407
++VOX:498000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:545:546:16418
++hr-fernsehen:594000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4673:4674:65
++MDR FERNSEHEN:594000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4657:4658:100
++NDR FS NDS:594000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4625:4626:129
++NDR FS HH *:594000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4625:4626:130
++NDR FS SH *:594000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4625:4626:131
++NDR FS MVP *:594000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4625:4626:132
++WDR Köln:594000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4641:4642:262
++SAT.1:658000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:385:386:16408
++N24:658000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:225:226:16398
++ProSieben:658000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:305:306:16403
++KABEL1:658000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:161:162:16394
++Eurosport:786000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:577:578:16420
++TERRA NOVA:786000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:609:610:16422
++TELE 5:786000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:465:466:16413
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/de-Bremen dvb-apps/util/szap/channels-conf/dvb-t/de-Bremen
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/de-Bremen     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/szap/channels-conf/dvb-t/de-Bremen   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,25 @@
++arte:482000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:201:202:2
++Phoenix:482000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:301:302:3
++NDR RB:482000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:518:519:161
++Das Erste RB:482000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:261:262:160
++hr-fernsehen:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4673:4674:65
++MDR FERNSEHEN:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4657:4658:100
++NDR FS NDS:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4625:4626:129
++NDR FS HH *:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4625:4626:130
++NDR FS SH *:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4625:4626:131
++NDR FS MVP *:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4625:4626:132
++WDR Köln:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4641:4642:262
++ZDF:562000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:545:546:514
++Info/3sat:562000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:561:562:515
++Doku/KiKa:562000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:593:594:517
++RTL Television:642000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:337:338:16405
++RTL2:642000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:353:354:16406
++Super RTL:642000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:369:370:16407
++VOX:642000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:545:546:16418
++Eurosport:666000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:577:578:16420
++TERRA NOVA:666000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:609:610:16422
++TELE 5:666000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:465:466:16413
++SAT.1:698000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:385:386:16408
++N24:698000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:225:226:16398
++ProSieben:698000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:305:306:16403
++KABEL1:698000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:161:162:16394
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/de-Koeln-Bonn dvb-apps/util/szap/channels-conf/dvb-t/de-Koeln-Bonn
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/de-Koeln-Bonn 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/szap/channels-conf/dvb-t/de-Koeln-Bonn       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,23 @@
++RTL Television:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:337:338:16405
++RTL2:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:353:354:16406
++Super RTL:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:433:434:16411
++VOX:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:545:546:16418
++ZDF:514000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:545:546:514
++Info/3sat:514000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:561:562:515
++Doku/KiKa:514000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:593:594:517
++MDR Fernsehen:698000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4657:4658:100
++NDR FS NDS:698000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4641:4642:129
++SÜDWEST RP:698000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4673:4674:226
++WDR Köln:698000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4625:4626:262
++N24:650000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:225:226:16398
++ProSieben:650000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:305:306:16403
++KABEL1:650000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:161:162:16394
++SAT.1:650000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:2078:2077:16408
++arte:826000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4385:4386:2
++Phoenix:826000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4401:4402:3
++EinsMuXx:826000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4417:4418:6
++Das Erste:826000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4369:4370:256
++Eurosport:834000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:577:578:16420
++VIVA:834000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:513:514:16416
++TERRA NOVA:834000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:609:610:16422
++CNN Int.:834000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:97:98:16390
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/de-Leipzig dvb-apps/util/szap/channels-conf/dvb-t/de-Leipzig
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/de-Leipzig    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/szap/channels-conf/dvb-t/de-Leipzig  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,7 @@
++# channels.conf for DVB-T - Leipzig (Germany) Transmitter
++# Generated by Albrecht Lohoefener <albrechtloh@gmx.de>
++
++MDR:586000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1553:1554:97
++rbb:586000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:2833:2834:177
++WDR:586000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:4193:4194:262
++BR:586000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:529:530:33
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/de-Luebeck dvb-apps/util/szap/channels-conf/dvb-t/de-Luebeck
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/de-Luebeck    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/szap/channels-conf/dvb-t/de-Luebeck  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,22 @@
++ZDF:490000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_1_2:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:545:546:514
++Info/3sat:490000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_1_2:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:561:562:515
++Doku/KiKa:490000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_1_2:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:593:594:517
++Bayerisches Fernsehen:530000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_1_2:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:5185:5186:34
++MDR FERNSEHEN:530000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_1_2:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:5169:5170:100
++NDR FS NDS *:530000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_1_2:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:5137:5138:129
++NDR FS HH *:530000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_1_2:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:5137:5138:130
++NDR FS SH:530000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_1_2:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:5137:5138:131
++NDR FS MVP *:530000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_1_2:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:5137:5138:132
++WDR Köln:530000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_1_2:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:5153:5154:262
++N24:546000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_1_2:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:225:226:16398
++ProSieben:546000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_1_2:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:305:306:16403
++KABEL1:546000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_1_2:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:161:162:16394
++SAT.1:546000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_1_2:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:385:386:16408
++arte:570000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4385:4386:2
++Phoenix:570000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4401:4402:3
++EinsExtra:570000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4417:4418:4
++Das Erste:570000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4369:4370:128
++RTL Television:626000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:337:338:16405
++RTL2:626000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:353:354:16406
++Super RTL:626000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:369:370:16407
++VOX:626000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:545:546:16418
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/de-Rhein-Main dvb-apps/util/szap/channels-conf/dvb-t/de-Rhein-Main
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/de-Rhein-Main 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/szap/channels-conf/dvb-t/de-Rhein-Main       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,6 @@
++c8:198500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:161:82
++c22:482000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:161:82
++c34:578000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:161:82
++c54:738000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:161:82
++c57:762000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:161:82
++c64:818000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:161:82
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/de-Ruhrgebiet dvb-apps/util/szap/channels-conf/dvb-t/de-Ruhrgebiet
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/de-Ruhrgebiet 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/szap/channels-conf/dvb-t/de-Ruhrgebiet       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,46 @@
++# channels.conf for dvb-t in germany, broadcasting area 'Duesseldorf/Ruhrgebiet'.
++# see
++# http://nrw.ueberallfernsehen.de/fileadmin/downloads/Programm_Ruhr_2005_04_04_final.pdf
++# for details on the regional availability of some channels (see the comments below).
++#
++RTL Television:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:337:338:16405
++RTL2:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:353:354:16406
++Super RTL:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:433:434:16411
++VOX:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:545:546:16418
++ZDF:586000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:545:546:514
++Info/3sat:586000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:561:562:515
++Doku/KiKa:586000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:593:594:517
++CNN Int.:722000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:97:98:16390
++VIVA:722000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:513:514:16416
++Eurosport:722000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:577:578:16420
++TERRA NOVA:722000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:609:610:16422
++ProSieben:746000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:305:306:16403
++SAT.1:746000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:385:386:16408
++KABEL1:746000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:161:162:16394
++N24:746000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:225:226:16398
++arte:818000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4385:4386:2
++Phoenix:818000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4401:4402:3
++EinsMuXx:818000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4417:4418:6
++Das Erste:818000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4369:4370:256
++##
++### regionale Sender/regional channels
++##
++## Kanal 25; Senderstandorte/broadcasting locations: Langenberg, Dortmund
++MDR FERNSEHEN-25:506000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:5425:5426:100
++NDR FS NDS-25:506000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:5409:5410:129
++SUEDWEST RP-25:506000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:5441:5442:226
++WDR Dortmund-25:506000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:5393:5394:259
++WDR Essen-25:506000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:5393:5394:261
++#
++## Kanal 46; Senderstandorte/broadcasting locations: Duesseldorf, Wesel, Langenberg
++MDR FERNSEHEN-46:674000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4913:4914:100
++NDR FS NDS-46:674000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4897:4898:129
++SUEDWEST RP-46:674000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4929:4930:226
++WDR Duesseldorf-46:674000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4881:4882:260
++WDR Wuppertal-46:674000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4881:4882:265
++## Kanal 59; Senderstandorte/broadcasting locations: Essen
++MDR FERNSEHEN-59:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:5169:5170:100
++NDR FS NDS-59:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:5153:5154:129
++SUEDWEST RP-59:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:5185:5186:226
++WDR Dortmund-59:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:5137:5138:259
++WDR Essen-59:778000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:5137:5138:261
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/es-Alpicat dvb-apps/util/szap/channels-conf/dvb-t/es-Alpicat
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/es-Alpicat    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/szap/channels-conf/dvb-t/es-Alpicat  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,19 @@
++#channels.conf for DVB-T - Alpicat (Lleida) Transmitter
++
++#C42
++TV3:642000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:111:112:801
++K3/33:642000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:121:122:802
++3/24:642000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:131:132:803
++Canal Pilot:642000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:141:142:804
++3XL.net:642000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:151:152:805
++
++#C58
++TVE 1:770000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:101:103:1377
++TVE 2:770000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:201:203:1441
++ANTENA 3:770000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:301:303:1121
++CANAL+:770000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:501:503:1057
++TELECINCO:770000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:401:403:1185
++
++#C66
++Veo TV:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:301:302:1536
++Net TV:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:401:402:1825
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/es-Collserola dvb-apps/util/szap/channels-conf/dvb-t/es-Collserola
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/es-Collserola 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/szap/channels-conf/dvb-t/es-Collserola       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,19 @@
++#channels.conf for DVB-T - Collserola (Barcelona) Transmitter
++
++#C43
++TV3:650000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:111:112:801
++K3/33:650000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:121:122:802
++3/24:650000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:131:132:803
++Canal Pilot:650000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:141:142:804
++3XL.net:650000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:151:152:805
++
++#C61
++TVE 1:794000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:101:103:1377
++TVE 2:794000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:201:203:1441
++ANTENA 3:794000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:301:303:1121
++CANAL+:794000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:501:503:1057
++TELECINCO:794000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:401:403:1185
++
++#C66
++Veo TV:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:301:302:1536
++Net TV:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:401:402:1825
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/es-Madrid dvb-apps/util/szap/channels-conf/dvb-t/es-Madrid
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/es-Madrid     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/szap/channels-conf/dvb-t/es-Madrid   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,26 @@
++TVE 1:770000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:101:103:380
++TVE 2:770000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:201:203:381
++24H TVE:770000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:1001:1003:382
++RNE1:770000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:0:2001:385
++RNEC:770000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:0:2011:386
++CLAN/50 TVE:770000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:1501:1503:383
++RNE3:770000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:0:2021:387
++TM3:810000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:111:113:421
++LAOTRA:810000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:211:212:422
++ONDA6:810000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:311:312:423
++TELEDEPORTE:834000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:101:103:100
++VEO TV:834000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:1001:1002:260
++VEO 2:834000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:301:302:261
++NET TV:834000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:1501:1502:300
++CUATRO:842000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:160:80:1057
++CNN+:842000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:161:84:1058
++40 LATINO:842000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:162:88:1059
++LA SEXTA 1:842000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:1501:0:340
++T5 Estrellas:850000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:201:301:181
++T5 Sport:850000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:202:302:182
++Telecinco:850000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:203:303:180
++FLYMUSIC:850000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:1501:1502:301
++antena 3:858000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:301:303:140
++a3.neox:858000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:501:503:141
++a3.nova:858000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:1001:1003:142
++La Sexta 2:858000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:1501:0:341
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/es-Mussara dvb-apps/util/szap/channels-conf/dvb-t/es-Mussara
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/es-Mussara    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/szap/channels-conf/dvb-t/es-Mussara  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,19 @@
++#channels.conf for DVB-T - La Mussara (Reus-Tarragona) Transmitter
++
++#C56
++TV3:754000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:111:112:801
++K3/33:754000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:121:122:802
++3/24:754000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:131:132:803
++Canal Pilot:754000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:141:142:804
++3XL.net:754000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:151:152:805
++
++#C59
++TVE 1:778000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:101:103:1377
++TVE 2:778000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:201:203:1441
++ANTENA 3:778000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:301:303:1121
++CANAL+:778000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:501:503:1057
++TELECINCO:778000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:401:403:1185
++
++#C66
++Veo TV:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:301:302:1536
++Net TV:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:401:402:1825
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/uk-Crystal-Palace dvb-apps/util/szap/channels-conf/dvb-t/uk-Crystal-Palace
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/uk-Crystal-Palace     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/szap/channels-conf/dvb-t/uk-Crystal-Palace   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,67 @@
++#channels.conf for DVB-T - Crystal Palace Transmitter
++
++# Multiplex 1 BBC - Channel 25, Offset -, Freq 505833333
++BBCi:505833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0:4479
++CBBC Channel:505833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0:4671
++BBC ONE:505833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:600:601
++BBC TWO:505833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:610:611
++BBC THREE:505833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:620:621
++BBC NEWS 24:505833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:640:641
++
++# Multiplex 2 Digital 3&4 - Channel 22, Offset -, Freq 481833333
++Teletext:481833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0
++FourText:481833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0
++CHANNEL4:481833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2827:2828
++ITV NEWS:481833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2850:2851
++ITV 1:481833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:512:650
++ITV 2:481833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2818:2819
++Ch 14:481833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2840:2841
++
++#Multiplex A SDN - Channel 32, Offset -, Frequency 561833333
++ntl:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0
++Ch 15:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:660
++BBC Radio 1:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:6210
++BBC Radio 2:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:6226
++BBC Radio 3:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:6242
++BBC Radio 4:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:6258
++QVC:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6049:6050
++FIVE:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6017:6018
++bid-up.tv:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6273:6274
++TV Travel Shop:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6161:6161
++
++#Multiplex B BBC - Channel 28, Offset -, Frequency 529833333
++#Community                (0x4e00) 01: PCR 0x1fff
++#703                      (0x4c80) 01: PCR 0x1fff
++BBC PARLMNT:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:403
++BBC FOUR:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:401
++701:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:204:411
++702:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:203:407
++CBeebies:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:401:402
++BBC Asian Net:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:435
++1Xtra BBC:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:434
++BBC 7:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:433
++BBC 6 Music:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:432
++BBC 5L SportsX:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:431
++BBC R5 Live:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:430
++
++# Multiplex C Crown Castle - Channel 34, Offset +, Frequency 578166666
++UKHistory:578166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:401:402
++Sky Travel:578166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:301:302
++Sky Spts News:578166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:202
++Sky News:578166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:101:102
++
++# Multiplex D Crown Castle - Channel 29, Offset -, Freq 537833333
++#UKBrightIdeas            (0x64c0) 01: PCR 0x1fff
++THE HITS:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:101:102
++TMF:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:202
++CBM:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:501:502
++Free2Play:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0
++Q:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1901
++Magic:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1801
++The Hits Radio:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1701
++BBC World Sv:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1601
++oneworld:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1501
++jazz fm:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1401
++Kerrang:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1301
++Smash Hits:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1201
++Kiss:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1101
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/uk-Hannington dvb-apps/util/szap/channels-conf/dvb-t/uk-Hannington
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/uk-Hannington 1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/szap/channels-conf/dvb-t/uk-Hannington       2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,28 @@
++BBC One:706000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:600:601
++BBC Two:706000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:610:611
++CBBC:706000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:620:621
++BBC Three:706000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:620:621
++BBC News 24:706000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:640:641
++CBeebies:674166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:401
++BBC Four:674166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:401
++BBC Parliament:674166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:403
++701:674166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:203:407
++702:674166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:204:411
++703:674166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0
++ITV 1:650166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:513:651
++ITV 2:650166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2818:2819
++Channel 4:650166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2822:2823
++ITV News:650166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2822:2823
++price-drop.tv:650166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2840:2841
++Five:626166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6017:6018
++QVC:626166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6059:6050
++Tv Travel Shop:626166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6161:6162
++Channel 15:626166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:660
++bid-up.tv:626166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6273:6274
++Sky News:658166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:101:102
++Sky Sports News:658166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:202
++Sky Travel:658166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:301:302
++UK History:658166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:401:402
++The Hits:634166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:101:102
++TMF:634166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:202
++UK Bright Ideas:634166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/uk-Oxford dvb-apps/util/szap/channels-conf/dvb-t/uk-Oxford
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/uk-Oxford     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/szap/channels-conf/dvb-t/uk-Oxford   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,41 @@
++BBC-Choice:578000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:620:621
++BBC-Knowledge:578000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:630:631
++BBC-News24:578000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:640:641
++BBC-1:578000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:600:601
++BBC-Parliament:578000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:660
++BBC-2:578000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:610:611
++ITV-1:850000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:513:651
++ITV-2:850000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2818:2819
++ITV-Sport:850000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2836:2837
++FilmFour:850000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2822:2823
++C4:850000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2826:2827
++E4:850000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2831:2832
++C5:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6017:6018
++Shop:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6049:6050
++ITVSelect-Info:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6065:6066
++ITVSelect-1:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6081:6082
++ITVSelect-2:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6097:6098
++ITVSelect-3:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6113:6114
++ITVSelect-4:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6129:6130
++Carlton-Cinema:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:288:289
++Sky-One:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:544:545
++Sky-Sports-1:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:800:801
++Sky-Premier:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:1056:1057
++CartoonNetwork:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:1312:1313
++UK-Horizons:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2336:2337
++ITV-Sport-Plus:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2592:2593
++ITVSportSelect:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:2596
++BreezeMen&Mtrs:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:800:801
++Granada-Plus:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:544:545
++MTV:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:1568:1569
++Sky-Movie-Max:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:1312:1313
++Sky-Sports-2:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2080:2081
++UK-Gold:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:288:289
++Wellbeing:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:1824:1825
++PLAY-uk:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:288:289
++UK-Style:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:544:545
++no-name:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:800:801
++Discovery:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:1312:1313
++Nick/Paramount:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2080:2081
++Sky-Sports-3:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2336:2337
++Brit-Eurosport:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2592:2593
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/uk-Reigate dvb-apps/util/szap/channels-conf/dvb-t/uk-Reigate
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/uk-Reigate    1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/szap/channels-conf/dvb-t/uk-Reigate  2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,51 @@
++BBC ONE:554000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:600:601
++BBC TWO:554000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:610:611
++ITV 1:474000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:512:650
++Channel 4:474000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2827:2828
++five:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6017:6018
++ITV 2:474000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2818:2819
++BBC THREE:554000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0
++Teletext:474000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0
++BBC FOUR:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0
++Sky Travel:618166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:301:302
++UKHistory:618166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:401:402
++Ch 14:474000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2840:2841
++Ch 15:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:660
++QVC:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6049:6050
++TV Travel Shop:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6161:6162
++The HITS:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:101:102
++UKBrightIdeas:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:301:302
++f tn:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0
++TMF:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:202
++bid-up.tv:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6273:6274
++CBM:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:501:502
++CBBC Channel:554000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:620:621
++CBeebies:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:401
++BBC NEWS 24:554000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:640:641
++ITV News:474000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2850:2851
++Sky News:618166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:101:102
++Sky Spts News:618166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:202
++BBC PARLMNT:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:403
++Community:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0
++FourText:474000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0
++BBCi:554000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0
++ntl:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0
++BBC Radio 1:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:6210
++1Xtra BBC:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:434
++BBC Radio 2:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:6226
++BBC Radio 3:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:6242
++BBC Radio 4:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:6258
++BBC R5 Live:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:430
++BBC 5L SportsX:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:431
++BBC 6 Music:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:432
++BBC 7:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:433
++BBC Asian Net.:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:435
++BBC World Sv.:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1601
++Smash Hits!:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1201
++Kiss:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1101
++Kerrang!:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1301
++jazz fm:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1401
++oneword:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1501
++701:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:203:407
++702:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:204:411
++703:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/uk-Sandy-Heath dvb-apps/util/szap/channels-conf/dvb-t/uk-Sandy-Heath
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels-conf/dvb-t/uk-Sandy-Heath        1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/szap/channels-conf/dvb-t/uk-Sandy-Heath      2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,12 @@
++BBC-Choice:641833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:620:621
++BBC-Knowledge:641833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:630:631
++BBC-News24:641833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:640:641
++BBC-1:641833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:600:601
++BBC-Parliament:641833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:660
++BBC-2:641833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:610:611
++ITV-1:665833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:513:651
++ITV-2:665833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2819:2820
++C4:665833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2823:2824
++E4:665833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2831:2832
++C5:650166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6017:6018
++Shop:650166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6049:6050
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbc-berlin dvb-apps/util/szap/channels.conf-dvbc-berlin
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbc-berlin 2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/szap/channels.conf-dvbc-berlin       1970-01-01 01:00:00.000000000 +0100
+@@ -1,171 +0,0 @@
+-3sat:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:210:220
+-ARD-Online-Kanal:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1805
+-CNBC:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:510:520
+-DLF-Köln:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:810
+-DLR-Berlin:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:710
+-EinsExtra:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:101:102
+-EinsFestival:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:201:202
+-EinsMuXx:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:301:302
+-EuroNews:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2221:2233
+-Eurosport:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:410:420
+-Fritz:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:901
+-KiKa:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:310:320
+-MDR FERNSEHEN:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:401:402
+-MDR KULTUR:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:801
+-MDR info:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1101
+-MHP ARD Online-Kanal:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:102
+-NDR Fernsehen:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2401:2402
+-ORB-Fernsehen:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:501:502
+-RADIOmultikulti:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1301
+-Radio 3:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:701
+-SFB1:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:601:602
+-SWR2:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1401
+-SÜDWEST BW:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:801:802
+-SÜDWEST RP:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:3101:3102
+-WDR 3:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1501
+-WDR 5:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1601
+-ZDF:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:110:120
+-ZDFdigitext:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-ZDFdokukanal:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:660:670
+-ZDFinfokanal:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:610:620
+-ZDFtheaterkanal:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-JUMP:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1001
+-SPUTNIK:426000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:1201
+-Österreich 1:394000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:169
+-ATV 2:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:631:632
+-ATV 2:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:631:632
+-Adagio:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-All Jazz:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-Avante:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:741:743
+-B5 aktuell:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3101
+-BBC Prime:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:761:762
+-BData3:402000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-BData4:402000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-BData5:402000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-BR-alpha:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:701:702
+-Barock Fantasie:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-Bayerisches FS:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:201:202
+-Bayern 1:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3601
+-Bayern 4 Klassik:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3001
+-BibelTV:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:731:732
+-Bloomberg:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-CLASSICA:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:767:768
+-COUNTRY:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:656
+-Canal 24 Horas:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:991:992
+-Club:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:711:713
+-Cristal New Age:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-DANCE:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:304
+-DW-tv:610000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:634:632
+-Das Erste:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:101:102
+-Detskij Mir:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:931:932
+-ERT-Sat:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:691:692
+-Einstein TV:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:701:702
+-Euronews:610000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:597:596
+-Eurosport News:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:771:772
+-Extreme Sports:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:791:793
+-Extreme Sports:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-Fashion TV:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-Fox Kids:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:671:672
+-Fox Kids:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:671:673
+-GOLD:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:320
+-HITLISTE:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:784
+-HR XXL:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3501
+-JAZZ:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:640
+-Jazz legends:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-Kabel Wizard:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-Kanal 7:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-Kanal 7:610000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:49:52
+-Kanal D:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:651:652
+-Kanal D:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:651:652
+-LATIN:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:368
+-Landscape:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-Leitseite:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2254:0
+-Liberty TV:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:721:723
+-MTV Base:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:781:782
+-MV-Test:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-Modem-Setup:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-Movie Sounds:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-Musica Antica:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-Musica Camerata:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-NDR Info:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3701
+-NTV international:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-NTVI:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:611:612
+-Nashe Kino:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:621:622
+-NordwestRadio:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3801
+-OLD GOLD:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:336
+-Opernfestival:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-PCNE:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:681:682
+-PREMIERE SPORT INTERACTIVE:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-PREMIERE DIREKT 1:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-PREMIERE DIREKT 2:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-PREMIERE DIREKT 3:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-PREMIERE DIREKT 4:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2815:2816
+-PREMIERE EROTIK:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1279:1280
+-PREMIERE NOSTALGIE:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2559:2560
+-PREMIERE SERIE:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1023:1024
+-PREMIERE SPORT 1:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:255:258
+-PREMIERE SPORT 2:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:3839:3840
+-PREMIERE START:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:255:256
+-Parlamentsfernsehen:610000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:33:36
+-Phoenix:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:901:902
+-Portal:402000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-RTP Internacional:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:661:662
+-Rai 1:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:951:952
+-Rai 2:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:961:962
+-Rai 3:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:971:972
+-SCHLAGER:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:384
+-SR 1:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3901
+-SR Fernsehen Suedwest:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:501:502
+-Show TV:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:911:912
+-Sinfonica:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-TGRT:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:921:922
+-TM V1.0:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-TV Polonia:434000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:641:642
+-TVEi:121000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:981:982
+-TW1:113000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:751:752
+-Test-R:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:701:702
+-Travel:610000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:595:594
+-VCR-Setup:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-VH1 Classic:610000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:604:603
+-Videotext:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-WDR FERNSEHEN:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:601:602
+-ZEE TV:442000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-arte:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:401:403
+-hessen fernsehen:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:301:302
+-hr-chronos:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3201
+-hr-klassik:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3401
+-hr2:410000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:3301
+-13 TH STREET:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2303:2304
+-ALTERNATIVE ROCK:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:544
+-BEATE-UHSE.TV:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1023:1024
+-CHILLOUT:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:400
+-CLASSIC ROCK:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:352
+-DISCOVERY CHANNEL:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1791:1792
+-DISNEY CHANNEL:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2559:2560
+-DEUTSCHE HITS:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:800
+-EASY LISTENING:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:608
+-Einstein:346000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-FILM & MUSICAL:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:592
+-FOX KIDS:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1279:1280
+-GOLDSTAR TV:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:3839:3840
+-HARD ROCK:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:816
+-HEIMATKANAL:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1535:1536
+-HIP HOP/R&B:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:576
+-JUNIOR:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:255:256
+-K-TOON:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+-KLASSIK POPULÄR:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:624
+-KRIMI &CO:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1535:1536
+-LOVE SONGS:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:592
+-NEW COUNTRY:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:384
+-ORCHESTRALE WERKE:378000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:560
+-PLANET:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1791:1792
+-PREMIERE 1:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:511:512
+-PREMIERE 2:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1791:1793
+-PREMIERE 3:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2303:2304
+-PREMIERE 4:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:767:768
+-PREMIERE 5:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1279:1280
+-PREMIERE 6:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1535:1536
+-PREMIERE 7:370000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:1023:1024
+-SOUL CLASSICS:362000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:352
+-STUDIO UNIVERSAL:354000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:2047:2048
+-Sonnenklar TV:402000000:INVERSION_OFF:6900000:FEC_NONE:QAM_64:0:0
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbs-astra dvb-apps/util/szap/channels.conf-dvbs-astra
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbs-astra  2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/szap/channels.conf-dvbs-astra        1970-01-01 01:00:00.000000000 +0100
+@@ -1,226 +0,0 @@
+-Das Erste:11837:h:0:27500:101:102:1:28106
+-ZDF:11954:h:0:27500:110:120:1:28006
+-3sat:11954:h:0:27500:210:220:1:28007
+-EinsMuXx:12110:h:0:27500:301:302:1:28203
+-EinsFestival:12110:h:0:27500:201:202:1:28202
+-EinsExtra:12110:h:0:27500:101:102:1:28201
+-MDR FERNSEHEN:12110:h:0:27500:401:402:1:28204
+-ORB-Fernsehen:12110:h:0:27500:501:502:1:28205
+-B1 Berlin:12110:h:0:27500:601:602:1:28206
+-SWR Fernsehen:11837:h:0:27500:801:802:1:28113
+-SR Fernsehen Suedwes:11837:h:0:27500:501:502:1:28110
+-hessen fernsehen:11837:h:0:27500:301:302:1:28108
+-WDR FERNSEHEN:11837:h:0:27500:601:602:1:28111
+-Bayerisches FS:11837:h:0:27500:201:202:1:28107
+-N3:12110:h:0:27500:2401:2402:1:28224
+-BR-alpha:11837:h:0:27500:701:702:1:28112
+-KiKa:11954:h:0:27500:310:320:1:28008
+-arte:11836:h:0:27500:401:402:1:28109
+-ZDF Theaterkanal:11954:h:0:27500:1110:1120:1:28016
+-ZDF.info:11954:h:0:27500:610:620:1:28011
+-ZDF.doku:11954:h:0:27500:660:670:1:28014
+-Phoenix:11837:h:0:27500:901:902:1:28114
+-DW-tv:10786:v:0:21997:305:306:1:9005
+-RTL Television:12188:h:0:27500:163:104:1:12003
+-SAT.1:12480:v:0:27500:1791:1792:1:46
+-ProSieben:12480:v:0:27500:255:256:1:898
+-RTL2:12188:h:0:27500:166:128:1:12020
+-Super RTL:12188:h:0:27500:165:120:1:12040
+-KABEL1:12480:v:0:27500:511:512:1:899
+-VOX:12188:h:0:27500:167:136:1:12060
+-tm3:12480:v:0:27500:767:768:1:897
+-Bloomberg TV Germany:12552:v:0:22000:162:99:1:12160
+-EuroNews:11954:h:0:27500:2221:2233:1:28015
+-N24:12480:v:0:27500:2047:2048:1:47
+-n-tv:12670:v:0:22000:162:96:1:12730
+-DSF:12480:v:0:27500:1023:1024:1:900
+-Eurosport:11954:h:0:27500:410:420:1:28009
+-Via 1 - Sch ner Re:12148:h:0:27500:511:512:1:44
+-Home Order Tel:12480:v:0:27500:1279:1280:1:40
+-QVC GERMANY:12552:v:0:22000:165:166:1:12100
+-TW 1:12692:h:0:22000:166:167:1:13013
+-Canal Canarias:12441:v:0:27500:513:681:1:29700
+-ProSieben A:12051:v:0:27500:161:84:1:20002
+-ProSieben CH:12051:v:0:27500:289:290:1:20001
+-Kabel 1 Austria:12051:v:0:27500:166:167:1:20004
+-Kabel 1 Schweiz:12051:v:0:27500:162:163:1:20003
+-CNN Int.:12168:v:0:27500:165:100:1:28512
+-Sky News:12552:v:0:22000:305:306:1:3995
+-Travel:12168:v:0:27500:163:92:1:28001
+-AB SAT / XXL:12266:h:0:27500:164:96:1:17004
+-MOTEURS:12266:h:0:27500:160:80:1:17000
+-HOT GM:12148:h:0:27500:767:768:1:45
+-KTO:12129:v:0:27500:170:120:1:8411
+-LA CINQUIEME:12207:v:0:27500:160:80:1:8501
+-LCP:12207:v:0:27500:165:100:1:8506
+-LibertyTV.com:12611:v:0:22000:941:942:1:12280
+-TV5 Europe:12611:v:0:22000:45:46:1:12240
+-Motors TV:12611:v:0:22000:191:194:1:12300
+-Wishline:12611:v:0:22000:214:216:1:12320
+-TV 5:10786:v:0:21997:164:112:1:9001
+-RTM - MAROC:10786:v:0:21997:162:96:1:9002
+-ESC1 - EGYPTE:10786:v:0:21997:163:104:1:9003
+-RAI 1:10786:v:0:21997:289:290:1:9004
+-RTPI:10786:v:0:21997:300:301:1:9006
+-TV7:10786:v:0:21997:166:128:1:9007
+-ARTE:10786:v:0:21997:167:136:1:9009
+-Colourbars:12611:v:0:22000:48:49:1:3982
+-Alice:12611:v:0:22000:162:96:1:12200
+-Video Italia:12611:v:0:22000:121:122:1:12220
+-ANDALUCIA TV:11934:v:0:27500:166:104:1:29011
+-TVC INT.:12441:v:0:27500:512:660:1:29701
+-TV4:11992:h:0:27500:165:98:1:20365
+-TV Niepokalanow:11876:h:0:27500:161:82:1:20601
+-VIVA:12670:v:0:22000:309:310:1:12732
+-VIVA ZWEI:12552:v:0:22000:171:172:1:12120
+-MTV Central:12699:v:0:22000:3031:3032:1:28643
+-ONYX:12692:h:1:27500:161:84:1:502
+-VIVA polska:11603:h:1:27500:190:191:1:611
+-DeeJay TV:11603:h:1:27500:160:161:1:602
+-NBC:11053:h:1:27500:550:551:1:8008
+-EWTN:10722:h:1:29900:1001:1201:1:4601
+-MTA INTL:10722:h:1:29900:1004:1204:1:4604
+-VOX:11053:h:1:27500:500:501:1:8002
+-SAT.1 A:11053:h:1:27500:511:512:1:8003
+-RTL2 AUSTRIA:11053:h:1:27500:520:521:1:8004
+-ZDF:11053:h:1:27500:570:571:1:8011
+-K-TV:11053:h:1:27500:580:581:1:8012
+-RTL Television:11053:h:1:27500:160:80:1:8001
+-ARTE:11059:v:1:6510:98:99:1:1
+-HOT Italia:11095:h:1:27500:4194:4195:1:3714
+-Olisat:11095:h:1:27500:33:34:1:3718
+-VIVA-POLSKA:11128:h:1:4340:98:99:1:1
+-DW-tv:11195:v:1:9099:101:102:1:5301
+-Canal 24 Horas:11203:h:1:3999:4130:4131:1:5301
+-TV5:11337:v:1:5631:512:640:1:1
+-SAT.1 CH:11603:h:1:27500:101:102:1:601
+-KurdSat:11603:h:1:27500:111:112:1:603
+-ARD "Das Erste":11603:h:1:27500:172:173:1:606
+-RTL 2 CH:11603:h:1:27500:175:176:1:609
+-Super RTL A:11603:h:1:27500:180:181:1:610
+-TV ROMANIA:11622:v:1:27500:227:247:1:10707
+-MRTV:11622:v:1:27500:222:242:1:10702
+-102.5 HIT Ch:11622:v:1:27500:224:244:1:10704
+-TLC SAT:11622:v:1:27500:225:245:1:10705
+-PRO-SAT:11622:v:1:27500:246:226:1:10706
+-Channel SUN:11622:v:1:27500:229:249:1:10709
+-Racing Channel:11622:v:1:27500:228:248:1:10708
+-3 ABN:11622:v:1:27500:221:241:1:10701
+-Bloom.Germany:11642:h:1:27500:1460:1420:1:4
+-Bloomberg TV UK:11642:h:1:27500:1560:1520:1:4
+-Sat 7:11642:h:1:27500:1660:1620:1:4
+-EDTV 1:11746:h:1:27500:4130:4131:1:9501
+-EDTV SPORT:11746:h:1:27500:4386:4387:1:9502
+-EDTV BUSINESS:11746:h:1:27500:4642:4643:1:9503
+-EDTV DRAMA:11746:h:1:27500:4898:4899:1:9504
+-RAI1:11765:v:1:27499:160:80:1:3401
+-RAI2:11765:v:1:27499:161:84:1:3402
+-RAI3:11765:v:1:27499:162:88:1:3403
+-RaiWayTEST2:11765:v:1:27499:516:654:1:3405
+-RAIMOSAICO:11765:v:1:27499:518:8191:1:3407
+-RAINews24:11803:v:1:27500:516:654:1:3301
+-CAMERA DEPUTATI:11803:v:1:27500:517:655:1:3302
+-TELEPACE:11803:v:1:27500:515:653:1:3304
+-RAISPORTSAT:11803:v:1:27500:512:650:1:3305
+-RAINettunoSAT2:11803:v:1:27500:513:651:1:3306
+-RAIeducational:11803:v:1:27500:514:652:1:3307
+-RAINettunoSAT1:11803:v:1:27500:519:657:1:3308
+-SAT2000:11803:v:1:27500:518:656:1:3309
+-I1:11918:v:1:27499:512:650:1:1
+-C5:11918:v:1:27499:513:660:1:2
+-R4:11918:v:1:27499:514:670:1:3
+-Telesierra:12091:h:1:27500:4160:4161:1:8704
+-C. Milagro:12091:h:1:27500:4368:4369:1:8711
+-Italia Sat:12091:h:1:27500:4600:4601:1:8728
+-TVE Internacional:12091:h:1:27500:4208:4209:1:8707
+-Fiesta:12091:h:1:27500:4432:4433:1:8720
+-Retelsat:12091:h:1:27500:4464:4465:1:8722
+-ART EUROPE:12013:h:1:27495:164:96:1:450
+-EGYPT SAT. CH. 2:12013:h:1:27495:166:104:1:470
+-IQRA:12013:h:1:27495:168:112:1:474
+-MAURITANIA TV:12110:v:1:27500:230:231:1:704
+-ARMENIA TV:12110:v:1:27500:240:241:1:705
+-SAILING CHANNEL:12110:v:1:27500:260:261:1:707
+-AL JAZEERA:12110:v:1:27500:270:271:1:708
+-Coming Soon TV:12110:v:1:27500:310:311:1:717
+-SaluteBenessere:12110:v:1:27500:320:321:1:718
+-AH-EDP1:12148:v:1:27499:96:97:1:7201
+-AH-EDP2:12148:v:1:27499:112:113:1:7202
+-Espresso:12148:v:1:27499:192:193:1:7203
+-Alice:12148:v:1:27499:160:161:1:7220
+-Nuvolari:12148:v:1:27499:176:177:1:7221
+-Leonardo:12148:v:1:27499:128:129:1:7222
+-AH-EDP3:12148:v:1:27499:36:37:1:7205
+-OTE Promo:12187:v:1:27500:517:655:1:1001
+-RTS SAT:12187:v:1:27500:519:657:1:1022
+-ERT SAT:12187:v:1:27500:514:652:1:1102
+-EXTRA:12187:v:1:27500:516:654:1:1106
+-TRIAL:12187:v:1:27500:513:651:1:1108
+-Minimax:11303:h:1:19540:300:301:1:3
+-TVN1:12209:h:1:5631:4194:4195:1:1
+-RR TEST:10978:v:1:8998:33:34:1:1
+-TV 5 Thailand:10978:v:1:8998:1057:1058:1:2
+-TEST-1:10978:v:1:8998:3105:3106:1:4
+-FASHION:12244:h:1:27500:123:133:1:103
+-AJARA TV:12244:h:1:27500:127:137:1:107
+-SLO-TV1:12300:v:1:27495:200:201:1:3201
+-POLONIA 1:12302:v:1:27500:205:206:1:3203
+-SUPER 1:12302:v:1:27500:207:208:1:3207
+-NAPOLI INT.:12302:v:1:27500:240:241:1:3210
+-MAGIC:12302:v:1:27500:245:246:1:3211
+-COUNTDOWN:12302:v:1:27500:235:236:1:3212
+-TBNE:12302:v:1:27500:230:231:1:3213
+-NAPOLI CHANNEL:12302:v:1:27500:227:228:1:3215
+-KURDISTAN TV:12302:v:1:27500:225:226:1:3214
+-ATLAS TV:12379:v:1:27500:3022:3032:1:3002
+-TELE 24 SWITZERLAND:12379:v:1:27500:3023:3033:1:3003
+-Abu Dhabi TV:12379:v:1:27500:3024:3034:1:3004
+-RTV MONTENEGRO:12379:v:1:27500:3026:3036:1:3006
+-JAAM-E-JAM 1:12436:h:1:27500:160:80:1:1
+-JAAM-E-JAM 2:12436:h:1:27500:161:82:1:2
+-SAHAR:12436:h:1:27500:162:84:1:3
+-SAHAR 2:12436:h:1:27500:163:86:1:4
+-IRINN:12436:h:1:27500:164:88:1:5
+-Musicmax:11303:h:1:19540:500:501:1:6
+-TEST:12474:h:1:27500:771:8191:1:10608
+-EbS:12474:h:1:27500:101:201:1:10601
+-MOU.2:12474:h:1:27500:42:43:1:10602
+-PINK PLUS:12474:h:1:27500:308:256:1:10605
+-LibertyTV.com:12474:h:1:27500:941:942:1:10603
+-2M Maroc:12474:h:1:27500:601:602:1:10607
+-ZEE TV:12474:h:1:27500:910:911:1:10604
+-WorldNet Europe:12483:v:1:8299:4260:4220:1:1
+-WorldNet:12483:v:1:8299:4560:4520:1:4
+-SICILIA INTERNATIONA:12519:v:1:27499:501:502:1:8309
+-SARDEGNA UNO:12519:v:1:27499:503:504:1:8310
+-EuroMed:12519:v:1:27499:510:511:1:8312
+-TGRT:12519:v:1:27499:505:506:1:8313
+-VIDEOLINA:12519:v:1:27499:515:516:1:8318
+-MEDIOLANUM:12538:h:1:27500:1131:1132:1:8987
+-www.travel:12538:h:1:27500:1180:1183:1:8992
+-MonteCarloSat:12538:h:1:27500:5126:5122:1:8877
+-Bulgaria TV:12538:h:1:27500:4612:4613:1:8827
+-TVN1:12571:h:1:5631:4194:4195:1:1
+-JSTV 1:12595:v:1:27500:2000:2001:1:8213
+-JSTV 2:12595:v:1:27500:2011:2013:1:8214
+-MBC:12595:v:1:27500:160:80:1:8201
+-ANN:12595:v:1:27500:161:84:1:8202
+-BET:12595:v:1:27500:167:108:1:8208
+-EuroNews:12595:v:1:27500:2221:2231:1:8211
+-Sharjah        Arabs:12653:h:1:27500:1160:1120:1:1
+-Qatar          Arabs:12653:h:1:27500:1260:1220:1:2
+-Saudi 1        Arabs:12653:h:1:27500:1360:1320:1:3
+-Kuwait         Arabs:12653:h:1:27500:1460:1420:1:4
+-Libya          Arabs:12653:h:1:27500:1560:1520:1:5
+-Sudan          Arabs:12653:h:1:27500:1660:1620:1:6
+-Oman           Arabs:12653:h:1:27500:1760:1720:1:7
+-Jordan         Arabs:12653:h:1:27500:1860:1820:1:8
+-IRAQ TV:12653:h:1:27500:1960:1920:1:9
+-Dubai Sport:12653:h:1:27500:1060:1020:1:10
+-Digitaly:12672:v:1:27500:220:221:1:4203
+-Telemarket:12672:v:1:27500:350:351:1:4211
+-eVision:12672:v:1:27500:360:361:1:4214
+-Thai TV5:12672:v:1:27500:200:201:1:4201
+-Studio Europa:12672:v:1:27500:230:231:1:4204
+-Video  Italia:12672:v:1:27500:340:341:1:4210
+-GAME NETWORK:12672:v:1:27500:291:292:1:4213
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-australia dvb-apps/util/szap/channels.conf-dvbt-australia
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-australia      2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/szap/channels.conf-dvbt-australia    1970-01-01 01:00:00.000000000 +0100
+@@ -1,31 +0,0 @@
+-ABC HDTV:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:2307:0:560
+-ABC TV Melbourne:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:561
+-ABC TV 2:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:562
+-ABC TV 3:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:563
+-ABC TV 4:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:564
+-ABC DiG Radio:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:0:2311:566
+-TEN Digital:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1585
+-TEN Digital 1:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1586
+-TEN Digital 2:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1587
+-TEN Digital 3:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1588
+-TEN Digital:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1589
+-TEN Digital 4:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1590
+-TEN Digital:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1591
+-TEN HD:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:514:0:1592
+-TEN Digital:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1593
+-Nine Digital:191625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:513:660:1072
+-Nine Digital HD:191625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:0:1073
+-Nine Guide:191625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:514:670:1074
+-7 Digital:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:769:770:1328
+-7 Digital 1:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:769:770:1329
+-7 Digital 2:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:769:770:1330
+-7 Digital 3:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:769:770:1331
+-7 HD Digital:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:833:834:1332
+-7 Program Guide:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:865:866:1334
+-SBS HD:536500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:102:103:784
+-SBS DIGITAL 1:536500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:81:785
+-SBS DIGITAL 2:536500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:162:83:786
+-SBS EPG:536500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:163:85:787
+-SBS RADIO 1:536500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:201:798
+-SBS RADIO 2:536500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:202:799
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-berlin dvb-apps/util/szap/channels.conf-dvbt-berlin
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-berlin 2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/szap/channels.conf-dvbt-berlin       1970-01-01 01:00:00.000000000 +0100
+@@ -1,51 +0,0 @@
+-c5:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:82
+-c7:191500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:82
+-c25:506000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:82
+-c27:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:82
+-c33:570000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:82
+-c44:658000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:82
+-c56:754000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:82
+-c59:778000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:82
+-
+-SWR BW:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:257:258:16
+-WDR:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:241:242:15
+-BBC World:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:49:50:16387
+-FAB:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:3073:3074:16576
+-
+-MDR Fernsehen:191500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:101:102:1
+-arte:191500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:201:202:2
+-NDR Fernsehen:191500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_NONE:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:301:302:3
+-
+-RTL:506000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:337:338:16405
+-RTL2:506000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:353:354:16406
+-Super RTL:506000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:433:434:16411
+-VOX:506000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:545:546:16418
+-
+-Das Erste:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1401:1402:14
+-Phoenix:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1301:1302:13
+-RBB Berlin:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1201:1202:12
+-RBB Brandenburg:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:1101:1102:11
+-
+-ZDF:570000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:545:546:514
+-Info/3sat:570000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:561:562:515
+-Doku/KiKa:570000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:593:594:517
+-
+-Kabel 1:658000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:162:16394
+-N24:658000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:225:226:16398
+-ProSieben:658000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:305:306:16403
+-SAT.1:658000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:385:386:16408
+-
+-DSF:754000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:129:130:16392
+-Testkanal n-tv:754000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:273:274:16401
+-VIVA Plus:754000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:529:530:16417
+-Eurosport:754000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:577:578:16420
+-
+-Testkanal Eurosport:778000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:577:578:16420
+-SUD:778000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16642
+-HUMAX DOWNLOAD SVC:778000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16645
+-IP Services:778000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16640
+-Media Broadcast Services:778000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16641
+-SUD 1:778000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16643
+-Kathrein Download:778000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:0:16644
+-Testkanal MTV:778000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:193:194:16396
+-Testkanal n-tv:778000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:273:274:16401
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-collserola dvb-apps/util/szap/channels.conf-dvbt-collserola
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-collserola     2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/szap/channels.conf-dvbt-collserola   1970-01-01 01:00:00.000000000 +0100
+@@ -1,25 +0,0 @@
+-#channels.conf for DVB-T - Collserola (Barcelona) Transmitter
+-
+-#C43
+-TV3:650000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:111:112:801
+-K3/33:650000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:121:122:802
+-3/24:650000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:131:132:803
+-Canal Pilot:650000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:141:142:804
+-3XL.net:650000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:151:152:805
+-
+-#C61
+-TVE 1:794000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:101:103:1377
+-TVE 2:794000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:201:203:1441
+-ANTENA 3:794000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:301:303:1121
+-CANAL+:794000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:501:503:1057
+-TELECINCO:794000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:401:403:1185
+-
+-#C66
+-Veo TV:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:301:302:1536
+-Net TV:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:401:402:1825
+-Video Promocional 1:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:210:212:425
+-Video Promocional 2:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:110:0:420
+-[1388]:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:0:0:5000
+-[138c]:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:0:0:5004
+-[138a]:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:0:0:5002
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-crystal-palace dvb-apps/util/szap/channels.conf-dvbt-crystal-palace
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-crystal-palace 2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/szap/channels.conf-dvbt-crystal-palace       1970-01-01 01:00:00.000000000 +0100
+@@ -1,70 +0,0 @@
+-#channels.conf for DVB-T - Crystal Palace Transmitter
+-
+-# Multiplex 1 BBC - Channel 25, Offset -, Freq 505833333
+-BBCi:505833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0:4479
+-CBBC Channel:505833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0:4671
+-BBC ONE:505833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:600:601
+-BBC TWO:505833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:610:611
+-BBC THREE:505833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:620:621
+-BBC NEWS 24:505833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:640:641
+-
+-# Multiplex 2 Digital 3&4 - Channel 22, Offset -, Freq 481833333
+-Teletext:481833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0
+-FourText:481833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0
+-CHANNEL4:481833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2827:2828
+-ITV NEWS:481833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2850:2851
+-ITV 1:481833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:512:650
+-ITV 2:481833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2818:2819
+-Ch 14:481833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2840:2841
+-
+-#Multiplex A SDN - Channel 32, Offset -, Frequency 561833333
+-ntl:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0
+-Ch 15:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:660
+-BBC Radio 1:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:6210
+-BBC Radio 2:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:6226
+-BBC Radio 3:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:6242
+-BBC Radio 4:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:6258
+-QVC:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6049:6050
+-FIVE:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6017:6018
+-bid-up.tv:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6273:6274
+-TV Travel Shop:561833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6161:6161
+-
+-#Multiplex B BBC - Channel 28, Offset -, Frequency 529833333
+-#Community                (0x4e00) 01: PCR 0x1fff
+-#703                      (0x4c80) 01: PCR 0x1fff
+-BBC PARLMNT:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:403
+-BBC FOUR:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:401
+-701:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:204:411
+-702:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:203:407
+-CBeebies:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:401:402
+-BBC Asian Net:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:435
+-1Xtra BBC:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:434
+-BBC 7:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:433
+-BBC 6 Music:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:432
+-BBC 5L SportsX:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:431
+-BBC R5 Live:529833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:430
+-
+-# Multiplex C Crown Castle - Channel 34, Offset +, Frequency 578166666
+-UKHistory:578166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:401:402
+-Sky Travel:578166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:301:302
+-Sky Spts News:578166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:202
+-Sky News:578166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:101:102
+-
+-# Multiplex D Crown Castle - Channel 29, Offset -, Freq 537833333
+-#UKBrightIdeas            (0x64c0) 01: PCR 0x1fff
+-THE HITS:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:101:102
+-TMF:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:202
+-CBM:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:501:502
+-Free2Play:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0
+-Q:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1901
+-Magic:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1801
+-The Hits Radio:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1701
+-BBC World Sv:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1601
+-oneworld:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1501
+-jazz fm:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1401
+-Kerrang:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1301
+-Smash Hits:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1201
+-Kiss:537833333:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1101
+-
+-
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-hannington dvb-apps/util/szap/channels.conf-dvbt-hannington
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-hannington     2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/szap/channels.conf-dvbt-hannington   1970-01-01 01:00:00.000000000 +0100
+@@ -1,28 +0,0 @@
+-BBC One:706000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:600:601
+-BBC Two:706000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:610:611
+-CBBC:706000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:620:621
+-BBC Three:706000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:620:621
+-BBC News 24:706000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:640:641
+-CBeebies:674166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:401
+-BBC Four:674166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:401
+-BBC Parliament:674166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:403
+-701:674166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:203:407
+-702:674166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:204:411
+-703:674166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0
+-ITV 1:650166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:513:651
+-ITV 2:650166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2818:2819
+-Channel 4:650166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2822:2823
+-ITV News:650166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2822:2823
+-price-drop.tv:650166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2840:2841
+-Five:626166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6017:6018
+-QVC:626166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6059:6050
+-Tv Travel Shop:626166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6161:6162
+-Channel 15:626166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:660
+-bid-up.tv:626166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6273:6274
+-Sky News:658166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:101:102
+-Sky Sports News:658166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:202
+-Sky Travel:658166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:301:302
+-UK History:658166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:401:402
+-The Hits:634166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:101:102
+-TMF:634166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:202
+-UK Bright Ideas:634166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-madrid dvb-apps/util/szap/channels.conf-dvbt-madrid
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-madrid 2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/szap/channels.conf-dvbt-madrid       1970-01-01 01:00:00.000000000 +0100
+@@ -1,16 +0,0 @@
+-Veo TV:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:301:302:1536
+-Net TV:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:401:402:1825
+-[1388]:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:0:0:5000
+-[138c]:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:0:0:5004
+-[138a]:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:0:0:5002
+-Video Promocional:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:0:0:420
+-Informe Semanal:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:0:0:425
+-TVE 2:770000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:201:203:1441
+-ANTENA 3:770000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:301:303:1121
+-TELECINCO:770000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:401:403:1185
+-CANAL+:770000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:501:503:1057
+-TVE 1:770000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:101:103:1377
+-Telemadrid:810000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:111:113:421
+-La Otra:810000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:211:212:422
+-Quiero Madrid:810000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:411:412:424
+-Onda 6:810000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:311:312:423
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-oxford dvb-apps/util/szap/channels.conf-dvbt-oxford
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-oxford 2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/szap/channels.conf-dvbt-oxford       1970-01-01 01:00:00.000000000 +0100
+@@ -1,41 +0,0 @@
+-BBC-Choice:578000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:620:621
+-BBC-Knowledge:578000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:630:631
+-BBC-News24:578000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:640:641
+-BBC-1:578000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:600:601
+-BBC-Parliament:578000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:660
+-BBC-2:578000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:610:611
+-ITV-1:850000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:513:651
+-ITV-2:850000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2818:2819
+-ITV-Sport:850000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2836:2837
+-FilmFour:850000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2822:2823
+-C4:850000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2826:2827
+-E4:850000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2831:2832
+-C5:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6017:6018
+-Shop:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6049:6050
+-ITVSelect-Info:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6065:6066
+-ITVSelect-1:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6081:6082
+-ITVSelect-2:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6097:6098
+-ITVSelect-3:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6113:6114
+-ITVSelect-4:713833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6129:6130
+-Carlton-Cinema:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:288:289
+-Sky-One:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:544:545
+-Sky-Sports-1:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:800:801
+-Sky-Premier:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:1056:1057
+-CartoonNetwork:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:1312:1313
+-UK-Horizons:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2336:2337
+-ITV-Sport-Plus:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2592:2593
+-ITVSportSelect:721833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:2596
+-BreezeMen&Mtrs:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:800:801
+-Granada-Plus:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:544:545
+-MTV:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:1568:1569
+-Sky-Movie-Max:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:1312:1313
+-Sky-Sports-2:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2080:2081
+-UK-Gold:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:288:289
+-Wellbeing:690000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:1824:1825
+-PLAY-uk:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:288:289
+-UK-Style:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:544:545
+-no-name:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:800:801
+-Discovery:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:1312:1313
+-Nick/Paramount:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2080:2081
+-Sky-Sports-3:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2336:2337
+-Brit-Eurosport:538000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2592:2593
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-reigate dvb-apps/util/szap/channels.conf-dvbt-reigate
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-reigate        2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/szap/channels.conf-dvbt-reigate      1970-01-01 01:00:00.000000000 +0100
+@@ -1,51 +0,0 @@
+-BBC ONE:554000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:600:601
+-BBC TWO:554000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:610:611
+-ITV 1:474000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:512:650
+-Channel 4:474000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2827:2828
+-five:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6017:6018
+-ITV 2:474000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2818:2819
+-BBC THREE:554000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0
+-Teletext:474000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0
+-BBC FOUR:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0
+-Sky Travel:618166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:301:302
+-UKHistory:618166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:401:402
+-Ch 14:474000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2840:2841
+-Ch 15:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:660
+-QVC:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6049:6050
+-TV Travel Shop:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6161:6162
+-The HITS:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:101:102
+-UKBrightIdeas:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:301:302
+-f tn:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0
+-TMF:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:202
+-bid-up.tv:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6273:6274
+-CBM:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:501:502
+-CBBC Channel:554000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:620:621
+-CBeebies:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:401
+-BBC NEWS 24:554000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:640:641
+-ITV News:474000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2850:2851
+-Sky News:618166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:101:102
+-Sky Spts News:618166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:202
+-BBC PARLMNT:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:403
+-Community:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0
+-FourText:474000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0
+-BBCi:554000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0
+-ntl:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0
+-BBC Radio 1:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:6210
+-1Xtra BBC:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:434
+-BBC Radio 2:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:6226
+-BBC Radio 3:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:6242
+-BBC Radio 4:498000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_1_2:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:6258
+-BBC R5 Live:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:430
+-BBC 5L SportsX:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:431
+-BBC 6 Music:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:432
+-BBC 7:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:433
+-BBC Asian Net.:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:435
+-BBC World Sv.:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1601
+-Smash Hits!:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1201
+-Kiss:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1101
+-Kerrang!:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1301
+-jazz fm:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1401
+-oneword:834000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:1501
+-701:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:203:407
+-702:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:204:411
+-703:522000000:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:0
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-sandy_heath dvb-apps/util/szap/channels.conf-dvbt-sandy_heath
+--- linuxtv-dvb-apps-1.1.1/util/szap/channels.conf-dvbt-sandy_heath    2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/szap/channels.conf-dvbt-sandy_heath  1970-01-01 01:00:00.000000000 +0100
+@@ -1,13 +0,0 @@
+-BBC-Choice:641833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:620:621
+-BBC-Knowledge:641833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:630:631
+-BBC-News24:641833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:640:641
+-BBC-1:641833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:600:601
+-BBC-Parliament:641833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:0:660
+-BBC-2:641833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:610:611
+-ITV-1:665833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:513:651
+-ITV-2:665833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2819:2820
+-C4:665833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2823:2824
+-E4:665833334:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:2831:2832
+-C5:650166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6017:6018
+-Shop:650166666:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:6049:6050
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/czap.c dvb-apps/util/szap/czap.c
+--- linuxtv-dvb-apps-1.1.1/util/szap/czap.c    2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/szap/czap.c  2009-06-21 13:29:06.000000000 +0200
+@@ -16,8 +16,9 @@
+ static char FRONTEND_DEV [80];
+ static char DEMUX_DEV [80];
++static int exit_after_tuning;
+-#define CHANNEL_FILE "/.czap/channels.conf"
++#define CHANNEL_FILE "channels.conf"
+ #define ERROR(x...)                                                   \
+       do {                                                            \
+@@ -71,14 +72,17 @@
+ static
+-int parse_param(const char *val, const Param * plist, int list_size)
++int parse_param(const char *val, const Param * plist, int list_size, int *ok)
+ {
+       int i;
+       for (i = 0; i < list_size; i++) {
+-              if (strcasecmp(plist[i].name, val) == 0)
++              if (strcasecmp(plist[i].name, val) == 0) {
++                      *ok = 1;
+                       return plist[i].value;
++              }
+       }
++      *ok = 0;
+       return -1;
+ }
+@@ -119,6 +123,7 @@
+       FILE *f;
+       char *chan;
+       char *name, *inv, *fec, *mod;
++      int ok;
+       if ((f = fopen(fname, "r")) == NULL) {
+               PERROR("could not open file '%s'", fname);
+@@ -144,19 +149,19 @@
+               ERROR("cannot parse service data");
+               return -3;
+       }
+-      frontend->inversion = parse_param(inv, inversion_list, LIST_SIZE(inversion_list));
+-      if (frontend->inversion < 0) {
++      frontend->inversion = parse_param(inv, inversion_list, LIST_SIZE(inversion_list), &ok);
++      if (!ok) {
+               ERROR("inversion field syntax '%s'", inv);
+               return -4;
+       }
+-      frontend->u.qam.fec_inner = parse_param(fec, fec_list, LIST_SIZE(fec_list));
+-      if (frontend->u.qam.fec_inner < 0) {
++      frontend->u.qam.fec_inner = parse_param(fec, fec_list, LIST_SIZE(fec_list), &ok);
++      if (!ok) {
+               ERROR("FEC field syntax '%s'", fec);
+               return -5;
+       }
+       frontend->u.qam.modulation = parse_param(mod, modulation_list,
+-                      LIST_SIZE(modulation_list));
+-      if (frontend->u.qam.modulation < 0) {
++                      LIST_SIZE(modulation_list), &ok);
++      if (!ok) {
+               ERROR("modulation field syntax '%s'", mod);
+               return -6;
+       }
+@@ -223,7 +228,7 @@
+ static
+-int check_frontend (int fe_fd)
++int check_frontend (int fe_fd, int human_readable)
+ {
+       fe_status_t status;
+       uint16_t snr, signal;
+@@ -236,9 +241,13 @@
+               ioctl(fe_fd, FE_READ_BER, &ber);
+               ioctl(fe_fd, FE_READ_UNCORRECTED_BLOCKS, &uncorrected_blocks);
+-              printf ("status %02x | signal %04x | snr %04x | "
+-                      "ber %08x | unc %08x | ",
+-                      status, signal, snr, ber, uncorrected_blocks);
++              if (human_readable) {
++                      printf ("status %02x | signal %3u%% | snr %3u%% | ber %d | unc %d | ",
++                              status, (signal * 100) / 0xffff, (snr * 100) / 0xffff, ber, uncorrected_blocks);
++              } else {
++                      printf ("status %02x | signal %04x | snr %04x | ber %08x | unc %08x | ",
++                              status, signal, snr, ber, uncorrected_blocks);
++              }
+               if (status & FE_HAS_LOCK)
+                       printf("FE_HAS_LOCK");
+@@ -246,13 +255,16 @@
+               usleep(1000000);
+               printf("\n");
++
++              if (exit_after_tuning && (status & FE_HAS_LOCK))
++                      break;
+       } while (1);
+       return 0;
+ }
+-static const char *usage = "\nusage: %s [-a adapter_num] [-f frontend_id] [-d demux_id] [-c conf_file] {<channel name>| -n channel_num}\n"
++static const char *usage = "\nusage: %s [-a adapter_num] [-f frontend_id] [-d demux_id] [-c conf_file] [ -H ] {<channel name>| -n channel_num} [-x]\n"
+       "   or: %s [-c conf_file]  -l\n\n";
+@@ -266,66 +278,78 @@
+       int vpid, apid;
+       int frontend_fd, video_fd, audio_fd;
+       int opt, list_channels = 0, chan_no = 0;
++      int human_readable = 0;
+-        while ((opt = getopt(argc, argv, "ln:hrn:a:f:d:c:")) != -1) {
+-                switch (opt) {
+-                case 'a':
+-                        adapter = strtoul(optarg, NULL, 0);
+-                        break;
+-                case 'f':
+-                        frontend = strtoul(optarg, NULL, 0);
+-                        break;
+-                case 'd':
+-                        demux = strtoul(optarg, NULL, 0);
+-                        break;
+-                case 'r':
+-                        dvr = 1;
+-                        break;
+-                case 'l':
+-                        list_channels = 1;
+-                        break;
+-                case 'n':
+-                        chan_no = strtoul(optarg, NULL, 0);
+-                        break;
+-                case 'c':
+-                        confname = optarg;
+-                        break;
+-                case '?':
+-                case 'h':
+-                default:
+-                        fprintf (stderr, usage, argv[0], argv[0]);
+-                        return -1;
+-                };
+-        }
+-      
+-        if (optind < argc)
+-                channel = argv[optind];
++      while ((opt = getopt(argc, argv, "Hln:hrn:a:f:d:c:x")) != -1) {
++              switch (opt) {
++              case 'a':
++                      adapter = strtoul(optarg, NULL, 0);
++                      break;
++              case 'f':
++                      frontend = strtoul(optarg, NULL, 0);
++                      break;
++              case 'd':
++                      demux = strtoul(optarg, NULL, 0);
++                      break;
++              case 'r':
++                      dvr = 1;
++                      break;
++              case 'l':
++                      list_channels = 1;
++                      break;
++              case 'n':
++                      chan_no = strtoul(optarg, NULL, 0);
++                      break;
++              case 'x':
++                      exit_after_tuning = 1;
++                      break;
++              case 'H':
++                      human_readable = 1;
++                      break;
++              case 'c':
++                      confname = optarg;
++                      break;
++              case '?':
++              case 'h':
++              default:
++                      fprintf (stderr, usage, argv[0], argv[0]);
++                      return -1;
++              };
++      }
+-        if (!channel && chan_no <= 0 && !list_channels) {
+-                fprintf (stderr, usage, argv[0], argv[0]);
+-                return -1;
+-        }
++      if (optind < argc)
++              channel = argv[optind];
++
++      if (!channel && chan_no <= 0 && !list_channels) {
++              fprintf (stderr, usage, argv[0], argv[0]);
++              return -1;
++      }
+       if (!homedir)
+               ERROR("$HOME not set");
+-        snprintf (FRONTEND_DEV, sizeof(FRONTEND_DEV),
+-                  "/dev/dvb/adapter%i/frontend%i", adapter, frontend);
++      snprintf (FRONTEND_DEV, sizeof(FRONTEND_DEV),
++                "/dev/dvb/adapter%i/frontend%i", adapter, frontend);
+-        snprintf (DEMUX_DEV, sizeof(DEMUX_DEV),
+-                  "/dev/dvb/adapter%i/demux%i", adapter, demux);
++      snprintf (DEMUX_DEV, sizeof(DEMUX_DEV),
++                "/dev/dvb/adapter%i/demux%i", adapter, demux);
+       printf ("using '%s' and '%s'\n", FRONTEND_DEV, DEMUX_DEV);
+       if (!confname)
+       {
++              int len = strlen(homedir) + strlen(CHANNEL_FILE) + 18;
+               if (!homedir)
+                       ERROR("$HOME not set");
+-              confname = malloc(strlen(homedir) + strlen(CHANNEL_FILE) + 1);
+-              memcpy(confname, homedir, strlen(homedir));
+-              memcpy(confname + strlen(homedir), CHANNEL_FILE,
+-                     strlen(CHANNEL_FILE) + 1);
++              confname = malloc(len);
++              snprintf(confname, len, "%s/.czap/%i/%s",
++                       homedir, adapter, CHANNEL_FILE);
++              if (access(confname, R_OK))
++                      snprintf(confname, len, "%s/.czap/%s",
++                               homedir, CHANNEL_FILE);
+       }
++      printf("reading channels from file '%s'\n", confname);
++
+       memset(&frontend_param, 0, sizeof(struct dvb_frontend_parameters));
+       if (parse(confname, list_channels, chan_no, channel, &frontend_param, &vpid, &apid))
+@@ -357,7 +381,7 @@
+       if (set_pesfilter (audio_fd, apid, DMX_PES_AUDIO, dvr) < 0)
+               return -1;
+-      check_frontend (frontend_fd);
++      check_frontend (frontend_fd, human_readable);
+       close (audio_fd);
+       close (video_fd);
+@@ -365,4 +389,3 @@
+       return 0;
+ }
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/femon.c dvb-apps/util/szap/femon.c
+--- linuxtv-dvb-apps-1.1.1/util/szap/femon.c   2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/szap/femon.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,149 +0,0 @@
+-/* femon -- monitor frontend status
+- *
+- * Copyright (C) 2003 convergence GmbH
+- * Johannes Stezenbach <js@convergence.de>
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+- */
+-
+-
+-#include <stdio.h>
+-#include <stdlib.h>
+-#include <limits.h>
+-#include <string.h>
+-#include <errno.h>
+-#include <sys/ioctl.h>
+-#include <sys/types.h>
+-#include <sys/stat.h>
+-#include <sys/poll.h>
+-#include <fcntl.h>
+-#include <time.h>
+-#include <unistd.h>
+-
+-#include <stdint.h>
+-#include <sys/time.h>
+-
+-#include <linux/dvb/frontend.h>
+-
+-#ifndef TRUE
+-#define TRUE (1==1)
+-#endif
+-#ifndef FALSE
+-#define FALSE (1==0)
+-#endif
+-
+-
+-#define FRONTENDDEVICE "/dev/dvb/adapter%d/frontend%d"
+-
+-static char *usage_str =
+-    "\nusage: femon [options]\n"
+-    "     -a number : use given adapter (default 0)\n"
+-    "     -f number : use given frontend (default 0)\n\n";
+-
+-
+-static void usage(void)
+-{
+-   fprintf(stderr, usage_str);
+-   exit(1);
+-}
+-
+-
+-static
+-int check_frontend (int fe_fd)
+-{
+-   fe_status_t status;
+-   uint16_t snr, signal;
+-   uint32_t ber, uncorrected_blocks;
+-
+-   do {
+-      ioctl(fe_fd, FE_READ_STATUS, &status);
+-      ioctl(fe_fd, FE_READ_SIGNAL_STRENGTH, &signal);
+-      ioctl(fe_fd, FE_READ_SNR, &snr);
+-      ioctl(fe_fd, FE_READ_BER, &ber);
+-      ioctl(fe_fd, FE_READ_UNCORRECTED_BLOCKS, &uncorrected_blocks);
+-
+-      printf ("status %02x | signal %04x | snr %04x | ber %08x | unc %08x | ",
+-            status, signal, snr, ber, uncorrected_blocks);
+-
+-      if (status & FE_HAS_LOCK)
+-       printf("FE_HAS_LOCK");
+-
+-      printf("\n");
+-      usleep(1000000);
+-   } while (1);
+-
+-   return 0;
+-}
+-
+-
+-static
+-int do_mon(unsigned int adapter, unsigned int frontend)
+-{
+-   char fedev[128];
+-   int fefd;
+-   int result;
+-   struct dvb_frontend_info fe_info;
+-
+-   snprintf(fedev, sizeof(fedev), FRONTENDDEVICE, adapter, frontend);
+-   printf("using '%s'\n", fedev);
+-
+-   if ((fefd = open(fedev, O_RDONLY | O_NONBLOCK)) < 0) {
+-      perror("opening frontend failed");
+-      return FALSE;
+-   }
+-
+-   result = ioctl(fefd, FE_GET_INFO, &fe_info);
+-
+-   if (result < 0) {
+-      perror("ioctl FE_GET_INFO failed");
+-      close(fefd);
+-      return FALSE;
+-   }
+-
+-   printf("FE: %s (%s)\n", fe_info.name, fe_info.type == FE_QPSK ? "SAT" :
+-                 fe_info.type == FE_QAM ? "CABLE": "TERRESTRIAL");
+-
+-   check_frontend (fefd);
+-
+-   close(fefd);
+-
+-   return result;
+-}
+-
+-int main(int argc, char *argv[])
+-{
+-   unsigned int adapter = 0, frontend = 0;
+-   int opt;
+-
+-   while ((opt = getopt(argc, argv, "hlrn:a:f:d:")) != -1) {
+-      switch (opt)
+-      {
+-       case '?':
+-       case 'h':
+-       default:
+-          usage();
+-       case 'a':
+-          adapter = strtoul(optarg, NULL, 0);
+-          break;
+-       case 'f':
+-          frontend = strtoul(optarg, NULL, 0);
+-      }
+-   }
+-
+-   do_mon(adapter, frontend);
+-
+-   return FALSE;
+-}
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/lnb.c dvb-apps/util/szap/lnb.c
+--- linuxtv-dvb-apps-1.1.1/util/szap/lnb.c     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/szap/lnb.c   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,101 @@
++#include <stdlib.h>
++#include <string.h>
++#include <ctype.h>
++#include "lnb.h"
++
++static char *univ_desc[] = {
++              "Europe",
++              "10800 to 11800 MHz and 11600 to 12700 Mhz",
++              "Dual LO, loband 9750, hiband 10600 MHz",
++              (char *)NULL };
++
++static char *dbs_desc[] = {
++              "Expressvu, North America",
++              "12200 to 12700 MHz",
++              "Single LO, 11250 MHz",
++              (char *)NULL };
++
++static char *standard_desc[] = {
++              "10945 to 11450 Mhz",
++              "Single LO, 10000 Mhz",
++              (char *)NULL };
++
++static char *enhan_desc[] = {
++              "Astra",
++              "10700 to 11700 MHz",
++              "Single LO, 9750 MHz",
++              (char *)NULL };
++
++static char *cband_desc[] = {
++              "Big Dish",
++              "3700 to 4200 MHz",
++              "Single LO, 5150 Mhz",
++              (char *)NULL };
++
++static struct lnb_types_st lnbs[] = {
++      {"UNIVERSAL",   univ_desc,              9750, 10600, 11700 },
++      {"DBS",         dbs_desc,               11250, 0, 0 },
++      {"STANDARD",    standard_desc,          10000, 0, 0 },
++      {"ENHANCED",    enhan_desc,             9750, 0, 0 },
++      {"C-BAND",      cband_desc,             5150, 0, 0 }
++};
++
++/* Enumerate through standard types of LNB's until NULL returned.
++ * Increment curno each time
++ */
++
++struct lnb_types_st *
++lnb_enum(int curno)
++{
++      if (curno >= (int) (sizeof(lnbs) / sizeof(lnbs[0])))
++              return (struct lnb_types_st *)NULL;
++      return &lnbs[curno];
++}
++
++/* Decode an lnb type, for example given on a command line
++ * If alpha and standard type, e.g. "Universal" then match that
++ * otherwise low[,high[,switch]]
++ */
++
++int
++lnb_decode(char *str, struct lnb_types_st *lnbp)
++{
++int i;
++char *cp, *np;
++
++      memset(lnbp, 0, sizeof(*lnbp));
++      cp = str;
++      while(*cp && isspace(*cp))
++              cp++;
++      if (isalpha(*cp)) {
++              for (i = 0; i < (int)(sizeof(lnbs) / sizeof(lnbs[0])); i++) {
++                      if (!strcasecmp(lnbs[i].name, cp)) {
++                              *lnbp = lnbs[i];
++                              return 1;
++                      }
++              }
++              return -1;
++      }
++      if (*cp == '\0' || !isdigit(*cp))
++              return -1;
++      lnbp->low_val = strtoul(cp, &np, 0);
++      if (lnbp->low_val == 0)
++              return -1;
++      cp = np;
++      while(*cp && (isspace(*cp) || *cp == ','))
++              cp++;
++      if (*cp == '\0')
++              return 1;
++      if (!isdigit(*cp))
++              return -1;
++      lnbp->high_val = strtoul(cp, &np, 0);
++      cp = np;
++      while(*cp && (isspace(*cp) || *cp == ','))
++              cp++;
++      if (*cp == '\0')
++              return 1;
++      if (!isdigit(*cp))
++              return -1;
++      lnbp->switch_val = strtoul(cp, NULL, 0);
++      return 1;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/lnb.h dvb-apps/util/szap/lnb.h
+--- linuxtv-dvb-apps-1.1.1/util/szap/lnb.h     1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/szap/lnb.h   2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,22 @@
++struct lnb_types_st {
++      char    *name;
++      char    **desc;
++      unsigned long   low_val;
++      unsigned long   high_val;       /* zero indicates no hiband */
++      unsigned long   switch_val;     /* zero indicates no hiband */
++};
++
++/* Enumerate through standard types of LNB's until NULL returned.
++ * Increment curno each time
++ */
++
++struct lnb_types_st *
++lnb_enum(int curno);
++
++/* Decode an lnb type, for example given on a command line
++ * If alpha and standard type, e.g. "Universal" then match that
++ * otherwise low[,high[,switch]]
++ */
++
++int
++lnb_decode(char *str, struct lnb_types_st *lnbp);
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/Makefile dvb-apps/util/szap/Makefile
+--- linuxtv-dvb-apps-1.1.1/util/szap/Makefile  2006-05-18 01:31:54.000000000 +0200
++++ dvb-apps/util/szap/Makefile        2009-06-21 13:29:06.000000000 +0200
+@@ -1,35 +1,18 @@
+-CC = gcc
+-CFLAGS = -MD -Wall -g -O2 -I../../include -I../lib
+-LFLAGS = -Wall -g -O2
+-RM = rm -f
+-
+-TARGETS = szap tzap czap azap femon
+-OBJS = szap.o tzap.o czap.o azap.o femon.o
++# Makefile for linuxtv.org dvb-apps/util/szap
+-all: $(OBJS) $(TARGETS)
+-      @echo
+-      @echo "--------------------------------------------------------------------------------"
+-      @echo " please copy an appropriate channels.conf-XXX channel list for DVB-S/C/T"
+-      @echo
+-      @echo "   to ~/.szap/channels.conf"
+-      @echo "      ~/.czap/channels.conf"
+-      @echo "      ~/.tzap/channels.conf"
+-      @echo
+-      @echo " and then call ./szap for DVB-S, ./czap for DVB-C or ./tzap for DVB-T"
+-      @echo "--------------------------------------------------------------------------------"
+-      @echo
++objects  = lnb.o
+-szap: szap.o ../lib/lnb.o
+-      $(CC) $(LFLAGS) -o szap szap.o ../lib/lnb.o
++binaries = azap  \
++           czap  \
++           szap  \
++           tzap
+-.c.o:
+-      $(CC) $(CFLAGS) -o $@ -c $<
++inst_bin = $(binaries)
+-.o:
+-      $(CC) $(LFLAGS) -o $@ $<
++.PHONY: all
+-clean:
+-      $(RM) $(TARGETS) core* *.o *.d .depend
++all: $(binaries)
+--include $(wildcard *.d) dummy
++$(binaries): $(objects)
++include ../../Make.rules
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/README dvb-apps/util/szap/README
+--- linuxtv-dvb-apps-1.1.1/util/szap/README    2004-01-25 20:23:39.000000000 +0100
++++ dvb-apps/util/szap/README  2009-06-21 13:29:06.000000000 +0200
+@@ -5,23 +5,29 @@
+ For DVB-S, Astra Channel config file:
+-$ ./szap -c channels.conf-dvbs-astra n24
++$ ./szap -c channels-conf/dvb-s/Astra-19.2E n24
+ will tune to N24. For DVB-C, Berlin Cable channel config:
+-$ ./czap -c channels.conf-dvbc-berlin Arte
++$ ./czap -c channels-conf/dvb-c/de-Berlin Arte
+ For DVB-T, Berlin Config:
+-$ ./czap -c channels.conf-dvbt-berlin phoenix
++$ ./tzap -c channels-conf/dvb-t/de-Berlin phoenix
+-By default the MPEG stream is routed to a hardware decoder. If you want to 
+-record the stream to disk you will route it to the DVR device by using the 
++For ATSC, Raleigh Durham Config:
++
++$ ./azap -c channels-conf/atsc/us-Raleigh-Durham WRAL
++
++will tune to WRAL's Digital Channel 5-1.
++
++By default the MPEG stream is routed to a hardware decoder. If you want to
++record the stream to disk you will route it to the DVR device by using the
+ '-r' option:
+-$ ./czap -c channels.conf-dvbt-berlin phoenix -r
++$ ./tzap -c channels-conf/dvb-t/de-Berlin phoenix -r
+ [keep it running in one console]
+-$ cat /dev/dvr/adapter0/dvr0 > /tmp/recording.ts
++$ cat /dev/dvb/adapter0/dvr0 > /tmp/recording.ts
+ [in a second console, will dump the MPEG transport stream to /tmp/recording.ts]
+ The status messages have the following meaning:
+@@ -38,10 +44,9 @@
+ unc [0...0xffffffff]     --- Number of Uncorrectable Blocks.
+                            Small numbers are Preferable.
+-If everything is alright and all frontend circuits are working stable 
++If everything is alright and all frontend circuits are working stable
+ (are locked) you should see a FE_HAS_LOCK in the rightmost line.
+ Good luck,
+ Holger
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/szap.c dvb-apps/util/szap/szap.c
+--- linuxtv-dvb-apps-1.1.1/util/szap/szap.c    2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/szap/szap.c  2009-06-21 13:29:06.000000000 +0200
+@@ -36,6 +36,7 @@
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ #include <sys/poll.h>
++#include <sys/param.h>
+ #include <fcntl.h>
+ #include <time.h>
+ #include <unistd.h>
+@@ -45,6 +46,7 @@
+ #include <linux/dvb/frontend.h>
+ #include <linux/dvb/dmx.h>
++#include <linux/dvb/audio.h>
+ #include "lnb.h"
+ #ifndef TRUE
+@@ -64,6 +66,7 @@
+ #define FRONTENDDEVICE "/dev/dvb/adapter%d/frontend%d"
+ #define DEMUXDEVICE "/dev/dvb/adapter%d/demux%d"
++#define AUDIODEVICE "/dev/dvb/adapter%d/audio%d"
+ static struct lnb_types_st lnb_type;
+@@ -79,18 +82,21 @@
+     "     -f number : use given frontend (default 0)\n"
+     "     -d number : use given demux (default 0)\n"
+     "     -c file   : read channels list from 'file'\n"
++    "     -b        : enable Audio Bypass (default no)\n"
+     "     -x        : exit after tuning\n"
++    "     -H        : human readable output\n"
+     "     -r        : set up /dev/dvb/adapterX/dvr0 for TS recording\n"
+     "     -l lnb-type (DVB-S Only) (use -l help to print types) or \n"
+     "     -l low[,high[,switch]] in Mhz\n"
+     "     -i        : run interactively, allowing you to type in channel names\n"
++    "     -p        : add pat and pmt to TS recording (implies -r)\n"
+     "                 or -n numbers for zapping\n";
+-static int set_demux(int dmxfd, int pid, int audio, int dvr)
++static int set_demux(int dmxfd, int pid, int pes_type, int dvr)
+ {
+    struct dmx_pes_filter_params pesfilter;
+-   if (pid <= 0 || pid >= 0x1fff) /* ignore this pid to allow radio services */
++   if (pid < 0 || pid >= 0x1fff) /* ignore this pid to allow radio services */
+          return TRUE;
+    if (dvr) {
+@@ -102,7 +108,7 @@
+    pesfilter.pid = pid;
+    pesfilter.input = DMX_IN_FRONTEND;
+    pesfilter.output = dvr ? DMX_OUT_TS_TAP : DMX_OUT_DECODER;
+-   pesfilter.pes_type = audio ? DMX_PES_AUDIO : DMX_PES_VIDEO;
++   pesfilter.pes_type = pes_type;
+    pesfilter.flags = DMX_IMMEDIATE_START;
+    if (ioctl(dmxfd, DMX_SET_PES_FILTER, &pesfilter) == -1) {
+@@ -114,6 +120,65 @@
+    return TRUE;
+ }
++int get_pmt_pid(char *dmxdev, int sid)
++{
++   int patfd, count;
++   int pmt_pid = 0;
++   int patread = 0;
++   int section_length;
++   unsigned char buft[4096];
++   unsigned char *buf = buft;
++   struct dmx_sct_filter_params f;
++
++   memset(&f, 0, sizeof(f));
++   f.pid = 0;
++   f.filter.filter[0] = 0x00;
++   f.filter.mask[0] = 0xff;
++   f.timeout = 0;
++   f.flags = DMX_IMMEDIATE_START | DMX_CHECK_CRC;
++
++   if ((patfd = open(dmxdev, O_RDWR)) < 0) {
++      perror("openening pat demux failed");
++      return -1;
++   }
++
++   if (ioctl(patfd, DMX_SET_FILTER, &f) == -1) {
++      perror("ioctl DMX_SET_FILTER failed");
++      close(patfd);
++      return -1;
++   }
++
++   while (!patread){
++      if (((count = read(patfd, buf, sizeof(buft))) < 0) && errno == EOVERFLOW)
++         count = read(patfd, buf, sizeof(buft));
++      if (count < 0) {
++         perror("read_sections: read error");
++         close(patfd);
++         return -1;
++      }
++
++      section_length = ((buf[1] & 0x0f) << 8) | buf[2];
++      if (count != section_length + 3)
++         continue;
++
++      buf += 8;
++      section_length -= 8;
++
++      patread = 1; /* assumes one section contains the whole pat */
++      while (section_length > 0) {
++         int service_id = (buf[0] << 8) | buf[1];
++         if (service_id == sid) {
++            pmt_pid = ((buf[2] & 0x1f) << 8) | buf[3];
++            section_length = 0;
++         }
++         buf += 4;
++         section_length -= 4;
++     }
++   }
++
++   close(patfd);
++   return pmt_pid;
++}
+ struct diseqc_cmd {
+    struct dvb_diseqc_master_cmd cmd;
+@@ -151,14 +216,14 @@
+        { {{0xe0, 0x10, 0x38, 0xf0, 0x00, 0x00}, 4}, 0 };
+    /* param: high nibble: reset bits, low nibble set bits,
+-    * bits are: option, position, polarizaion, band
++    * bits are: option, position, polarization, band
+     */
+    cmd.cmd.msg[3] =
+        0xf0 | (((sat_no * 4) & 0x0f) | (hi_band ? 1 : 0) | (pol_vert ? 0 : 2));
+    diseqc_send_msg(secfd, pol_vert ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18,
+                  &cmd, hi_band ? SEC_TONE_ON : SEC_TONE_OFF,
+-                 (sat_no / 4) % 2 ? SEC_MINI_B : SEC_MINI_A);
++                 sat_no % 2 ? SEC_MINI_B : SEC_MINI_A);
+    return TRUE;
+ }
+@@ -189,8 +254,9 @@
+ static
+-int check_frontend (int fe_fd, int dvr)
++int check_frontend (int fe_fd, int dvr, int human_readable)
+ {
++   (void)dvr;
+    fe_status_t status;
+    uint16_t snr, signal;
+    uint32_t ber, uncorrected_blocks;
+@@ -210,8 +276,13 @@
+       if (ioctl(fe_fd, FE_READ_UNCORRECTED_BLOCKS, &uncorrected_blocks) == -1)
+          uncorrected_blocks = -2;
+-      printf ("status %02x | signal %04x | snr %04x | ber %08x | unc %08x | ",
+-            status, signal, snr, ber, uncorrected_blocks);
++      if (human_readable) {
++              printf ("status %02x | signal %3u%% | snr %3u%% | ber %d | unc %d | ",
++                      status, (signal * 100) / 0xffff, (snr * 100) / 0xffff, ber, uncorrected_blocks);
++      } else {
++              printf ("status %02x | signal %04x | snr %04x | ber %08x | unc %08x | ",
++                      status, signal, snr, ber, uncorrected_blocks);
++      }
+       if (status & FE_HAS_LOCK)
+        printf("FE_HAS_LOCK");
+@@ -230,10 +301,12 @@
+ static
+ int zap_to(unsigned int adapter, unsigned int frontend, unsigned int demux,
+       unsigned int sat_no, unsigned int freq, unsigned int pol,
+-      unsigned int sr, unsigned int vpid, unsigned int apid, int dvr)
++      unsigned int sr, unsigned int vpid, unsigned int apid, int sid,
++      int dvr, int rec_psi, int bypass, int human_readable)
+ {
+-   char fedev[128], dmxdev[128];
+-   static int fefd, videofd, audiofd;
++   char fedev[128], dmxdev[128], auddev[128];
++   static int fefd, dmxfda, dmxfdv, audiofd = -1, patfd, pmtfd;
++   int pmtpid;
+    uint32_t ifreq;
+    int hiband, result;
+    static struct dvb_frontend_info fe_info;
+@@ -241,6 +314,7 @@
+    if (!fefd) {
+       snprintf(fedev, sizeof(fedev), FRONTENDDEVICE, adapter, frontend);
+       snprintf(dmxdev, sizeof(dmxdev), DEMUXDEVICE, adapter, demux);
++      snprintf(auddev, sizeof(auddev), AUDIODEVICE, adapter, demux);
+       printf("using '%s' and '%s'\n", fedev, dmxdev);
+       if ((fefd = open(fedev, O_RDWR | O_NONBLOCK)) < 0) {
+@@ -262,18 +336,41 @@
+        return FALSE;
+       }
+-      if ((videofd = open(dmxdev, O_RDWR)) < 0) {
++      if ((dmxfdv = open(dmxdev, O_RDWR)) < 0) {
+        perror("opening video demux failed");
+        close(fefd);
+        return FALSE;
+       }
+-      if ((audiofd = open(dmxdev, O_RDWR)) < 0) {
++      if ((dmxfda = open(dmxdev, O_RDWR)) < 0) {
+        perror("opening audio demux failed");
+-       close(videofd);
+        close(fefd);
+        return FALSE;
+       }
++
++      if (dvr == 0)   /* DMX_OUT_DECODER */
++       audiofd = open(auddev, O_RDWR);
++
++      if (rec_psi){
++         if ((patfd = open(dmxdev, O_RDWR)) < 0) {
++          perror("opening pat demux failed");
++          close(audiofd);
++          close(dmxfda);
++          close(dmxfdv);
++          close(fefd);
++          return FALSE;
++         }
++
++         if ((pmtfd = open(dmxdev, O_RDWR)) < 0) {
++          perror("opening pmt demux failed");
++          close(patfd);
++          close(audiofd);
++          close(dmxfda);
++          close(dmxfdv);
++          close(fefd);
++          return FALSE;
++         }
++      }
+    }
+    hiband = 0;
+@@ -293,15 +390,36 @@
+    if (diseqc(fefd, sat_no, pol, hiband))
+       if (do_tune(fefd, ifreq, sr))
+-       if (set_demux(videofd, vpid, 0, dvr))
+-          if (set_demux(audiofd, apid, 1, dvr))
+-             result = TRUE;
++       if (set_demux(dmxfdv, vpid, DMX_PES_VIDEO, dvr))
++          if (audiofd >= 0)
++             (void)ioctl(audiofd, AUDIO_SET_BYPASS_MODE, bypass);
++          if (set_demux(dmxfda, apid, DMX_PES_AUDIO, dvr)) {
++             if (rec_psi) {
++                pmtpid = get_pmt_pid(dmxdev, sid);
++                if (pmtpid < 0) {
++                   result = FALSE;
++                }
++                if (pmtpid == 0) {
++                   fprintf(stderr,"couldn't find pmt-pid for sid %04x\n",sid);
++                   result = FALSE;
++                }
++                if (set_demux(patfd, 0, DMX_PES_OTHER, dvr))
++                   if (set_demux(pmtfd, pmtpid, DMX_PES_OTHER, dvr))
++                      result = TRUE;
++                } else {
++                  result = TRUE;
++                }
++             }
+-   check_frontend (fefd, dvr);
++   check_frontend (fefd, dvr, human_readable);
+    if (!interactive) {
+-      close(audiofd);
+-      close(videofd);
++      close(patfd);
++      close(pmtfd);
++      if (audiofd >= 0)
++       close(audiofd);
++      close(dmxfda);
++      close(dmxfdv);
+       close(fefd);
+    }
+@@ -312,14 +430,15 @@
+ static int read_channels(const char *filename, int list_channels,
+                        uint32_t chan_no, const char *chan_name,
+                        unsigned int adapter, unsigned int frontend,
+-                       unsigned int demux, int dvr)
++                       unsigned int demux, int dvr, int rec_psi,
++                       int bypass, int human_readable)
+ {
+    FILE *cfp;
+    char buf[4096];
+    char inp[256];
+    char *field, *tmp, *p;
+    unsigned int line;
+-   unsigned int freq, pol, sat_no, sr, vpid, apid;
++   unsigned int freq, pol, sat_no, sr, vpid, apid, sid;
+    int ret;
+ again:
+@@ -399,20 +518,41 @@
+           goto syntax_err;
+        vpid = strtoul(field, NULL, 0);
++       if (!vpid)
++            vpid = 0x1fff;
+        if (!(field = strsep(&tmp, ":")))
+           goto syntax_err;
++       p = strchr(field, ';');
++
++       if (p) {
++          *p = '\0';
++          p++;
++          if (bypass) {
++             if (!p || !*p)
++                goto syntax_err;
++             field = p;
++          }
++       }
++
+        apid = strtoul(field, NULL, 0);
++       if (!apid)
++            apid = 0x1fff;
++
++       if (!(field = strsep(&tmp, ":")))
++          goto syntax_err;
++
++       sid = strtoul(field, NULL, 0);
+        printf("sat %u, frequency = %u MHz %c, symbolrate %u, "
+-              "vpid = 0x%04x, apid = 0x%04x\n",
+-              sat_no, freq, pol ? 'V' : 'H', sr, vpid, apid);
++              "vpid = 0x%04x, apid = 0x%04x sid = 0x%04x\n",
++              sat_no, freq, pol ? 'V' : 'H', sr, vpid, apid, sid);
+        fclose(cfp);
+-       ret = zap_to(adapter, frontend, demux,
+-                    sat_no, freq * 1000, pol, sr, vpid, apid, dvr);
++       ret = zap_to(adapter, frontend, demux, sat_no, freq * 1000,
++                    pol, sr, vpid, apid, sid, dvr, rec_psi, bypass, human_readable);
+        if (interactive)
+           goto again;
+@@ -475,17 +615,22 @@
+    int list_channels = 0;
+    unsigned int chan_no = 0;
+    const char *chan_name = NULL;
+-   unsigned int adapter = 0, frontend = 0, demux = 0, dvr = 0;
++   unsigned int adapter = 0, frontend = 0, demux = 0, dvr = 0, rec_psi = 0;
++   int bypass = 0;
+    int opt, copt = 0;
++   int human_readable = 0;
+    lnb_type = *lnb_enum(0);
+-   while ((opt = getopt(argc, argv, "hqrn:a:f:d:c:l:xi")) != -1) {
++   while ((opt = getopt(argc, argv, "Hhqrpn:a:f:d:c:l:xib")) != -1) {
+       switch (opt)
+       {
+        case '?':
+        case 'h':
+        default:
+           bad_usage(argv[0], 0);
++       case 'b':
++          bypass = 1;
++          break;
+        case 'q':
+           list_channels = 1;
+           break;
+@@ -501,6 +646,9 @@
+        case 'f':
+           frontend = strtoul(optarg, NULL, 0);
+           break;
++       case 'p':
++          rec_psi = 1;
++          break;
+        case 'd':
+           demux = strtoul(optarg, NULL, 0);
+           break;
+@@ -517,6 +665,9 @@
+        case 'x':
+           exit_after_tuning = 1;
+           break;
++      case 'H':
++          human_readable = 1;
++          break;
+        case 'i':
+           interactive = 1;
+           exit_after_tuning = 1;
+@@ -545,16 +696,21 @@
+           fprintf(stderr, "error: $HOME not set\n");
+           return TRUE;
+        }
+-       strncpy(chanfile, home, sizeof(chanfile));
+-       strcat(chanfile, "/.szap/" CHANNEL_FILE);
++       snprintf(chanfile, sizeof(chanfile),
++              "%s/.szap/%i/%s", home, adapter, CHANNEL_FILE);
++       if (access(chanfile, R_OK))
++              snprintf(chanfile, sizeof(chanfile),
++                       "%s/.szap/%s", home, CHANNEL_FILE);
+    }
+    printf("reading channels from file '%s'\n", chanfile);
++   if (rec_psi)
++      dvr=1;
++
+    if (!read_channels(chanfile, list_channels, chan_no, chan_name,
+-          adapter, frontend, demux, dvr))
++          adapter, frontend, demux, dvr, rec_psi, bypass, human_readable))
+       return TRUE;
+    return FALSE;
+ }
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/szap/tzap.c dvb-apps/util/szap/tzap.c
+--- linuxtv-dvb-apps-1.1.1/util/szap/tzap.c    2004-01-17 17:59:46.000000000 +0100
++++ dvb-apps/util/szap/tzap.c  2009-06-21 13:29:06.000000000 +0200
+@@ -1,3 +1,24 @@
++/* tzap -- DVB-T zapping utility
++ */
++
++/*
++ * Added recording to a file
++ * arguments:
++ *
++ * -t timeout (seconds)
++ * -o filename                output filename (use -o - for stdout)
++ * -s only print summary
++ * -S run silently (no output)
++ *
++ * Bernard Hatt 24/2/04
++ */
++
++
++
++#define _FILE_OFFSET_BITS 64
++#define _LARGEFILE_SOURCE 1
++#define _LARGEFILE64_SOURCE 1
++
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ #include <sys/ioctl.h>
+@@ -9,15 +30,19 @@
+ #include <fcntl.h>
+ #include <ctype.h>
+ #include <errno.h>
++#include <signal.h>
+ #include <linux/dvb/frontend.h>
+ #include <linux/dvb/dmx.h>
+-
+ static char FRONTEND_DEV [80];
+ static char DEMUX_DEV [80];
++static char DVR_DEV [80];
++static int timeout_flag=0;
++static int silent=0,timeout=0;
++static int exit_after_tuning;
+-#define CHANNEL_FILE "/.tzap/channels.conf"
++#define CHANNEL_FILE "channels.conf"
+ #define ERROR(x...)                                                     \
+         do {                                                            \
+@@ -68,14 +93,16 @@
+       {"GUARD_INTERVAL_1_16", GUARD_INTERVAL_1_16},
+       {"GUARD_INTERVAL_1_32", GUARD_INTERVAL_1_32},
+       {"GUARD_INTERVAL_1_4", GUARD_INTERVAL_1_4},
+-      {"GUARD_INTERVAL_1_8", GUARD_INTERVAL_1_8}
++      {"GUARD_INTERVAL_1_8", GUARD_INTERVAL_1_8},
++      {"GUARD_INTERVAL_AUTO", GUARD_INTERVAL_AUTO}
+ };
+ static const Param hierarchy_list [] = {
+       { "HIERARCHY_1", HIERARCHY_1 },
+       { "HIERARCHY_2", HIERARCHY_2 },
+       { "HIERARCHY_4", HIERARCHY_4 },
+-      { "HIERARCHY_NONE", HIERARCHY_NONE }
++      { "HIERARCHY_NONE", HIERARCHY_NONE },
++      { "HIERARCHY_AUTO", HIERARCHY_AUTO }
+ };
+ static const Param constellation_list [] = {
+@@ -84,12 +111,14 @@
+       { "QAM_16", QAM_16 },
+       { "QAM_256", QAM_256 },
+       { "QAM_32", QAM_32 },
+-      { "QAM_64", QAM_64 }
++      { "QAM_64", QAM_64 },
++      { "QAM_AUTO", QAM_AUTO }
+ };
+ static const Param transmissionmode_list [] = {
+       { "TRANSMISSION_MODE_2K", TRANSMISSION_MODE_2K },
+       { "TRANSMISSION_MODE_8K", TRANSMISSION_MODE_8K },
++      { "TRANSMISSION_MODE_AUTO", TRANSMISSION_MODE_AUTO }
+ };
+ #define LIST_SIZE(x) sizeof(x)/sizeof(Param)
+@@ -100,7 +129,7 @@
+ {
+       char c;
+       int character = 0;
+-      int index = 0;
++      int _index = 0;
+       while (1) {
+               if (read(fd, &c, 1) < 1)
+@@ -111,9 +140,9 @@
+                       break;
+               while (toupper(c) != plist->name[character]) {
+-                      index++;
++                      _index++;
+                       plist++;
+-                      if (index >= list_size)  /*  parse error, no valid */
++                      if (_index >= list_size)         /*  parse error, no valid */
+                               return -2;       /*  parameter name found  */
+               }
+@@ -150,7 +179,10 @@
+                       return -3;      /*  to fit in 32 bit */
+       };
++      errno = 0;
+       *val = strtol(number, NULL, 10);
++      if (errno == ERANGE)
++              return -4;
+       return 0;
+ }
+@@ -167,13 +199,18 @@
+               if (read(fd, &c, 1) < 1)
+                       return -1;      /*  EOF! */
+-              if (c == ':' && channel[character] == '\0')
+-                      break;
+-
+-              if (toupper(c) == toupper(channel[character]))
+-                      character++;
+-              else
++              if ( '\n' == c ) /* start of line */
+                       character = 0;
++              else if ( character >= 0 ) { /* we are in the namefield */
++
++                      if (c == ':' && channel[character] == '\0')
++                              break;
++
++                      if (toupper(c) == toupper(channel[character]))
++                              character++;
++                      else
++                              character = -1;
++              }
+       };
+       return 0;
+@@ -211,12 +248,32 @@
+       return err;
+ }
++static int check_fec(fe_code_rate_t *fec)
++{
++      switch (*fec)
++      {
++      case FEC_NONE:
++              *fec = FEC_AUTO;
++      case FEC_AUTO:
++      case FEC_1_2:
++      case FEC_2_3:
++      case FEC_3_4:
++      case FEC_5_6:
++      case FEC_7_8:
++              return 0;
++      default:
++              ;
++      }
++      return 1;
++}
++
+ int parse(const char *fname, const char *channel,
+         struct dvb_frontend_parameters *frontend, int *vpid, int *apid)
+ {
+       int fd;
+       int err;
++      int tmp;
+       if ((fd = open(fname, O_RDONLY | O_NONBLOCK)) < 0) {
+               PERROR ("could not open file '%s'", fname);
+@@ -229,54 +286,57 @@
+               return -2;
+       }
+-      if ((err = try_parse_int(fd, &frontend->frequency, "frequency")))
++      if ((err = try_parse_int(fd, &tmp, "frequency")))
+               return -3;
++      frontend->frequency = tmp;
+       if ((err = try_parse_param(fd,
+                                  inversion_list, LIST_SIZE(inversion_list),
+-                                 (int *) &frontend->inversion,
+-                                 "inversion")))
++                                 &tmp, "inversion")))
+               return -4;
++      frontend->inversion = tmp;
+       if ((err = try_parse_param(fd, bw_list, LIST_SIZE(bw_list),
+-                                 (int *) &frontend->u.ofdm.bandwidth,
+-                                 "bandwidth")))
++                                 &tmp, "bandwidth")))
+               return -5;
++      frontend->u.ofdm.bandwidth = tmp;
+       if ((err = try_parse_param(fd, fec_list, LIST_SIZE(fec_list),
+-                                 (int *) &frontend->u.ofdm.code_rate_HP,
+-                                 "code_rate_HP")))
++                                 &tmp, "code_rate_HP")))
++              return -6;
++      frontend->u.ofdm.code_rate_HP = tmp;
++      if (check_fec(&frontend->u.ofdm.code_rate_HP))
+               return -6;
+       if ((err = try_parse_param(fd, fec_list, LIST_SIZE(fec_list),
+-                                 (int *) &frontend->u.ofdm.code_rate_LP,
+-                                 "code_rate_LP")))
++                                 &tmp, "code_rate_LP")))
++              return -7;
++      frontend->u.ofdm.code_rate_LP = tmp;
++      if (check_fec(&frontend->u.ofdm.code_rate_LP))
+               return -7;
+       if ((err = try_parse_param(fd, constellation_list,
+                                  LIST_SIZE(constellation_list),
+-                                 (int *) &frontend->u.ofdm.constellation,
+-                                 "constellation")))
++                                 &tmp, "constellation")))
+               return -8;
++      frontend->u.ofdm.constellation = tmp;
+       if ((err = try_parse_param(fd, transmissionmode_list,
+                                  LIST_SIZE(transmissionmode_list),
+-                                 (int *) &frontend->u.ofdm.
+-                                 transmission_mode,
+-                                 "transmission_mode")))
++                                 &tmp, "transmission_mode")))
+               return -9;
++      frontend->u.ofdm.transmission_mode = tmp;
+       if ((err = try_parse_param(fd, guard_list, LIST_SIZE(guard_list),
+-                                 (int *) &frontend->u.ofdm.
+-                                 guard_interval, "guard_interval")))
++                                 &tmp, "guard_interval")))
+               return -10;
++      frontend->u.ofdm.guard_interval = tmp;
+       if ((err = try_parse_param(fd, hierarchy_list,
+                                  LIST_SIZE(hierarchy_list),
+-                                 (int *) &frontend->u.ofdm.
+-                                 hierarchy_information,
+-                                 "hierarchy_information")))
++                                 &tmp, "hierarchy_information")))
+               return -11;
++      frontend->u.ofdm.hierarchy_information = tmp;
+       if ((err = try_parse_int(fd, vpid, "Video PID")))
+               return -12;
+@@ -330,7 +390,8 @@
+               return -1;
+       }
+-      printf ("tuning to %i Hz\n", frontend->frequency);
++      if (silent<2)
++              fprintf (stderr,"tuning to %i Hz\n", frontend->frequency);
+       if (ioctl(fe_fd, FE_SET_FRONTEND, frontend) < 0) {
+               PERROR("ioctl FE_SET_FRONTEND failed");
+@@ -340,38 +401,115 @@
+       return 0;
+ }
++static void
++do_timeout(int x)
++{
++      (void)x;
++      if (timeout_flag==0)
++      {
++              timeout_flag=1;
++              alarm(2);
++              signal(SIGALRM, do_timeout);
++      }
++      else
++      {
++              /* something has gone wrong ... exit */
++              exit(1);
++      }
++}
+-static
+-int check_frontend (int fe_fd)
++static void
++print_frontend_stats (int fe_fd, int human_readable)
+ {
+       fe_status_t status;
+-      uint16_t snr, signal;
++      uint16_t snr, _signal;
+       uint32_t ber, uncorrected_blocks;
+-      do {
+-              ioctl(fe_fd, FE_READ_STATUS, &status);
+-              ioctl(fe_fd, FE_READ_SIGNAL_STRENGTH, &signal);
+-              ioctl(fe_fd, FE_READ_SNR, &snr);
+-              ioctl(fe_fd, FE_READ_BER, &ber);
+-              ioctl(fe_fd, FE_READ_UNCORRECTED_BLOCKS, &uncorrected_blocks);
++      ioctl(fe_fd, FE_READ_STATUS, &status);
++      ioctl(fe_fd, FE_READ_SIGNAL_STRENGTH, &_signal);
++      ioctl(fe_fd, FE_READ_SNR, &snr);
++      ioctl(fe_fd, FE_READ_BER, &ber);
++      ioctl(fe_fd, FE_READ_UNCORRECTED_BLOCKS, &uncorrected_blocks);
+-              printf ("status %02x | signal %04x | snr %04x | "
+-                      "ber %08x | unc %08x | ",
+-                      status, signal, snr, ber, uncorrected_blocks);
++      if (human_readable) {
++              printf ("status %02x | signal %3u%% | snr %3u%% | ber %d | unc %d | ",
++                      status, (_signal * 100) / 0xffff, (snr * 100) / 0xffff, ber, uncorrected_blocks);
++      } else {
++              fprintf (stderr, "status %02x | signal %04x | snr %04x | ber %08x | unc %08x | ",
++                      status, _signal, snr, ber, uncorrected_blocks);
++      }
+-              if (status & FE_HAS_LOCK)
+-                      printf("FE_HAS_LOCK");
++      if (status & FE_HAS_LOCK)
++              fprintf(stderr,"FE_HAS_LOCK");
+-              usleep(1000000);
++      fprintf(stderr,"\n");
++}
+-              printf("\n");
+-      } while (1);
++static
++int check_frontend (int fe_fd, int human_readable)
++{
++      fe_status_t status;
++      do {
++              ioctl(fe_fd, FE_READ_STATUS, &status);
++              if (!silent)
++                      print_frontend_stats(fe_fd, human_readable);
++              if (exit_after_tuning && (status & FE_HAS_LOCK))
++                      break;
++              usleep(1000000);
++      } while (!timeout_flag);
++      if (silent < 2)
++              print_frontend_stats (fe_fd, human_readable);
+       return 0;
+ }
++#define BUFLEN (188*256)
++static
++void copy_to_file(int in_fd, int out_fd)
++{
++      char buf[BUFLEN];
++      int r;
++      long long int rc = 0LL;
++      while(timeout_flag==0)
++      {
++              r=read(in_fd,buf,BUFLEN);
++              if (r < 0) {
++                      if (errno == EOVERFLOW) {
++                              printf("buffer overrun\n");
++                              continue;
++                      }
++                      PERROR("Read failed");
++                      break;
++              }
++              if (write(out_fd,buf,r) < 0) {
++                      PERROR("Write failed");
++                      break;
++              }
++              rc+=r;
++      }
++      if (silent<2)
++      {
++              fprintf(stderr, "copied %lld bytes (%lld Kbytes/sec)\n",rc,rc/(1024*timeout));
++      }
++}
+-static const char *usage = "\nusage: %s [-a adapter_num] [-f frontend_id] [-d demux_id] [-c conf_file] [-r] <channel name>\n\n";
++static char *usage =
++    "usage:\n"
++    "       tzap [options] <channel_name>\n"
++    "         zap to channel channel_name (case insensitive)\n"
++    "     -a number : use given adapter (default 0)\n"
++    "     -f number : use given frontend (default 0)\n"
++    "     -d number : use given demux (default 0)\n"
++    "     -c file   : read channels list from 'file'\n"
++    "     -x        : exit after tuning\n"
++    "     -r        : set up /dev/dvb/adapterX/dvr0 for TS recording\n"
++    "     -s        : only print summary\n"
++    "     -S        : run silently (no output)\n"
++    "     -H        : human readable output\n"
++    "     -F        : set up frontend only, don't touch demux\n"
++    "     -t number : timeout (seconds)\n"
++    "     -o file   : output filename (use -o - for stdout)\n"
++    "     -h -?     : display this help and exit\n";
+ int main(int argc, char **argv)
+@@ -382,10 +520,14 @@
+       char *channel = NULL;
+       int adapter = 0, frontend = 0, demux = 0, dvr = 0;
+       int vpid, apid;
+-      int frontend_fd, audio_fd, video_fd;
++      int frontend_fd, audio_fd = 0, video_fd = 0, dvr_fd, file_fd;
+       int opt;
++      int record = 0;
++      int frontend_only = 0;
++      char *filename = NULL;
++      int human_readable = 0;
+-      while ((opt = getopt(argc, argv, "hrn:a:f:d:c:")) != -1) {
++      while ((opt = getopt(argc, argv, "H?hrxRsFSn:a:f:d:c:t:o:")) != -1) {
+               switch (opt) {
+               case 'a':
+                       adapter = strtoul(optarg, NULL, 0);
+@@ -396,12 +538,34 @@
+               case 'd':
+                       demux = strtoul(optarg, NULL, 0);
+                       break;
++              case 't':
++                      timeout = strtoul(optarg, NULL, 0);
++                      break;
++              case 'o':
++                      filename = strdup(optarg);
++                      record=1;
++                      /* fall through */
+               case 'r':
+                       dvr = 1;
+                       break;
++              case 'x':
++                      exit_after_tuning = 1;
++                      break;
+               case 'c':
+                       confname = optarg;
+                       break;
++              case 's':
++                      silent = 1;
++                      break;
++              case 'S':
++                      silent = 2;
++                      break;
++              case 'F':
++                      frontend_only = 1;
++                      break;
++              case 'H':
++                      human_readable = 1;
++                      break;
+               case '?':
+               case 'h':
+               default:
+@@ -424,17 +588,25 @@
+       snprintf (DEMUX_DEV, sizeof(DEMUX_DEV),
+                 "/dev/dvb/adapter%i/demux%i", adapter, demux);
+-      printf ("using '%s' and '%s'\n", FRONTEND_DEV, DEMUX_DEV);
++      snprintf (DVR_DEV, sizeof(DVR_DEV),
++                "/dev/dvb/adapter%i/dvr%i", adapter, demux);
++
++      if (silent<2)
++              fprintf (stderr,"using '%s' and '%s'\n", FRONTEND_DEV, DEMUX_DEV);
+       if (!confname)
+       {
++              int len = strlen(homedir) + strlen(CHANNEL_FILE) + 18;
+               if (!homedir)
+                       ERROR ("$HOME not set");
+-              confname = malloc (strlen(homedir) + strlen(CHANNEL_FILE) + 1);
+-              memcpy (confname, homedir, strlen(homedir));
+-              memcpy (confname + strlen(homedir), CHANNEL_FILE,
+-                      strlen(CHANNEL_FILE) + 1);
++              confname = malloc (len);
++              snprintf (confname, len, "%s/.tzap/%i/%s",
++                        homedir, adapter, CHANNEL_FILE);
++              if (access (confname, R_OK))
++                      snprintf (confname, len, "%s/.tzap/%s",
++                                homedir, CHANNEL_FILE);
+       }
++      printf("reading channels from file '%s'\n", confname);
+       memset(&frontend_param, 0, sizeof(struct dvb_frontend_parameters));
+@@ -449,12 +621,17 @@
+       if (setup_frontend (frontend_fd, &frontend_param) < 0)
+               return -1;
++      if (frontend_only)
++              goto just_the_frontend_dude;
++
+         if ((video_fd = open(DEMUX_DEV, O_RDWR)) < 0) {
+                 PERROR("failed opening '%s'", DEMUX_DEV);
+                 return -1;
+         }
+-      printf ("video pid 0x%04x, audio pid 0x%04x\n", vpid, apid);
++      if (silent<2)
++              fprintf (stderr,"video pid 0x%04x, audio pid 0x%04x\n", vpid, apid);
++
+       if (set_pesfilter (video_fd, vpid, DMX_PES_VIDEO, dvr) < 0)
+               return -1;
+@@ -466,7 +643,51 @@
+       if (set_pesfilter (audio_fd, apid, DMX_PES_AUDIO, dvr) < 0)
+               return -1;
+-      check_frontend (frontend_fd);
++      signal(SIGALRM,do_timeout);
++      if (timeout>0)
++              alarm(timeout);
++
++
++      if (record)
++      {
++              if (filename!=NULL)
++              {
++                      if (strcmp(filename,"-")!=0)
++                      {
++                              file_fd = open (filename,O_WRONLY|O_LARGEFILE|O_CREAT,0644);
++                              if (file_fd<0)
++                              {
++                                      PERROR("open of '%s' failed",filename);
++                                      return -1;
++                              }
++                      }
++                      else
++                      {
++                              file_fd=1;
++                      }
++              }
++              else
++              {
++                      PERROR("Record mode but no filename!");
++                      return -1;
++              }
++
++              if ((dvr_fd = open(DVR_DEV, O_RDONLY)) < 0) {
++                      PERROR("failed opening '%s'", DVR_DEV);
++                      return -1;
++              }
++              if (silent<2)
++                      print_frontend_stats (frontend_fd, human_readable);
++
++              copy_to_file(dvr_fd,file_fd);
++
++              if (silent<2)
++                      print_frontend_stats (frontend_fd, human_readable);
++      }
++      else {
++just_the_frontend_dude:
++              check_frontend (frontend_fd, human_readable);
++      }
+       close (audio_fd);
+       close (video_fd);
+@@ -474,4 +695,3 @@
+       return 0;
+ }
+-
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/ttusb_dec_reset/Makefile dvb-apps/util/ttusb_dec_reset/Makefile
+--- linuxtv-dvb-apps-1.1.1/util/ttusb_dec_reset/Makefile       2004-01-21 23:13:45.000000000 +0100
++++ dvb-apps/util/ttusb_dec_reset/Makefile     2009-06-21 13:29:06.000000000 +0200
+@@ -1,17 +1,19 @@
+-CC    = gcc
+-RM    = rm -f
+-CFLAGS        = -g -Wall -O2
+-LFLAGS        = -g -Wall
+-LDFLAGS = -lusb
++# Makefile for linuxtv.org dvb-apps/util/ttusb_dec_reset
+-OBJS  = ttusb_dec_reset.o
+-TARGET        = ttusb_dec_reset
++binaries = ttusb_dec_reset
+-$(TARGET): $(OBJS)
+-      $(CC) $(LFLAGS) $(LDFLAGS) -o $(TARGET) $(OBJS)
++ifneq ($(realpath $(binaries)),)
++inst_bin = $(binaries)
++endif
+-.c.o:
+-      $(CC) $(CFLAGS) -c $< -o $@
++LDLIBS += -lusb
+-clean:
+-      $(RM) *.o $(TARGET)
++.PHONY: all
++
++ifeq ($(ttusb_dec_reset),1)
++all: $(binaries)
++else
++all: clean
++endif
++
++include ../../Make.rules
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/ttusb_dec_reset/ttusb_dec_reset.c dvb-apps/util/ttusb_dec_reset/ttusb_dec_reset.c
+--- linuxtv-dvb-apps-1.1.1/util/ttusb_dec_reset/ttusb_dec_reset.c      2004-01-21 23:13:45.000000000 +0100
++++ dvb-apps/util/ttusb_dec_reset/ttusb_dec_reset.c    2009-06-21 13:29:06.000000000 +0200
+@@ -25,10 +25,12 @@
+       }
+ }
+-int main()
++int main(int argc, char *argv[])
+ {
+       struct usb_bus *busses;
+       struct usb_bus *bus;
++      (void) argc;
++      (void) argv;
+       usb_init();
+       usb_find_busses();
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/zap/Makefile dvb-apps/util/zap/Makefile
+--- linuxtv-dvb-apps-1.1.1/util/zap/Makefile   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/zap/Makefile 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,20 @@
++# Makefile for linuxtv.org dvb-apps/util/zap
++
++objects  = zap_ca.o  \
++           zap_dvb.o
++
++binaries = zap
++
++inst_bin = $(binaries)
++
++CPPFLAGS += -I../../lib
++LDFLAGS  += -L../../lib/libdvbapi -L../../lib/libdvbsec  -L../../lib/libdvbcfg -L../../lib/libdvben50221 -L../../lib/libucsi
++LDLIBS   += -ldvbcfg -ldvben50221 -ldvbsec -ldvbapi -lucsi -lpthread
++
++.PHONY: all
++
++all: $(binaries)
++
++$(binaries): $(objects)
++
++include ../../Make.rules
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/zap/zap.c dvb-apps/util/zap/zap.c
+--- linuxtv-dvb-apps-1.1.1/util/zap/zap.c      1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/zap/zap.c    2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,226 @@
++/*
++      ZAP utility
++
++      Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++      Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++      This program is free software; you can redistribute it and/or modify
++      it under the terms of the GNU Lesser General Public License as
++      published by the Free Software Foundation; either version 2.1 of
++      the License, or (at your option) any later version.
++
++      This program is distributed in the hope that it will be useful,
++      but WITHOUT ANY WARRANTY; without even the implied warranty of
++      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++      GNU Lesser General Public License for more details.
++
++      You should have received a copy of the GNU Lesser General Public
++      License along with this library; if not, write to the Free Software
++      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#include <stdio.h>
++#include <unistd.h>
++#include <limits.h>
++#include <string.h>
++#include <fcntl.h>
++#include <signal.h>
++#include <pthread.h>
++#include <sys/poll.h>
++#include <libdvbapi/dvbdemux.h>
++#include <libdvbapi/dvbaudio.h>
++#include <libdvbsec/dvbsec_cfg.h>
++#include <libucsi/mpeg/section.h>
++#include "zap_dvb.h"
++#include "zap_ca.h"
++
++
++static void signal_handler(int _signal);
++
++static int quit_app = 0;
++
++void usage(void)
++{
++      static const char *_usage = "\n"
++              " ZAP: A zapping application\n"
++              " Copyright (C) 2004, 2005, 2006 Manu Abraham (manu@kromtek.com)\n"
++              " Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)\n\n"
++              " usage: zap <options> as follows:\n"
++              " -h                    help\n"
++              " -adapter <id>         adapter to use (default 0)\n"
++              " -frontend <id>        frontend to use (default 0)\n"
++              " -demux <id>           demux to use (default 0)\n"
++              " -caslotnum <id>       ca slot number to use (default 0)\n"
++              " -channels <filename>  channels.conf file.\n"
++              " -secfile <filename>   Optional sec.conf file.\n"
++              " -secid <secid>        ID of the SEC configuration to use, one of:\n"
++              " -nomoveca             Do not attempt to move CA descriptors from stream to programme level\n"
++              " <channel name>\n";
++      fprintf(stderr, "%s\n", _usage);
++
++      exit(1);
++}
++
++int find_channel(struct dvbcfg_zapchannel *channel, void *private_data)
++{
++      struct dvbcfg_zapchannel *tmpchannel = private_data;
++
++      if (strcmp(channel->name, tmpchannel->name) == 0) {
++              memcpy(tmpchannel, channel, sizeof(struct dvbcfg_zapchannel));
++              return 1;
++      }
++
++      return 0;
++}
++
++int main(int argc, char *argv[])
++{
++      int adapter_id = 0;
++      int frontend_id = 0;
++      int demux_id = 0;
++      int caslot_num = 0;
++      char *chanfile = "/etc/channels.conf";
++      char *secfile = NULL;
++      char *secid = NULL;
++      char *channel_name = NULL;
++      int moveca = 1;
++      int argpos = 1;
++      struct zap_dvb_params zap_dvb_params;
++      struct zap_ca_params zap_ca_params;
++
++      while(argpos != argc) {
++              if (!strcmp(argv[argpos], "-h")) {
++                      usage();
++              } else if (!strcmp(argv[argpos], "-adapter")) {
++                      if ((argc - argpos) < 2)
++                              usage();
++                      if (sscanf(argv[argpos+1], "%i", &adapter_id) != 1)
++                              usage();
++                      argpos+=2;
++              } else if (!strcmp(argv[argpos], "-frontend")) {
++                      if ((argc - argpos) < 2)
++                              usage();
++                      if (sscanf(argv[argpos+1], "%i", &frontend_id) != 1)
++                              usage();
++                      argpos+=2;
++              } else if (!strcmp(argv[argpos], "-demux")) {
++                      if ((argc - argpos) < 2)
++                              usage();
++                      if (sscanf(argv[argpos+1], "%i", &demux_id) != 1)
++                              usage();
++                      argpos+=2;
++              } else if (!strcmp(argv[argpos], "-caslotnum")) {
++                      if ((argc - argpos) < 2)
++                              usage();
++                      if (sscanf(argv[argpos+1], "%i", &caslot_num) != 1)
++                              usage();
++                      argpos+=2;
++              } else if (!strcmp(argv[argpos], "-channels")) {
++                      if ((argc - argpos) < 2)
++                              usage();
++                      chanfile = argv[argpos+1];
++                      argpos+=2;
++              } else if (!strcmp(argv[argpos], "-secfile")) {
++                      if ((argc - argpos) < 2)
++                              usage();
++                      secfile = argv[argpos+1];
++                      argpos+=2;
++              } else if (!strcmp(argv[argpos], "-secid")) {
++                      if ((argc - argpos) < 2)
++                              usage();
++                      secid = argv[argpos+1];
++                      argpos+=2;
++              } else if (!strcmp(argv[argpos], "-nomoveca")) {
++                      moveca = 0;
++                      argpos++;
++              } else {
++                      if ((argc - argpos) != 1)
++                              usage();
++                      channel_name = argv[argpos];
++                      argpos++;
++              }
++      }
++
++      // the user didn't select anything!
++      if (channel_name == NULL)
++              usage();
++
++      // setup any signals
++      signal(SIGINT, signal_handler);
++      signal(SIGPIPE, SIG_IGN);
++
++      // start the CA stuff
++      zap_ca_params.adapter_id = adapter_id;
++      zap_ca_params.caslot_num = caslot_num;
++      zap_ca_params.moveca = moveca;
++      zap_ca_start(&zap_ca_params);
++
++      // find the requested channel
++      if (strlen(channel_name) >= sizeof(zap_dvb_params.channel.name)) {
++              fprintf(stderr, "Channel name is too long %s\n", channel_name);
++              exit(1);
++      }
++      FILE *channel_file = fopen(chanfile, "r");
++      if (channel_file == NULL) {
++              fprintf(stderr, "Could open channel file %s\n", chanfile);
++              exit(1);
++      }
++      memcpy(zap_dvb_params.channel.name, channel_name, strlen(channel_name) + 1);
++      if (dvbcfg_zapchannel_parse(channel_file, find_channel, &zap_dvb_params.channel) != 1) {
++              fprintf(stderr, "Unable to find requested channel %s\n", channel_name);
++              exit(1);
++      }
++      fclose(channel_file);
++
++      // default SEC with a DVBS card
++      if ((secid == NULL) && (zap_dvb_params.channel.fe_type == DVBFE_TYPE_DVBS))
++              secid = "UNIVERSAL";
++
++      // look it up if one were supplied
++      zap_dvb_params.valid_sec = 0;
++      if (secid != NULL) {
++              if (dvbsec_cfg_find(secfile, secid,
++                              &zap_dvb_params.sec)) {
++                      fprintf(stderr, "Unable to find suitable sec/lnb configuration for channel\n");
++                      exit(1);
++              }
++              zap_dvb_params.valid_sec = 1;
++      }
++
++      // open the frontend
++      zap_dvb_params.fe = dvbfe_open(adapter_id, frontend_id, 0);
++      if (zap_dvb_params.fe == NULL) {
++              fprintf(stderr, "Failed to open frontend\n");
++              exit(1);
++      }
++
++      // start the DVB stuff
++      zap_dvb_params.adapter_id = adapter_id;
++      zap_dvb_params.frontend_id = frontend_id;
++      zap_dvb_params.demux_id = demux_id;
++      zap_dvb_start(&zap_dvb_params);
++
++      // the UI
++      while(!quit_app) {
++              sleep(1);
++      }
++
++      // shutdown DVB stuff
++      if (channel_name != NULL)
++              zap_dvb_stop();
++
++      // shutdown CA stuff
++      zap_ca_stop();
++
++      // done
++      exit(0);
++}
++
++static void signal_handler(int _signal)
++{
++      (void) _signal;
++
++      if (!quit_app) {
++              quit_app = 1;
++      }
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/zap/zap_ca.c dvb-apps/util/zap/zap_ca.c
+--- linuxtv-dvb-apps-1.1.1/util/zap/zap_ca.c   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/zap/zap_ca.c 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,198 @@
++/*
++      ZAP utility CA functions
++
++      Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++      Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++      This program is free software; you can redistribute it and/or modify
++      it under the terms of the GNU Lesser General Public License as
++      published by the Free Software Foundation; either version 2.1 of
++      the License, or (at your option) any later version.
++
++      This program is distributed in the hope that it will be useful,
++      but WITHOUT ANY WARRANTY; without even the implied warranty of
++      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++      GNU Lesser General Public License for more details.
++
++      You should have received a copy of the GNU Lesser General Public
++      License along with this library; if not, write to the Free Software
++      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <unistd.h>
++#include <sys/poll.h>
++#include <pthread.h>
++#include <libdvben50221/en50221_stdcam.h>
++#include "zap_ca.h"
++
++
++static int zap_ca_info_callback(void *arg, uint8_t slot_id, uint16_t session_number, uint32_t ca_id_count, uint16_t *ca_ids);
++static int zap_ai_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                           uint8_t application_type, uint16_t application_manufacturer,
++                           uint16_t manufacturer_code, uint8_t menu_string_length,
++                           uint8_t *menu_string);
++static void *camthread_func(void* arg);
++
++static struct en50221_transport_layer *tl = NULL;
++static struct en50221_session_layer *sl = NULL;
++static struct en50221_stdcam *stdcam = NULL;
++
++static int ca_resource_connected = 0;
++
++static int camthread_shutdown = 0;
++static pthread_t camthread;
++static int seenpmt = 0;
++static int moveca = 0;
++
++void zap_ca_start(struct zap_ca_params *params)
++{
++      // create transport layer
++      tl = en50221_tl_create(1, 16);
++      if (tl == NULL) {
++              fprintf(stderr, "Failed to create transport layer\n");
++              return;
++      }
++
++      // create session layer
++      sl = en50221_sl_create(tl, 16);
++      if (sl == NULL) {
++              fprintf(stderr, "Failed to create session layer\n");
++              en50221_tl_destroy(tl);
++              return;
++      }
++
++      // create the stdcam instance
++      stdcam = en50221_stdcam_create(params->adapter_id, params->caslot_num, tl, sl);
++      if (stdcam == NULL) {
++              en50221_sl_destroy(sl);
++              en50221_tl_destroy(tl);
++              return;
++      }
++
++      // hook up the AI callbacks
++      if (stdcam->ai_resource) {
++              en50221_app_ai_register_callback(stdcam->ai_resource, zap_ai_callback, stdcam);
++      }
++
++      // hook up the CA callbacks
++      if (stdcam->ca_resource) {
++              en50221_app_ca_register_info_callback(stdcam->ca_resource, zap_ca_info_callback, stdcam);
++      }
++
++      // any other stuff
++      moveca = params->moveca;
++
++      // start the cam thread
++      pthread_create(&camthread, NULL, camthread_func, NULL);
++}
++
++void zap_ca_stop(void)
++{
++      if (stdcam == NULL)
++              return;
++
++      // shutdown the cam thread
++      camthread_shutdown = 1;
++      pthread_join(camthread, NULL);
++
++      // destroy session layer
++      en50221_sl_destroy(sl);
++
++      // destroy transport layer
++      en50221_tl_destroy(tl);
++
++      // destroy the stdcam
++      if (stdcam->destroy)
++              stdcam->destroy(stdcam, 1);
++}
++
++int zap_ca_new_pmt(struct mpeg_pmt_section *pmt)
++{
++      uint8_t capmt[4096];
++      int size;
++
++      if (stdcam == NULL)
++              return -1;
++
++      if (ca_resource_connected) {
++              fprintf(stderr, "Received new PMT - sending to CAM...\n");
++
++              // translate it into a CA PMT
++              int listmgmt = CA_LIST_MANAGEMENT_ONLY;
++              if (seenpmt) {
++                      listmgmt = CA_LIST_MANAGEMENT_UPDATE;
++              }
++              seenpmt = 1;
++
++              if ((size = en50221_ca_format_pmt(pmt, capmt, sizeof(capmt), moveca, listmgmt,
++                                                CA_PMT_CMD_ID_OK_DESCRAMBLING)) < 0) {
++                      fprintf(stderr, "Failed to format PMT\n");
++                      return -1;
++              }
++
++              // set it
++              if (en50221_app_ca_pmt(stdcam->ca_resource, stdcam->ca_session_number, capmt, size)) {
++                      fprintf(stderr, "Failed to send PMT\n");
++                      return -1;
++              }
++
++              // we've seen this PMT
++              return 1;
++      }
++
++      return 0;
++}
++
++void zap_ca_new_dvbtime(time_t dvb_time)
++{
++      if (stdcam == NULL)
++              return;
++
++      if (stdcam->dvbtime)
++              stdcam->dvbtime(stdcam, dvb_time);
++}
++
++static void *camthread_func(void* arg)
++{
++      (void) arg;
++
++      while(!camthread_shutdown) {
++              stdcam->poll(stdcam);
++      }
++
++      return 0;
++}
++
++static int zap_ai_callback(void *arg, uint8_t slot_id, uint16_t session_number,
++                           uint8_t application_type, uint16_t application_manufacturer,
++                           uint16_t manufacturer_code, uint8_t menu_string_length,
++                           uint8_t *menu_string)
++{
++      (void) arg;
++      (void) slot_id;
++      (void) session_number;
++
++      printf("CAM Application type: %02x\n", application_type);
++      printf("CAM Application manufacturer: %04x\n", application_manufacturer);
++      printf("CAM Manufacturer code: %04x\n", manufacturer_code);
++      printf("CAM Menu string: %.*s\n", menu_string_length, menu_string);
++
++      return 0;
++}
++
++static int zap_ca_info_callback(void *arg, uint8_t slot_id, uint16_t session_number, uint32_t ca_id_count, uint16_t *ca_ids)
++{
++      (void) arg;
++      (void) slot_id;
++      (void) session_number;
++
++      printf("CAM supports the following ca system ids:\n");
++      uint32_t i;
++      for(i=0; i< ca_id_count; i++) {
++              printf("  0x%04x\n", ca_ids[i]);
++      }
++      ca_resource_connected = 1;
++      return 0;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/zap/zap_ca.h dvb-apps/util/zap/zap_ca.h
+--- linuxtv-dvb-apps-1.1.1/util/zap/zap_ca.h   1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/zap/zap_ca.h 2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,37 @@
++/*
++      ZAP utility CA functions
++
++      Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++      Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++      This program is free software; you can redistribute it and/or modify
++      it under the terms of the GNU Lesser General Public License as
++      published by the Free Software Foundation; either version 2.1 of
++      the License, or (at your option) any later version.
++
++      This program is distributed in the hope that it will be useful,
++      but WITHOUT ANY WARRANTY; without even the implied warranty of
++      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++      GNU Lesser General Public License for more details.
++
++      You should have received a copy of the GNU Lesser General Public
++      License along with this library; if not, write to the Free Software
++      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#ifndef ZAP_CA_H
++#define ZAP_CA_H 1
++
++struct zap_ca_params {
++      int adapter_id;
++      int caslot_num;
++      int moveca;
++};
++
++extern void zap_ca_start(struct zap_ca_params *params);
++extern void zap_ca_stop(void);
++
++extern int zap_ca_new_pmt(struct mpeg_pmt_section *pmt);
++extern void zap_ca_new_dvbtime(time_t dvb_time);
++
++#endif
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/zap/zap_dvb.c dvb-apps/util/zap/zap_dvb.c
+--- linuxtv-dvb-apps-1.1.1/util/zap/zap_dvb.c  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/zap/zap_dvb.c        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,353 @@
++/*
++      ZAP utility DVB functions
++
++      Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++      Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++      This program is free software; you can redistribute it and/or modify
++      it under the terms of the GNU Lesser General Public License as
++      published by the Free Software Foundation; either version 2.1 of
++      the License, or (at your option) any later version.
++
++      This program is distributed in the hope that it will be useful,
++      but WITHOUT ANY WARRANTY; without even the implied warranty of
++      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++      GNU Lesser General Public License for more details.
++
++      You should have received a copy of the GNU Lesser General Public
++      License along with this library; if not, write to the Free Software
++      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#include <stdio.h>
++#include <unistd.h>
++#include <limits.h>
++#include <string.h>
++#include <signal.h>
++#include <pthread.h>
++#include <sys/poll.h>
++#include <libdvbapi/dvbdemux.h>
++#include <libucsi/section.h>
++#include <libucsi/mpeg/section.h>
++#include <libucsi/dvb/section.h>
++#include "zap_dvb.h"
++#include "zap_ca.h"
++
++#define FE_STATUS_PARAMS (DVBFE_INFO_LOCKSTATUS|DVBFE_INFO_SIGNAL_STRENGTH|DVBFE_INFO_BER|DVBFE_INFO_SNR|DVBFE_INFO_UNCORRECTED_BLOCKS)
++
++static int dvbthread_shutdown = 0;
++static pthread_t dvbthread;
++
++static int pat_version = -1;
++static int ca_pmt_version = -1;
++
++static void *dvbthread_func(void* arg);
++
++static void process_pat(int pat_fd, struct zap_dvb_params *params, int *pmt_fd, struct pollfd *pollfd);
++static void process_tdt(int tdt_fd);
++static void process_pmt(int pmt_fd, struct zap_dvb_params *params);
++static int create_section_filter(int adapter, int demux, uint16_t pid, uint8_t table_id);
++
++
++int zap_dvb_start(struct zap_dvb_params *params)
++{
++      pthread_create(&dvbthread, NULL, dvbthread_func, (void*) params);
++      return 0;
++}
++
++void zap_dvb_stop(void)
++{
++      dvbthread_shutdown = 1;
++      pthread_join(dvbthread, NULL);
++}
++
++static void *dvbthread_func(void* arg)
++{
++      int tune_state = 0;
++      int pat_fd = -1;
++      int pmt_fd = -1;
++      int tdt_fd = -1;
++      struct pollfd pollfds[3];
++
++      struct zap_dvb_params *params = (struct zap_dvb_params *) arg;
++
++      // create PAT filter
++      if ((pat_fd = create_section_filter(params->adapter_id, params->demux_id,
++           TRANSPORT_PAT_PID, stag_mpeg_program_association)) < 0) {
++              fprintf(stderr, "Failed to create PAT section filter\n");
++              exit(1);
++      }
++      pollfds[0].fd = pat_fd;
++      pollfds[0].events = POLLIN|POLLPRI|POLLERR;
++
++      // create TDT filter
++      if ((tdt_fd = create_section_filter(params->adapter_id, params->demux_id, TRANSPORT_TDT_PID, stag_dvb_time_date)) < 0) {
++              fprintf(stderr, "Failed to create TDT section filter\n");
++              exit(1);
++      }
++      pollfds[1].fd = tdt_fd;
++      pollfds[1].events = POLLIN|POLLPRI|POLLERR;
++
++      // zero PMT filter
++      pollfds[2].fd = 0;
++      pollfds[2].events = 0;
++
++      // the DVB loop
++      while(!dvbthread_shutdown) {
++              // tune frontend + monitor lock status
++              if (tune_state == 0) {
++                      // get the type of frontend
++                      struct dvbfe_info result;
++                      char *types;
++                      memset(&result, 0, sizeof(result));
++                      dvbfe_get_info(params->fe, 0, &result, DVBFE_INFO_QUERYTYPE_IMMEDIATE, 0);
++                      switch(result.type) {
++                      case DVBFE_TYPE_DVBS:
++                              types = "DVB-S";
++                              break;
++                      case DVBFE_TYPE_DVBC:
++                              types = "DVB-C";
++                              break;
++                      case DVBFE_TYPE_DVBT:
++                              types = "DVB-T";
++                              break;
++                      case DVBFE_TYPE_ATSC:
++                              types = "ATSC";
++                              break;
++                      default:
++                              types = "Unknown";
++                      }
++                      fprintf(stderr, "Using frontend \"%s\", type %s\n", result.name, types);
++
++                      // do we have a valid SEC configuration?
++                      struct dvbsec_config *sec = NULL;
++                      if (params->valid_sec)
++                              sec = &params->sec;
++
++                      // tune!
++                      if (dvbsec_set(params->fe,
++                                        sec,
++                                        params->channel.polarization,
++                                        (params->channel.diseqc_switch & 0x01) ? DISEQC_SWITCH_B : DISEQC_SWITCH_A,
++                                        (params->channel.diseqc_switch & 0x02) ? DISEQC_SWITCH_B : DISEQC_SWITCH_A,
++                                        &params->channel.fe_params,
++                                        0)) {
++                              fprintf(stderr, "Failed to set frontend\n");
++                              exit(1);
++                      }
++
++                      tune_state++;
++              } else if (tune_state == 1) {
++                      struct dvbfe_info result;
++                      memset(&result, 0, sizeof(result));
++                      if (dvbfe_get_info(params->fe,
++                                         FE_STATUS_PARAMS,
++                                         &result,
++                                         DVBFE_INFO_QUERYTYPE_IMMEDIATE,
++                                         0) != FE_STATUS_PARAMS) {
++                              fprintf(stderr, "Problem retrieving frontend information: %m\n");
++                      }
++
++                      fprintf(stderr, "status %c%c%c%c%c | signal %04x | snr %04x | ber %08x | unc %08x | %s\r",
++                              result.signal ? 'S' : ' ',
++                              result.carrier ? 'C' : ' ',
++                              result.viterbi ? 'V' : ' ',
++                              result.sync ? 'Y' : ' ',
++                              result.lock ? 'L' : ' ',
++                              result.signal_strength,
++                              result.snr,
++                              result.ber,
++                              result.ucblocks,
++                              result.lock ? "FE_HAS_LOCK" : "");
++                      fflush(stderr);
++
++                      if (result.lock) {
++                              tune_state++;
++                              fprintf(stderr, "\n");
++                              fflush(stderr);
++                      } else {
++                              usleep(500000);
++                      }
++              }
++
++              // is there SI data?
++              int count = poll(pollfds, 3, 100);
++              if (count < 0) {
++                      fprintf(stderr, "Poll error\n");
++                      break;
++              }
++              if (count == 0) {
++                      continue;
++              }
++
++              // PAT
++              if (pollfds[0].revents & (POLLIN|POLLPRI)) {
++                      process_pat(pat_fd, params, &pmt_fd, &pollfds[2]);
++              }
++
++              // TDT
++              if (pollfds[1].revents & (POLLIN|POLLPRI)) {
++                      process_tdt(tdt_fd);
++              }
++
++              //  PMT
++              if (pollfds[2].revents & (POLLIN|POLLPRI)) {
++                      process_pmt(pmt_fd, params);
++              }
++      }
++
++      // close demuxers
++      if (pat_fd != -1)
++              close(pat_fd);
++      if (pmt_fd != -1)
++              close(pmt_fd);
++      if (tdt_fd != -1)
++              close(tdt_fd);
++
++      return 0;
++}
++
++static void process_pat(int pat_fd, struct zap_dvb_params *params, int *pmt_fd, struct pollfd *pollfd)
++{
++      int size;
++      uint8_t sibuf[4096];
++
++      // read the section
++      if ((size = read(pat_fd, sibuf, sizeof(sibuf))) < 0) {
++              return;
++      }
++
++      // parse section
++      struct section *section = section_codec(sibuf, size);
++      if (section == NULL) {
++              return;
++      }
++
++      // parse section_ext
++      struct section_ext *section_ext = section_ext_decode(section, 0);
++      if (section_ext == NULL) {
++              return;
++      }
++      if (pat_version == section_ext->version_number) {
++              return;
++      }
++
++      // parse PAT
++      struct mpeg_pat_section *pat = mpeg_pat_section_codec(section_ext);
++      if (pat == NULL) {
++              return;
++      }
++
++      // try and find the requested program
++      struct mpeg_pat_program *cur_program;
++      mpeg_pat_section_programs_for_each(pat, cur_program) {
++              if (cur_program->program_number == params->channel.service_id) {
++                      // close old PMT fd
++                      if (*pmt_fd != -1)
++                              close(*pmt_fd);
++
++                      // create PMT filter
++                      if ((*pmt_fd = create_section_filter(params->adapter_id, params->demux_id,
++                                                           cur_program->pid, stag_mpeg_program_map)) < 0) {
++                              return;
++                      }
++                      pollfd->fd = *pmt_fd;
++                      pollfd->events = POLLIN|POLLPRI|POLLERR;
++
++                      // we have a new PMT pid
++                      ca_pmt_version = -1;
++                      break;
++              }
++      }
++
++      // remember the PAT version
++      pat_version = section_ext->version_number;
++}
++
++static void process_tdt(int tdt_fd)
++{
++      int size;
++      uint8_t sibuf[4096];
++
++      // read the section
++      if ((size = read(tdt_fd, sibuf, sizeof(sibuf))) < 0) {
++              return;
++      }
++
++      // parse section
++      struct section *section = section_codec(sibuf, size);
++      if (section == NULL) {
++              return;
++      }
++
++      // parse TDT
++      struct dvb_tdt_section *tdt = dvb_tdt_section_codec(section);
++      if (tdt == NULL) {
++              return;
++      }
++
++      // done
++      zap_ca_new_dvbtime(dvbdate_to_unixtime(tdt->utc_time));
++}
++
++static void process_pmt(int pmt_fd, struct zap_dvb_params *params)
++{
++      int size;
++      uint8_t sibuf[4096];
++
++      // read the section
++      if ((size = read(pmt_fd, sibuf, sizeof(sibuf))) < 0) {
++              return;
++      }
++
++      // parse section
++      struct section *section = section_codec(sibuf, size);
++      if (section == NULL) {
++              return;
++      }
++
++      // parse section_ext
++      struct section_ext *section_ext = section_ext_decode(section, 0);
++      if (section_ext == NULL) {
++              return;
++      }
++      if ((section_ext->table_id_ext != params->channel.service_id) ||
++          (section_ext->version_number == ca_pmt_version)) {
++              return;
++      }
++
++      // parse PMT
++      struct mpeg_pmt_section *pmt = mpeg_pmt_section_codec(section_ext);
++      if (pmt == NULL) {
++              return;
++      }
++
++      // do ca handling
++      if (zap_ca_new_pmt(pmt) == 1)
++              ca_pmt_version = pmt->head.version_number;
++}
++
++static int create_section_filter(int adapter, int demux, uint16_t pid, uint8_t table_id)
++{
++      int demux_fd = -1;
++      uint8_t filter[18];
++      uint8_t mask[18];
++
++      // open the demuxer
++      if ((demux_fd = dvbdemux_open_demux(adapter, demux, 0)) < 0) {
++              return -1;
++      }
++
++      // create a section filter
++      memset(filter, 0, sizeof(filter));
++      memset(mask, 0, sizeof(mask));
++      filter[0] = table_id;
++      mask[0] = 0xFF;
++      if (dvbdemux_set_section_filter(demux_fd, pid, filter, mask, 1, 1)) {
++              close(demux_fd);
++              return -1;
++      }
++
++      // done
++      return demux_fd;
++}
+diff -Nurd linuxtv-dvb-apps-1.1.1/util/zap/zap_dvb.h dvb-apps/util/zap/zap_dvb.h
+--- linuxtv-dvb-apps-1.1.1/util/zap/zap_dvb.h  1970-01-01 01:00:00.000000000 +0100
++++ dvb-apps/util/zap/zap_dvb.h        2009-06-21 13:29:06.000000000 +0200
+@@ -0,0 +1,41 @@
++/*
++      ZAP utility DVB functions
++
++      Copyright (C) 2004, 2005 Manu Abraham <abraham.manu@gmail.com>
++      Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
++
++      This program is free software; you can redistribute it and/or modify
++      it under the terms of the GNU Lesser General Public License as
++      published by the Free Software Foundation; either version 2.1 of
++      the License, or (at your option) any later version.
++
++      This program is distributed in the hope that it will be useful,
++      but WITHOUT ANY WARRANTY; without even the implied warranty of
++      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++      GNU Lesser General Public License for more details.
++
++      You should have received a copy of the GNU Lesser General Public
++      License along with this library; if not, write to the Free Software
++      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++*/
++
++#ifndef ZAP_DVB_H
++#define ZAP_DVB_H 1
++
++#include <libdvbcfg/dvbcfg_zapchannel.h>
++#include <libdvbsec/dvbsec_api.h>
++
++struct zap_dvb_params {
++      int adapter_id;
++      int frontend_id;
++      int demux_id;
++      struct dvbcfg_zapchannel channel;
++      struct dvbsec_config sec;
++      int valid_sec;
++      struct dvbfe_handle *fe;
++};
++
++extern int zap_dvb_start(struct zap_dvb_params *params);
++extern void zap_dvb_stop(void);
++
++#endif
diff --git a/meta-openvuplus/recipes-enigma2/dvbtools/dvb-apps_1.1.1.bb b/meta-openvuplus/recipes-enigma2/dvbtools/dvb-apps_1.1.1.bb
new file mode 100644 (file)
index 0000000..4968070
--- /dev/null
@@ -0,0 +1,112 @@
+HOMEPAGE = "http://www.linuxtv.org"
+LICENSE = "GPLv2+"
+LIC_FILES_CHKSUM = "file://COPYING;md5=751419260aa954499f7abaabaa882bbe"
+
+SRC_URI = "http://linuxtv.org/downloads/linuxtv-dvb-apps-${PV}.tar.bz2 \
+           file://update-to-trunk.diff \
+           file://update-to-tip.diff"
+
+PR = "r2"
+
+S = "${WORKDIR}/linuxtv-dvb-apps-${PV}"
+
+PACKAGES =+ "dvb-evtest dvb-evtest-dbg \
+             dvbapp-tests dvbapp-tests-dbg \
+             dvbdate dvbdate-dbg \
+             dvbtraffic dvbtraffic-dbg \
+             dvbnet dvbnet-dbg \
+             dvb-scan dvb-scan-dbg dvb-scan-data \
+             dvb-azap dvb-azap-dbg \
+             dvb-czap dvb-czap-dbg \
+             dvb-szap dvb-szap-dbg \
+             dvb-tzap dvb-tzap-dbg \
+             dvb-femon dvb-femon-dbg \
+             dvb-zap-data"
+
+
+TARGET_CC_ARCH += "${LDFLAGS} -static"
+
+FILES_${PN} = "${bindir} ${datadir}/dvb"
+FILES_${PN}-doc = ""
+FILES_${PN}-dev = "${includedir}"
+
+FILES_dvb-evtest = "${bindir}/evtest"
+FILES_dvb-evtest-dbg = "${bindir}/.debug/evtest"
+
+FILES_dvbapp-tests = "${bindir}/*test* "
+FILES_dvbapp-tests-dbg = "${bindir}/.debug/*test*"
+
+FILES_dvbdate = "${bindir}/dvbdate"
+FILES_dvbdate-dbg = "${bindir}/.debug/dvbdate"
+
+FILES_dvbtraffic = "${bindir}/dvbtraffic"
+FILES_dvbtraffic-dbg = "${bindir}/.debug/dvbtraffic"
+
+FILES_dvbnet = "${bindir}/dvbnet"
+FILES_dvbnet-dbg = "${bindir}/.debug/dvbnet"
+
+FILES_dvb-scan = "${bindir}/*scan "
+FILES_dvb-scan-dbg = "${bindir}/.debug/*scan"
+FILES_dvb-scan-data = "${docdir}/dvb-apps/scan"
+
+FILES_dvb-azap = "${bindir}/azap"
+FILES_dvb-azap-dbg = "${bindir}/.debug/azap"
+
+FILES_dvb-czap = "${bindir}/czap"
+FILES_dvb-czap-dbg = "${bindir}/.debug/czap"
+
+FILES_dvb-szap = "${bindir}/szap"
+FILES_dvb-szap-dbg = "${bindir}/.debug/szap"
+
+FILES_dvb-tzap = "${bindir}/tzap"
+FILES_dvb-tzap-dbg = "${bindir}/.debug/tzap"
+
+FILES_dvb-femon = "${bindir}/femon"
+FILES_dvb-femon-dbg = "${bindir}/.debug/femon"
+
+FILES_dvb-zap-data = "${docdir}/dvb-apps/szap"
+
+do_configure() {
+       sed -i -e s:/usr/include:${STAGING_INCDIR}:g util/av7110_loadkeys/generate-keynames.sh 
+}
+
+do_install() {
+    make DESTDIR=${D} install
+       install -d ${D}/${bindir}
+    install -d ${D}/${docdir}/dvb-apps
+    install -d ${D}/${docdir}/dvb-apps/scan
+    install -d ${D}/${docdir}/dvb-apps/szap
+       chmod a+rx ${D}/${libdir}/*.so*
+
+    # Install tests
+    install -m 0755 ${S}/test/setvoltage      ${D}${bindir}/test_setvoltage
+    install -m 0755 ${S}/test/set22k          ${D}${bindir}/test_set22k
+    install -m 0755 ${S}/test/video           ${D}${bindir}/test_video
+    install -m 0755 ${S}/test/sendburst       ${D}${bindir}/test_sendburst
+    install -m 0755 ${S}/test/diseqc          ${D}${bindir}/test_diseqc
+    install -m 0755 ${S}/test/test_sections   ${D}${bindir}/
+    install -m 0755 ${S}/test/test_av_play    ${D}${bindir}/
+    install -m 0755 ${S}/test/test_stillimage ${D}${bindir}/
+    install -m 0755 ${S}/test/test_dvr_play   ${D}${bindir}/
+    install -m 0755 ${S}/test/test_tt         ${D}${bindir}/
+    install -m 0755 ${S}/test/test_sec_ne     ${D}${bindir}/
+    install -m 0755 ${S}/test/test_stc        ${D}${bindir}/
+    install -m 0755 ${S}/test/test_av         ${D}${bindir}/
+    install -m 0755 ${S}/test/test_vevent     ${D}${bindir}/
+    install -m 0755 ${S}/test/test_pes        ${D}${bindir}/
+    install -m 0755 ${S}/test/test_dvr        ${D}${bindir}/
+
+    cp -pPR ${S}/util/szap/channels-conf* ${D}/${docdir}/dvb-apps/szap/
+    cp -pPR ${S}/util/szap/README   ${D}/${docdir}/dvb-apps/szap/
+}
+
+python populate_packages_prepend () {
+       dvb_libdir = bb.data.expand('${libdir}', d)
+       do_split_packages(d, dvb_libdir, '^lib(.*)\.so$', 'lib%s', 'DVB %s package', extra_depends='', allow_links=True)
+       do_split_packages(d, dvb_libdir, '^lib(.*)\.la$', 'lib%s-dev', 'DVB %s development package', extra_depends='${PN}-dev')
+       do_split_packages(d, dvb_libdir, '^lib(.*)\.a$', 'lib%s-dev', 'DVB %s development package', extra_depends='${PN}-dev')
+       do_split_packages(d, dvb_libdir, '^lib(.*)\.so\.*', 'lib%s', 'DVB %s library', extra_depends='', allow_links=True)
+}
+
+SRC_URI[md5sum] = "de958cdb8d00e74792dd69f3c945b037"
+SRC_URI[sha256sum] = "371f8133db705bde6c2f79cccb0b1a1f626a0d94bf41acceba5d76a69155f057"
diff --git a/meta-openvuplus/recipes-enigma2/dvbtools/dvbstream_cvs.bb b/meta-openvuplus/recipes-enigma2/dvbtools/dvbstream_cvs.bb
new file mode 100644 (file)
index 0000000..652857f
--- /dev/null
@@ -0,0 +1,18 @@
+SECTION = "console/multimedia"
+PRIORITY = "optional"
+LICENSE = "GPLV2"
+DEPENDS = "libxml2"
+SRCDATE = "20090621"
+PV = "0.0+cvs${SRCDATE}"
+
+PR = "r1"
+
+SRC_URI = "cvs://anonymous@dvbtools.cvs.sourceforge.net/cvsroot/dvbtools;module=dvbstream"
+S = "${WORKDIR}/dvbstream"
+
+CFLAGS_append = " ${LDFLAGS} -D_GNU_SOURCE"
+
+do_install() {
+       mkdir -p ${D}${bindir}
+       for i in dvbstream dumprtp ts_filter rtpfeed; do install -m 0755 $i ${D}${bindir}/; done
+}
diff --git a/meta-openvuplus/recipes-enigma2/dvbtools/dvbtune_cvs.bb b/meta-openvuplus/recipes-enigma2/dvbtools/dvbtune_cvs.bb
new file mode 100644 (file)
index 0000000..0b0715c
--- /dev/null
@@ -0,0 +1,23 @@
+SECTION = "console/multimedia"
+PRIORITY = "optional"
+LICENSE = "GPLv2"
+DEPENDS = "libxml2"
+SRCDATE = "20090621"
+PV = "0.0+cvs${SRCDATE}"
+
+SRC_URI = "cvs://anonymous@dvbtools.cvs.sourceforge.net/cvsroot/dvbtools;module=dvbtune"
+
+S = "${WORKDIR}/dvbtune"
+
+CFLAGS += "\$(shell xml2-config --cflags)"
+LDFLAGS += "\$(shell xml2-config --libs)"
+
+do_compile() {
+       oe_runmake dvbtune xml2vdr
+}
+
+do_install() {
+       mkdir -p ${D}${bindir}
+       install -m 0755 dvbtune ${D}${bindir}/
+       install -m 0755 xml2vdr ${D}${bindir}/
+}
diff --git a/meta-openvuplus/recipes-enigma2/dvbtools/wscan_20101204.bb b/meta-openvuplus/recipes-enigma2/dvbtools/wscan_20101204.bb
new file mode 100644 (file)
index 0000000..34bc652
--- /dev/null
@@ -0,0 +1,15 @@
+SUMMARY = "Wscan is a dvb channel scanner that doesn't require an initial frequency table"
+LICENSE = "GPLv2"
+PR = "r1"
+
+SRC_URI = "http://wirbel.htpc-forum.de/w_scan/w_scan-${PV}.tar.bz2"
+
+SRC_URI[md5sum] = "93c1a61992cac35d0efcf14a0ef2bd25"
+SRC_URI[sha256sum] = "1731a17317a75f9c37732654c10070acf4058b70757f762de8be05d8f5fcf838"
+
+S = "${WORKDIR}/w_scan-${PV}"
+
+inherit autotools
+
+FILES_${PN} += "${datadir}"
+
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices.bb b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices.bb
new file mode 100755 (executable)
index 0000000..45c2557
--- /dev/null
@@ -0,0 +1,20 @@
+SUMMARY = "enigma2 default services/transponder"
+LICENSE = "GPLv2"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0;md5=801f80980d171dd6425610833a22dbe6"
+
+PR = "r8"
+
+SRC_URI = "file://*"
+
+S = "${WORKDIR}"
+
+INHIBIT_PACKAGE_STRIP = "1"
+
+do_install() {
+       install -d ${D}/usr/share/enigma2/dealer
+       install ${WORKDIR}/*.info ${D}/usr/share/enigma2/dealer
+       install ${WORKDIR}/lamedb.* ${D}/usr/share/enigma2/dealer
+}
+
+FILES_${PN} = "/"
+PACKAGE_ARCH = "all"
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/lamedb.130 b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/lamedb.130
new file mode 100644 (file)
index 0000000..6748689
--- /dev/null
@@ -0,0 +1,6492 @@
+eDVB services /4/
+transponders
+00820000:1ce8:0071
+       s 12188000:27500000:1:4:130:2:0
+/
+00820000:1e78:0071
+       s 12264000:27500000:1:3:130:2:0:1:2:2:2
+/
+00820000:1edc:0071
+       s 12284000:27500000:0:4:130:2:0
+/
+00820000:3390:0071
+       s 11158000:27500000:1:4:130:2:0
+/
+00820000:2e18:00b0
+       s 10873000:27500000:1:3:130:2:0
+/
+00820000:0708:00c8
+       s 11541000:22000000:1:4:130:2:0
+/
+00820000:1770:0110
+       s 11919000:27500000:1:2:130:2:0
+/
+00820000:00c8:013e
+       s 11240000:27500000:1:3:130:2:0
+/
+00820000:012c:013e
+       s 11258000:27500000:0:3:130:2:0:1:2:2:2
+/
+00820000:0190:013e
+       s 11278000:27500000:1:3:130:2:0:1:2:0:2
+/
+00820000:01f4:013e
+       s 11296000:27500000:0:3:130:2:0
+/
+00820000:0258:013e
+       s 11317000:27500000:1:3:130:2:0
+/
+00820000:03e8:013e
+       s 11393000:27500000:1:4:130:2:0
+/
+00820000:044c:013e
+       s 11411000:27500000:0:4:130:2:0:1:2:0:2
+/
+00820000:0514:013e
+       s 11449000:27500000:0:3:130:2:0:1:2:0:2
+/
+00820000:05dc:013e
+       s 11488000:27500000:0:4:130:2:0
+/
+00820000:0640:013e
+       s 11508000:27500000:1:4:130:2:0
+/
+00820000:06a4:013e
+       s 11526000:27500000:0:3:130:2:0
+/
+00820000:1388:013e
+       s 11727000:27500000:1:3:130:2:0
+/
+00820000:13ef:013e
+       s 11747000:27500000:0:3:130:2:0
+/
+00820000:1450:013e
+       s 11766000:27500000:1:2:130:2:0
+/
+00820000:1518:013e
+       s 11804200:27500000:1:2:130:2:0
+/
+00820000:157c:013e
+       s 11823000:27500000:0:3:130:2:0
+/
+00820000:17d4:013e
+       s 11938000:29900000:0:3:130:2:0
+/
+00820000:1964:013e
+       s 12015000:27500000:0:3:130:2:0
+/
+00820000:1b58:013e
+       s 12111000:27500000:1:3:130:2:0
+/
+00820000:1bbc:013e
+       s 12130260:27500000:0:3:130:2:0:1:2:0:2
+/
+00820000:1c20:013e
+       s 12149000:27500000:1:3:130:2:0
+/
+00820000:1c84:013e
+       s 12169000:27500000:0:3:130:2:0
+/
+00820000:1e14:013e
+       s 12245000:27500000:0:3:130:2:0
+/
+00820000:1fa4:013e
+       s 12322000:27500000:0:3:130:2:0
+/
+00820000:20d0:013e
+       s 12380000:27500000:1:3:130:2:0
+/
+00820000:2134:013e
+       s 12399000:27500000:0:3:130:2:0
+/
+00820000:21fc:013e
+       s 12437000:27500000:0:3:130:2:0
+/
+00820000:2328:013e
+       s 12520000:27500000:1:3:130:2:0
+/
+00820000:24b8:013e
+       s 12597000:27500000:1:3:130:2:0
+/
+00820000:2af8:013e
+       s 10719000:27500000:1:4:130:2:0
+/
+00820000:2b5c:013e
+       s 10723000:29900000:0:3:130:2:0
+/
+00820000:2bc0:013e
+       s 10757000:27500000:1:4:130:2:0
+/
+00820000:2c88:013e
+       s 10796000:27500000:1:4:130:2:0
+/
+00820000:2cec:013e
+       s 10815000:27500000:0:4:130:2:0
+/
+00820000:2d50:013e
+       s 10834000:27500000:1:3:130:2:0:1:2:0:2
+/
+00820000:2e7c:013e
+       s 10892000:27500000:0:3:130:2:0
+/
+00820000:2f44:013e
+       s 10930160:29900000:0:3:130:2:0
+/
+00820000:2fa8:013e
+       s 10949000:27500000:1:3:130:2:0
+/
+00820000:300c:013e
+       s 10971410:29700000:0:2:130:2:0:1:2:0:2
+/
+00820000:3070:013e
+       s 10992000:27500000:1:2:130:2:0
+/
+00820000:3138:013e
+       s 11034000:27500000:1:3:130:2:0
+/
+00820000:319c:013e
+       s 11054000:27500000:0:4:130:2:0
+/
+00820000:3200:013e
+       s 11075000:27500000:1:3:130:2:0
+/
+00820000:3264:013e
+       s 11096000:29900000:0:2:130:2:0:1:2:0:2
+/
+00820000:32c8:013e
+       s 11117000:27500000:1:3:130:2:0
+/
+00820000:332c:013e
+       s 11137000:27500000:0:3:130:2:0
+/
+00820000:33f4:013e
+       s 11179000:27500000:0:3:130:2:0
+/
+00820000:3458:013e
+       s 11200000:27500000:1:4:130:2:0
+/
+00820000:3bc4:013e
+       s 11566000:27500000:0:3:130:2:0
+/
+00820000:3c28:013e
+       s 11585000:27500000:1:3:130:2:0
+/
+00820000:3c8c:013e
+       s 11604000:27500000:0:4:130:2:0
+/
+00820000:3cf0:013e
+       s 11623000:27500000:1:3:130:2:0
+/
+00820000:3d54:013e
+       s 11642500:27500000:0:3:130:2:0
+/
+00820000:3db8:013e
+       s 11662000:27500000:1:3:130:2:0
+/
+00820000:23f0:013f
+       s 12558000:27500000:1:3:130:2:0
+/
+00820000:26ac:013f
+       s 12692000:27500000:0:3:130:2:0:1:2:0:2
+/
+00820000:3e1c:013f
+       s 11681000:27500000:0:3:130:2:0:1:2:0:2
+/
+00820000:25e4:02be
+       s 12654000:27500000:0:3:130:2:0
+/
+00820000:0064:fbff
+       s 11219250:29900000:0:4:130:2:0
+/
+00820000:0320:fbff
+       s 11355080:29900000:1:4:130:2:0
+/
+00820000:14b4:fbff
+       s 11785000:29900000:0:3:130:2:0:1:2:0:2
+/
+00820000:15e0:fbff
+       s 11842000:29900000:1:3:130:2:0:1:2:0:2
+/
+00820000:1644:fbff
+       s 11861000:29900000:0:4:130:2:0
+/
+00820000:16a8:fbff
+       s 11881000:27500000:1:3:130:2:0
+/
+00820000:170c:fbff
+       s 11900000:29900000:0:4:130:2:0
+/
+00820000:1838:fbff
+       s 11958000:27500000:1:3:130:2:0
+/
+00820000:189c:fbff
+       s 11976000:29900000:0:4:130:2:0
+/
+00820000:1900:fbff
+       s 11996000:29900000:1:3:130:2:0:1:2:0:2
+/
+00820000:19c8:fbff
+       s 12034000:29900000:1:4:130:2:0
+/
+00820000:1a2c:fbff
+       s 12054000:29900000:0:4:130:2:0
+/
+00820000:1a90:fbff
+       s 12072000:29900000:1:4:130:2:0
+/
+00820000:1af4:fbff
+       s 12091900:29900000:0:3:130:2:0:1:2:0:2
+/
+00820000:1d4c:fbff
+       s 12206980:29900000:0:3:130:2:0:1:2:0:2
+/
+00820000:2008:fbff
+       s 12341000:29900000:1:3:130:2:0:1:2:0:2
+/
+00820000:206c:fbff
+       s 12360420:29900000:0:3:130:2:0:1:2:0:2
+/
+00820000:2198:fbff
+       s 12418000:29900000:1:3:130:2:0:1:2:0:2
+/
+00820000:2260:fbff
+       s 12465910:29900000:1:3:130:2:0:1:2:0:2
+/
+00820000:251c:fbff
+       s 12616000:29900000:0:4:130:2:0
+/
+00820000:2580:fbff
+       s 12635000:29900000:1:4:130:2:0
+/
+00820000:2648:fbff
+       s 12673280:29900000:1:4:130:2:0
+/
+00820000:2710:fbff
+       s 12713000:29900000:1:4:130:2:0
+/
+00820000:2774:fbff
+       s 12731000:29900000:0:3:130:2:0:1:2:0:2
+/
+00820000:2c24:fbff
+       s 10775000:29900000:0:4:130:2:0
+/
+00820000:2db4:fbff
+       s 10853440:29900000:0:4:130:2:0
+/
+0082accf:0578:013e
+       s 11471000:27500000:1:4:130:2:0
+/
+0082afc2:0065:0001
+       s 12226000:27500000:1:3:130:2:0
+/
+end
+services
+420e:00820000:3db8:013e:0:0
+
+p:
+0111:00820000:3070:013e:0:0
+
+p:
+0112:00820000:3070:013e:0:0
+
+p:
+0f66:00820000:2198:fbff:0:0
+
+p:
+0390:00820000:33f4:013e:0:0
+
+p:
+2df1:00820000:1a2c:fbff:0:0
+
+p:
+3400:00820000:2710:fbff:1:0
+Primafila 10
+p:SkyItalia
+0001:00820000:2e18:00b0:1:0
+AL MAGHRIBIA
+p:PRVDR
+0001:0082afc2:0065:0001:1:0
+RFE/RL TV 1 (HB1-8)
+p:
+0001:00820000:1770:0110:1:0
+Italia 1
+p:Mediaset
+0001:00820000:1fa4:013e:1:0
+RIT-TV
+p:EUTELSAT
+0001:00820000:25e4:02be:1:0
+SHARJAH TV
+p:ARABSAT
+1101:00820000:1644:fbff:1:0
+Doctor's Life
+p:SkyItalia
+3c01:00820000:0064:fbff:1:0
+DoveTv
+p:SkyItalia
+0002:00820000:3200:013e:1:0
+MTV Polska
+p:MTV Networks Europe
+0002:00820000:2e18:00b0:1:0
+AlAoula INTER+L
+p:PRVDR
+0002:00820000:1770:0110:1:0
+Canale 5
+p:Mediaset
+0002:00820000:25e4:02be:1:0
+QATAR TV
+p:ARABSAT
+1402:00820000:05dc:013e:1:0
+ANIMAL PLANET
+p:CYFRA +
+3402:00820000:2710:fbff:1:0
+Primafila 12
+p:SkyItalia
+3902:00820000:2648:fbff:1:0
+DIVA Universal
+p:SkyItalia
+0003:00820000:2e18:00b0:1:0
+AL Aoula
+p:PRVDR
+0003:00820000:3d54:013e:1:0
+Bloomberg European TV
+p:
+0003:00820000:1770:0110:1:0
+Rete 4
+p:Mediaset
+0003:00820000:25e4:02be:1:0
+SAUDI1
+p:ARABSAT
+3c03:00820000:0064:fbff:1:0
+LEI
+p:SkyItalia
+0004:00820000:3200:013e:1:0
+CC Family
+p:MTV Networks Europe
+0004:00820000:2e18:00b0:1:0
+ARRABIAA
+p:PRVDR
+0004:00820000:1770:0110:1:0
+Iris
+p:Mediaset
+0004:00820000:25e4:02be:1:0
+KUWAIT
+p:ARABSAT
+0104:0082afc2:0065:0001:1:0
+VOA Music Mix 260
+p:
+0005:00820000:3200:013e:1:0
+VIVA Polska
+p:MTV Networks Europe
+0005:00820000:2e18:00b0:1:0
+AL Aoula INTER
+p:PRVDR
+0005:00820000:1770:0110:1:0
+CANALE 5
+p:Mediaset
+0005:0082accf:0578:013e:1:0
+Kahkeshan TV
+p:Harmonic
+0105:0082afc2:0065:0001:1:0
+VOA Music Mix 261
+p:
+3305:00820000:0190:013e:1:0
+ESP HD Intl
+p:CYFRA +
+3405:00820000:2710:fbff:1:0
+Primafila 14
+p:SkyItalia
+0006:00820000:3200:013e:1:0
+Viacom Blink!
+p:MTV Networks Europe
+0006:00820000:2e18:00b0:1:0
+ASSADISSA
+p:PRVDR
+0006:00820000:1770:0110:1:0
+Boing
+p:Mediaset
+0006:00820000:25e4:02be:1:0
+SUDAN TV
+p:ARABSAT
+0106:0082afc2:0065:0001:1:0
+VOA Music Mix 262
+p:
+0e06:00820000:2d50:013e:1:0
+BBC HD
+p:ITI
+1206:00820000:2b5c:013e:1:0
+NPR
+p:Arqiva
+1406:00820000:05dc:013e:1:0
+CLUB TV
+p:CYFRA +
+1f06:00820000:21fc:013e:1:0
+ALKAWTHAR
+p:IRIB
+2906:00820000:1edc:0071:1:0
+Boomerang
+p:Cyfrowy Polsat S.A.
+0007:00820000:3200:013e:1:0
+VH1
+p:MTV Networks Europe
+0007:00820000:1770:0110:1:0
+La 5
+p:Mediaset
+0007:00820000:25e4:02be:1:0
+OMAN
+p:ARABSAT
+0107:0082afc2:0065:0001:1:0
+VOA Radio 263 (HB59-62)
+p:
+1307:00820000:2e7c:013e:1:0
+CANAL+
+p:CYFRA +
+1407:00820000:05dc:013e:1:0
+ZONE REALITY
+p:CYFRA +
+1f07:00820000:21fc:013e:1:0
+SAHAR 2
+p:IRIB
+3307:00820000:0190:013e:1:0
+ESP HD Turk
+p:CYFRA +
+3607:00820000:00c8:013e:1:0
+ESP Int'l
+p:Eutelsat,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861
+3c07:00820000:0064:fbff:1:0
+Boomerang
+p:SkyItalia
+0008:00820000:2e18:00b0:1:0
+Medi1 TV
+p:PRVDR
+0008:0082afc2:0065:0001:1:0
+IBB OS Download 8 (DCP)
+p:
+0008:00820000:1770:0110:1:0
+TgCom24
+p:Mediaset
+0008:00820000:25e4:02be:1:0
+ESC
+p:ARABSAT
+0108:0082afc2:0065:0001:1:0
+VOA Radio 264
+p:
+0e08:00820000:2d50:013e:1:0
+BBC Knowledge HD
+p:ITI
+1308:00820000:2e7c:013e:1:0
+CANAL+ FILM
+p:CYFRA +
+1f08:00820000:21fc:013e:1:0
+PRESS TV
+p:IRIB
+2908:00820000:1edc:0071:1:0
+Planeta FM
+p:Cyfrowy Polsat S.A.
+3308:00820000:0190:013e:1:0
+ESP HD Russian
+p:CYFRA +
+3608:00820000:00c8:013e:1:0
+ESP Romanian
+p:Eutelsat,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861
+0009:0082afc2:0065:0001:1:0
+IBB OS Download 9 (CCP)
+p:
+0009:00820000:1770:0110:1:0
+Mediaset EXTRA
+p:Harmonic
+0009:00820000:25e4:02be:1:0
+AL-IRAQIA TV
+p:ARABSAT
+0109:0082afc2:0065:0001:1:0
+VOA Radio 265 (HB61-64)
+p:
+0e09:00820000:2d50:013e:1:0
+HBO2 HD
+p:ITI
+2909:00820000:1edc:0071:1:0
+TVP Sport
+p:Cyfrowy Polsat S.A.
+3309:00820000:0190:013e:1:0
+ESP HD Dutch
+p:CYFRA +
+3609:00820000:00c8:013e:1:0
+ESP Dutch
+p:Eutelsat,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861
+4209:00820000:3db8:013e:1:0
+PUNTOSAT
+p:Telespazio
+000a:00820000:3200:013e:1:0
+Comedy Central Polska
+p:MTV Networks Europe
+000a:00820000:2e18:00b0:1:0
+ARRIADIA
+p:PRVDR
+000a:00820000:1770:0110:1:0
+Mediaset ITALIA DUE
+p:Mediaset
+000a:00820000:1388:013e:1:0
+SCT HD
+p:Harmonic
+010a:0082afc2:0065:0001:1:0
+VOA Radio 266 (HB63-64)
+p:
+0e0a:00820000:2d50:013e:1:0
+HBO COMEDY HD
+p:ITI
+110a:00820000:1644:fbff:1:0
+Sky TG24
+p:SkyItalia
+130a:00820000:2e7c:013e:1:0
+DTV CABLE KU
+p:CYFRA +
+200a:00820000:24b8:013e:1:0
+ARM_1
+p:GlobeCast
+290a:00820000:1edc:0071:1:0
+TEST I
+p:Cyfrowy Polsat S.A.
+330a:00820000:0190:013e:1:0
+ESP HD Czech
+p:CYFRA +
+360a:00820000:00c8:013e:1:0
+ESP Polish
+p:Eutelsat,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861
+390a:00820000:32c8:013e:1:0
+BBC Entertainment Poland
+p:Globecast UK
+420a:00820000:3db8:013e:1:0
+Home Tv
+p:Harmonic
+000b:00820000:3200:013e:1:0
+Nickelodeon Europe
+p:MTV Networks Europe
+000b:0082accf:0578:013e:1:0
+Somali Channel
+p:Harmonic
+010b:0082afc2:0065:0001:1:0
+VOA Radio 267 (HB65-68)
+p:
+0e0b:00820000:2d50:013e:1:0
+nPremium2
+p:ITI
+130b:00820000:2e7c:013e:1:0
+DTV CABLE AL
+p:CYFRA +
+200b:00820000:24b8:013e:1:0
+BET
+p:GlobeCast
+290b:00820000:1edc:0071:1:0
+Zone Europa
+p:Cyfrowy Polsat S.A.
+330b:00820000:0190:013e:1:0
+ESP HD German
+p:CYFRA +
+360b:00820000:00c8:013e:1:0
+ESP Russian
+p:Eutelsat,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861
+390b:00820000:32c8:013e:1:0
+BBC Knowledge Poland
+p:Globecast UK
+3a0b:00820000:1fa4:013e:1:0
+TG NORBA 24
+p:EUTELSAT
+420b:00820000:3db8:013e:1:0
+MC TELEVISION
+p:Telespazio
+000c:0082accf:0578:013e:1:0
+Royal Somali TV
+p:Harmonic
+130c:00820000:2e7c:013e:1:0
+DTV CABLE ZI
+p:CYFRA +
+200c:00820000:24b8:013e:1:0
+BBC World News
+p:GlobeCast
+290c:00820000:1edc:0071:1:0
+Polsat Jim Jam
+p:Cyfrowy Polsat S.A.
+360c:00820000:00c8:013e:1:0
+ESP Portuguese
+p:Eutelsat,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861
+390c:00820000:32c8:013e:1:0
+BBC Lifestyle Poland
+p:Globecast UK
+420c:00820000:3db8:013e:1:0
+STUDIO 100 SAT
+p:Telespazio
+010d:0082afc2:0065:0001:1:0
+VOA Radio 269
+p:
+130d:00820000:2e7c:013e:1:0
+ALE KINO+
+p:CYFRA +
+200d:00820000:24b8:013e:1:0
+RD1_Radio_ARMENIA
+p:GlobeCast
+290d:00820000:1edc:0071:1:0
+Polsat Film
+p:Cyfrowy Polsat S.A.
+330d:00820000:0190:013e:1:0
+ESP HD Portuguese
+p:CYFRA +
+340d:00820000:2710:fbff:1:0
+Primafila 8
+p:SkyItalia
+360d:00820000:00c8:013e:1:0
+ESP Hungarian
+p:Eutelsat,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861
+390d:00820000:32c8:013e:1:0
+BBC CBeebies Poland
+p:Globecast UK
+420d:00820000:3db8:013e:1:0
+LOMBARDIA SAT
+p:Harmonic
+000e:0082accf:0578:013e:1:0
+Dardasha TV
+p:Harmonic
+000e:00820000:3bc4:013e:1:0
+Wesal Haq
+p:RRSat
+010e:0082afc2:0065:0001:1:0
+VOA Radio 270 (HB65-68)
+p:
+030e:00820000:1b58:013e:1:0
+RIKSat
+p:Telespazio
+120e:00820000:2b5c:013e:1:0
+Thendral
+p:Arqiva
+130e:00820000:2e7c:013e:1:0
+ALE KINO+
+p:CYFRA +
+200e:00820000:24b8:013e:1:0
+Sonshine TV
+p:GlobeCast
+290e:00820000:1edc:0071:1:0
+TV6
+p:Cyfrowy Polsat S.A.
+330e:00820000:0190:013e:1:0
+ESP HD Polish
+p:CYFRA +
+420e:00820000:00c8:013e:1:0
+ITALIA 7
+p:LINK
+000f:0082accf:0578:013e:1:0
+Sawalef - X
+p:Harmonic
+010f:0082afc2:0065:0001:1:0
+VOA Radio 271 (HB69-72)
+p:
+030f:00820000:1b58:013e:1:0
+Class News
+p:Harmonic
+200f:00820000:24b8:013e:1:0
+Sonshine Radio
+p:GlobeCast
+290f:00820000:1edc:0071:1:0
+ATM Rozrywka TV
+p:Cyfrowy Polsat S.A.
+330f:00820000:0190:013e:1:0
+ESP HD Hungarian
+p:CYFRA +
+360f:00820000:00c8:013e:1:0
+ESP Czech
+p:Eutelsat,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861
+390f:00820000:32c8:013e:1:0
+R1
+p:Globecast UK
+420f:00820000:3db8:013e:1:0
+Primo Canale
+p:Telespazio
+0110:0082afc2:0065:0001:1:0
+VOA Radio 272 (HB71-72)
+p:
+0310:00820000:1b58:013e:1:0
+CLASS HORSE TV
+p:Telespazio
+0e10:00820000:0708:00c8:1:0
+EMPTY SERVICE
+p:M-Three satcom
+2010:00820000:24b8:013e:1:0
+1TVRUS Europe
+p:Harmonic
+3310:00820000:0190:013e:1:0
+ESP HD Bulgaria
+p:CYFRA +
+3610:00820000:00c8:013e:1:0
+ESP Greek
+p:Eutelsat,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861
+4210:00820000:3db8:013e:1:0
+Challenger
+p:Harmonic
+0e11:00820000:0708:00c8:1:0
+VIRGIN RADIO TV
+p:M-Three satcom
+1111:00820000:1644:fbff:1:0
+EasyBaby
+p:SkyItalia
+2011:00820000:24b8:013e:1:0
+CNNi
+p:GlobeCast
+2c11:00820000:1a90:fbff:1:0
+12072V SID 0x2c11
+p:DVB-S QPSK 12072V 13.0°E
+3311:00820000:0190:013e:1:0
+ESP HD Italy
+p:CYFRA +
+3611:00820000:00c8:013e:1:0
+ESP Cyprus
+p:Eutelsat,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861
+4211:00820000:3db8:013e:1:0
+Challenger T1
+p:Telespazio
+0712:0082accf:0578:013e:1:0
+TELECOLORE
+p:Harmonic
+0e12:00820000:0708:00c8:1:0
+CUBOVISION
+p:TIMB
+0e12:00820000:16a8:fbff:1:0
+Caccia e Pesca +
+p:SkyItalia
+2912:00820000:1edc:0071:1:0
+Polsat Sport News 
+p:Cyfrowy Polsat S.A.
+2c12:00820000:1a90:fbff:1:0
+12072V SID 0x2c12
+p:DVB-S QPSK 12072V 13.0°E
+3312:00820000:0190:013e:1:0
+ESP HD Romania
+p:CYFRA +
+3612:00820000:00c8:013e:1:0
+ESP Bulgarian
+p:Eutelsat,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861
+3912:00820000:32c8:013e:1:0
+CNBC PE Hot
+p:Globecast UK
+4212:00820000:3db8:013e:1:0
+Challenger T2
+p:Telespazio
+0313:00820000:1b58:013e:1:0
+TV Moda
+p:Telespazio
+2013:00820000:24b8:013e:1:0
+Euronews
+p:GlobeCast
+2913:00820000:1edc:0071:1:0
+Dla Abonentow
+p:Cyfrowy Polsat S.A.
+2c13:00820000:1a90:fbff:1:0
+12072V SID 0x2c13
+p:DVB-S QPSK 12072V 13.0°E
+3313:00820000:0190:013e:1:0
+ESP HD ECH
+p:CYFRA +
+3613:00820000:00c8:013e:1:0
+ESP2 Turk
+p:Eutelsat,C:0500,C:1803,C:0931,C:0baa,C:091f,C:0604
+4213:00820000:3db8:013e:1:0
+Canale Italia 84
+p:Telespazio
+2914:00820000:1edc:0071:1:0
+Blue Hustler
+p:Cyfrowy Polsat S.A.
+2c14:00820000:1a90:fbff:1:0
+12072V SID 0x2c14
+p:DVB-S QPSK 12072V 13.0°E
+3314:00820000:0190:013e:1:0
+ESP HD Spain
+p:CYFRA +
+3614:00820000:00c8:013e:1:0
+ESP Serbia
+p:Eutelsat,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861
+3914:00820000:32c8:013e:1:0
+Discovery ID Poland
+p:Globecast UK
+4214:00820000:3db8:013e:1:0
+Canale Italia
+p:Telespazio
+2015:00820000:24b8:013e:1:0
+JSTV 1
+p:Harmonic
+2915:00820000:1edc:0071:1:0
+12284H SID 0x2915
+p:DVB-S QPSK 12284H 13.0°E
+3315:00820000:0190:013e:1:0
+ESP HD
+p:CYFRA +
+3615:00820000:00c8:013e:1:0
+ESP Turk
+p:EUROSPORT,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861
+3915:00820000:32c8:013e:1:0
+TLC Poland
+p:Globecast UK
+0016:00820000:3200:013e:1:0
+MTV Polska.
+p:MTV Networks Europe
+1216:00820000:2b5c:013e:1:0
+RDPi Radio
+p:Arqiva
+2016:00820000:24b8:013e:1:0
+JSTV 2
+p:Harmonic
+2916:00820000:1edc:0071:1:0
+Dla Abonentow
+p:Cyfrowy Polsat S.A.
+3316:00820000:0190:013e:1:0
+ESP HD Serbia
+p:CYFRA +
+3616:00820000:00c8:013e:1:0
+ESP2 German
+p:Eutelsat,C:0500,C:1803,C:0931,C:0baa,C:091f,C:0604
+3916:00820000:32c8:013e:1:0
+KICC TV
+p:Globecast UK
+4216:00820000:3db8:013e:1:0
+The Green Channel
+p:Harmonic
+2017:00820000:24b8:013e:1:0
+WRN Russkij
+p:GlobeCast
+2917:00820000:1edc:0071:1:0
+Zlote Przeboje
+p:Cyfrowy Polsat S.A.
+3317:00820000:0190:013e:1:0
+ESP HD Greek
+p:CYFRA +
+3617:00820000:00c8:013e:1:0
+ESP2 Serbia
+p:Eutelsat,C:0500,C:1803,C:0931,C:0baa,C:091f,C:0604
+4217:00820000:3db8:013e:1:0
+STARSAT
+p:Telespazio
+0018:00820000:3200:013e:1:0
+CC Family.
+p:MTV Networks Europe
+2018:00820000:24b8:013e:1:0
+WRN English
+p:GlobeCast
+2918:00820000:1edc:0071:1:0
+Travel
+p:Cyfrowy Polsat S.A.
+3318:00820000:0190:013e:1:0
+EUROSPORT HD PL
+p:CYFRA +
+3618:00820000:00c8:013e:1:0
+ESP Biava
+p:Eutelsat,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861
+0019:00820000:3200:013e:1:0
+VIVA Polska.
+p:MTV Networks Europe
+2019:00820000:24b8:013e:1:0
+WRN Deutsch
+p:GlobeCast
+2919:00820000:1edc:0071:1:0
+Superstacja
+p:Cyfrowy Polsat S.A.
+3319:00820000:0190:013e:1:0
+EUROSPORT HD 
+p:CYFRA +
+3619:00820000:00c8:013e:1:0
+France 24 (en Francais)
+p:Eutelsat
+4219:00820000:3db8:013e:1:0
+CANALE D ASTE
+p:Harmonic
+011a:0082afc2:0065:0001:1:0
+Sawa Levant Radio 282
+p:
+0e1a:00820000:16a8:fbff:1:0
+Marcopolo
+p:SkyItalia
+141a:00820000:05dc:013e:1:0
+11488H SID 0x141a
+p:DVB-S QPSK 11488H 13.0°E
+201a:00820000:24b8:013e:1:0
+WRN Francais
+p:GlobeCast
+331a:00820000:0190:013e:1:0
+EUROSPORT HD 
+p:CYFRA +
+361a:00820000:00c8:013e:1:0
+France 24 (in English)
+p:Eutelsat
+011b:0082afc2:0065:0001:1:0
+Sawa Iraq Radio 283
+p:
+0e1b:00820000:0708:00c8:1:0
+Jewels Sorg3
+p:M-Three satcom
+0e1b:00820000:16a8:fbff:1:0
+Alice
+p:SkyItalia
+121b:00820000:2b5c:013e:1:0
+Radio A1
+p:Harmonic
+451b:00820000:0258:013e:1:0
+Il Sole
+p:Arqiva
+071c:0082accf:0578:013e:1:0
+LA NUOVA TV
+p:Harmonic
+0e1c:00820000:0708:00c8:1:0
+Jewels Sorg2
+p:M-Three satcom
+0e1c:00820000:16a8:fbff:1:0
+Leonardo
+p:SkyItalia
+1d1c:00820000:2fa8:013e:1:0
+ANB
+p:Globecast UK
+201c:00820000:24b8:013e:1:0
+RCI 3
+p:GlobeCast
+231c:00820000:00c8:013e:1:0
+Antenna 3 Nordest
+p:LINK
+3c1c:00820000:0064:fbff:1:0
+Matchmusic
+p:SkyItalia
+0c1d:00820000:1e78:0071:1:0
+Polsat Sport HD
+p:Cyfrowy Polsat S.A.
+0e1d:00820000:0708:00c8:1:0
+Jewels Sorg1
+p:M-Three satcom
+201d:00820000:24b8:013e:1:0
+Family Europe
+p:GlobeCast
+251d:00820000:13ef:013e:1:0
+Dubai TV
+p:Du
+331d:00820000:0190:013e:1:0
+ESP HD test D
+p:CYFRA +
+001e:00820000:3200:013e:1:0
+Comedy Central Polska.
+p:MTV Networks Europe
+001e:0082accf:0578:013e:1:0
+Nick Jr.
+p:Harmonic
+0c1e:00820000:1e78:0071:1:0
+Polsat Sport HD
+p:Cyfrowy Polsat S.A.
+0e1e:00820000:0708:00c8:1:0
+LA7
+p:TIMB
+201e:00820000:24b8:013e:1:0
+RCI 2
+p:Harmonic
+251e:00820000:13ef:013e:1:0
+Dubai Sports 3
+p:Du
+341e:00820000:2710:fbff:1:0
+Primafila 27
+p:SkyItalia
+001f:0082accf:0578:013e:1:0
+Nickelodeon HD
+p:Harmonic
+0c1f:00820000:1e78:0071:1:0
+FoxLife HD
+p:Cyfrowy Polsat S.A.
+0e1f:00820000:0708:00c8:1:0
+NOELLO SAT
+p:M-Three satcom
+201f:00820000:24b8:013e:1:0
+RCI 1
+p:GlobeCast
+251f:00820000:13ef:013e:1:0
+Sama Dubai
+p:Du
+0e20:00820000:0708:00c8:1:0
+Telelombardia
+p:M-Three satcom,C:0919,C:093b,C:09cd
+1d20:00820000:2fa8:013e:1:0
+Al Hiwar
+p:Globecast UK
+0321:00820000:3bc4:013e:1:0
+TBN Europe
+p:OVERON
+0c21:00820000:1e78:0071:1:0
+HBO HD
+p:Cyfrowy Polsat S.A.
+1d21:00820000:2fa8:013e:1:0
+CN/TCM
+p:Globecast UK
+2021:00820000:24b8:013e:1:0
+IBC TAMIL RADIO
+p:GlobeCast
+3421:00820000:2710:fbff:1:0
+Primafila 23
+p:SkyItalia
+0122:0082afc2:0065:0001:1:0
+Yamal 290
+p:
+0322:00820000:3bc4:013e:1:0
+TBNEspain
+p:GCE
+0c22:00820000:1e78:0071:1:0
+TVP 2 HD
+p:Cyfrowy Polsat S.A
+0e22:00820000:0708:00c8:1:0
+Trentino TV
+p:M-Three satcom
+1c22:00820000:1c20:013e:1:0
+Tunisie Nationale
+p:AH-EDP
+3422:00820000:2710:fbff:1:0
+Primafila 25
+p:SkyItalia
+4222:00820000:3db8:013e:1:0
+BLU 2
+p:Telespazio
+0123:0082afc2:0065:0001:1:0
+Sawa Gulf Radio 291
+p:
+0323:00820000:3bc4:013e:1:0
+TBN ITALIA
+p:OVERON
+0c23:00820000:1e78:0071:1:0
+Polsat HD
+p:Cyfrowy Polsat S.A.
+0e23:00820000:0708:00c8:1:0
+LA7ondemand
+p:TIMB
+1123:00820000:1644:fbff:1:0
+Sky TG24
+p:SkyItalia
+1d23:00820000:2fa8:013e:1:0
+DMC TV
+p:Globecast UK
+2023:00820000:24b8:013e:1:0
+Service 8227
+p:GlobeCast
+2923:00820000:1edc:0071:1:0
+Radio ZET
+p:Cyfrowy Polsat S.A.
+3423:00820000:2710:fbff:1:0
+Primafila 26
+p:SkyItalia
+4223:00820000:3db8:013e:1:0
+REDLIGHT PROMO
+p:Telespazio
+0124:0082afc2:0065:0001:1:0
+Sawa N. Africa Radio 292
+p:
+0324:00820000:3bc4:013e:1:0
+Church Channel
+p:GCE
+0c24:00820000:1e78:0071:1:0
+Polsat Sport Extra HD
+p:Cyfrowy Polsat S.A.
+1d24:00820000:2fa8:013e:1:0
+Miracle TV
+p:Globecast UK
+2024:00820000:24b8:013e:1:0
+The Voice
+p:GlobeCast
+2524:00820000:13ef:013e:1:0
+PMC
+p:Du
+2924:00820000:1edc:0071:1:0
+RMF Classic
+p:Cyfrowy Polsat S.A.
+2c24:00820000:251c:fbff:1:0
+Cinema 1 HD
+p:SkyItalia
+4224:00820000:3db8:013e:1:0
+Redlight 3D-HD
+p:Telespazio
+0325:00820000:3bc4:013e:1:0
+JCTV
+p:TandbergTV
+0c25:00820000:1e78:0071:1:0
+AXN HD
+p:Cyfrowy Polsat SA
+0e25:00820000:0708:00c8:1:0
+QVC
+p:M-Three satcom
+2025:00820000:24b8:013e:1:0
+Radio Jahani
+p:GlobeCast
+2c25:00820000:251c:fbff:1:0
+Sky Calcio 3 HD
+p:SkyItalia
+4225:00820000:3db8:013e:1:0
+HUSTLER HD-3D
+p:Telespazio
+0126:0082afc2:0065:0001:1:0
+VOA and RFA Asia 294
+p:
+0326:00820000:3bc4:013e:1:0
+EL SHAFAA
+p:OVERON
+0726:0082accf:0578:013e:1:0
+LA9
+p:Harmonic
+0c26:00820000:1e78:0071:1:0
+Cinemax 2 HD
+p:Cyfrowy Polsat S.A.
+0e26:00820000:0708:00c8:1:0
+DAS ERSTE
+p:M-Three satcom
+1d26:00820000:2fa8:013e:1:0
+iLike TV
+p:Globecast UK
+2026:00820000:24b8:013e:1:0
+WRN Special
+p:GlobeCast
+2526:00820000:13ef:013e:1:0
+Sharqiya
+p:Du
+2926:00820000:1edc:0071:1:0
+Test
+p:Cyfrowy Polsat S.A.
+2c26:00820000:251c:fbff:1:0
+Discovery HD
+p:SkyItalia
+0127:0082afc2:0065:0001:1:0
+VOA Radio 295 (HB89-92)
+p:
+0327:00820000:3bc4:013e:1:0
+TBN Russia
+p:Overon
+0c27:00820000:1e78:0071:1:0
+FOX HD
+p:Cyfrowy Polsat S.A.
+0e27:00820000:0708:00c8:1:0
+POLO TV
+p:M-Three satcom
+1327:00820000:33f4:013e:1:0
+Al Malakoot
+p:Harmonic
+1d27:00820000:2fa8:013e:1:0
+Al Forat
+p:Globecast UK
+2027:00820000:24b8:013e:1:0
+Thamizhamutham Radio
+p:GlobeCast
+2527:00820000:13ef:013e:1:0
+AL BAGHDADIA 2
+p:Du
+2927:00820000:1edc:0071:1:0
+Trójka - PR
+p:Cyfrowy Polsat S.A.
+2c27:00820000:251c:fbff:1:0
+Sportitalia
+p:SkyItalia
+3427:00820000:2710:fbff:1:0
+Primafila 24
+p:SkyItalia
+4227:00820000:3db8:013e:1:0
+Roma Sat
+p:Harmonic
+0028:00820000:25e4:02be:1:0
+JORDAN TV
+p:ARABSAT
+0128:0082afc2:0065:0001:1:0
+VOA and Sawa Radio 296
+p:
+0328:00820000:3bc4:013e:1:0
+Smile of a Child
+p:TandbergTV
+0c28:00820000:1e78:0071:1:0
+Polsat Sport Extra HD
+p:Cyfrowy Polsat S.A
+0e28:00820000:0708:00c8:1:0
+PHYSIQUE TV
+p:M-Three satcom
+1328:00820000:33f4:013e:1:0
+Al Karma TV-ME
+p:Telespazio
+1d28:00820000:2fa8:013e:1:0
+Al Fady
+p:Globecast UK
+2928:00820000:1edc:0071:1:0
+Radio PIN 102FM
+p:Cyfrowy Polsat S.A.
+2c28:00820000:251c:fbff:1:0
+myDeejay
+p:SkyItalia
+3628:00820000:00c8:013e:1:0
+EUROSPORT2 PL
+p:Eutelsat,C:0500,C:0100,C:1803,C:0baa,C:1813,C:1861
+4228:00820000:3db8:013e:1:0
+Roma Sat
+p:Harmonic
+0029:00820000:25e4:02be:1:0
+ALMUSTAKILLA
+p:ARABSAT
+0129:0082afc2:0065:0001:1:0
+Sawa Sudan Radio 297
+p:
+0329:00820000:3bc4:013e:1:0
+NEJAT TV
+p:OVERON
+0e29:00820000:0708:00c8:1:0
+HSE24
+p:
+1329:00820000:33f4:013e:1:0
+Channel  One Tv
+p:Harmonic
+2029:00820000:24b8:013e:1:0
+Family Int 1
+p:GlobeCast
+2529:00820000:13ef:013e:1:0
+Al-Arabiya
+p:Du 
+2929:00820000:1edc:0071:1:0
+Jedynka - PR
+p:Cyfrowy Polsat S.A.
+2c29:00820000:251c:fbff:1:0
+12616H SID 0x2c29
+p:DVB-S QPSK 12616H 13.0°E
+3629:00820000:00c8:013e:1:0
+EUROSPORT PL
+p:Eutelsat,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861
+4229:00820000:3db8:013e:1:0
+Roma Sat
+p:Harmonic
+002a:00820000:25e4:02be:1:0
+SAUDI-QURAN
+p:ARABSAT
+0e2a:00820000:0708:00c8:1:0
+DeeJayTV
+p:Rete A 1,C:09cd,C:0919,C:093b,C:183d
+112a:00820000:1644:fbff:1:0
+11861H SID 0x112a
+p:DVB-S QPSK 11861H 13.0°E
+1d2a:00820000:2fa8:013e:1:0
+Disney Channel
+p:Globecast UK
+202a:00820000:24b8:013e:1:0
+Family Int 2
+p:GlobeCast
+292a:00820000:1edc:0071:1:0
+RMF FM
+p:Cyfrowy Polsat S.A.
+2c2a:00820000:251c:fbff:1:0
+Sportitalia2
+p:SkyItalia
+342a:00820000:2710:fbff:1:0
+Primafila 23
+p:SkyItalia
+422a:00820000:3db8:013e:1:0
+Roma Sat
+p:Harmonic
+012b:0082afc2:0065:0001:1:0
+Sawa Lebanon Radio 299
+p:
+1d2b:00820000:2fa8:013e:1:0
+Cartoon Network
+p:Globecast UK
+252b:00820000:13ef:013e:1:0
+MBC MAGHREB AL ARABIA
+p:Du
+2c2b:00820000:251c:fbff:1:0
+NationalGeo HD
+p:SkyItalia
+422b:00820000:3db8:013e:1:0
+Roma Sat
+p:Telespazio
+1d2c:00820000:2fa8:013e:1:0
+Turner Classic Movies
+p:Globecast UK
+2c2c:00820000:251c:fbff:1:0
+12616H SID 0x2c2c
+p:DVB-S QPSK 12616H 13.0°E
+342c:00820000:2710:fbff:1:0
+Playjam
+p:SkyItalia
+422c:00820000:3db8:013e:1:0
+Passione Pesca
+p:Harmonic
+012d:00820000:3e1c:013f:1:0
+TF1 HD
+p:Eutelsat
+012d:00820000:157c:013e:1:0
+R1
+p:NetMed
+032d:00820000:3bc4:013e:1:0
+ChildRussia
+p:Overon
+1d2d:00820000:2fa8:013e:1:0
+Virgin Radio TV
+p:Globecast UK
+202d:00820000:24b8:013e:1:0
+WRN Events
+p:GlobeCast
+2c2d:00820000:251c:fbff:1:0
+Sky Supercalcio HD
+p:SkyItalia
+332d:00820000:3390:0071:1:0
+Polsat
+p:Cyfrowy Polsat S.A.
+012e:00820000:3e1c:013f:1:0
+France 2 HD
+p:Eutelsat
+012e:00820000:157c:013e:1:0
+R2
+p:NetMed
+0e2e:00820000:16a8:fbff:1:0
+Alice
+p:SkyItalia
+132e:00820000:33f4:013e:1:0
+TELEPADREPIO
+p:Telespazio
+1d2e:00820000:2fa8:013e:1:0
+Sat 7 Pars
+p:Globecast UK
+2c2e:00820000:251c:fbff:1:0
+Baby TV
+p:SkyItalia
+332e:00820000:3390:0071:1:0
+Polsat Play
+p:Cyfrowy Polsat S.A.
+012f:00820000:3e1c:013f:1:0
+France 3
+p:Eutelsat
+012f:00820000:157c:013e:1:0
+R3
+p:NetMed
+032f:00820000:3bc4:013e:1:0
+NOOR TV
+p:Overon
+0c2f:00820000:1e78:0071:1:0
+History HD
+p:Cyfrowy Polsat S.A.
+0e2f:00820000:16a8:fbff:1:0
+Leonardo
+p:SkyItalia
+1d2f:00820000:2fa8:013e:1:0
+Velayat TV
+p:Globecast UK
+252f:00820000:13ef:013e:1:0
+CH 33
+p:du
+2c2f:00820000:251c:fbff:1:0
+Sky Calcio Info
+p:SkyItalia
+332f:00820000:3390:0071:1:0
+TV4
+p:Cyfrowy Polsat S.A.
+0130:00820000:157c:013e:1:0
+R4
+p:NetMed
+0730:0082accf:0578:013e:1:0
+TELENOVA
+p:Harmonic
+0c30:00820000:1e78:0071:1:0
+12264V SID 0xc30
+p:DVB-S2 8PSK 12264V 13.0°E
+1330:00820000:33f4:013e:1:0
+TEF CHANNEL
+p:Harmonic
+1d30:00820000:2fa8:013e:1:0
+Karbala Satellite Channel
+p:Globecast UK
+2030:00820000:24b8:013e:1:0
+WRN Sawt Al Alam
+p:GlobeCast
+2c30:00820000:251c:fbff:1:0
+AXN HD
+p:SkyItalia
+3330:00820000:3390:0071:1:0
+Polsat Sport
+p:Cyfrowy Polsat S.A.
+0131:00820000:3e1c:013f:1:0
+France 5
+p:Eutelsat
+0331:00820000:3bc4:013e:1:0
+ICC
+p:Overon
+0e31:00820000:16a8:fbff:1:0
+Marcopolo
+p:SkyItalia
+2031:00820000:24b8:013e:1:0
+Radio Al Mahabba
+p:GlobeCast
+2c31:00820000:251c:fbff:1:0
+DeAJunior
+p:SkyItalia
+3331:00820000:3390:0071:1:0
+Polsat Sport Extra
+p:Cyfrowy Polsat S.A.
+3431:00820000:2710:fbff:1:0
+Primafila 25
+p:SkyItalia
+4231:00820000:3db8:013e:1:0
+PDF_TV
+p:Harmonic
+0132:00820000:3e1c:013f:1:0
+M6 HD
+p:Eutelsat
+0132:00820000:157c:013e:1:0
+R5
+p:NetMed
+0332:00820000:3bc4:013e:1:0
+El Shadai TV (ETV)
+p:RRSat
+1132:00820000:2af8:013e:1:0
+Movies24
+p:CYFRA +
+1d32:00820000:2fa8:013e:1:0
+Al Maaref
+p:Globecast UK
+2c32:00820000:251c:fbff:1:0
+Sky Calcio 2 HD
+p:SkyItalia
+3332:00820000:3390:0071:1:0
+Polsat Cafe
+p:Cyfrowy Polsat S.A.
+3432:00820000:2710:fbff:1:0
+Primafila 26
+p:SkyItalia
+4232:00820000:3db8:013e:1:0
+Studio Europa
+p:Harmonic
+0133:00820000:3e1c:013f:1:0
+Arte HD
+p:Eutelsat
+0133:00820000:157c:013e:1:0
+R6
+p:NetMed
+2c33:00820000:251c:fbff:1:0
+VideoItalia
+p:SkyItalia
+3333:00820000:3390:0071:1:0
+TV Biznes
+p:Cyfrowy Polsat S.A.
+3433:00820000:2710:fbff:1:0
+Primafila 27
+p:SkyItalia
+0134:00820000:3e1c:013f:1:0
+Direct 8
+p:Eutelsat
+0134:0082afc2:0065:0001:1:0
+Darfur/Egypt Mono 308
+p:
+0134:00820000:157c:013e:1:0
+novasports1 Cy
+p:NetMed
+0834:00820000:3d54:013e:1:0
+ERTSAT Europe
+p:
+1134:00820000:2af8:013e:1:0
+4fun.TV
+p:CYFRA +
+1c34:00820000:1c20:013e:1:0
+Khabar TV
+p:AH-EDP
+2c34:00820000:251c:fbff:1:0
+Sky Sport 1 HD
+p:SkyItalia
+3334:00820000:3390:0071:1:0
+Test F
+p:Cyfrowy Polsat S.A.
+3a34:00820000:1fa4:013e:1:0
+Sport Klub
+p:Eutelsat
+0135:00820000:3e1c:013f:1:0
+W9
+p:Eutelsat
+0135:0082afc2:0065:0001:1:0
+Yamal 309
+p:
+0335:00820000:3bc4:013e:1:0
+Wesal TV
+p:RRSat
+1235:00820000:2b5c:013e:1:0
+Wedding TV
+p:Arqiva
+2935:00820000:1edc:0071:1:0
+RMF MAXXX
+p:Cyfrowy Polsat S.A.
+2c35:00820000:251c:fbff:1:0
+Eurosport HD
+p:SkyItalia
+3335:00820000:3390:0071:1:0
+Polsat News
+p:Cyfrowy Polsat S.A.
+3435:00820000:2710:fbff:1:0
+Primafila 24
+p:SkyItalia
+3635:00820000:00c8:013e:1:0
+ESP2 NE Intl
+p:Eutelsat,C:0500,C:0100,C:1803,C:0baa,C:1813,C:1861
+3a35:00820000:1fa4:013e:1:0
+UNIVERSAL
+p:EUTELSAT
+4235:00820000:3db8:013e:1:0
+OITN
+p:Harmonic
+0136:00820000:3e1c:013f:1:0
+TMC
+p:Eutelsat
+0336:00820000:3bc4:013e:1:0
+FEED
+p:RRSat
+1136:00820000:2af8:013e:1:0
+PLANETE+
+p:CYFRA +
+1c36:00820000:1c20:013e:1:0
+LIDER TV AZERBAIJAN
+p:AH-EDP
+2036:00820000:24b8:013e:1:0
+Voice of Russia
+p:GlobeCast
+2136:00820000:3070:013e:1:0
+Rai Movie
+p:RAI
+2c36:00820000:251c:fbff:1:0
+Comedy Central
+p:SkyItalia
+3336:00820000:3390:0071:1:0
+Polsat2
+p:Cyfrowy Polsat S.A.
+3636:00820000:00c8:013e:1:0
+ESP2 NE Polish
+p:Eutelsat,C:0500,C:0100,C:1803,C:0baa,C:1813,C:1861
+3a36:00820000:1fa4:013e:1:0
+SCI FI
+p:EUTELSAT
+4236:00820000:3db8:013e:1:0
+20TV
+p:Telespazio
+0137:00820000:3e1c:013f:1:0
+NT1
+p:Eutelsat
+1137:00820000:2af8:013e:1:0
+MINIMINI+
+p:CYFRA +
+2c37:00820000:251c:fbff:1:0
+La7
+p:SkyItalia
+3637:00820000:00c8:013e:1:0
+ESP2 NE Bulgarian
+p:Eutelsat,C:0500,C:0100,C:1803,C:0baa,C:1813,C:1861
+4237:00820000:3db8:013e:1:0
+TV Luna
+p:Telespazio
+0138:00820000:3e1c:013f:1:0
+NRJ12
+p:Eutelsat
+1c38:00820000:1c20:013e:1:0
+CCTV4
+p:AH-EDP
+2938:00820000:1edc:0071:1:0
+Disney Junior
+p:Cyfrowy Polsat S.A
+2c38:00820000:251c:fbff:1:0
+Nickelodeon
+p:SkyItalia
+3638:00820000:00c8:013e:1:0
+ESP2 NE Serbian
+p:Eutelsat,C:0500,C:0100,C:1803,C:0baa,C:1813,C:1861
+0139:00820000:3e1c:013f:1:0
+LCP
+p:Eutelsat
+0e39:00820000:16a8:fbff:1:0
+NationalGeo
+p:SkyItalia
+1139:00820000:2af8:013e:1:0
+HISTORY
+p:CYFRA +
+1339:00820000:33f4:013e:1:0
+GBR
+p:Telespazio
+2939:00820000:1edc:0071:1:0
+12284H SID 0x2939
+p:DVB-S QPSK 12284H 13.0°E
+3639:00820000:00c8:013e:1:0
+ESP2 NE Czech
+p:Eutelsat,C:0500,C:0100,C:1803,C:0baa,C:1813,C:1861
+013a:00820000:3e1c:013f:1:0
+France 4
+p:Eutelsat
+073a:0082accf:0578:013e:1:0
+VENETOLINK
+p:Harmonic
+113a:00820000:2af8:013e:1:0
+RODIN TV
+p:CYFRA +
+133a:00820000:33f4:013e:1:0
+Cancao Nova Interna
+p:Harmonic
+293a:00820000:1edc:0071:1:0
+12284H SID 0x293a
+p:DVB-S QPSK 12284H 13.0°E
+2c3a:00820000:251c:fbff:1:0
+Milan Channel
+p:SkyItalia
+363a:00820000:00c8:013e:1:0
+ESP2 NE Danish
+p:Eutelsat,C:0500,C:0100,C:1803,C:0baa,C:1813,C:1861
+113b:00820000:2af8:013e:1:0
+Water Planet
+p:CYFRA +
+133b:00820000:33f4:013e:1:0
+CTV AP
+p:Harmonic
+293b:00820000:1edc:0071:1:0
+12284H SID 0x293b
+p:DVB-S QPSK 12284H 13.0°E
+363b:00820000:00c8:013e:1:0
+ESP2 NE Russian
+p:Eutelsat,C:0500,C:0100,C:1803,C:0baa,C:1813,C:1861
+013c:00820000:157c:013e:1:0
+Disney XD
+p:NetMed
+073c:0082accf:0578:013e:1:0
+EOS NETWORK
+p:Harmonic
+133c:00820000:33f4:013e:1:0
+Al Anwar
+p:Telespazio
+293c:00820000:1edc:0071:1:0
+Dla Abonentow
+p:Cyfrowy Polsat S.A.
+2c3c:00820000:251c:fbff:1:0
+Primafila 1 HD
+p:SkyItalia
+363c:00820000:00c8:013e:1:0
+ESP2 NE Swedish
+p:Eutelsat,C:0500,C:0100,C:1803,C:0baa,C:1813,C:1861
+013d:00820000:157c:013e:1:0
+novacinema1
+p:NetMed
+073d:0082accf:0578:013e:1:0
+BLU LIVE
+p:Harmonic
+113d:00820000:2af8:013e:1:0
+CANAL+ GOL
+p:CYFRA +
+133d:00820000:33f4:013e:1:0
+TRSP
+p:Telespazio
+293d:00820000:1edc:0071:1:0
+Dla Abonentow
+p:Cyfrowy Polsat
+2c3d:00820000:251c:fbff:1:0
+Fox HD
+p:SkyItalia
+363d:00820000:00c8:013e:1:0
+ESP ECH
+p:Eutelsat,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861
+013e:00820000:157c:013e:1:0
+novasports1
+p:NetMed
+113e:00820000:2af8:013e:1:0
+CANAL+ WEEKEND
+p:CYFRA +
+123e:00820000:2b5c:013e:1:0
+Zagros
+p:Arqiva
+2c3e:00820000:251c:fbff:1:0
+Fox Crime HD
+p:SkyItalia
+363e:00820000:00c8:013e:1:0
+ESP2 NE UPC
+p:Eutelsat,C:0500,C:0100,C:1803,C:0baa,C:1813,C:1861
+3a3e:00820000:1fa4:013e:1:0
+Sport Klub POL
+p:Eutelsat
+013f:00820000:157c:013e:1:0
+MEGA
+p:NetMed
+073f:0082accf:0578:013e:1:0
+Italiamia
+p:Harmonic
+133f:00820000:33f4:013e:1:0
+Telemarket
+p:Telespazio
+213f:00820000:3070:013e:1:0
+Rai 1
+p:RAI
+2c3f:00820000:251c:fbff:1:0
+Sky Calcio 6 HD
+p:SkyItalia
+363f:00820000:00c8:013e:1:0
+ESP2 NE Hungary
+p:Eutelsat,C:0500,C:0100,C:1803,C:0baa,C:1813,C:1861
+3a3f:00820000:1fa4:013e:1:0
+UNIVERSAL POL
+p:EUTELSAT
+0140:00820000:157c:013e:1:0
+ANT-1
+p:NetMed
+0740:0082accf:0578:013e:1:0
+ARTE OGGI TV
+p:Harmonic
+1340:00820000:33f4:013e:1:0
+ERDE UND MENSCH
+p:Telespazio
+2140:00820000:3070:013e:1:0
+Rai 2
+p:RAI
+2c40:00820000:251c:fbff:1:0
+Sky Calcio 7 HD
+p:SkyItalia
+3640:00820000:00c8:013e:1:0
+ESP2 NE Romania
+p:Eutelsat,C:0500,C:0100,C:1803,C:0baa,C:1813,C:1861
+3a40:00820000:1fa4:013e:1:0
+SCI FI POL
+p:EUTELSAT
+0141:00820000:157c:013e:1:0
+STAR
+p:NetMed
+0741:0082accf:0578:013e:1:0
+ASO SAT
+p:Harmonic
+1241:00820000:2b5c:013e:1:0
+RTB Virgilio
+p:Arqiva
+1341:00820000:33f4:013e:1:0
+ITALIA 8
+p:Harmonic
+2141:00820000:3070:013e:1:0
+Rai 3
+p:RAI
+2c41:00820000:251c:fbff:1:0
+Sky Calcio 8 HD
+p:SkyItalia
+3641:00820000:00c8:013e:1:0
+ESP UPC
+p:Eutelsat,C:0500,C:0b01,C:1803,C:0100,C:0931,C:0604,C:0baa,C:1813,C:1861
+0142:00820000:157c:013e:1:0
+nova CLASSICS
+p:NetMed
+1242:00820000:2b5c:013e:1:0
+Ariana Afghanistan
+p:Arqiva
+1342:00820000:33f4:013e:1:0
+Kanal Hayat
+p:Telespazio
+2142:00820000:3070:013e:1:0
+Rai 4
+p:RAI
+2c42:00820000:251c:fbff:1:0
+Sky Calcio 4 HD
+p:SkyItalia
+3342:00820000:3390:0071:1:0
+Polsat Play
+p:Cyfrowy Polsat S.A.
+3642:00820000:00c8:013e:1:0
+ESP2 NE Norwegian
+p:Eutelsat,C:0500,C:0100,C:1803,C:0baa,C:1813,C:1861
+0143:00820000:157c:013e:1:0
+novasports7
+p:NetMed
+1243:00820000:2b5c:013e:1:0
+Andisheh TV
+p:Arqiva
+1343:00820000:33f4:013e:1:0
+Payam-E-Afghan
+p:Telespazio
+1f43:00820000:319c:013e:1:0
+RTL CH
+p:MEDIA BROADCAST,C:0d02
+2c43:00820000:251c:fbff:1:0
+Sky Uno HD
+p:SkyItalia
+3643:00820000:00c8:013e:1:0
+ESP2 NE Dutch
+p:Eutelsat,C:0500,C:0100,C:1803,C:0baa,C:1813,C:1861
+0144:00820000:157c:013e:1:0
+R13
+p:NetMed
+0744:0082accf:0578:013e:1:0
+CIAO SKY 899
+p:Harmonic
+1244:00820000:2b5c:013e:1:0
+AHL-E-BAIT TV
+p:Arqiva
+1f44:00820000:319c:013e:1:0
+RTL 2 CH
+p:MEDIA BROADCAST
+2144:00820000:3070:013e:1:0
+Rai News
+p:RAI
+2c44:00820000:251c:fbff:1:0
+Sky Calcio 5 HD
+p:SkyItalia
+0145:00820000:157c:013e:1:0
+ALPHA TV
+p:NetMed
+1245:00820000:2b5c:013e:1:0
+Hope Channel
+p:Arqiva
+1345:00820000:33f4:013e:1:0
+RTA
+p:Harmonic
+2c45:00820000:251c:fbff:1:0
+Cinema +1 HD
+p:SkyItalia
+0146:00820000:157c:013e:1:0
+novasports4
+p:NetMed
+1246:00820000:2b5c:013e:1:0
+Didar Global TV
+p:Arqiv
+1346:00820000:33f4:013e:1:0
+Armenia TV
+p:Telespazio
+2c46:00820000:251c:fbff:1:0
+Cinema +24 HD
+p:SkyItalia
+3346:00820000:3390:0071:1:0
+Polsat Cafe
+p:Cyfrowy Polsat S.A.
+0147:00820000:157c:013e:1:0
+novasports4 Cy
+p:NetMed
+1147:00820000:2af8:013e:1:0
+ CANAL+ GOL
+p:CYFRA +
+1347:00820000:33f4:013e:1:0
+ACM Channel
+p:Telespazio
+2c47:00820000:251c:fbff:1:0
+CinemaFamilyHD
+p:SkyItalia
+0148:00820000:157c:013e:1:0
+novasports7 Cy
+p:NetMed
+2c48:00820000:251c:fbff:1:0
+Cinema Classics HD
+p:SkyItalia
+0149:00820000:157c:013e:1:0
+novacinema1 Cy
+p:NetMed
+0749:0082accf:0578:013e:1:0
+DF
+p:Satlink
+1349:00820000:33f4:013e:1:0
+20 TV
+p:Telespazio
+2c49:00820000:251c:fbff:1:0
+Cinema Passion HD
+p:SkyItalia
+3349:00820000:3390:0071:1:0
+Polsat News
+p:Cyfrowy Polsat S.A.
+2c4a:00820000:251c:fbff:1:0
+Cinema Comedy HD
+p:SkyItalia
+0d4b:00820000:1450:013e:1:0
+Rai 3 TGR FVG
+p:Rai
+134b:00820000:33f4:013e:1:0
+Kentron Tv
+p:Telespazio
+144b:00820000:05dc:013e:1:0
+p:CYFRA +
+1f4b:00820000:319c:013e:1:0
+ZDF
+p:MEDIA BROADCAST
+2c4b:00820000:251c:fbff:1:0
+Cinema Max +1 HD
+p:SkyItalia
+0d4c:00820000:1450:013e:1:0
+RaiMed
+p:RAI
+134c:00820000:33f4:013e:1:0
+EUROSPORT 3D
+p:Telespazio
+2c4c:00820000:251c:fbff:1:0
+Primafila 5 HD
+p:SkyItalia
+364c:00820000:1fa4:013e:1:0
+Dorcel TV
+p:Eutelsat
+114d:00820000:2af8:013e:1:0
+HBO
+p:CYFRA +
+1d4d:00820000:2f44:013e:1:0
+Nickelodeon
+p:NetMed
+2c4d:00820000:251c:fbff:1:0
+Primafila 7 HD
+p:SkyItalia
+074e:0082accf:0578:013e:1:0
+CHAT SKY 903
+p:Harmonic
+0d4e:00820000:1450:013e:1:0
+Rai Scuola
+p:RAI
+114e:00820000:2af8:013e:1:0
+13TH STREET
+p:CYFRA +
+1d4e:00820000:2f44:013e:1:0
+VH1
+p:NetMed
+2c4e:00820000:251c:fbff:1:0
+Primafila 9 HD
+p:SkyItalia
+114f:00820000:2af8:013e:1:0
+HBO2
+p:CYFRA +
+1d4f:00820000:2f44:013e:1:0
+MTV
+p:NetMed
+2c4f:00820000:251c:fbff:1:0
+Cinema Hits HD
+p:SkyItalia
+0d50:00820000:1450:013e:1:0
+Senato
+p:RAI
+1150:00820000:2af8:013e:1:0
+HBO COMEDY
+p:CYFRA +
+2c50:00820000:251c:fbff:1:0
+Primafila 11 HD
+p:SkyItalia
+3450:00820000:2710:fbff:1:0
+JimJam
+p:SkyItalia
+1151:00820000:2af8:013e:1:0
+10719V SID 0x1151
+p:DVB-S QPSK 10719V 13.0°E
+1251:00820000:2b5c:013e:1:0
+Private Spice
+p:Arqiva
+1d51:00820000:2f44:013e:1:0
+Kontra Channel
+p:NetMed
+2c51:00820000:251c:fbff:1:0
+Primafila 13 HD
+p:SkyItalia
+2d51:00820000:170c:fbff:1:0
+Primafila 17
+p:SkyItalia
+0d52:00820000:1450:013e:1:0
+Rai 5
+p:Rai
+1d52:00820000:2f44:013e:1:0
+Animal Planet
+p:NetMed
+2c52:00820000:251c:fbff:1:0
+Sky Sport Extra HD
+p:SkyItalia
+3452:00820000:2710:fbff:1:0
+MAN-GA
+p:SkyItalia
+1153:00820000:2af8:013e:1:0
+ESP
+p:CYFRA +
+1d53:00820000:2f44:013e:1:0
+testServiceM3_1
+p:NetMed
+2d53:00820000:170c:fbff:1:0
+Primafila 16
+p:SkyItalia
+0154:0082afc2:0065:0001:1:0
+DOS TV  340
+p:
+1d54:00820000:2f44:013e:1:0
+National Geographic
+p:NetMed
+1f54:00820000:319c:013e:1:0
+PMC
+p:MEDIA BROADCAST
+2d54:00820000:170c:fbff:1:0
+Primafila 18
+p:SkyItalia
+0f55:00820000:2198:fbff:1:0
+12418V SID 0xf55
+p:DVB-S2 8PSK 12418V 13.0°E
+1c55:00820000:1c20:013e:1:0
+SMtv San Marino
+p:EUTELSAT
+1d55:00820000:2f44:013e:1:0
+testServiceM3_2
+p:NetMed
+1f55:00820000:319c:013e:1:0
+Persian Star 2
+p:MEDIA BROADCAST
+2c55:00820000:251c:fbff:1:0
+Cinema Max HD
+p:SkyItalia
+2d55:00820000:170c:fbff:1:0
+Primafila 19
+p:SkyItalia
+3d55:00820000:2c88:013e:1:0
+D. SCIENCE
+p:CYFRA +
+0f56:00820000:2198:fbff:1:0
+12418V SID 0xf56
+p:DVB-S2 8PSK 12418V 13.0°E
+1c56:00820000:1c20:013e:1:0
+Canale Aste
+p:M-Three satcom
+1d56:00820000:2f44:013e:1:0
+A TEST
+p:NetMed
+2d56:00820000:170c:fbff:1:0
+Sky Calcio 8
+p:SkyItalia
+3656:00820000:1fa4:013e:1:0
+Dorcel T.V.
+p:Eutelsat
+0f57:00820000:2198:fbff:1:0
+12418V SID 0xf57
+p:DVB-S2 8PSK 12418V 13.0°E
+1d57:00820000:2f44:013e:1:0
+Private Spice
+p:NetMed
+2d57:00820000:170c:fbff:1:0
+Primafila 15
+p:SkyItalia
+3d57:00820000:2c88:013e:1:0
+D. WORLD
+p:CYFRA +
+0758:0082accf:0578:013e:1:0
+CARPE DIEM
+p:Harmonic
+0f58:00820000:2198:fbff:1:0
+12418V SID 0xf58
+p:DVB-S2 8PSK 12418V 13.0°E
+1c58:00820000:1c20:013e:1:0
+People TV-Rete 7
+p:People TV-Rete 7
+2d58:00820000:170c:fbff:1:0
+Sky Sport Extra
+p:SkyItalia
+3d58:00820000:2c88:013e:1:0
+TVP SPORT
+p:CYFRA +
+1c59:00820000:1c20:013e:1:0
+CNC-001
+p:Service Provider
+1d59:00820000:2f44:013e:1:0
+Playboy TV
+p:NetMed
+1f59:00820000:319c:013e:1:0
+MI-TV
+p:MEDIA BROADCAST
+2d59:00820000:170c:fbff:1:0
+Eurosport
+p:SkyItalia
+3d59:00820000:2c88:013e:1:0
+TELE5
+p:CYFRA +
+1c5a:00820000:1c20:013e:1:0
+BIKE SHOW TV
+p:M-Three satcom
+3d5a:00820000:2c88:013e:1:0
+POLONIA1
+p:CYFRA +
+1c5b:00820000:1c20:013e:1:0
+Bahrain International
+p:Bahrain TV
+1f5b:00820000:319c:013e:1:0
+Al Beladi TV
+p:MEDIA BROADCAST
+2c5b:00820000:251c:fbff:1:0
+Primafila 3 HD
+p:SkyItalia
+3d5b:00820000:2c88:013e:1:0
+EDUSAT
+p:CYFRA +
+1c5c:00820000:1c20:013e:1:0
+GDG CHANNEL
+p:LINK
+3d5c:00820000:2c88:013e:1:0
+TVP SERIALE
+p:CYFRA +
+125d:00820000:3458:013e:1:0
+Pro TV International
+p:RRSat
+1c5d:00820000:1c20:013e:1:0
+3 CHANNEL
+p:LINK
+2b5d:00820000:19c8:fbff:1:0
+Cinema 1
+p:SkyItalia
+2c5d:00820000:251c:fbff:1:0
+Sky Sport 3 HD
+p:SkyItalia
+2d5d:00820000:170c:fbff:1:0
+Sky Calcio 9
+p:SkyItalia
+3d5d:00820000:2c88:013e:1:0
+KP MUZYKA
+p:CYFRA +
+125e:00820000:3458:013e:1:0
+AL FAYHAA
+p:RRSat
+1c5e:00820000:1c20:013e:1:0
+SUPERFLUO
+p:LINK
+1f5e:00820000:319c:013e:1:0
+Iran Beauty
+p:MEDIA BROADCAST
+2c5e:00820000:251c:fbff:1:0
+Eurosport 2 HD
+p:SkyItalia
+3d5e:00820000:2c88:013e:1:0
+NATIONAL GEO
+p:CYFRA +
+015f:00820000:1c84:013e:1:0
+Discovery Channel
+p:NetMed
+025f:00820000:3c8c:013e:1:0
+DW Europe
+p:MEDIA BROADCAST
+125f:00820000:3458:013e:1:0
+Mohabat
+p:RRSat
+1f5f:00820000:319c:013e:1:0
+Persian film 2
+p:MEDIA BROADCAST
+2d5f:00820000:170c:fbff:1:0
+Sky Calcio 10
+p:SkyItalia
+365f:00820000:1388:013e:1:0
+BBC Arabic
+p:BBC World Service
+3d5f:00820000:2c88:013e:1:0
+Orange Sport
+p:CYFRA +
+0160:00820000:1c84:013e:1:0
+R9
+p:NetMed
+1260:00820000:3458:013e:1:0
+CGN
+p:RRSat
+1260:0082accf:0578:013e:1:0
+Tele A
+p:Harmonic
+1f60:00820000:319c:013e:1:0
+TV Persia one
+p:MEDIA BROADCAST
+3660:00820000:00c8:013e:1:0
+90 Numeri Sat
+p:Eutelsat
+3d60:00820000:2c88:013e:1:0
+Filmbox Extra
+p:CYFRA +
+0161:00820000:1c84:013e:1:0
+novasports2
+p:NetMed
+1261:00820000:3458:013e:1:0
+Gali Kurdistan TV
+p:RRSat
+1c61:00820000:1c20:013e:1:0
+SUPER
+p:LINK
+2b61:00820000:19c8:fbff:1:0
+Cinema Family
+p:SkyItalia
+2d61:00820000:170c:fbff:1:0
+Sky Calcio 11
+p:SkyItalia
+3b61:00820000:012c:013e:1:0
+nPremium3
+p:ITI
+3d61:00820000:2c88:013e:1:0
+Filmbox
+p:CYFRA +
+0162:00820000:1c84:013e:1:0
+novatest
+p:NetMed
+0262:00820000:3c8c:013e:1:0
+HB-FEED
+p:MEDIA BROADCAST
+0762:0082accf:0578:013e:1:0
+RETE ORO
+p:Satlink
+1262:00820000:3458:013e:1:0
+MTA International
+p:RRSat
+1c62:00820000:1c20:013e:1:0
+ONE
+p:LINK
+2462:00820000:23f0:013f:1:0
+Shabakeh7
+p:Telespazio
+2d62:00820000:170c:fbff:1:0
+Sky Calcio 12
+p:SkyItalia
+3b62:00820000:012c:013e:1:0
+TVP HD
+p:ITI
+3d62:00820000:2c88:013e:1:0
+Filmbox Family
+p:CYFRA +
+0163:00820000:1c84:013e:1:0
+novatest Cy
+p:NetMed
+0263:00820000:3c8c:013e:1:0
+Arab-Girls.TV
+p:MEDIA BROADCAST
+1163:00820000:2af8:013e:1:0
+PLANETE+
+p:CYFRA +
+1263:00820000:3458:013e:1:0
+Dieu TV
+p:RRSat
+1c63:00820000:1c20:013e:1:0
+NEW ONE
+p:LINK
+1f63:00820000:319c:013e:1:0
+U
+p:MEDIA BROADCAST
+2b63:00820000:19c8:fbff:1:0
+Cinema +24
+p:SkyItalia
+2d63:00820000:170c:fbff:1:0
+Sky Calcio 13
+p:SkyItalia
+3b63:00820000:012c:013e:1:0
+Eurosport 2 HD
+p:ITI
+0064:0082afc2:0065:0001:1:0
+VOA TV 100 (HB49-52)
+p:
+0164:00820000:1c84:013e:1:0
+R15
+p:NetMed
+0264:00820000:3c8c:013e:1:0
+4play games
+p:MEDIA BROADCAST
+1164:00820000:2af8:013e:1:0
+MINIMINI+
+p:CYFRA +
+1264:00820000:3458:013e:1:0
+ATV International
+p:RRSat
+1c64:00820000:1c20:013e:1:0
+JUST ONE
+p:LINK
+1f64:00820000:319c:013e:1:0
+Iran Music
+p:MEDIA BROADCAST
+2064:00820000:24b8:013e:1:0
+Quadriga
+p:GlobeCast
+3b64:00820000:012c:013e:1:0
+nPremium
+p:ITI
+3d64:00820000:2c88:013e:1:0
+DISCOVERY
+p:CYFRA +
+0065:00820000:1e14:013e:1:0
+STS International
+p:GlobeCast
+0065:0082afc2:0065:0001:1:0
+VOA Radio 101 (HB51-52)
+p:
+0165:00820000:1c84:013e:1:0
+R10
+p:NetMed
+0265:00820000:3c8c:013e:1:0
+arab-69.tv
+p:MEDIA BROADCAST
+1265:00820000:3458:013e:1:0
+IN TV
+p:RRSat
+1c65:00820000:1c20:013e:1:0
+FADAK TV
+p:LINK
+2b65:00820000:19c8:fbff:1:0
+Cinema Classics
+p:SkyItalia
+2d65:00820000:170c:fbff:1:0
+Primafila 1
+p:SkyItalia
+3b65:00820000:012c:013e:1:0
+Nat Geo Wild HD
+p:ITI
+0066:0082afc2:0065:0001:1:0
+VOA Radio 102 (HB53-56)
+p:
+0166:00820000:1c84:013e:1:0
+R8
+p:NetMed
+0266:00820000:3c8c:013e:1:0
+' ' Hot Arab Sex
+p:MEDIA BROADCAST
+0d66:00820000:1450:013e:1:0
+Rai yoyo
+p:Rai
+1266:00820000:3458:013e:1:0
+DIPRE TV
+p:RRSat
+1c66:00820000:1c20:013e:1:0
+DIRETTA TV
+p:LINK
+2b66:00820000:19c8:fbff:1:0
+cielo
+p:
+3b66:00820000:012c:013e:1:0
+Animal Planet HD
+p:ITI
+0067:00820000:1e14:013e:1:0
+Saudi Sport 2
+p:GlobeCast
+0267:00820000:3c8c:013e:1:0
+121 Chat
+p:MEDIA BROADCAST
+1167:00820000:2af8:013e:1:0
+HBO
+p:CYFRA +
+1267:00820000:3458:013e:1:0
+FUEGO TV
+p:RRSat
+1c67:00820000:1c20:013e:1:0
++ TV
+p:LINK
+1f67:00820000:319c:013e:1:0
+EBRU TV
+p:MEDIA BROADCAST
+3b67:00820000:012c:013e:1:0
+Cinemax HD
+p:ITI
+0068:00820000:1e14:013e:1:0
+Al sumariah
+p:GlobeCast
+0168:00820000:1c84:013e:1:0
+Cartoon Network
+p:NetMed
+0268:00820000:3c8c:013e:1:0
+Arab-Jins
+p:MEDIA BROADCAST
+0668:0082accf:0578:013e:1:0
+BLU SHOP
+p:Harmonic
+1168:00820000:2af8:013e:1:0
+HBO2
+p:CYFRA +
+1268:00820000:3458:013e:1:0
+PUNTO SAT
+p:RRSat
+1c68:00820000:1c20:013e:1:0
+SKY 918
+p:LINK
+2468:00820000:23f0:013f:1:0
+Saamen TV
+p:Telespazio
+2c68:00820000:251c:fbff:1:0
+Sky Sport 2 HD
+p:SkyItalia
+3b68:00820000:012c:013e:1:0
+WiP - Sundance HD
+p:iTi
+0069:00820000:1e14:013e:1:0
+MEZZO
+p:Globecast,C:0500,C:0100,C:1813,C:0604
+0169:00820000:1c84:013e:1:0
+MACEDONIA TV
+p:NetMed
+0269:00820000:3c8c:013e:1:0
+Love TV
+p:MEDIA BROADCAST
+0669:0082accf:0578:013e:1:0
+LA 8
+p:Satlink
+1169:00820000:2af8:013e:1:0
+HBO COMEDY
+p:CYFRA +
+1269:00820000:3458:013e:1:0
+TIVU TIVU
+p:RRSat
+1c69:00820000:1c20:013e:1:0
+SKY 942
+p:LINK
+2469:00820000:23f0:013f:1:0
+THAQALLYN  TV
+p:Telespazio
+4269:00820000:2bc0:013e:1:0
+VOD 51
+p:Cyfrowy Polsat S.A.
+006a:00820000:1e14:013e:1:0
+Samacom Test
+p:GlobeCast
+016a:00820000:1c84:013e:1:0
+SKAI TV
+p:NetMed
+026a:00820000:3c8c:013e:1:0
+Lebnaniat TV.
+p:MEDIA BROADCAST
+066a:0082accf:0578:013e:1:0
+TV7 LOMBARDIA
+p:Harmonic
+126a:00820000:3458:013e:1:0
+DIPRE TV 2
+p:RRSat
+1c6a:00820000:1c20:013e:1:0
+SKY 843
+p:LINK
+296a:00820000:3d54:013e:1:0
+LIVE CHANNEL
+p:BSS
+2b6a:00820000:19c8:fbff:1:0
+Disney Ch. +2
+p:SkyItalia
+2c6a:00820000:251c:fbff:1:0
+MTV LIVE HD
+p:SkyItalia
+366a:00820000:00c8:013e:1:0
+Bergamosat
+p:Eutelsat
+426a:00820000:2bc0:013e:1:0
+VOD 52
+p:Cyfrowy Polsat S.A.
+016b:00820000:1c84:013e:1:0
+ET-3
+p:NetMed
+026b:00820000:3c8c:013e:1:0
+Arab XXX
+p:MEDIA BROADCAST
+126b:00820000:3458:013e:1:0
+SonLife Broadcasting Network
+p:RRSat
+1c6b:00820000:1c20:013e:1:0
+BBC PERSIAN
+p:BBC
+246b:00820000:23f0:013f:1:0
+HODHOD Arabic
+p:Telespazio
+296b:00820000:3d54:013e:1:0
+KOMALA TV
+p:BSS
+2b6b:00820000:19c8:fbff:1:0
+Cinema Max
+p:SkyItalia
+2c6b:00820000:251c:fbff:1:0
+ExtremeSportsHD
+p:SkyItalia
+426b:00820000:2bc0:013e:1:0
+VOD 53
+p:Cyfrowy Polsat S.A.
+006c:0082afc2:0065:0001:1:0
+VOA Radio 108 (HB65-68)
+p:
+026c:00820000:3c8c:013e:1:0
+AlTeb Alnabawy
+p:MEDIA BROADCAST
+076c:0082accf:0578:013e:1:0
+LUNA SAT SKY 888
+p:Harmonic
+1f6c:00820000:319c:013e:1:0
+4
+p:MEDIA BROADCAST
+296c:00820000:3d54:013e:1:0
+ZEE TV
+p:BSS
+2c6c:00820000:251c:fbff:1:0
+Fox Life HD
+p:SkyItalia
+426c:00820000:2bc0:013e:1:0
+VOD 54
+p:Cyfrowy Polsat S.A.
+006d:0082afc2:0065:0001:1:0
+VOA Radio 109 (HB67-68)
+p:
+026d:00820000:3c8c:013e:1:0
+India Girls
+p:MEDIA BROADCAST
+126d:00820000:3458:013e:1:0
+MOONLIGHT TV
+p:RRSat
+206d:00820000:2328:013e:1:0
+HRT-TV1
+p:OIV Zagreb
+296d:00820000:3d54:013e:1:0
+ZEE CINEMA
+p:BSS
+2c6d:00820000:251c:fbff:1:0
+Real Time HD
+p:SkyItalia
+426d:00820000:2bc0:013e:1:0
+VOD 55
+p:Cyfrowy Polsat S.A.
+006e:0082afc2:0065:0001:1:0
+VOA Radio 110 (HB69-72)
+p:
+026e:00820000:3c8c:013e:1:0
++18 Love Girls
+p:MEDIA BROADCAST
+126e:00820000:3458:013e:1:0
+METRO SAT
+p:RRSat
+206e:00820000:2328:013e:1:0
+HRT-TV2
+p:OIV Zagreb
+296e:00820000:3d54:013e:1:0
+ITN
+p:BSS
+2b6e:00820000:19c8:fbff:1:0
+Disney Channel
+p:SkyItalia
+2c6e:00820000:251c:fbff:1:0
+ESPN America HD
+p:SkyItalia
+426e:00820000:2bc0:013e:1:0
+VOD 56
+p:Cyfrowy Polsat S.A.
+446e:00820000:3264:013e:1:0
+EUROSPORT 2
+p:Globecast
+006f:0082afc2:0065:0001:1:0
+VOA Radio 111 (HB71-72)
+p:
+016f:00820000:1c84:013e:1:0
+R7
+p:NetMed
+026f:00820000:3c8c:013e:1:0
+Sexy love girls
+p:MEDIA BROADCAST
+126f:00820000:3458:013e:1:0
+TIVU TIVU 2
+p:RRSat
+206f:00820000:2328:013e:1:0
+HRT PLUS
+p:OIV Zagreb
+296f:00820000:3d54:013e:1:0
+AAA Music
+p:BSS
+2c6f:00820000:251c:fbff:1:0
+Discovery Sci HD
+p:SkyItalia
+426f:00820000:2bc0:013e:1:0
+VOD 57
+p:Cyfrowy Polsat S.A.
+446f:00820000:3264:013e:1:0
+TV BREIZH
+p:Globecast
+0070:00820000:1e14:013e:1:0
+Saudi Arabian TV2
+p:GlobeCast
+0170:00820000:1c84:013e:1:0
+ServiceTest1
+p:NetMed
+0270:00820000:3c8c:013e:1:0
+.arab babes
+p:MEDIA BROADCAST
+1270:00820000:3458:013e:1:0
+EURSAT
+p:RRSat
+2970:00820000:3d54:013e:1:0
+Zee Russia
+p:BSS
+2b70:00820000:19c8:fbff:1:0
+Sky Uno +1
+p:SkyItalia
+2c70:00820000:251c:fbff:1:0
+DiscoveryT&L HD
+p:SkyItalia
+4270:00820000:2bc0:013e:1:0
+VOD 58
+p:Cyfrowy Polsat S.A.
+4470:00820000:3264:013e:1:0
+USHUAIA
+p:Globecast
+0171:00820000:1c84:013e:1:0
+serviceTest2
+p:NetMed
+0271:00820000:3c8c:013e:1:0
+Kosmica TV
+p:MEDIA BROADCAST
+1271:00820000:3458:013e:1:0
+Eurotic TV
+p:RRSat
+1f71:00820000:319c:013e:1:0
+IRAN.PSTV
+p:MEDIA BROADCAST
+2b71:00820000:19c8:fbff:1:0
+Discovery
+p:SkyItalia
+2c71:00820000:251c:fbff:1:0
+History HD
+p:SkyItalia
+4271:00820000:2bc0:013e:1:0
+VOD 59
+p:Cyfrowy Polsat S.A.
+4471:00820000:3264:013e:1:0
+PARIS PREMIERE
+p:Globecast
+0172:00820000:1c84:013e:1:0
+Mad Music Hits GR Cy
+p:NetMed
+1272:00820000:3458:013e:1:0
+Belarus TV
+p:RRSat
+2c72:00820000:251c:fbff:1:0
+NatGeo Wild HD
+p:SkyItalia
+4272:00820000:2bc0:013e:1:0
+VOD 60
+p:Cyfrowy Polsat S.A.
+0073:00820000:1e14:013e:1:0
+AL BAGHDADIA
+p:GlobeCast
+0173:00820000:1c84:013e:1:0
+nova Mad Music My Rock Cy
+p:NetMed
+1273:0082accf:0578:013e:1:0
+Gioielli Per Tutti
+p:Harmonic
+2b73:00820000:19c8:fbff:1:0
+Cinema Passion
+p:SkyItalia
+2c73:00820000:251c:fbff:1:0
+NatGeo Adv HD
+p:SkyItalia
+4273:00820000:2bc0:013e:1:0
+VOD 61
+p:Cyfrowy Polsat S.A.
+0074:00820000:1e14:013e:1:0
+JSC Sports News
+p:GlobeCast,C:0500,C:0603
+0174:00820000:1c84:013e:1:0
+nova Mad Music Greek Cy
+p:NetMed
+0274:00820000:3c8c:013e:1:0
+ELITE SHOPPING
+p:MEDIA BROADCAST
+1274:0082accf:0578:013e:1:0
+Napoli Mia
+p:Harmonic
+2c74:00820000:251c:fbff:1:0
+GamberoRossoHD
+p:SkyItalia
+3674:00820000:00c8:013e:1:0
+A3
+p:Eutelsat
+4274:00820000:2bc0:013e:1:0
+VOD 62
+p:Cyfrowy Polsat S.A.
+0075:00820000:1e14:013e:1:0
+HOT TV
+p:GlobeCast
+0175:00820000:1c84:013e:1:0
+Mad Music Rebetico Cy
+p:NetMed
+2c75:00820000:251c:fbff:1:0
+Disney Ch. HD
+p:SkyItalia
+4275:00820000:2bc0:013e:1:0
+VOD 63
+p:Cyfrowy Polsat S.A.
+0076:00820000:1e14:013e:1:0
+GEM Movie
+p:GlobeCast
+0176:00820000:1c84:013e:1:0
+nova Mad Music  Seasonal Cy
+p:NetMed
+1276:00820000:3458:013e:1:0
+Movie1
+p:RRSat
+4276:00820000:2bc0:013e:1:0
+VOD 64
+p:Cyfrowy Polsat S.A.
+4277:00820000:2bc0:013e:1:0
+VOD 65
+p:Cyfrowy Polsat S.A.
+0178:00820000:1c84:013e:1:0
+NEÔ
+p:NetMed
+0179:00820000:1c84:013e:1:0
+MAD T.V
+p:NetMed
+0579:00820000:0320:fbff:1:0
+In evidenza
+p:SkyItalia
+1d79:00820000:2f44:013e:1:0
+Playboy TV Cy
+p:NetMed
+3779:00820000:044c:013e:1:0
+CANAL+ FILM HD
+p:CYFRA+
+017a:00820000:1c84:013e:1:0
+ET-1
+p:NetMed
+1d7a:00820000:2f44:013e:1:0
+Private Spice Cy
+p:NetMed
+447a:00820000:3264:013e:1:0
+DISNEY HD
+p:Globecast
+447b:00820000:3264:013e:1:0
+EUROSPORT HD
+p:Globecast
+017c:00820000:1c84:013e:1:0
+MAD TV
+p:NetMed
+067c:0082accf:0578:013e:1:0
+LAZIO CHANNEL
+p:Harmonic
+117c:00820000:2af8:013e:1:0
+DTV CABLE PL
+p:CYFRA +
+127c:0082accf:0578:013e:1:0
+Kurd Channel
+p:Harmonic
+297c:00820000:3d54:013e:1:0
+KALEMEH FARSI
+p:BSS
+2b7c:00820000:19c8:fbff:1:0
+Disney Junior
+p:SkyItalia
+427c:00820000:2bc0:013e:1:0
+VOD 50
+p:Cyfrowy Polsat S.A.
+017d:00820000:1c84:013e:1:0
+R14
+p:NetMed
+027d:00820000:3c8c:013e:1:0
+TVRUS
+p:MEDIA BROADCAST
+117d:00820000:2af8:013e:1:0
+DTV CABLE MI
+p:CYFRA +
+427d:00820000:2bc0:013e:1:0
+xxxVOD1
+p:Cyfrowy Polsat S.A.
+007e:00820000:1e14:013e:1:0
+JSC Sports Global
+p:GlobeCast
+027e:00820000:3c8c:013e:1:0
+Juwelo
+p:MEDIA BROADCAST
+1c7e:00820000:206c:fbff:1:0
+Test T
+p:SkyItalia
+1d7e:00820000:2f44:013e:1:0
+OTV Test
+p:NetMed
+2c7e:00820000:251c:fbff:1:0
+MTV Hits
+p:SkyItalia
+367e:00820000:00c8:013e:1:0
+Canal Algerie
+p:Eutelsat
+427e:00820000:2bc0:013e:1:0
+xxxVOD2
+p:Cyfrowy Polsat S.A.
+017f:00820000:1c84:013e:1:0
+novasports2 Cy
+p:NetMed
+027f:00820000:3c8c:013e:1:0
+Persian TV MARKET
+p:MEDIA BROADCAST
+1d7f:00820000:2f44:013e:1:0
+OTV PVR
+p:NetMed
+0180:00820000:1c84:013e:1:0
+ÂïõëÞ
+p:NetMed
+0c81:00820000:2328:013e:1:0
+SLO-TV1
+p:OIV Zagreb
+1181:00820000:2af8:013e:1:0
+TV 4
+p:CYFRA +
+2481:00820000:23f0:013f:1:0
+HADI TV1
+p:Harmonic
+2981:00820000:3d54:013e:1:0
+Al Magharibia
+p:BSS
+0182:00820000:1c84:013e:1:0
+MAD MUSIC  Hits GR
+p:NetMed
+0282:00820000:3c8c:013e:1:0
+IRAN-MNTV
+p:MEDIA BROADCAST
+0582:00820000:0320:fbff:1:0
+Discovery Travel
+p:SkyItalia
+0c82:00820000:2328:013e:1:0
+SLO-TV2
+p:OIV Zagreb
+2482:00820000:23f0:013f:1:0
+HADI TV3
+p:Telespazio
+2982:00820000:3d54:013e:1:0
+TV DISCO
+p:BSS
+2d82:00820000:170c:fbff:1:0
+Primafila 20
+p:SkyItalia
+0183:00820000:1c84:013e:1:0
+nova MAD MUSIC My Rock
+p:NetMed
+0283:00820000:3c8c:013e:1:0
+IRAN-FMTV
+p:MEDIA BROADCAST
+0c83:00820000:2328:013e:1:0
+TV K-C
+p:OIV Zagreb
+2483:00820000:23f0:013f:1:0
+HADI TV4
+p:Telespazio
+2983:00820000:3d54:013e:1:0
+!mwala3a 3lik
+p:BSS
+2c83:00820000:251c:fbff:1:0
+MTV
+p:SkyItalia
+0184:00820000:1c84:013e:1:0
+nova MAD MUSIC Greek
+p:NetMed
+2984:00820000:3d54:013e:1:0
+Anta 7iate
+p:BSS
+2c84:00820000:251c:fbff:1:0
+Sky Calcio 1 HD
+p:SkyItalia
+0185:00820000:1c84:013e:1:0
+MAD MUSIC Rebetico
+p:NetMed
+0385:00820000:2134:013e:1:0
+SF 1
+p:Schweizer Fernsehen
+1c85:00820000:332c:013e:1:0
+MotorsTV
+p:Arqiva
+1c85:00820000:1ce8:0071:1:0
+Zone Romantica
+p:Cyfrowy Polsat S.A.
+2485:00820000:23f0:013f:1:0
+RU TV
+p:Telespazio
+2985:00820000:3d54:013e:1:0
+Iran Fun
+p:BSS
+2c85:00820000:251c:fbff:1:0
+MTV Rocks
+p:SkyItalia
+3785:00820000:044c:013e:1:0
+Water Planet
+p:CYFRA+
+4485:00820000:3264:013e:1:0
+Supertennis HD
+p:Globecast
+0186:00820000:1c84:013e:1:0
+nova MAD MUSIC Seasonal
+p:NetMed
+1c86:00820000:332c:013e:1:0
+Bloomberg European TV
+p:Arqiva
+1c86:00820000:1ce8:0071:1:0
+AXN Crime
+p:Cyfrowy Polsat S.A.
+1f86:00820000:319c:013e:1:0
+bwtv
+p:MEDIA BROADCAST,C:0e00
+2986:00820000:3d54:013e:1:0
+Music Box Russia
+p:BSS 
+3786:00820000:044c:013e:1:0
+Novela TV
+p:CYFRA+
+0c87:00820000:2328:013e:1:0
+SLO-TV3
+p:OIV Zagreb
+1c87:00820000:1ce8:0071:1:0
+AXN Sci-Fi
+p:Cyfrowy Polsat S.A.
+2487:00820000:23f0:013f:1:0
+Orient Tv
+p:Telespazio
+2987:00820000:3d54:013e:1:0
+The Word Network
+p:BSS
+1288:00820000:3458:013e:1:0
+LAS TELEVENTA
+p:RRSat
+1c88:00820000:1ce8:0071:1:0
+Fightbox
+p:Cyfrowy Polsat S.A.
+1d88:00820000:2f44:013e:1:0
+testServiceM3_3
+p:NetMed
+2488:00820000:23f0:013f:1:0
+BARAEM
+p:Telespazio
+2988:00820000:3d54:013e:1:0
+GOD TV
+p:BSS
+1289:00820000:3458:013e:1:0
+HERCULES
+p:RRSat
+1c89:00820000:332c:013e:1:0
+MOTO TV
+p:Arqiva
+1c89:00820000:1ce8:0071:1:0
+Extreme Sports
+p:Cyfrowy Polsat S.A.
+128a:00820000:3458:013e:1:0
+NEW GENERATION TV
+p:RRSat
+298a:00820000:3d54:013e:1:0
+nar elhob
+p:BSS
+028b:00820000:3c8c:013e:1:0
+Chinese Radio International
+p:MEDIA BROADCAST
+038b:00820000:2134:013e:1:0
+SF zwei
+p:Schweizer Fernsehen
+128b:00820000:3458:013e:1:0
+Kurd Channel
+p:RRSat
+1c8b:00820000:1ce8:0071:1:0
+Nat Geo Wild
+p:Cyfrowy Polsat S.A
+298b:00820000:3d54:013e:1:0
+WNS
+p:BSS
+2c8b:00820000:2580:fbff:1:0
+Disney Ch. +1
+p:SkyItalia
+128c:00820000:3458:013e:1:0
+My Tivi
+p:RRSat
+1c8c:00820000:1ce8:0071:1:0
+DISCOVERY
+p:
+298c:00820000:3d54:013e:1:0
+lo3b whob
+p:BSS
+128d:00820000:3458:013e:1:0
+Kliksat.Farhad
+p:RRSat
+2c8d:00820000:2580:fbff:1:0
+Disney XD +2
+p:SkyItalia
+3c8d:00820000:1bbc:013e:1:0
+novacinema HD Cy
+p:Netmed
+128e:00820000:3458:013e:1:0
+Altarek - The Way TV
+p:RRSat
+358e:00820000:1388:013e:1:0
+TVE Internacional
+p:Telefonica Spain
+3c8e:00820000:1bbc:013e:1:0
+Nat Geo Wild HD
+p:Netmed
+038f:00820000:2134:013e:1:0
+SF info
+p:Schweizer Fernsehen
+1d8f:00820000:2f44:013e:1:0
+novacinema4
+p:NetMed
+3c8f:00820000:1bbc:013e:1:0
+National Geographic HD
+p:Netmed
+0590:00820000:0320:fbff:1:0
+Nick Jr
+p:SkyItalia
+2490:00820000:23f0:013f:1:0
+HODHOD FARSI
+p:Harmonic
+2990:00820000:3d54:013e:1:0
+NAPOLI TLA
+p:BSS
+2c90:00820000:2580:fbff:1:0
+Animal Planet
+p:SkyItalia
+3590:00820000:1388:013e:1:0
+Canal 24 Horas
+p:Telefonica Spain
+3c90:00820000:1bbc:013e:1:0
+EPT HD
+p:Netmed
+2991:00820000:3d54:013e:1:0
+ART AscoRadioTv
+p:BSS
+2c91:00820000:2580:fbff:1:0
+Horror Channel
+p:SkyItalia
+3c91:00820000:1bbc:013e:1:0
+Discovery HD Showcase
+p:Netmed
+0592:00820000:0320:fbff:1:0
+ESPN Classic
+p:SkyItalia
+1292:00820000:3458:013e:1:0
+TVR
+p:RRSat
+2492:00820000:23f0:013f:1:0
+AL JAZEERA CHILDREN
+p:Telespazio
+2992:00820000:3d54:013e:1:0
+AB Channel
+p:BSS
+3c92:00820000:1bbc:013e:1:0
+nova 3D
+p:Netmed
+0593:00820000:0320:fbff:1:0
+MTV Classic
+p:SkyItalia
+1293:00820000:3458:013e:1:0
+Somaliland National TV
+p:RRsat
+1c93:00820000:1ce8:0071:1:0
+Discovery
+p:Cyfrowy Polsat S.A.
+1d93:00820000:2f44:013e:1:0
+EEPG
+p:NetMed
+2993:00820000:3d54:013e:1:0
+Betting Channel
+p:BSS
+3c93:00820000:1bbc:013e:1:0
+novasports HD Cy
+p:Netmed
+0294:00820000:3c8c:013e:1:0
+Persian Film
+p:MEDIA BROADCAST
+0594:00820000:0320:fbff:1:0
+MTV Music
+p:SkyItalia
+1294:00820000:3458:013e:1:0
+HCTV
+p:RRsat
+2994:00820000:3d54:013e:1:0
+Italiamia
+p:BSS
+3c94:00820000:1bbc:013e:1:0
+novasports HD
+p:Netmed
+0295:00820000:3c8c:013e:1:0
+IPN TV
+p:MEDIA BROADCAST
+0595:00820000:0320:fbff:1:0
+MTV Dance
+p:SkyItalia
+1295:00820000:3458:013e:1:0
+Somalisat
+p:RRsat
+1d95:00820000:2f44:013e:1:0
+NOVA SCOPE
+p:NetMed
+2995:00820000:3d54:013e:1:0
+SRI TV
+p:BSS
+2a95:00820000:1838:fbff:1:0
+Real Time
+p:SkyItalia
+3c95:00820000:1bbc:013e:1:0
+novacinema HD
+p:NetMed
+1c96:00820000:1ce8:0071:1:0
+AXN
+p:Cyfrowy Polsat S.A.
+2096:00820000:2328:013e:1:0
+RBC-TV
+p:OIV Zagreb
+2996:00820000:3d54:013e:1:0
+Liguria TV
+p:BSS
+3c96:00820000:1bbc:013e:1:0
+PDC_Service
+p:Syned
+1d97:00820000:2f44:013e:1:0
+Travel Channel
+p:NetMed
+2997:00820000:3d54:013e:1:0
+Hope Channel
+p:BSS
+3c97:00820000:1bbc:013e:1:0
+Pvod_Service_1
+p:Syned
+1298:00820000:3458:013e:1:0
+Suryoyo Sat
+p:RRSat
+3a98:00820000:1fa4:013e:1:0
+Romauno
+p:Eutelsat
+3c98:00820000:1bbc:013e:1:0
+nova 3D Cy
+p:NETMED
+0599:00820000:0320:fbff:1:0
+Class CNBC
+p:SkyItalia
+1299:00820000:3458:013e:1:0
+FREE XTV
+p:RRSat
+1c99:00820000:332c:013e:1:0
+TV5MONDE FBS
+p:Arqiva
+1d99:00820000:2f44:013e:1:0
+nova MAD GREEKZ
+p:NetMed
+019a:00820000:1964:013e:1:0
+ALHAQIQA
+p:ART
+019a:00820000:3264:013e:1:0
+beIN Sport1
+p:Globecast
+129a:00820000:3458:013e:1:0
+French Lover
+p:RRSat
+1c9a:00820000:332c:013e:1:0
+TV5MONDE EUROPE
+p:Arqiva
+1d9a:00820000:2f44:013e:1:0
+novacinema4 Cy
+p:NetMed
+019b:00820000:3264:013e:1:0
+beIN Sport2
+p:Harmonic
+1c9c:00820000:332c:013e:1:0
+Crime and Investigation
+p:Arqiva
+059d:00820000:0320:fbff:1:0
+Onda Latina
+p:SkyItalia
+1c9d:00820000:332c:013e:1:0
+Crime + Investigation
+p:Arqiva
+2c9d:00820000:2580:fbff:1:0
+Super!
+p:SkyItalia
+439d:00820000:2cec:013e:1:0
+BABY TV
+p:RRSat
+1c9e:00820000:332c:013e:1:0
+Kurdistan TV
+p:Arqiva
+439e:00820000:2cec:013e:1:0
+3ABN International
+p:RRSat
+019f:00820000:26ac:013f:1:0
+BFM TV
+p:Eutelsat
+059f:00820000:0320:fbff:1:0
+Lady Channel
+p:SkyItalia
+1c9f:00820000:332c:013e:1:0
+NHK World
+p:Arqiva
+439f:00820000:2cec:013e:1:0
+BVN
+p:RRSat
+43a0:00820000:2cec:013e:1:0
+CNL
+p:RRSat
+00a1:00820000:1e14:013e:1:0
+Al Rasheed TV
+p:GlobeCast
+01a1:00820000:26ac:013f:1:0
+Direct Star
+p:Eutelsat
+43a1:00820000:2cec:013e:1:0
+Soyuz TV
+p:RRSat
+01a2:00820000:26ac:013f:1:0
+Gulli
+p:Eutelsat
+43a2:00820000:2cec:013e:1:0
+Nash TV
+p:RRSat
+01a3:00820000:26ac:013f:1:0
+France O
+p:Eutelsat
+05a3:00820000:0320:fbff:1:0
+AXN
+p:SkyItalia
+43a3:00820000:2cec:013e:1:0
+Fashion TV
+p:RRSat
+20a4:00820000:3d54:013e:1:0
+DMTV
+p:OIV Zagreb
+29a4:00820000:3d54:013e:1:0
+Finest TV
+p:BSS
+00a5:00820000:1e14:013e:1:0
+KANAL 4
+p:GlobeCast
+06a5:00820000:3138:013e:1:0
+TV CORAN
+p:GlobeCast
+1ca5:00820000:332c:013e:1:0
+GEM TV
+p:Arqiva
+20a5:00820000:3d54:013e:1:0
+PASSIONE PESCA
+p:OiV
+29a5:00820000:3d54:013e:1:0
+RVS Italy
+p:BSS
+06a6:00820000:3138:013e:1:0
+TV TAMAZIGHT
+p:GlobeCast
+1fa6:00820000:189c:fbff:1:0
+Gambero Rosso
+p:SkyItalia
+43a6:00820000:2cec:013e:1:0
+KURDsat
+p:RRSat
+06a7:00820000:3138:013e:1:0
+Jewish News One
+p:GlobeCast
+1fa7:00820000:189c:fbff:1:0
+Fox News
+p:SkyItalia
+29a7:00820000:3d54:013e:1:0
+Venere Tv
+p:BSS
+43a7:00820000:2cec:013e:1:0
+MKTV sat
+p:RRSat
+06a8:00820000:3138:013e:1:0
+Shanson TV
+p:GlobeCast
+1fa8:00820000:189c:fbff:1:0
+MGM
+p:SkyItalia
+29a8:00820000:3d54:013e:1:0
+Swiss Venere Tv
+p:BSS
+2aa8:00820000:1838:fbff:1:0
+Sky Sport 1
+p:SkyItalia
+43a8:00820000:2cec:013e:1:0
+Thai Global Network
+p:RRSat
+06a9:00820000:3138:013e:1:0
+2M Maroc
+p:GlobeCast
+29a9:00820000:3d54:013e:1:0
+Venere Tv Espana
+p:BSS
+2aa9:00820000:1838:fbff:1:0
+Sky Sport 2
+p:SkyItalia
+35a9:00820000:1388:013e:1:0
+TELESUR
+p:Telefonica Spain
+43a9:00820000:2cec:013e:1:0
+VTV4
+p:RRSat
+06aa:00820000:3138:013e:1:0
+CCTV9
+p:GlobeCast
+1faa:00820000:189c:fbff:1:0
+Roma Channel
+p:SkyItalia
+29aa:00820000:3d54:013e:1:0
+Venere Tv Romania
+p:BSS
+2aaa:00820000:1838:fbff:1:0
+Sky Supercalcio
+p:SkyItalia
+2daa:00820000:170c:fbff:1:0
+Primafila 20
+p:SkyItalia
+43aa:00820000:2cec:013e:1:0
+Rojhelat
+p:RRSat
+06ab:00820000:3138:013e:1:0
+SHANT TV
+p:GlobeCast
+29ab:00820000:3d54:013e:1:0
+Classic Hits Channel
+p:BSS
+06ac:00820000:3138:013e:1:0
+RTR
+p:GlobeCast
+1cac:00820000:1ce8:0071:1:0
+ESPN
+p:Cyfrowy Polsat S.A.
+1fac:00820000:189c:fbff:1:0
+Sky News
+p:SkyItalia
+43ac:00820000:2cec:013e:1:0
+ERT World
+p:RRSat
+06ad:0082accf:0578:013e:1:0
+TVA VICENZA
+p:Satlink
+0dad:00820000:2d50:013e:1:0
+Disney Junior
+p:ITI
+06ae:00820000:3138:013e:1:0
+Rossiya 24
+p:GlobeCast
+29ae:00820000:3d54:013e:1:0
+SNTV
+p:BSS
+1faf:00820000:189c:fbff:1:0
+Yacht & Sail
+p:SkyItalia
+2aaf:00820000:1838:fbff:1:0
+Sky Supercalcio
+p:SkyItalia
+06b0:00820000:3138:013e:1:0
+TRT Turk
+p:GlobeCast
+2ab0:00820000:1838:fbff:1:0
+Sky Sport 2
+p:SkyItalia
+2ab1:00820000:1838:fbff:1:0
+Sky Sport24
+p:SkyItalia
+06b2:00820000:3138:013e:1:0
+Al Jazeera Intl
+p:GlobeCast
+0db2:00820000:2d50:013e:1:0
+Discovery Historia
+p:ITI
+36b2:00820000:06a4:013e:1:0
+RTS Un
+p:Radio Television Suisse
+36b3:00820000:06a4:013e:1:0
+RSI LA 1
+p:Radiotelevisione svizzera
+3bb3:00820000:012c:013e:1:0
+Eurosport 2 HD PL-HU-RO
+p:ITI
+43b3:00820000:2cec:013e:1:0
+Daring!TV
+p:RRSat
+06b4:00820000:3138:013e:1:0
+AZTV
+p:GlobeCast
+43b4:00820000:2cec:013e:1:0
+Daring!TV 2
+p:RRSat
+06b5:00820000:3138:013e:1:0
+Ganj E Hozour
+p:GlobeCast
+1cb5:00820000:1ce8:0071:1:0
+Disney XD
+p:Cyfrowy Polsat S.A.
+3bb5:00820000:012c:013e:1:0
+Nat Geo Wild HD PL
+p:ITI
+2db6:00820000:1a2c:fbff:1:0
+AXN Sci-Fi
+p:SkyItalia
+3ab7:00820000:0514:013e:1:0
+MGM HD
+p:ITI
+01b8:00820000:1964:013e:1:0
+PIK TV
+p:JMC
+0bb8:00820000:20d0:013e:1:0
+ETV2
+p:GlobeCast
+2ab8:00820000:1838:fbff:1:0
+Sky Sport24
+p:SkyItalia
+36b8:00820000:06a4:013e:1:0
+RTS Deux
+p:Radio Television Suisse
+3ab8:00820000:0514:013e:1:0
+Discovery HD
+p:ITI
+05b9:00820000:0320:fbff:1:0
+Discovery Travel
+p:SkyItalia
+2ab9:00820000:1838:fbff:1:0
+PPV Bundle
+p:SkyItalia
+36b9:00820000:06a4:013e:1:0
+RSI LA 2
+p:Radiotelevisione svizzera
+3ab9:00820000:0514:013e:1:0
+nSport
+p:ITI
+43b9:00820000:2cec:013e:1:0
+MRTV / Univ TV
+p:RRSat
+0dba:00820000:2d50:013e:1:0
+Disney XD
+p:ITI
+1fba:00820000:189c:fbff:1:0
+Fox
+p:SkyItalia
+2aba:00820000:1838:fbff:1:0
+Sky Sport24
+p:SkyItalia
+2bba:00820000:19c8:fbff:1:0
+Cielo_interact
+p:SkyItalia
+3aba:00820000:0514:013e:1:0
+nPremium4
+p:ITI
+43ba:00820000:2cec:013e:1:0
+TV Verdade
+p:RRsat
+05bb:00820000:0320:fbff:1:0
+Discovery Sci
+p:SkyItalia
+0bbb:00820000:20d0:013e:1:0
+Sat7 Plus
+p:GlobeCast
+2abb:00820000:1838:fbff:1:0
+PPV Bundle2
+p:SkyItalia
+3abb:00820000:012c:013e:1:0
+WiP - Sundande HD PL
+p:ITI
+3dbb:00820000:0640:013e:1:0
+ReligiaTV
+p:TVN
+0bbc:00820000:20d0:013e:1:0
+AD AlOula
+p:GLOBECAST
+0fbc:00820000:2db4:fbff:1:0
+Nuvolari
+p:SkyItalia
+1fbc:00820000:189c:fbff:1:0
+Vetrina Primafila
+p:SkyItalia
+38bc:00820000:2648:fbff:1:0
+Primafila 22
+p:SkyItalia
+0bbd:00820000:20d0:013e:1:0
+Libya Al Ahrar
+p:GlobeCast
+0fbd:00820000:2db4:fbff:1:0
+Fox +1
+p:SkyItalia
+1bbd:00820000:17d4:013e:1:0
+GAMES
+p:NetMed
+1fbd:00820000:189c:fbff:1:0
+Vetrina Primafila
+p:SkyItalia
+2cbd:00820000:2580:fbff:1:0
+Disney XD +1
+p:SkyItalia
+34bd:00820000:3c28:013e:1:0
+Loveworld TV
+p:GlobeCast
+38bd:00820000:2648:fbff:1:0
+Primafila 21
+p:SkyItalia
+3abd:00820000:0514:013e:1:0
+TVP 1 HD
+p:ITI
+00be:0082afc2:0065:0001:1:0
+Alhurra TV 190
+p:
+1bbe:00820000:17d4:013e:1:0
+E! Entertainment
+p:NetMed
+1fbe:00820000:189c:fbff:1:0
+NatGeo Wild
+p:SkyItalia
+2cbe:00820000:2580:fbff:1:0
+DisneyInEnglish
+p:SkyItalia
+34be:00820000:3c28:013e:1:0
+Fashion One
+p:GlobeCast
+38be:00820000:2648:fbff:1:0
+Primafila 28
+p:SkyItalia
+3abe:00820000:0514:013e:1:0
+Romance TV
+p:ITI
+0bbf:00820000:20d0:013e:1:0
+Telepace
+p:GlobeCast
+1bbf:00820000:17d4:013e:1:0
+The History Channel
+p:NetMed
+1fbf:00820000:189c:fbff:1:0
+Yacht & Sail
+p:SkyItalia
+2cbf:00820000:2580:fbff:1:0
+Juventus Channel
+p:SkyItalia
+38bf:00820000:2648:fbff:1:0
+Primafila 2
+p:SkyItalia
+0bc0:00820000:20d0:013e:1:0
+KNN Channel
+p:GlobeCast
+0dc0:00820000:2d50:013e:1:0
+Sport Klub +
+p:TVN
+1bc0:00820000:17d4:013e:1:0
+novacinema2
+p:NetMed
+2cc0:00820000:2580:fbff:1:0
+Inter Channel
+p:SkyItalia
+34c0:00820000:3c28:013e:1:0
+DAYSTAR TV
+p:GlobeCast
+35c0:00820000:1388:013e:1:0
+Redlight
+p:Telefonica Spain
+38c0:00820000:2648:fbff:1:0
+Sky Inside
+p:SkyItalia
+02c1:00820000:1b58:013e:1:0
+Al Jazeera Documentary
+p:Telespazio
+0bc1:00820000:20d0:013e:1:0
+ZAHRAA TV
+p:GLOBECAST
+0fc1:00820000:2db4:fbff:1:0
+Fox Crime +1
+p:SkyItalia
+12c1:00820000:2e7c:013e:1:0
+CANAL+
+p:CYFRA +
+1bc1:00820000:17d4:013e:1:0
+mottv
+p:NetMed
+35c1:00820000:1388:013e:1:0
+D-XTV2
+p:Telefonica Spain
+44c1:00820000:0258:013e:1:0
+WeddingTV Italia
+p:Arqiva
+02c2:00820000:1b58:013e:1:0
+Al Jazeera Mubasher
+p:Telespazio
+06c2:0082accf:0578:013e:1:0
+ROLSAT
+p:Harmonic
+0bc2:00820000:20d0:013e:1:0
+ERI TV
+p:GlobeCast
+0fc2:00820000:2db4:fbff:1:0
+Fox Life +1
+p:SkyItalia
+12c2:00820000:2e7c:013e:1:0
+CANAL+ FILM
+p:CYFRA +
+1bc2:00820000:17d4:013e:1:0
+novacinema3
+p:NetMed
+2cc2:00820000:2580:fbff:1:0
+La3
+p:SkyItalia
+34c2:00820000:3c28:013e:1:0
+Ariana TV
+p:GlobeCast
+35c2:00820000:1388:013e:1:0
+SCT 3
+p:Telefonica Spain
+38c2:00820000:2648:fbff:1:0
+Sky Inside
+p:SkyItalia
+01c3:00820000:26ac:013f:1:0
+RTL9
+p:AB SAT
+0bc3:00820000:20d0:013e:1:0
+HOLY GOD
+p:GlobeCast
+1bc3:00820000:17d4:013e:1:0
+novasports4
+p:NetMed
+2bc3:00820000:1a90:fbff:1:0
+Primafila 13
+p:SkyItalia
+2dc3:00820000:1a2c:fbff:1:0
+Cinema Max +1
+p:SkyItalia
+35c3:00820000:1388:013e:1:0
+SCT 5
+p:Telefonica Spain
+38c3:00820000:2648:fbff:1:0
+Sky Inside
+p:SkyItalia
+3dc3:00820000:0640:013e:1:0
+Eska TV
+p:ITI
+01c4:00820000:26ac:013f:1:0
+AB1
+p:AB SAT
+02c4:00820000:1b58:013e:1:0
+Al Jazeera
+p:Telespazio
+0dc4:00820000:2d50:013e:1:0
+TVP Historia
+p:TVN
+12c4:00820000:2e7c:013e:1:0
+KUCHNIA+
+p:CYFRA +
+1bc4:00820000:17d4:013e:1:0
+novasports highlights
+p:NetMed
+2cc4:00820000:2580:fbff:1:0
+DeAKids
+p:SkyItalia
+35c4:00820000:1388:013e:1:0
+SCT 4
+p:Harmonic
+01c5:00820000:26ac:013f:1:0
+AB MOTEURS
+p:AB SAT
+12c5:00820000:2e7c:013e:1:0
+ALE KINO+
+p:CYFRA +
+1bc5:00820000:17d4:013e:1:0
+novasports6
+p:NetMed
+1fc5:00820000:189c:fbff:1:0
+Fox Life
+p:SkyItalia
+2bc5:00820000:1a90:fbff:1:0
+Primafila 11
+p:SkyItalia
+3bc5:00820000:0064:fbff:1:0
+Disney Junior +1
+p:SkyItalia
+01c6:00820000:26ac:013f:1:0
+ANIMAUX
+p:
+12c6:00820000:2e7c:013e:1:0
+teleTOON+
+p:CYFRA +
+1bc6:00820000:17d4:013e:1:0
+EPT HD
+p:NetMed
+1fc6:00820000:189c:fbff:1:0
+TestTS63
+p:SkyItalia
+2dc6:00820000:1a2c:fbff:1:0
+Sky Uno
+p:SkyItalia
+34c6:00820000:3c28:013e:1:0
+TSB
+p:GlobeCast
+35c6:00820000:1388:013e:1:0
+SCT 6
+p:Telefonica Spain
+3bc6:00820000:0064:fbff:1:0
+DoveTv
+p:SkyItalia
+01c7:00820000:26ac:013f:1:0
+CHASSE & PECHE
+p:AB SAT
+12c7:00820000:2e7c:013e:1:0
+TVP 1
+p:CYFRA +
+1bc7:00820000:17d4:013e:1:0
+Disney Channel
+p:NetMed
+2bc7:00820000:1a90:fbff:1:0
+Eurosport 2
+p:SkyItalia
+2dc7:00820000:1a2c:fbff:1:0
+Sky Calcio 1
+p:SkyItalia
+34c7:00820000:3c28:013e:1:0
+Rebel TV
+p:GlobeCast
+35c7:00820000:1388:013e:1:0
+SCT 7
+p:Telefonica Spain
+00c8:0082afc2:0065:0001:1:0
+AzadliqRadiosu TV
+p:
+01c8:00820000:26ac:013f:1:0
+CINE FX
+p:
+12c8:00820000:2e7c:013e:1:0
+TVP 2
+p:CYFRA +
+1bc8:00820000:17d4:013e:1:0
+novasports3
+p:NetMed
+1fc8:00820000:189c:fbff:1:0
+Fox Retro
+p:SkyItalia
+2cc8:00820000:2580:fbff:1:0
+Classica
+p:SkyItalia
+2dc8:00820000:1a2c:fbff:1:0
+Sky Calcio 15
+p:SkyItalia
+34c8:00820000:3c28:013e:1:0
+INSPIRATIONNAL
+p:GlobeCast
+35c8:00820000:1388:013e:1:0
+SCT HQ
+p:Telefonica Spain
+38c8:00820000:2648:fbff:1:0
+Primafila 22
+p:SkyItalia
+00c9:0082afc2:0065:0001:1:0
+Radio Svoboda RU 201
+p:
+01c9:00820000:26ac:013f:1:0
+CINE POLAR
+p:AB SAT
+0bc9:00820000:20d0:013e:1:0
+Saudi - Sunnah
+p:GlobeCast
+12c9:00820000:2e7c:013e:1:0
+CANAL+ SPORT
+p:CYFRA +
+1bc9:00820000:17d4:013e:1:0
+novasports4 Cy
+p:NetMed
+1fc9:00820000:189c:fbff:1:0
+Cult
+p:SkyItalia
+35c9:00820000:1388:013e:1:0
+SCT 3b
+p:Telefonica Spain
+38c9:00820000:2648:fbff:1:0
+Primafila 28
+p:SkyItalia
+00ca:0082afc2:0065:0001:1:0
+Radio Svoboda UA 202
+p:
+01ca:00820000:26ac:013f:1:0
+ESCALES
+p:AB SAT
+12ca:00820000:2e7c:013e:1:0
+MTV ROCKS
+p:CYFRA +
+1bca:00820000:17d4:013e:1:0
+novacinema3 Cy
+p:NetMed
+1cca:00820000:1ce8:0071:1:0
+Cinemax2
+p:Cyfrowy Polsat S.A.
+2bca:00820000:1a90:fbff:1:0
+Primafila 9
+p:SkyItalia
+2dca:00820000:1a2c:fbff:1:0
+Cinema +1
+p:SkyItalia
+34ca:00820000:3c28:013e:1:0
+EWTN UK
+p:GlobeCast
+35ca:00820000:1388:013e:1:0
+SCT 4b
+p:Telefonica Spain
+38ca:00820000:2648:fbff:1:0
+Sky Inside
+p:SkyItalia
+3aca:00820000:03e8:013e:1:0
+Upload
+p:TVN
+00cb:0082afc2:0065:0001:1:0
+Radioi Ozodi 203
+p:
+01cb:00820000:26ac:013f:1:0
+Toute l'Histoire
+p:AB SAT
+12cb:00820000:2e7c:013e:1:0
+DOMO+
+p:CYFRA +
+1bcb:00820000:17d4:013e:1:0
+novasports3 Cy
+p:NetMed
+1fcb:00820000:189c:fbff:1:0
+Fox Crime
+p:SkyItalia
+2bcb:00820000:1a90:fbff:1:0
+CNN Intl.
+p:SkyItalia
+38cb:00820000:2648:fbff:1:0
+Sky Inside
+p:SkyItalia
+3bcb:00820000:0064:fbff:1:0
+Disney XD
+p:SkyItalia
+01cc:00820000:1964:013e:1:0
+TRT Belgesel
+p:JMC
+01cc:00820000:26ac:013f:1:0
+AB3
+p:AB SAT
+02cc:00820000:1b58:013e:1:0
+Telemarket 2
+p:Telespazio
+1bcc:00820000:17d4:013e:1:0
+novasports6 Cy
+p:NetMed
+1fcc:00820000:189c:fbff:1:0
+Gambero Rosso
+p:SkyItalia
+2bcc:00820000:1a90:fbff:1:0
+Primafila 7
+p:SkyItalia
+2dcc:00820000:1a2c:fbff:1:0
+Cinema Hits
+p:SkyItalia
+34cc:00820000:3c28:013e:1:0
+.Viva L'Italia Channel
+p:GlobeCast
+35cc:00820000:1388:013e:1:0
+TELEITALIASPOT
+p:Telefonica Spain
+38cc:00820000:2648:fbff:1:0
+Sky Radio
+p:SkyItalia
+3bcc:00820000:0064:fbff:1:0
+Cartoon Network
+p:SkyItalia
+00cd:0082afc2:0065:0001:1:0
+Radio Svaboda 205
+p:
+01cd:00820000:26ac:013f:1:0
+ACTION
+p:AB SAT
+0bcd:00820000:20d0:013e:1:0
+Speeda TV
+p:GlobeCast
+1ccd:00820000:1ce8:0071:1:0
+TEST T
+p:Cyfrowy Polsat S.A.
+29cd:00820000:3cf0:013e:1:0
+Pianeta TV
+p:GlobeCast
+2bcd:00820000:1a90:fbff:1:0
+GXT
+p:SkyItalia
+2dcd:00820000:1a2c:fbff:1:0
+Cinema Comedy
+p:SkyItalia
+34cd:00820000:3c28:013e:1:0
+!FunSpice
+p:GlobeCast
+35cd:00820000:1388:013e:1:0
+TELEITALIASPOT b
+p:Telefonica Spain
+3bcd:00820000:0064:fbff:1:0
+Hip Hop TV
+p:SkyItalia
+3dcd:00820000:0640:013e:1:0
+TVN HD
+p:TVN
+00ce:0082afc2:0065:0001:1:0
+Radio Tavisupleba 206
+p:
+01ce:00820000:26ac:013f:1:0
+MANGAS
+p:AB SAT
+06ce:0082accf:0578:013e:1:0
+SILVER TV
+p:Harmonic
+1bce:00820000:17d4:013e:1:0
+novacinema2 Cy
+p:NetMed
+29ce:00820000:3cf0:013e:1:0
+TELEPIU' Channel
+p:GlobeCast
+2bce:00820000:1a90:fbff:1:0
+Primafila 5
+p:SkyItalia
+34ce:00820000:3c28:013e:1:0
+KICC
+p:GlobeCast
+35ce:00820000:1388:013e:1:0
+TELEITALIASPOT c
+p:Telefonica Spain
+3dce:00820000:0640:013e:1:0
+TVN Style HD
+p:TVN
+00cf:0082afc2:0065:0001:1:0
+Azatutyun 207
+p:
+01cf:00820000:26ac:013f:1:0
+ENCYCLO
+p:AB SAT
+06cf:0082accf:0578:013e:1:0
+RETECONOMY
+p:Satlink
+0bcf:00820000:20d0:013e:1:0
+Hispan TV
+p:GlobeCast
+1ccf:00820000:1ce8:0071:1:0
+FoxLife
+p:Cyfrowy Polsat S.A.
+1fcf:00820000:189c:fbff:1:0
+History
+p:SkyItalia
+29cf:00820000:3cf0:013e:1:0
+ARTE
+p:
+2bcf:00820000:1a90:fbff:1:0
+Sky Calcio 2
+p:SkyItalia
+2dcf:00820000:1a2c:fbff:1:0
+Sky Calcio 14
+p:SkyItalia
+3dcf:00820000:0640:013e:1:0
+TVN STYLE HD
+p:ITI
+00d0:0082afc2:0065:0001:1:0
+Radio Deewa 208
+p:
+01d0:00820000:26ac:013f:1:0
+AB4
+p:AB SAT
+06d0:0082accf:0578:013e:1:0
+FISHING TV
+p:Harmonic
+07d0:0082accf:0578:013e:1:0
+ODEON SAT
+p:Satlink
+1bd0:00820000:17d4:013e:1:0
+FOXlife
+p:NetMed
+29d0:00820000:3cf0:013e:1:0
+RTL 102.5 TV
+p:GlobeCast
+2bd0:00820000:1a90:fbff:1:0
+Primafila 3
+p:SkyItalia
+2cd0:00820000:2580:fbff:1:0
+E!
+p:SkyItalia
+2fd0:00820000:2c24:fbff:1:0
+DeAKids +1
+p:SkyItalia
+38d0:00820000:2648:fbff:1:0
+Fox Business
+p:SkyItalia
+3dd0:00820000:0640:013e:1:0
+TVN Turbo HD
+p:TVN
+01d1:00820000:26ac:013f:1:0
+LUCKY JACK
+p:AB SAT
+02d1:00820000:1b58:013e:1:0
+BETHEL TV
+p:Telespazio
+1bd1:00820000:17d4:013e:1:0
+FX
+p:NetMed
+2bd1:00820000:1a90:fbff:1:0
+Sky Calcio 3
+p:SkyItalia
+2cd1:00820000:2580:fbff:1:0
+ESPN America
+p:SkyItalia
+2fd1:00820000:2c24:fbff:1:0
+Discovery +1
+p:SkyItalia
+3dd1:00820000:0640:013e:1:0
+TVN TURBO HD
+p:TVN
+00d2:0082afc2:0065:0001:1:0
+Mashaal Radio 210
+p:
+01d2:00820000:26ac:013f:1:0
+ORANGE SPORT INFO
+p:AB SAT
+02d2:00820000:1b58:013e:1:0
+The Truth
+p:Telespazio
+1bd2:00820000:17d4:013e:1:0
+Boomerang
+p:NetMed
+29d2:00820000:3cf0:013e:1:0
+ITALIA_CHANNEL
+p:GlobeCast
+2fd2:00820000:2c24:fbff:1:0
+DMAX
+p:SkyItalia
+39d2:00820000:1fa4:013e:1:0
+RTVi Europe
+p:EUTELSAT
+00d3:0082afc2:0065:0001:1:0
+Azattyk Unalgysy 211
+p:
+01d3:00820000:26ac:013f:1:0
+BIS promo
+p:AB SAT
+02d3:00820000:1b58:013e:1:0
+S.NEU JERUSALEM
+p:Telespazio
+1bd3:00820000:17d4:013e:1:0
+Nat Geo Wild
+p:NetMed
+29d3:00820000:3cf0:013e:1:0
+TV_ROMANIA
+p:
+2bd3:00820000:1a90:fbff:1:0
+Sky Calcio 4
+p:SkyItalia
+2fd3:00820000:2c24:fbff:1:0
+-frisbee-
+p:SkyItalia
+39d3:00820000:1fa4:013e:1:0
+RTVi Detskii Mir-Teleclub
+p:EUTELSAT
+00d4:0082afc2:0065:0001:1:0
+Ozodlik Radiosi 212
+p:
+01d4:00820000:26ac:013f:1:0
+XXL
+p:AB SAT
+29d4:00820000:3cf0:013e:1:0
+Carisma_TV
+p:GlobeCast
+34d4:00820000:3c28:013e:1:0
+TISHK TV
+p:GlobeCast
+39d4:00820000:1fa4:013e:1:0
+RTVi Nashe Kino
+p:EUTELSAT
+00d5:0082afc2:0065:0001:1:0
+Azadliq Radiosu 213
+p:
+01d5:00820000:26ac:013f:1:0
+XXL PL
+p:AB SAT
+0fd5:00820000:2db4:fbff:1:0
+Fox +2
+p:SkyItalia
+29d5:00820000:3cf0:013e:1:0
+KBS_WORLD
+p:GlobeCast
+2bd5:00820000:1a90:fbff:1:0
+Sky Calcio 5
+p:SkyItalia
+2fd5:00820000:2c24:fbff:1:0
+K2
+p:SkyItalia
+44d5:00820000:0258:013e:1:0
+Videolina
+p:Arqiva
+0fd6:00820000:2db4:fbff:1:0
+Fox Life +2
+p:SkyItalia
+29d6:00820000:3cf0:013e:1:0
+El Chourouk
+p:GlobeCast
+34d6:00820000:3c28:013e:1:0
+TV GLOBO
+p:TandbergTV,C:1801,C:0500
+44d6:00820000:0258:013e:1:0
+Sardegna1
+p:Arqiva
+00d7:0082afc2:0065:0001:1:0
+Alhurra TV 215
+p:
+0fd7:00820000:2db4:fbff:1:0
+Fox Crime +2
+p:SkyItalia
+10d7:00820000:03e8:013e:1:0
+TVN
+p:TVN
+12d7:00820000:2e7c:013e:1:0
+4823
+p:CYFRA +
+29d7:00820000:3cf0:013e:1:0
+TELESUD
+p:GlobeCast
+2bd7:00820000:1a90:fbff:1:0
+Sky Calcio 6
+p:SkyItalia
+34d7:00820000:3c28:013e:1:0
+News 7
+p:GlobeCast
+39d7:00820000:1fa4:013e:1:0
+TV ARM RU
+p:EUTELSAT
+00d8:0082afc2:0065:0001:1:0
+Kabul Stream 216
+p:
+10d8:00820000:03e8:013e:1:0
+TVN 24
+p:TVN
+44d8:00820000:0258:013e:1:0
+20TV
+p:Arqiva
+00d9:0082afc2:0065:0001:1:0
+Azatlyk Radiosy 217
+p:
+0fd9:00820000:2db4:fbff:1:0
+History +1
+p:SkyItalia
+10d9:00820000:03e8:013e:1:0
+TVN Siedem
+p:TVN
+29d9:00820000:3cf0:013e:1:0
+K+
+p:GlobeCast
+2bd9:00820000:1a90:fbff:1:0
+Sky Calcio 7
+p:SkyItalia
+2dd9:00820000:1a2c:fbff:1:0
+Sky Sport 3
+p:SkyItalia
+00da:0082afc2:0065:0001:1:0
+Azatliq Radiosi 218
+p:
+01da:00820000:1964:013e:1:0
+IQRAA  -  ARABESQUE
+p:ART
+0fda:00820000:2db4:fbff:1:0
+NationalGeo +1
+p:SkyItalia
+10da:00820000:03e8:013e:1:0
+nSport
+p:TVN
+44da:00820000:0258:013e:1:0
+AVA MOVIE
+p:Arqiva
+01db:00820000:1964:013e:1:0
+Iqraa Africa & Europe
+p:
+06db:0082accf:0578:013e:1:0
+NOSTRADAMUS
+p:Satlink
+0fdb:00820000:2648:fbff:1:0
+12673V SID 0xfdb
+p:DVB-S QPSK 12673V 13.0°E
+29db:00820000:3cf0:013e:1:0
+Arirang World
+p:
+44db:00820000:0258:013e:1:0
+TVR
+p:Arqiva
+00dc:0082afc2:0065:0001:1:0
+RL North Caucasus 220
+p:
+0fdc:00820000:2db4:fbff:1:0
+Arturo
+p:SkyItalia
+10dc:00820000:03e8:013e:1:0
+Mango 24
+p:TVN
+29dc:00820000:3cf0:013e:1:0
+AD Sport 1
+p:GlobeCast
+32dc:00820000:0190:013e:1:0
+CANAL+ HD
+p:CYFRA +
+00dd:0082afc2:0065:0001:1:0
+Europa Libera 221
+p:
+10dd:00820000:03e8:013e:1:0
+TTV
+p:ITI
+1edd:00820000:21fc:013e:1:0
+IRIB1 
+p:IRIB
+32dd:00820000:0190:013e:1:0
+CANAL+ FILM HD
+p:CYFRA +
+44dd:00820000:0258:013e:1:0
+Russia Today
+p:Arqiva
+00de:0082afc2:0065:0001:1:0
+RSE Balkans 222
+p:
+01de:00820000:1964:013e:1:0
+IFILM
+p:ART
+0fde:00820000:2db4:fbff:1:0
+JimJam +1
+p:SkyItalia
+10de:00820000:03e8:013e:1:0
+TVN Meteo
+p:TVN
+12de:00820000:2e7c:013e:1:0
+H test 1
+p:CYFRA +
+29de:00820000:3cf0:013e:1:0
+NESSMA EU
+p:GlobeCast
+2fde:00820000:2c24:fbff:1:0
+Nick Jr +1
+p:SkyItalia
+32de:00820000:0190:013e:1:0
+CANAL+ SPORT HD
+p:CYFRA +
+00df:0082afc2:0065:0001:1:0
+Radio Farda 223
+p:
+02df:00820000:1b58:013e:1:0
+Al Mayadeen Tv
+p:Harmonic
+10df:00820000:03e8:013e:1:0
+TVN Turbo
+p:TVN
+12df:00820000:2e7c:013e:1:0
+H test 2
+p:CYFRA +
+1edf:00820000:21fc:013e:1:0
+IRIB2 
+p:IRIB
+32df:00820000:0190:013e:1:0
+NATIONAL GEO HD
+p:CYFRA +
+38df:00820000:2648:fbff:1:0
+Sky Assist
+p:SkyItalia
+44df:00820000:0258:013e:1:0
+Persian TV
+p:Arqiva
+01e0:00820000:1964:013e:1:0
+Press TV
+p:JMC
+10e0:00820000:03e8:013e:1:0
+TVN Style
+p:TVN
+12e0:00820000:2e7c:013e:1:0
+H test 3
+p:CYFRA +
+2fe0:00820000:2c24:fbff:1:0
+AXN +1
+p:SkyItalia
+38e0:00820000:2648:fbff:1:0
+Primafila 4
+p:SkyItalia
+44e0:00820000:0258:013e:1:0
+Russia Al-Yaum
+p:Arqiva
+00e1:0082afc2:0065:0001:1:0
+Persian TV 225
+p:
+01e1:00820000:1964:013e:1:0
+Syrian Drama
+p:ART
+06e1:0082accf:0578:013e:1:0
+SRI LANKA ONE
+p:Satlink
+10e1:00820000:1644:fbff:1:0
+Sky Meteo24
+p:SkyItalia
+10e1:00820000:03e8:013e:1:0
+Test
+p:TVN
+12e1:00820000:2e7c:013e:1:0
+  CANAL+ FILM
+p:CYFRA +
+1ee1:00820000:21fc:013e:1:0
+IRINN
+p:IRIB
+32e1:00820000:0190:013e:1:0
+FILMBOX HD
+p:CYFRA +
+38e1:00820000:2648:fbff:1:0
+Primafila 6
+p:SkyItalia
+44e1:00820000:0258:013e:1:0
+Opap TV
+p:Arqiva
+00e2:0082afc2:0065:0001:1:0
+Radio Free Iraq 226
+p:
+0fe2:00820000:2db4:fbff:1:0
+Sky Test
+p:SkyItalia
+10e2:00820000:03e8:013e:1:0
+TVN CNBC
+p:TVN
+29e2:00820000:3cf0:013e:1:0
+E'TV Emilia R.
+p:GlobeCast
+32e2:00820000:0190:013e:1:0
+AXN SPIN HD
+p:CYFRA +
+44e2:00820000:0258:013e:1:0
+Monitor Games
+p:Arqiva
+00e3:0082afc2:0065:0001:1:0
+Evropa e Lire 227
+p:
+01e3:00820000:1964:013e:1:0
+Ictimai TV
+p:ART
+0fe3:00820000:2648:fbff:1:0
+12673V SID 0xfe3
+p:DVB-S QPSK 12673V 13.0°E
+10e3:00820000:1644:fbff:1:0
+SNAI Sat
+p:SkyItalia
+12e3:00820000:2e7c:013e:1:0
+ CANAL+
+p:CYFRA +
+1ee3:00820000:21fc:013e:1:0
+IRIB QURAN
+p:IRIB
+29e3:00820000:3cf0:013e:1:0
+ARTE
+p:
+32e3:00820000:0190:013e:1:0
+TVN 7 HD
+p:CYFRA +
+44e3:00820000:0258:013e:1:0
+World Fashion Channel
+p:Arqiva
+00e4:0082afc2:0065:0001:1:0
+Ekho Kavkaza 228
+p:
+12e4:00820000:2e7c:013e:1:0
+ CANAL+ FILM
+p:CYFRA +
+44e4:00820000:0258:013e:1:0
+PersianToon
+p:Arqiva
+01e5:00820000:1964:013e:1:0
+Syria TV
+p:JMC
+0ce5:00820000:1518:013e:1:0
+Rai Sport 2
+p:RAI
+12e5:00820000:2e7c:013e:1:0
+ CANAL+ SPORT
+p:CYFRA +
+3be5:00820000:0064:fbff:1:0
+Rock TV
+p:SkyItalia
+44e5:00820000:0258:013e:1:0
+Imam Hussein TV
+p:
+0ce6:00820000:1518:013e:1:0
+Camera Deputati
+p:RAI
+3be6:00820000:0064:fbff:1:0
+Sky Music
+p:SkyItalia
+44e6:00820000:0258:013e:1:0
+Baqi TV
+p:Arqiva
+01e7:00820000:1964:013e:1:0
+RT DOC
+p:JMC
+1ee7:00820000:21fc:013e:1:0
+SAHAR 1
+p:IRIB
+29e7:00820000:3cf0:013e:1:0
+Telefoggia
+p:GlobeCast
+2fe7:00820000:2c24:fbff:1:0
+GXT +1
+p:SkyItalia
+44e7:00820000:0258:013e:1:0
+Al-Hayat
+p:Arqiva
+01e8:00820000:1964:013e:1:0
+Yemen TV
+p:JMC
+0ce8:00820000:1518:013e:1:0
+Rai Test HD
+p:Rai
+10e8:00820000:1644:fbff:1:0
+TG24PrimoPiano
+p:SkyItalia
+2fe8:00820000:2c24:fbff:1:0
+Cartoon +1
+p:SkyItalia
+44e8:00820000:0258:013e:1:0
+AHTV
+p:Arqiva
+0ce9:00820000:1518:013e:1:0
+Rai Sport 1
+p:RAI
+2fe9:00820000:2c24:fbff:1:0
+Boomerang +1
+p:SkyItalia
+35e9:00820000:00c8:013e:1:0
+ESP2 Int'l
+p:Eutelsat,C:0500,C:1803,C:0931,C:0baa,C:091f,C:0604
+0cea:00820000:1518:013e:1:0
+Rai Premium
+p:RAI
+10ea:00820000:1644:fbff:1:0
+TG24 Rassegne
+p:SkyItalia
+1cea:00820000:2fa8:013e:1:0
+Noursat
+p:Globecast UK
+20ea:00820000:3db8:013e:1:0
+BLU
+p:Telespazio
+34ea:00820000:3c28:013e:1:0
+MADE IN ITALY
+p:GlobeCast
+35ea:00820000:00c8:013e:1:0
+ESP2 Dutch
+p:Eutelsat,C:0500,C:1803,C:0931,C:0baa,C:091f,C:0604
+0beb:00820000:20d0:013e:1:0
+Equidia PRO1
+p:GlobeCast
+0ceb:00820000:1518:013e:1:0
+Rai Storia
+p:RAI
+1eeb:00820000:21fc:013e:1:0
+AL-ALAM
+p:IRIB
+20eb:00820000:3db8:013e:1:0
+CONTO TV 3
+p:Telespazio
+0bec:00820000:20d0:013e:1:0
+Equidia PRO2
+p:GlobeCast
+0cec:00820000:1518:013e:1:0
+RaiNettunoSat1
+p:RAI
+10ec:00820000:1644:fbff:1:0
+TG24 Eventi
+p:SkyItalia
+20ec:00820000:3db8:013e:1:0
+CONTO TV 2
+p:Telespazio
+2fec:00820000:2c24:fbff:1:0
+Real Time +1
+p:SkyItalia
+35ec:00820000:00c8:013e:1:0
+ESP2 Test
+p:Eutelsat,C:0500,C:1803,C:0931,C:0baa,C:091f,C:0604
+0ced:00820000:1518:013e:1:0
+TV2000
+p:RAI
+13ed:00820000:05dc:013e:1:0
+TV POLONIA
+p:CYFRA +
+20ed:00820000:3db8:013e:1:0
+CONTO TV 1
+p:Telespazio
+35ed:00820000:00c8:013e:1:0
+ESP2 Greek
+p:Eutelsat,C:0500,C:1803,C:0931,C:0baa,C:091f,C:0604
+3bed:00820000:0064:fbff:1:0
+Sky Music
+p:SkyItalia
+0cee:00820000:1518:013e:1:0
+Rai Gulp
+p:RAI
+13ee:00820000:05dc:013e:1:0
+TVS
+p:CYFRA +
+20ee:00820000:3db8:013e:1:0
+CONTO TV
+p:Telespazio
+39ee:00820000:1fa4:013e:1:0
+Youdem
+p:Eutelsat
+20ef:00820000:3db8:013e:1:0
+CONTO TV 4
+p:Harmonic
+29ef:00820000:3cf0:013e:1:0
+RTG TV
+p:GlobeCast
+00f0:0082afc2:0065:0001:1:0
+VOA TV 240 (HB49-56)
+p:
+13f0:00820000:05dc:013e:1:0
+KINO POLSKA
+p:CYFRA +
+20f0:00820000:3db8:013e:1:0
+CONTO TV 5
+p:Telespazio
+2ff0:00820000:2c24:fbff:1:0
+Comedy +1
+p:SkyItalia
+3bf0:00820000:0064:fbff:1:0
+Caccia e Pesca
+p:SkyItalia
+00f1:00820000:2e18:00b0:1:0
+Tamazight
+p:PRVDR
+00f1:0082afc2:0065:0001:1:0
+VOA TV 241
+p:
+13f1:00820000:05dc:013e:1:0
+TRACE TV
+p:CYFRA +
+20f1:00820000:3db8:013e:1:0
+JUSTICE TV
+p:Telespazio
+29f1:00820000:3cf0:013e:1:0
+METROPOLIS TV SAT
+p:GlobeCast
+2ff1:00820000:2c24:fbff:1:0
+Nickelodeon +1
+p:SkyItalia
+00f2:0082afc2:0065:0001:1:0
+VOA TV 242
+p:
+01f2:00820000:1964:013e:1:0
+Saudi Sports 1
+p:JMC
+29f2:00820000:3cf0:013e:1:0
+METROSAT
+p:GlobeCast
+44f2:00820000:0258:013e:1:0
+Manoto 1
+p:Arqiva
+00f3:0082afc2:0065:0001:1:0
+VOA Radio 243 (HB51-52)
+p:
+01f3:00820000:1964:013e:1:0
+Alalam
+p:JMC
+38f3:00820000:2648:fbff:1:0
+Music Box
+p:SkyItalia
+00f4:0082afc2:0065:0001:1:0
+VOA Radio 244 (HB53-54)
+p:
+13f4:00820000:05dc:013e:1:0
+5108
+p:CYFRA +
+34f4:00820000:3c28:013e:1:0
+POKERItalia24
+p:GlobeCast
+3bf4:00820000:0064:fbff:1:0
+Babel
+p:SkyItalia
+00f5:0082afc2:0065:0001:1:0
+VOA Radio 245 (HB55-56)
+p:
+01f5:00820000:26ac:013f:1:0
+Trace Sport SD
+p:Eutelsat
+13f5:00820000:05dc:013e:1:0
+ITV
+p:CYFRA +
+20f5:00820000:01f4:013e:1:0
+JSC Sports +1
+p:Al Jazeera
+35f5:00820000:00c8:013e:1:0
+ESP2 Rus
+p:Eutelsat,C:0500,C:1803,C:0931,C:0baa,C:091f,C:0604
+01f6:00820000:26ac:013f:1:0
+TV8 Mont Blanc
+p:Eutelsat
+12f6:00820000:2e7c:013e:1:0
+KUCHNIA+
+p:CYFRA +
+13f6:00820000:05dc:013e:1:0
+TVP INFO
+p:CYFRA +
+20f6:00820000:01f4:013e:1:0
+JSC Sports +2
+p:Al Jazeera
+01f7:00820000:26ac:013f:1:0
+M6 SD
+p:Eutelsat
+12f7:00820000:2e7c:013e:1:0
+ALE KINO+
+p:CYFRA +
+13f7:00820000:05dc:013e:1:0
+CINEMAX
+p:CYFRA +
+20f7:00820000:01f4:013e:1:0
+JSC Sports +3
+p:Al Jazeera
+01f8:00820000:26ac:013f:1:0
+Game ONE
+p:Eutelsat
+12f8:00820000:2e7c:013e:1:0
+teleTOON+
+p:CYFRA +
+13f8:00820000:05dc:013e:1:0
+PULS
+p:CYFRA +
+20f8:00820000:01f4:013e:1:0
+JSC Sports +4
+p:Al Jazeera
+11f9:00820000:2b5c:013e:1:0
+Islam TV
+p:Arqiva
+12f9:00820000:2e7c:013e:1:0
+DOMO+
+p:CYFRA +
+13f9:00820000:05dc:013e:1:0
+TVP Kultura
+p:CYFRA +
+20f9:00820000:01f4:013e:1:0
+JSC Sports +5
+p:Al Jazeera
+11fa:00820000:2b5c:013e:1:0
+GEM ME
+p:Arqiva
+20fa:00820000:01f4:013e:1:0
+JSC Sports +6
+p:Al Jazeera
+29fa:00820000:3cf0:013e:1:0
+Mediterraneo Sat
+p:GlobeCast
+38fa:00820000:2648:fbff:1:0
+Primafila 21
+p:SkyItalia
+00fb:0082afc2:0065:0001:1:0
+VOA TV 251
+p:
+11fb:00820000:2b5c:013e:1:0
+RTPi
+p:Arqiva
+20fb:00820000:01f4:013e:1:0
+JSC Sports +7
+p:Al Jazeera
+29fb:00820000:3cf0:013e:1:0
+QUORE TV
+p:GlobeCast
+00fc:0082afc2:0065:0001:1:0
+VOA TV 252
+p:
+10fc:00820000:1644:fbff:1:0
+Sky TG24
+p:SkyItalia
+11fc:00820000:2b5c:013e:1:0
+MTA INTL
+p:Arqiva
+20fc:00820000:01f4:013e:1:0
+JSC Sports +8
+p:Al Jazeera
+29fc:00820000:3cf0:013e:1:0
+Reality TV
+p:GlobeCast
+44fc:00820000:0258:013e:1:0
+Pars TV
+p:Harmonic
+00fd:0082afc2:0065:0001:1:0
+VOA Radio 253 (HB53-56)
+p:
+20fd:00820000:01f4:013e:1:0
+JSC Sports +9
+p:Al Jazeera
+35fd:00820000:00c8:013e:1:0
+ESP2 Portuguese
+p:Eutelsat,C:0500,C:1803,C:0931,C:0baa,C:091f,C:0604
+11fe:00820000:2b5c:013e:1:0
+Deepam TV
+p:Arqiva
+20fe:00820000:01f4:013e:1:0
+JSC Sports +10
+p:Al Jazeera
+2a00:00820000:3cf0:013e:2:0
+Radio_Romania_International
+p:GlobeCast
+3c00:00820000:0064:fbff:2:0
+Vibe
+p:SkyItalia
+2a01:00820000:3cf0:013e:2:0
+RadioClassica
+p:GlobeCast
+2a02:00820000:3cf0:013e:2:0
+RTL GROOVE
+p:GlobeCast_Italia
+2a03:00820000:3cf0:013e:2:0
+RTL Italian Style
+p:GlobeCast_Italia
+2a04:00820000:3cf0:013e:2:0
+Guardia Costiera
+p:GlobeCast_Italia
+2a05:00820000:3cf0:013e:2:0
+RTL Classic
+p:GlobeCast_Italia
+0e06:00820000:3c8c:013e:2:0
+DW09
+p:MEDIA BROADCAST
+2a06:00820000:3cf0:013e:2:0
+Radio Padania
+p:
+3c06:00820000:0064:fbff:2:0
+Yesterjay 2000
+p:SkyItalia
+2907:00820000:1edc:0071:2:0
+Planeta FM
+p:Cyfrowy Polsat S.A.
+0c08:00820000:20d0:013e:2:0
+Radio Nawa Arabic
+p:GlobeCast
+3c0a:00820000:0064:fbff:2:0
+Heart n' song
+p:SkyItalia
+000b:00820000:2e18:00b0:2:0
+Radio national
+p:PRVDR
+000b:00820000:1770:0110:2:0
+Radio Mater
+p:
+000b:00820000:25e4:02be:2:0
+SHARJAH R1
+p:ARABSAT
+0c0b:00820000:20d0:013e:2:0
+Emirates FM
+p:GlobeCast
+000c:00820000:2e18:00b0:2:0
+Radio Dakhla
+p:PRVDR
+000c:00820000:25e4:02be:2:0
+QATAR R1
+p:ARABSAT
+3c0c:00820000:0064:fbff:2:0
+Dance
+p:SkyItalia
+000d:00820000:25e4:02be:2:0
+SAUDI1 R1
+p:ARABSAT
+3c0d:00820000:0064:fbff:2:0
+Ritmo Latino
+p:SkyItalia
+000e:00820000:2e18:00b0:2:0
+Chaine inter
+p:PRVDR
+000e:00820000:25e4:02be:2:0
+KUWAIT R1
+p:ARABSAT
+3c0e:00820000:0064:fbff:2:0
+Livetime
+p:SkyItalia
+000f:00820000:2e18:00b0:2:0
+Amazigh
+p:PRVDR
+0c0f:00820000:20d0:013e:2:0
+RFI Francais
+p:GlobeCast
+3c0f:00820000:0064:fbff:2:0
+Rock Classic
+p:SkyItalia
+0010:00820000:2e18:00b0:2:0
+Radio Mohamed VI
+p:PRVDR
+0010:00820000:25e4:02be:2:0
+SUDAN R1
+p:ARABSAT
+3c10:00820000:0064:fbff:2:0
+Rock Shock
+p:SkyItalia
+0011:00820000:25e4:02be:2:0
+OMAN R1
+p:ARABSAT
+3c11:00820000:0064:fbff:2:0
+B-Side
+p:SkyItalia
+0012:00820000:25e4:02be:2:0
+ESC R1
+p:ARABSAT
+3c12:00820000:0064:fbff:2:0
+Jazz & Fusion
+p:SkyItalia
+0013:00820000:25e4:02be:2:0
+RADIO BAGHDAD
+p:ARABSAT
+3c13:00820000:0064:fbff:2:0
+Jazz Gold
+p:SkyItalia
+3c14:00820000:0064:fbff:2:0
+Soul Train
+p:SkyItalia
+0015:00820000:25e4:02be:2:0
+SHARJAH R2
+p:ARABSAT
+3c15:00820000:0064:fbff:2:0
+Extrabeat
+p:SkyItalia
+3c16:00820000:0064:fbff:2:0
+Sinfonia
+p:SkyItalia
+0017:00820000:25e4:02be:2:0
+SAUDI1 R2
+p:ARABSAT
+3c17:00820000:0064:fbff:2:0
+Opera
+p:SkyItalia
+0018:00820000:25e4:02be:2:0
+KUWAIT R2
+p:ARABSAT
+3c18:00820000:0064:fbff:2:0
+Cinema Deejay
+p:SkyItalia
+0119:0082afc2:0065:0001:2:0
+VOA Radio 281 (HB75-78)
+p:
+3c19:00820000:0064:fbff:2:0
+Baby Mix
+p:SkyItalia
+001a:00820000:25e4:02be:2:0
+SUDAN R2
+p:ARABSAT
+0e1a:00820000:3c8c:013e:2:0
+DW-FM01
+p:MEDIA BROADCAST
+3c1a:00820000:0064:fbff:2:0
+Disc Joker
+p:SkyItalia
+001b:00820000:25e4:02be:2:0
+OMAN R2
+p:ARABSAT
+291b:00820000:1edc:0071:2:0
+RMF FM
+p:Cyfrowy Polsat S.A.
+001c:00820000:25e4:02be:2:0
+ESC R2
+p:ARABSAT
+291c:00820000:1edc:0071:2:0
+Zlote Przeboje
+p:Cyfrowy Polsat S.A.
+001d:00820000:25e4:02be:2:0
+AL-IRAQIA QURAN
+p:ARABSAT
+0c1d:00820000:20d0:013e:2:0
+FMAddis97-1
+p:GlobeCast
+291e:00820000:1edc:0071:2:0
+RMF Classic
+p:Cyfrowy Polsat S.A.
+291f:00820000:1edc:0071:2:0
+Radio PIN 102FM
+p:Cyfrowy Polsat S.A.
+2920:00820000:1edc:0071:2:0
+Jedynka - PR
+p:Cyfrowy Polsat S.A.
+2921:00820000:1edc:0071:2:0
+Trójka - PR
+p:Cyfrowy Polsat S.A.
+2922:00820000:1edc:0071:2:0
+Radio ZET
+p:Cyfrowy Polsat S.A.
+0025:00820000:25e4:02be:2:0
+OMAN R3
+p:ARABSAT
+0026:00820000:25e4:02be:2:0
+ESC R3
+p:ARABSAT
+0a28:00820000:3d54:013e:2:0
+Era 1
+p:
+1c2d:00820000:1c20:013e:2:0
+R.Citta Futura
+p:AH-EDP
+0e2e:00820000:0708:00c8:2:0
+RADIO ITALIA s.m.i.
+p:M-Three satcom
+002f:00820000:25e4:02be:2:0
+OMAN-HOLY QURAN
+p:ARABSAT
+292f:00820000:1edc:0071:2:0
+RMF MAXXX
+p:Cyfrowy Polsat S.A.
+0e30:00820000:0708:00c8:2:0
+RMC 2
+p:M-Three satcom
+1c30:00820000:1c20:013e:2:0
+Ecoradio
+p:AH-EDP
+2530:00820000:13ef:013e:2:0
+Noor Dubai Radio
+p:Du
+0e31:00820000:0708:00c8:2:0
+VIRGIN RADIO
+p:M-Three satcom
+0032:00820000:25e4:02be:2:0
+JORDAN R1
+p:ARABSAT
+1c32:00820000:1c20:013e:2:0
+R Tunisie Culture
+p:AH-EDP
+0e34:00820000:0708:00c8:2:0
+R.BuonConsiglio
+p:M-Three satcom
+4234:00820000:3db8:013e:2:0
+TASVIR AFN
+p:Telespazio
+0135:00820000:157c:013e:2:0
+Love Radio
+p:NetMed
+0e35:00820000:0708:00c8:2:0
+Radio Sportiva
+p:M-Three  satcom
+0136:0082afc2:0065:0001:2:0
+VOA Urdu Radio 310
+p:
+0136:00820000:157c:013e:2:0
+Greek Church
+p:NetMed
+0e36:00820000:0708:00c8:2:0
+KISS KISS RADIO
+p:M-Three satcom
+0137:00820000:157c:013e:2:0
+Skai Radio
+p:NetMed
+0138:00820000:157c:013e:2:0
+Melodi Radio
+p:NetMed
+0e38:00820000:0708:00c8:2:0
+R.S.F. inBlu
+p:M-Three satcom
+0e38:00820000:3c8c:013e:2:0
+DW-FM04
+p:MEDIA BROADCAST
+0139:00820000:157c:013e:2:0
+RR3
+p:NetMed
+0e39:00820000:0708:00c8:2:0
+Radio Sei
+p:M-Three satcom
+013a:00820000:157c:013e:2:0
+RR1
+p:NetMed
+0e3a:00820000:0708:00c8:2:0
+Rete Sport
+p:M-Three satcom
+0e3c:00820000:0708:00c8:2:0
+Radio 24
+p:M-Three satcom
+0e3d:00820000:0708:00c8:2:0
+R.ONDA D'URTO
+p:M-Three satcom
+0e3e:00820000:0708:00c8:2:0
+R101
+p:M-Three satcom
+0e40:00820000:0708:00c8:2:0
+RADIO KOLBE
+p:M-Three satcom
+0e42:00820000:0708:00c8:2:0
+DISCORADIO
+p:M-Three satcom
+0e43:00820000:0708:00c8:2:0
+DEEJAY
+p:M-Three satcom
+2143:00820000:3070:013e:2:0
+Rai radiofd4
+p:RAI
+0e44:00820000:0708:00c8:2:0
+CAPITAL
+p:M-Three satcom
+0e45:00820000:0708:00c8:2:0
+M DUE O
+p:M-Three satcom
+0e46:00820000:0708:00c8:2:0
+Radio Iglesias
+p:M-Three satcom
+0e47:00820000:0708:00c8:2:0
+Radio
+p:M-Three satcom
+1348:00820000:33f4:013e:2:0
+VAB RADIO
+p:Telespazio
+0e4a:00820000:3c8c:013e:2:0
+DW-FM07
+p:MEDIA BROADCAST
+144a:00820000:05dc:013e:2:0
+11488H SID 0x144a
+p:DVB-S QPSK 11488H 13.0°E
+144c:00820000:05dc:013e:2:0
+11488H SID 0x144c
+p:DVB-S QPSK 11488H 13.0°E
+0e4e:00820000:3c8c:013e:2:0
+DW-FEED1
+p:MEDIA BROADCAST
+144e:00820000:05dc:013e:2:0
+11488H SID 0x144e
+p:DVB-S QPSK 11488H 13.0°E
+294e:00820000:1edc:0071:2:0
+12284H SID 0x294e
+p:DVB-S QPSK 12284H 13.0°E
+1c52:00820000:1c20:013e:2:0
+R Tunisie Nationale
+p:AH-EDP
+1c53:00820000:1c20:013e:2:0
+R Tunisie Internationale
+p:AH-EDP
+3653:00820000:1388:013e:2:0
+BBC English (Europe)
+p:BBC World Service
+3654:00820000:1388:013e:2:0
+BBC English Mid-East
+p:BBC World Service
+3656:00820000:1388:013e:2:0
+BBC English News
+p:BBC World Service
+365c:00820000:1388:013e:2:0
+BBC Arabic
+p:BBC World Service
+0960:00820000:3d54:013e:2:0
+Era Sport
+p:
+0066:0082accf:0578:013e:2:0
+Bahai Radio
+p:Harmonic
+0067:0082afc2:0065:0001:2:0
+VOA Radio 103 (HB55-56)
+p:
+0067:00820000:2cec:013e:2:0
+RUSSIAN RADIO
+p:RRSat
+2167:00820000:3070:013e:2:0
+Multilingue 1
+p:RAI
+0068:0082afc2:0065:0001:2:0
+VOA Music Mix 104 (HB57-60)
+p:
+2168:00820000:3070:013e:2:0
+Multilingue 2
+p:RAI
+0069:0082afc2:0065:0001:2:0
+VOA Radio 105 (HB59-60)
+p:
+2169:00820000:3070:013e:2:0
+SatelRadio
+p:RAI
+006a:0082afc2:0065:0001:2:0
+VOA Radio 106 (HB61-64)
+p:
+1d6a:00820000:2f44:013e:2:0
+BHMA FM 99,5
+p:NetMed
+216a:00820000:3070:013e:2:0
+Radio OM unica
+p:RAI
+006b:0082afc2:0065:0001:2:0
+VOA Radio 107 (HB63-64)
+p:
+216b:00820000:3070:013e:2:0
+Radio2 mono
+p:RAI
+016c:00820000:1c84:013e:2:0
+NET
+p:NetMed
+126c:00820000:3458:013e:2:0
+Radio INTESA SANPAOLO
+p:RRSat
+216c:00820000:3070:013e:2:0
+Radio3 mono
+p:RAI
+016d:00820000:1c84:013e:2:0
+ERA2
+p:NetMed
+016e:00820000:1c84:013e:2:0
+ERA SPORT
+p:NetMed
+2070:00820000:2328:013e:2:0
+VOICE OF CRO
+p:OIV Zagreb
+0071:0082afc2:0065:0001:2:0
+VOA Radio 113 (HB75-76)
+p:
+2071:00820000:2328:013e:2:0
+HRT-HR1
+p:OIV Zagreb
+0072:0082afc2:0065:0001:2:0
+Sawa Levant Radio 114
+p:
+2072:00820000:2328:013e:2:0
+HRT-HR2
+p:OIV Zagreb
+2972:00820000:3d54:013e:2:0
+VRT Radio 1
+p:BSS
+0073:0082afc2:0065:0001:2:0
+Sawa Iraq Radio 115
+p:
+2073:00820000:2328:013e:2:0
+HRT-HR3
+p:OIV Zagreb
+2973:00820000:3d54:013e:2:0
+VRT Radio 2
+p:BSS
+0074:0082afc2:0065:0001:2:0
+Yamal 116
+p:
+2074:00820000:2328:013e:2:0
+HRT R-Pula
+p:OiV Zagreb
+2974:00820000:3d54:013e:2:0
+RADIO 74
+p:BSS
+0075:0082afc2:0065:0001:2:0
+Sawa Gulf Radio 117
+p:
+0076:0082afc2:0065:0001:2:0
+Sawa N. Africa Radio 118
+p:
+0077:0082afc2:0065:0001:2:0
+VOA and RFA Asia 119
+p:
+1277:00820000:3458:013e:2:0
+New Life Radio Russia
+p:RRSat
+3677:00820000:1388:013e:2:0
+BBC Afghan
+p:BBC World Service
+0079:0082afc2:0065:0001:2:0
+VOA Iraq N/S Radio 121
+p:
+1279:00820000:3458:013e:2:0
+European Radio for Belarus
+p:RRSat
+007a:0082afc2:0065:0001:2:0
+Sawa Sudan Radio 122
+p:
+127a:00820000:3458:013e:2:0
+Tamil GTBC.fm
+p:RRSat
+007b:0082afc2:0065:0001:2:0
+Sawa Lebanon Radio 123
+p:
+017b:00820000:1c84:013e:2:0
+ERA3
+p:NetMed
+127b:00820000:3458:013e:2:0
+Tamil Radio EU
+p:RRSat
+127c:00820000:3458:013e:2:0
+Radio Mojdeh
+p:RRSat
+367c:00820000:1388:013e:2:0
+BBC Russian
+p:BBC World Service
+127d:00820000:3458:013e:2:0
+London TBC
+p:RRsat
+127e:00820000:3458:013e:2:0
+Persian Radio
+p:RRSat
+207f:00820000:2328:013e:2:0
+OTVORENI
+p:OIV Zagreb
+2080:00820000:2328:013e:2:0
+MEDIASERVIS
+p:OIV Zagreb
+0081:00820000:2e18:00b0:2:0
+Medi1Radio
+p:PRVDR
+2081:00820000:2328:013e:2:0
+TOTALNI FM
+p:OiV Zagreb
+2082:00820000:2328:013e:2:0
+R MIR M
+p:OiV Zagreb
+1d83:00820000:2f44:013e:2:0
+SENTRA FM
+p:NetMed
+2083:00820000:2328:013e:2:0
+RADIO MARIJA
+p:OiV Zagreb
+0c84:00820000:2328:013e:2:0
+SLO-RA1-INF
+p:OIV Zagreb
+1d84:00820000:2f44:013e:2:0
+REAL FM
+p:NetMed
+0c85:00820000:2328:013e:2:0
+SLO-RA2
+p:OIV Zagreb
+0c86:00820000:2328:013e:2:0
+SLO-RA3
+p:OIV Zagreb
+0c88:00820000:2328:013e:2:0
+RADIO SI
+p:OIV Zagreb
+3688:00820000:00c8:013e:2:0
+TDA Chaine 1
+p:Eutelsat
+208a:00820000:2328:013e:2:0
+Narodni radio
+p:OIV Zagreb
+298d:00820000:3d54:013e:2:0
+ILC Tamil
+p:BSS
+298e:00820000:3d54:013e:2:0
+Nawa Kurdish Radio
+p:BSS
+0c8f:00820000:2328:013e:2:0
+CAPODISTRIA
+p:OIV Zagreb
+298f:00820000:3d54:013e:2:0
+Nawa Arabic Radio
+p:BSS
+3591:00820000:1388:013e:2:0
+Radio 1
+p:Telefonica Spain
+3592:00820000:1388:013e:2:0
+Radio 3
+p:Telefonica Spain
+3692:00820000:00c8:013e:2:0
+TDA Chaine 2
+p:Eutelsat
+3593:00820000:1388:013e:2:0
+Radio 4
+p:Telefonica Spain
+3693:00820000:1388:013e:2:0
+BBC Eur Feed 1
+p:BBC World Service
+1d94:00820000:2f44:013e:2:0
+novasport FM
+p:NetMed
+2094:00820000:3d54:013e:2:0
+R MIR M
+p:OIV Zagreb
+3594:00820000:1388:013e:2:0
+Radio 5
+p:Telefonica Spain
+3694:00820000:1388:013e:2:0
+BBC Eur Feed 2
+p:BBC World Service
+3595:00820000:1388:013e:2:0
+Radio Clasica
+p:Telefonica Spain
+3695:00820000:1388:013e:2:0
+BBC Eur Feed 3
+p:BBC World Service
+3596:00820000:1388:013e:2:0
+Radio Exterior
+p:Telefonica Spain
+3696:00820000:1388:013e:2:0
+BBC Eur Feed 4
+p:BBC World Service
+1197:00820000:1e14:013e:2:0
+Saudi Radio 2
+p:GlobeCast
+3697:00820000:1388:013e:2:0
+BBC Eur Feed 5
+p:BBC World Service
+0098:00820000:1e14:013e:2:0
+TRT TAMIL OLLI
+p:GlobeCast
+0898:00820000:3d54:013e:2:0
+Era 2
+p:
+1198:00820000:1e14:013e:2:0
+European Program
+p:GlobeCast
+2998:00820000:3d54:013e:2:0
+Radioshora
+p:BSS
+3698:00820000:1388:013e:2:0
+BBC Eur Feed 6
+p:BBC World Service
+0399:00820000:2134:013e:2:0
+SRG-DRS 1
+p:Schweizer Radio DRS
+2999:00820000:3d54:013e:2:0
+Renew Live
+p:BSS
+3a99:00820000:1fa4:013e:2:0
+Radio Radio
+p:Eutelsat
+039a:00820000:2134:013e:2:0
+SRG-DRS 2
+p:Schweizer Radio DRS
+039b:00820000:2134:013e:2:0
+SRG-DRS 3
+p:Schweizer Radio DRS
+299b:00820000:3d54:013e:2:0
+Rang A Rang
+p:BSS
+039c:00820000:2134:013e:2:0
+SRG-DRS Virus
+p:Schweizer Radio DRS
+299c:00820000:3d54:013e:2:0
+RADIO EVIVA
+p:BSS_LDK
+369c:00820000:00c8:013e:2:0
+TDA Chaine 3
+p:Eutelsat
+039d:00820000:2134:013e:2:0
+SRG-DRS Musikwelle
+p:Schweizer Radio DRS
+039e:00820000:2134:013e:2:0
+SRG-Rumantsch
+p:Radio Rumantsch
+299e:00820000:3d54:013e:2:0
+RADIO JEANS
+p:BSS
+299f:00820000:3d54:013e:2:0
+Radio Expert
+p:BSS
+29a1:00820000:3d54:013e:2:0
+Radio Zamaneh
+p:BSS
+29a3:00820000:3d54:013e:2:0
+Radio Padania
+p:BSS
+03a6:00820000:2134:013e:2:0
+SRG-Swiss Classic
+p:Swiss Satellite Radio
+03a7:00820000:2134:013e:2:0
+SRG-Swiss Pop
+p:Swiss Satellite Radio
+03a8:00820000:2134:013e:2:0
+SRG-Swiss Jazz
+p:Swiss Satellite Radio
+03a9:00820000:2134:013e:2:0
+SRG-DRS 4 News
+p:Schweizer Radio DRS
+3dae:00820000:2c88:013e:2:0
+10796V SID 0x3dae
+p:DVB-S QPSK 10796V 13.0°E
+00af:00820000:1e14:013e:2:0
+Al Rasheed Radio
+p:GlobeCast
+00b1:00820000:2e18:00b0:2:0
+Radio Tanger
+p:PRVDR
+00b2:00820000:2e18:00b0:2:0
+Radio Fes
+p:PRVDR
+00b3:00820000:2e18:00b0:2:0
+Radio Marrakech
+p:PRVDR
+00b7:00820000:1e14:013e:2:0
+Radio YAADOUT
+p:GlobeCast
+00ba:00820000:1e14:013e:2:0
+FRANCE MAGHREB
+p:GlobeCast
+00bb:00820000:1e14:013e:2:0
+RADIO ORIENT
+p:GlobeCast
+20bb:00820000:3d54:013e:2:0
+RADIO MARIJA
+p:OIV Zagreb
+43bc:00820000:2cec:013e:2:0
+3ABN Radio
+p:RRSat
+43be:00820000:2cec:013e:2:0
+Heimatklang
+p:RRSat
+43c0:00820000:2cec:013e:2:0
+The Overcomer
+p:RRSat
+43c1:00820000:2cec:013e:2:0
+RNW-1
+p:RRSat
+43c2:00820000:2cec:013e:2:0
+RNW-2
+p:RRSat
+43c3:00820000:2cec:013e:2:0
+ROCK NATION
+p:RRSat
+06c4:00820000:3138:013e:2:0
+AZTV Radio
+p:GlobeCast
+09c4:00820000:3d54:013e:2:0
+Era 5
+p:
+43c4:00820000:2cec:013e:2:0
+TGN Radio
+p:RRSat
+43c5:00820000:2cec:013e:2:0
+Makedonsko Radio
+p:RRSat
+43c6:00820000:2cec:013e:2:0
+VOV Radio
+p:RRSat
+43c7:00820000:2cec:013e:2:0
+RNW-8
+p:RRSat
+37c8:00820000:044c:013e:2:0
+11411H SID 0x37c8
+p:DVB-S2 8PSK 11411H 13.0°E
+43c8:00820000:2cec:013e:2:0
+RNW-9
+p:RRSat
+43c9:00820000:2cec:013e:2:0
+ERA 1
+p:RRSat
+43ca:00820000:2cec:013e:2:0
+ERA 2
+p:RRSat
+36cb:00820000:06a4:013e:2:0
+SSR-La 1ere
+p:Radio Television Suisse
+43cb:00820000:2cec:013e:2:0
+ERA 3
+p:RRSat
+36cc:00820000:06a4:013e:2:0
+SSR-Espace 2
+p:Radio Television Suisse
+43cc:00820000:2cec:013e:2:0
+ERA SPORT
+p:RRSat
+1bcd:00820000:17d4:013e:2:0
+Mad Radio
+p:NetMed
+36cd:00820000:06a4:013e:2:0
+SSR-Couleur3
+p:Radio Television Suisse
+43cd:00820000:2cec:013e:2:0
+ERA 5
+p:RRSat
+36ce:00820000:06a4:013e:2:0
+SSR-Option Musique
+p:Radio Television Suisse
+43ce:00820000:2cec:013e:2:0
+Azadi FM
+p:RRSat
+36cf:00820000:06a4:013e:2:0
+SSR-Rete Uno
+p:Radiotelevisione svizzera
+43cf:00820000:2cec:013e:2:0
+Radio Dijla
+p:RRSat
+36d0:00820000:06a4:013e:2:0
+SSR-Rete Due
+p:Radiotelevisione svizzera
+36d1:00820000:06a4:013e:2:0
+SSR-Rete Tre
+p:Radiotelevisione svizzera
+38d1:00820000:2648:fbff:2:0
+Radio DeeJay
+p:SkyItalia
+38d2:00820000:2648:fbff:2:0
+M2O
+p:SkyItalia
+38d3:00820000:2648:fbff:2:0
+Radio 105
+p:SkyItalia
+38d4:00820000:2648:fbff:2:0
+Virgin Radio
+p:SkyItalia
+38d5:00820000:2648:fbff:2:0
+Radio Capital
+p:SkyItalia
+36d6:00820000:06a4:013e:2:0
+SSR-WRS
+p:Radio Television Suisse
+38d6:00820000:2648:fbff:2:0
+Radio KissKiss
+p:SkyItalia
+36d7:00820000:06a4:013e:2:0
+SSR-CH-Classique
+p:Swiss Satellite Radio
+38d7:00820000:2648:fbff:2:0
+RTL 102.5
+p:SkyItalia
+38d8:00820000:2648:fbff:2:0
+R 101
+p:SkyItalia
+38d9:00820000:2648:fbff:2:0
+Radio Italia
+p:SkyItalia
+06da:00820000:3138:013e:2:0
+Chanson
+p:GlobeCast
+38da:00820000:2648:fbff:2:0
+Radio 24
+p:SkyItalia
+06db:00820000:3138:013e:2:0
+Radio 2M
+p:GlobeCast
+38db:00820000:2648:fbff:2:0
+RDS
+p:SkyItalia
+02dc:00820000:1b58:013e:2:0
+Radio Maria
+p:Telespazio
+38dc:00820000:2648:fbff:2:0
+Radio Montecarlo
+p:SkyItalia
+44dc:00820000:0258:013e:2:0
+Radio KASZEBE
+p:Arqiva
+02dd:00820000:1b58:013e:2:0
+Rik3
+p:Telespazio
+0dde:00820000:3c8c:013e:2:0
+DW05
+p:MEDIA BROADCAST
+02e0:00820000:1b58:013e:2:0
+RDS
+p:Telespazio
+02e1:00820000:1b58:013e:2:0
+DimSuono Roma
+p:Telespazio
+02e2:00820000:1b58:013e:2:0
+ANNI 60
+p:Telespazio
+02e7:00820000:1b58:013e:2:0
+Popolare
+p:Telespazio
+02e8:00820000:1b58:013e:2:0
+Radio PadrePio
+p:Telespazio
+12e8:00820000:2e7c:013e:2:0
+CYFRA+ RADIO
+p:CYFRA +
+3be8:00820000:0064:fbff:2:0
+50 songs
+p:SkyItalia
+01e9:00820000:1964:013e:2:0
+Sana  radio
+p:JMC
+3be9:00820000:0064:fbff:2:0
+Yesterjay '80
+p:SkyItalia
+01ea:00820000:1964:013e:2:0
+Aden Radio
+p:JMC
+12ea:00820000:2e7c:013e:2:0
+CYFRA+ RMF
+p:CYFRA +
+3bea:00820000:0064:fbff:2:0
+Yesterjay '90
+p:SkyItalia
+01eb:00820000:1964:013e:2:0
+Syria R3
+p:JMC
+32eb:00820000:0190:013e:2:0
+EUSP PL AUDIO
+p:CYFRA +
+35eb:00820000:00c8:013e:2:0
+Prod ESP2
+p:Eutelsat
+3beb:00820000:0064:fbff:2:0
+Hit Italia
+p:SkyItalia
+01ec:00820000:1964:013e:2:0
+Syria R2
+p:JMC
+12ec:00820000:2e7c:013e:2:0
+CYFRA+ PR
+p:CYFRA +
+3bec:00820000:0064:fbff:2:0
+ItalianVintage
+p:SkyItalia
+01ed:00820000:1964:013e:2:0
+Syria R1
+p:
+02ed:00820000:1b58:013e:2:0
+R.Eurospin
+p:Telespazio
+10ed:00820000:03e8:013e:2:0
+Test_Radio
+p:TVN
+12ed:00820000:2e7c:013e:2:0
+JASNA GORA
+p:CYFRA +
+39ed:00820000:1fa4:013e:2:0
+PEIRAIKI EKKLISIA
+p:EUTELSAT
+01ee:00820000:1964:013e:2:0
+TSR Turkce
+p:JMC
+1eee:00820000:21fc:013e:2:0
+RADIO QURAN
+p:IRIB
+01ef:00820000:1964:013e:2:0
+TRT FM
+p:JMC
+0cef:00820000:1518:013e:2:0
+Rai Radio1
+p:RAI
+1eef:00820000:21fc:013e:2:0
+SEDAYE ASHNA1
+p:IRIB
+01f0:00820000:1964:013e:2:0
+Voice of Turkey World
+p:JMC
+0cf0:00820000:1518:013e:2:0
+Rai Radio2
+p:RAI
+0cf1:00820000:1518:013e:2:0
+Rai Radio3
+p:RAI
+0cf2:00820000:1450:013e:2:0
+Rai radiofd4
+p:RAI
+0cf3:00820000:1518:013e:2:0
+Rai radiofd5
+p:RAI
+02f4:00820000:1b58:013e:2:0
+Radio ZETA
+p:Telespazio
+0bf4:00820000:20d0:013e:2:0
+Radio Zara
+p:GlobeCast
+0cf4:00820000:1518:013e:2:0
+BLUSAT2000
+p:RAI
+0bf5:00820000:20d0:013e:2:0
+Dmitsi Hafash
+p:GlobeCast
+0cf5:00820000:1518:013e:2:0
+GR Parlam.
+p:RAI
+1ef5:00820000:21fc:013e:2:0
+RADIO IRAN
+p:IRIB
+0cf6:00820000:1518:013e:2:0
+Rai isoradio
+p:RAI
+0cf7:00820000:1450:013e:2:0
+Notturno italiano
+p:RAI
+1ef7:00820000:21fc:013e:2:0
+COI Radio
+p:IRIB
+0cf8:00820000:1518:013e:2:0
+Radio Vaticana
+p:RAI
+02f9:00820000:1b58:013e:2:0
+Radio RADICALE
+p:Telespazio
+1efa:00820000:21fc:013e:2:0
+IRIB1/IRIB2
+p:IRIB
+1efb:00820000:21fc:013e:2:0
+IRIB5/IRIB4
+p:IRIB
+08fc:00820000:3d54:013e:2:0
+Era 3
+p:
+0dfc:00820000:3c8c:013e:2:0
+DW08
+p:MEDIA BROADCAST
+1efc:00820000:21fc:013e:2:0
+IRIB3/IRIB6
+p:IRIB
+29fe:00820000:3cf0:013e:2:0
+RTL 102.5
+p:GlobeCast_Italia
+3bfe:00820000:0064:fbff:2:0
+Capital '70
+p:SkyItalia
+12ff:00820000:2e7c:013e:2:0
+tech 2
+p:CYFRA +
+29ff:00820000:3cf0:013e:2:0
+Romania_In_direct
+p:GlobeCast
+3bff:00820000:0064:fbff:2:0
+Vintage '60
+p:SkyItalia
+0bb8:00820000:1a2c:fbff:4:0
+
+p:SkyItalia
+0fa2:00820000:3c28:013e:7:0
+SSU  TV GLOBO
+p:GlobeCast
+126d:00820000:0708:00c8:8:0
+NETINSAT.COM
+p:M-Three satcom
+0101:00820000:2e18:00b0:12:0
+MAP_SAT
+p:PRVDR
+0007:00820000:2e18:00b0:12:0
+MAP SAT
+p:PRVDR
+0110:00820000:3070:013e:12:0
+DVB-SSU DBC
+p:Intellibyte Inc
+3b24:00820000:012c:013e:12:0
+Invoice
+p:ITI
+292b:00820000:1edc:0071:12:0
+CP_Download
+p:Cyfrowy Polsat S.A.
+292c:00820000:1edc:0071:12:0
+CP_Download_CPT
+p:Cyfrowy Polsat S.A.
+4233:00820000:3db8:013e:12:0
+OTA 6500
+p:telespazio
+3b38:00820000:0514:013e:12:0
+pVOD
+p:ITI
+2960:00820000:1edc:0071:12:0
+CP_download_D4
+p:Cyfrowy Polsat S.A.
+2961:00820000:1edc:0071:12:0
+Sagem_Software
+p:Cyfrowy Polsat S.A.
+1d77:00820000:2f44:013e:12:0
+IPE 3
+p:???
+1f77:00820000:319c:013e:12:0
+Test_1
+p:MEDIA BROADCAST
+02ca:00820000:1b58:013e:12:0
+IP DATA
+p:Telespazio
+3aca:00820000:0514:013e:12:0
+Upload
+p:ITI
+3ad4:00820000:0514:013e:12:0
+Invoice
+p:ITI
+0de8:00820000:2d50:013e:12:0
+Invoice
+p:ITI
+0001:00820000:3200:013e:25:0
+MTV Live HD
+p:MTV Networks Europe
+2b0f:00820000:1900:fbff:25:0
+Sky Sport 1 HD
+p:SkyItalia
+1010:00820000:1d4c:fbff:25:0
+Cinema Hits HD
+p:SkyItalia
+2b10:00820000:1900:fbff:25:0
+Sky Sport 2 HD
+p:SkyItalia
+1011:00820000:1d4c:fbff:25:0
+Cinema Max HD
+p:SkyItalia
+2b12:00820000:1900:fbff:25:0
+Sky Sport 2 HD
+p:SkyItalia
+2b13:00820000:1900:fbff:25:0
+Discovery Sci HD
+p:SkyItalia
+0015:00820000:3200:013e:25:0
+MTV Live HD
+p:MTV Networks Europe
+1015:00820000:1d4c:fbff:25:0
+Discovery HD
+p:SkyItalia
+2b16:00820000:1900:fbff:25:0
+Cinema Comedy HD
+p:SkyItalia
+2b18:00820000:1900:fbff:25:0
+Cinema Classics HD
+p:SkyItalia
+2b1b:00820000:1900:fbff:25:0
+Sky Sport24 HD
+p:SkyItalia
+2b1d:00820000:1900:fbff:25:0
+Sky Sport24 HD
+p:SkyItalia
+1020:00820000:1d4c:fbff:25:0
+Disney Ch. HD
+p:SkyItalia
+1e20:00820000:15e0:fbff:25:0
+Primafila 11 HD
+p:SkyItalia
+2b20:00820000:1900:fbff:25:0
+Sky Sport24 HD
+p:SkyItalia
+1e21:00820000:15e0:fbff:25:0
+Primafila 13 HD
+p:SkyItalia
+1e22:00820000:15e0:fbff:25:0
+NatGeo Adv HD
+p:SkyItalia
+1c28:00820000:206c:fbff:25:0
+Sky Sport 3 HD
+p:SkyItalia
+1c29:00820000:206c:fbff:25:0
+Sky Supercalcio HD
+p:SkyItalia
+4331:00820000:300c:013e:25:0
+SF 1 HD
+p:Schweizer Fernsehen
+1c32:00820000:206c:fbff:25:0
+DiscoveryT&L HD
+p:SkyItalia
+1e32:00820000:15e0:fbff:25:0
+Cinema Max +1 HD
+p:SkyItalia
+4332:00820000:300c:013e:25:0
+SF zwei HD
+p:Schweizer Fernsehen
+1e33:00820000:15e0:fbff:25:0
+Cinema Classics HD
+p:SkyItalia
+4333:00820000:300c:013e:25:0
+RTS Un HD
+p:Radio Television Suisse
+1e34:00820000:15e0:fbff:25:0
+Primafila 1 HD
+p:SkyItalia
+4334:00820000:300c:013e:25:0
+RTS Deux HD
+p:Radio Television Suisse
+1e35:00820000:15e0:fbff:25:0
+Primafila 3 HD
+p:SkyItalia
+4335:00820000:300c:013e:25:0
+Test17205
+p:SRG SSR
+1e36:00820000:15e0:fbff:25:0
+Primafila 5 HD
+p:SkyItalia
+1e37:00820000:15e0:fbff:25:0
+Primafila 7 HD
+p:SkyItalia
+1e38:00820000:15e0:fbff:25:0
+Primafila 9 HD
+p:SkyItalia
+1e3c:00820000:15e0:fbff:25:0
+Discovery HD
+p:SkyItalia
+0f3d:00820000:2198:fbff:25:0
+ExtremeSportsHD
+p:SkyItalia
+1e3d:00820000:15e0:fbff:25:0
+NationalGeo HD
+p:SkyItalia
+0f3e:00820000:2198:fbff:25:0
+Sky Uno HD
+p:SkyItalia
+1c3e:00820000:206c:fbff:25:0
+Sky Supercalcio HD
+p:SkyItalia
+1e3e:00820000:15e0:fbff:25:0
+Discovery Sci HD
+p:SkyItalia
+0f3f:00820000:2198:fbff:25:0
+Fox HD
+p:SkyItalia
+1c3f:00820000:206c:fbff:25:0
+Cinema Passion HD
+p:SkyItalia
+1e3f:00820000:15e0:fbff:25:0
+DiscoveryT&L HD
+p:SkyItalia
+1e40:00820000:15e0:fbff:25:0
+History HD
+p:SkyItalia
+0f41:00820000:2198:fbff:25:0
+Sky 3D
+p:SkyItalia
+1e41:00820000:15e0:fbff:25:0
+NatGeo Wild HD
+p:SkyItalia
+0f42:00820000:2198:fbff:25:0
+Sky 3D
+p:SkyItalia
+1e42:00820000:15e0:fbff:25:0
+GamberoRossoHD
+p:SkyItalia
+0f43:00820000:2198:fbff:25:0
+Sky 3D
+p:SkyItalia
+1e43:00820000:15e0:fbff:25:0
+Disney Ch. HD
+p:SkyItalia
+0f44:00820000:2198:fbff:25:0
+Sky 3D
+p:SkyItalia
+1e44:00820000:15e0:fbff:25:0
+MTV LIVE HD
+p:SkyItalia
+0f45:00820000:2198:fbff:25:0
+Sky 3D
+p:SkyItalia
+0f46:00820000:2198:fbff:25:0
+Sky Calcio 5 HD
+p:SkyItalia
+0f47:00820000:2198:fbff:25:0
+Fox Life HD
+p:SkyItalia
+0f48:00820000:2198:fbff:25:0
+Sky Calcio 6 HD
+p:SkyItalia
+1e48:00820000:15e0:fbff:25:0
+Sky Sport Extra HD
+p:SkyItalia
+0d49:00820000:1450:013e:25:0
+Rai HD
+p:Rai
+0f49:00820000:2198:fbff:25:0
+Fox Crime HD
+p:SkyItalia
+0f4a:00820000:2198:fbff:25:0
+AXN HD
+p:SkyItalia
+0f4b:00820000:2198:fbff:25:0
+Real Time HD
+p:SkyItalia
+0f4c:00820000:2198:fbff:25:0
+Primafila 7 HD
+p:SkyItalia
+0f4e:00820000:2198:fbff:25:0
+Sky Sport 2 HD
+p:SkyItalia
+0f4f:00820000:2198:fbff:25:0
+Sky Supercalcio HD
+p:SkyItalia
+0f50:00820000:2198:fbff:25:0
+Eurosport HD
+p:SkyItalia
+0f51:00820000:2198:fbff:25:0
+Eurosport 2 HD
+p:SkyItalia
+0f52:00820000:2198:fbff:25:0
+ESPN America HD
+p:SkyItalia
+0f53:00820000:2198:fbff:25:0
+Sky Calcio 1 HD
+p:SkyItalia
+1c53:00820000:206c:fbff:25:0
+DiscoveryT&L HD
+p:SkyItalia
+0f54:00820000:2198:fbff:25:0
+Sky Calcio 2 HD
+p:SkyItalia
+1c57:00820000:206c:fbff:25:0
+CinemaFamilyHD
+p:SkyItalia
+0f59:00820000:2198:fbff:25:0
+Sky Calcio 7 HD
+p:SkyItalia
+0f5a:00820000:2198:fbff:25:0
+Sky Calcio 8 HD
+p:SkyItalia
+0f5b:00820000:2198:fbff:25:0
+Sky Sport 3 HD
+p:SkyItalia
+1e5b:00820000:15e0:fbff:25:0
+Primafila 1 HD
+p:SkyItalia
+0f5c:00820000:2198:fbff:25:0
+Sky Sport Extra HD
+p:SkyItalia
+1e5c:00820000:15e0:fbff:25:0
+Sky Calcio 8 HD
+p:SkyItalia
+0f5d:00820000:2198:fbff:25:0
+Sky Calcio 3 HD
+p:SkyItalia
+0f5e:00820000:2198:fbff:25:0
+Sky Calcio 4 HD
+p:SkyItalia
+0f5f:00820000:2198:fbff:25:0
+Sky Calcio 5 HD
+p:SkyItalia
+1e5f:00820000:15e0:fbff:25:0
+Sky Calcio 7 HD
+p:SkyItalia
+0f60:00820000:2198:fbff:25:0
+Sky Calcio 6 HD
+p:SkyItalia
+1e60:00820000:15e0:fbff:25:0
+Primafila 3 HD
+p:SkyItalia
+0f61:00820000:2198:fbff:25:0
+Cinema 1 HD
+p:SkyItalia
+0f62:00820000:2198:fbff:25:0
+Cinema +1 HD
+p:SkyItalia
+0f63:00820000:2198:fbff:25:0
+Cinema +24 HD
+p:SkyItalia
+0f64:00820000:2198:fbff:25:0
+Cinema Hits HD
+p:SkyItalia
+0f65:00820000:2198:fbff:25:0
+CinemaFamilyHD
+p:SkyItalia
+0f67:00820000:2198:fbff:25:0
+Cinema Passion HD
+p:SkyItalia
+0f68:00820000:2198:fbff:25:0
+Cinema Comedy HD
+p:SkyItalia
+0f69:00820000:2198:fbff:25:0
+Cinema Max HD
+p:SkyItalia
+0f6a:00820000:2198:fbff:25:0
+Sky Sport 1 HD
+p:SkyItalia
+106a:00820000:2008:fbff:25:0
+Cinema 1 HD
+p:SkyItalia
+3779:00820000:14b4:fbff:25:0
+AXN HD
+p:SkyItalia
+377a:00820000:044c:013e:25:0
+CANAL+ GOL HD
+p:CYFRA+
+377b:00820000:044c:013e:25:0
+C+ WEEKEND HD
+p:CYFRA+
+377c:00820000:044c:013e:25:0
+MINIMINI+ HD
+p:CYFRA+
+377d:00820000:044c:013e:25:0
+teleTOON+ HD
+p:CYFRA+
+377e:00820000:044c:013e:25:0
+PLANETE+ HD
+p:CYFRA+
+377f:00820000:044c:013e:25:0
+KUCHNIA+ HD
+p:CYFRA+
+3780:00820000:044c:013e:25:0
+DOMO+ HD
+p:CYFRA+
+3781:00820000:044c:013e:25:0
+ALE KINO+ HD
+p:CYFRA+
+3782:00820000:044c:013e:25:0
+CANAL+ 3D
+p:CYFRA+
+1089:00820000:2008:fbff:25:0
+Sky Calcio 3 HD
+p:SkyItalia
+108a:00820000:2008:fbff:25:0
+Sky Calcio 4 HD
+p:SkyItalia
+108b:00820000:2008:fbff:25:0
+Primafila 9 HD
+p:SkyItalia
+108f:00820000:2008:fbff:25:0
+Primafila 11 HD
+p:SkyItalia
+379a:00820000:044c:013e:25:0
+MINIMINI+ HD
+p:CYFRA+
+379b:00820000:044c:013e:25:0
+teleTOON+ HD
+p:CYFRA+
+379c:00820000:044c:013e:25:0
+PLANETE+ HD
+p:CYFRA+
+379c:00820000:14b4:fbff:25:0
+NationalGeo HD
+p:SkyItalia
+379d:00820000:044c:013e:25:0
+KUCHNIA+ HD
+p:CYFRA+
+379d:00820000:14b4:fbff:25:0
+Fox HD
+p:SkyItalia
+379e:00820000:044c:013e:25:0
+DOMO+ HD
+p:CYFRA+
+379e:00820000:14b4:fbff:25:0
+Fox Crime HD
+p:SkyItalia
+379f:00820000:044c:013e:25:0
+ALE KINO+ HD
+p:CYFRA+
+37a6:00820000:14b4:fbff:25:0
+Sky Uno HD
+p:SkyItalia
+37aa:00820000:14b4:fbff:25:0
+Primafila 20 HD
+p:SkyItalia
+0dae:00820000:1af4:fbff:25:0
+Focus HD
+p:SkyItalia
+0db0:00820000:1af4:fbff:25:0
+GamberoRossoHD
+p:SkyItalia
+03b7:00820000:2134:013e:25:0
+RSI LA 2 HD
+p:Radiotelevisione svizzera
+0db7:00820000:1af4:fbff:25:0
+GamberoRossoHD
+p:SkyItalia
+0db8:00820000:1af4:fbff:25:0
+Fox Life HD
+p:SkyItalia
+0db9:00820000:1af4:fbff:25:0
+History HD
+p:SkyItalia
+0dba:00820000:1af4:fbff:25:0
+NatGeo Adv HD
+p:SkyItalia
+0dbb:00820000:1af4:fbff:25:0
+NatGeo Wild HD
+p:SkyItalia
+24be:00820000:2260:fbff:25:0
+Primafila 13 HD
+p:SkyItalia
+24bf:00820000:2260:fbff:25:0
+Primafila 5 HD
+p:SkyItalia
+24c3:00820000:2260:fbff:25:0
+Sky Calcio 1 HD
+p:SkyItalia
+24c4:00820000:2260:fbff:25:0
+Sky Calcio 2 HD
+p:SkyItalia
+37c9:00820000:044c:013e:25:0
+CYFRA+ PPV test
+p:CYFRA+
+37d2:00820000:14b4:fbff:25:0
+Primafila 20 HD
+p:SkyItalia
+36e3:00820000:06a4:013e:25:0
+RSI LA 1 HD
+p:Radiotelevisione svizzera
+2cf1:00820000:2774:fbff:25:0
+ESPN America HD
+p:SkyItalia
+2cf2:00820000:2774:fbff:25:0
+ExtremeSportsHD
+p:SkyItalia
+2cf3:00820000:2774:fbff:25:0
+Real Time HD
+p:SkyItalia
+2cf4:00820000:2774:fbff:25:0
+Cinema Max +1 HD
+p:SkyItalia
+2cf5:00820000:2774:fbff:25:0
+Cinema +24 HD
+p:SkyItalia
+2cff:00820000:2774:fbff:25:0
+Cinema +1 HD
+p:SkyItalia
+0bb9:00820000:2198:fbff:27:0
+PUSH REF HD 3001
+p:SkyItalia
+1001:00820000:2db4:fbff:100:0
+10853H SID 0x1001
+p:DVB-S QPSK 10853H 13.0°E
+1103:00820000:1644:fbff:100:0
+11861H SID 0x1103
+p:DVB-S QPSK 11861H 13.0°E
+0016:00820000:1edc:0071:100:0
+12284H SID 0x16
+p:DVB-S QPSK 12284H 13.0°E
+1322:00820000:2e7c:013e:100:0
+10892H SID 0x1322
+p:DVB-S QPSK 10892H 13.0°E
+2c22:00820000:1a90:fbff:100:0
+12072V SID 0x2c22
+p:DVB-S QPSK 12072V 13.0°E
+1323:00820000:2e7c:013e:100:0
+10892H SID 0x1323
+p:DVB-S QPSK 10892H 13.0°E
+1144:00820000:2af8:013e:100:0
+10719V SID 0x1144
+p:DVB-S QPSK 10719V 13.0°E
+1145:00820000:2af8:013e:100:0
+10719V SID 0x1145
+p:DVB-S QPSK 10719V 13.0°E
+344f:00820000:2710:fbff:100:0
+12713V SID 0x344f
+p:DVB-S QPSK 12713V 13.0°E
+1158:00820000:2af8:013e:100:0
+10719V SID 0x1158
+p:DVB-S QPSK 10719V 13.0°E
+1159:00820000:2af8:013e:100:0
+10719V SID 0x1159
+p:DVB-S QPSK 10719V 13.0°E
+037a:00820000:3bc4:013e:100:0
+11566H SID 0x37a
+p:DVB-S QPSK 11566H 13.0°E
+2c80:00820000:251c:fbff:100:0
+12616H SID 0x2c80
+p:DVB-S QPSK 12616H 13.0°E
+0187:00820000:1c84:013e:100:0
+12169H SID 0x187
+p:DVB-S QPSK 12169H 13.0°E
+118a:00820000:2af8:013e:100:0
+10719V SID 0x118a
+p:DVB-S QPSK 10719V 13.0°E
+1d9b:00820000:2f44:013e:100:0
+10930H SID 0x1d9b
+p:DVB-S QPSK 10930H 13.0°E
+1d9c:00820000:2f44:013e:100:0
+10930H SID 0x1d9c
+p:DVB-S QPSK 10930H 13.0°E
+1d9d:00820000:2f44:013e:100:0
+10930H SID 0x1d9d
+p:DVB-S QPSK 10930H 13.0°E
+1d9e:00820000:2f44:013e:100:0
+10930H SID 0x1d9e
+p:DVB-S QPSK 10930H 13.0°E
+2daf:00820000:170c:fbff:100:0
+11900H SID 0x2daf
+p:DVB-S QPSK 11900H 13.0°E
+3db5:00820000:2c88:013e:100:0
+10796V SID 0x3db5
+p:DVB-S QPSK 10796V 13.0°E
+3db6:00820000:2c88:013e:100:0
+10796V SID 0x3db6
+p:DVB-S QPSK 10796V 13.0°E
+05d5:00820000:0320:fbff:100:0
+11355V SID 0x5d5
+p:DVB-S QPSK 11355V 13.0°E
+2ce7:00820000:2580:fbff:100:0
+12635V SID 0x2ce7
+p:DVB-S QPSK 12635V 13.0°E
+1fec:00820000:189c:fbff:100:0
+11976H SID 0x1fec
+p:DVB-S QPSK 11976H 13.0°E
+3bef:00820000:0064:fbff:100:0
+11219H SID 0x3bef
+p:DVB-S QPSK 11219H 13.0°E
+1bfa:00820000:17d4:013e:100:0
+11938H SID 0x1bfa
+p:DVB-S QPSK 11938H 13.0°E
+1162:00820000:2af8:013e:128:0
+EPG
+p:CYFRA +
+12fe:00820000:2e7c:013e:128:0
+tech
+p:CYFRA +
+0016:00820000:1e78:0071:129:0
+Consumer Cam
+p:Cyfrowy Polsat S.A.
+144f:00820000:05dc:013e:129:0
+5199
+p:CYFRA +
+00e1:00820000:2e7c:013e:129:0
+PHILIPS DOWNLOAD 1.1
+p:WIZJA 1
+2b11:00820000:1900:fbff:130:0
+Sky Sport 1 HD
+p:SkyItalia
+2b1c:00820000:1900:fbff:130:0
+Sky Sport 24 HD
+p:SkyItalia
+3425:00820000:2710:fbff:130:0
+Modalita' d'Acquisto
+p:SkyItalia
+3428:00820000:2710:fbff:130:0
+PRIMAFILA HCZ
+p:SkyItalia
+1c34:00820000:206c:fbff:130:0
+Sky Sport 3 HD
+p:SkyItalia
+1037:00820000:1d4c:fbff:130:0
+FeedScherma HD
+p:SkyItalia
+0f40:00820000:2198:fbff:130:0
+Zapper3D
+p:SkyItalia
+1c40:00820000:206c:fbff:130:0
+Sky Supercalcio HD
+p:SkyItalia
+3454:00820000:2710:fbff:130:0
+goal Alert HD
+p:SkyItalia
+0e55:00820000:16a8:fbff:130:0
+Gestione Collegam. Telefonico
+p:SkyItalia
+2aab:00820000:1838:fbff:130:0
+Sport Active 1
+p:SkyItalia
+2aac:00820000:1838:fbff:130:0
+Sports Active 2
+p:SkyItalia
+2ab4:00820000:1838:fbff:130:0
+Sky Sport 24
+p:SkyItalia
+2ab5:00820000:1838:fbff:130:0
+Sky Sport 1
+p:SkyItalia
+2ab6:00820000:1838:fbff:130:0
+Sky Supercalcio
+p:SkyItalia
+2ab7:00820000:1838:fbff:130:0
+Sports Active 3
+p:SkyItalia
+2db7:00820000:1a2c:fbff:130:0
+Cinema Active
+p:SkyItalia
+2db8:00820000:1a2c:fbff:130:0
+Cinema itv
+p:SkyItalia
+38cd:00820000:2648:fbff:130:0
+Sky Radio
+p:SkyItalia
+1fd1:00820000:189c:fbff:130:0
+Primafila Sky
+p:SkyItalia
+2dda:00820000:1a2c:fbff:130:0
+Sky Sport 3
+p:SkyItalia
+38e2:00820000:2648:fbff:130:0
+Novita' Sky
+p:SkyItalia
+10e7:00820000:1644:fbff:130:0
+TG 24 - Mosaico
+p:SkyItalia
+3be7:00820000:0064:fbff:130:0
+Sky Music
+p:SkyItalia
+10e9:00820000:1644:fbff:130:0
+TG 24 - Feed 2
+p:SkyItalia
+10eb:00820000:1644:fbff:130:0
+Guida Multilingua
+p:SkyItalia
+1002:00820000:2db4:fbff:131:0
+IEPG Data
+p:SkyItalia
+3005:00820000:2c24:fbff:131:0
+IEPG Data
+p:SkyItalia
+2006:00820000:189c:fbff:131:0
+IEPG Data
+p:SkyItalia
+0e0e:00820000:1af4:fbff:131:0
+IEPG Data
+p:SkyItalia
+2e17:00820000:1a2c:fbff:131:0
+IEPG Data
+p:SkyItalia
+251a:00820000:2260:fbff:131:0
+IEPG Data
+p:SkyItalia
+3c1d:00820000:0064:fbff:131:0
+IEPG Data
+p:SkyItalia
+2c23:00820000:1a90:fbff:131:0
+IEPG Data
+p:SkyItalia
+112e:00820000:1644:fbff:131:0
+IEPG Data
+p:SkyItalia
+294a:00820000:1edc:0071:131:0
+Portal ITV
+p:Cyfrowy Polsat S.A.
+2d4f:00820000:2774:fbff:131:0
+IEPG Data
+p:SkyItalia
+3451:00820000:2710:fbff:131:0
+IEPG Data
+p:SkyItalia
+2b57:00820000:1900:fbff:131:0
+IEPG Data
+p:SkyItalia
+1063:00820000:1d4c:fbff:131:0
+IEPG Data
+p:SkyItalia
+0e70:00820000:16a8:fbff:131:0
+IEPG Data
+p:SkyItalia
+1e76:00820000:15e0:fbff:131:0
+IEPG Data
+p:SkyItalia
+1c80:00820000:206c:fbff:131:0
+IEPG Data
+p:SkyItalia
+2c87:00820000:251c:fbff:131:0
+IEPG Data
+p:SkyItalia
+0f89:00820000:2198:fbff:131:0
+IEPG Data
+p:SkyItalia
+0dab:00820000:1450:013e:131:0
+download
+p:Rai
+2db3:00820000:170c:fbff:131:0
+IEPG Data
+p:SkyItalia
+2bbf:00820000:19c8:fbff:131:0
+IEPG Data
+p:SkyItalia
+10ca:00820000:2008:fbff:131:0
+IEPG Data
+p:SkyItalia
+05d7:00820000:0320:fbff:131:0
+IEPG Data
+p:SkyItalia
+37d7:00820000:14b4:fbff:131:0
+IEPG Data
+p:SkyItalia
+2ceb:00820000:2580:fbff:131:0
+IEPG Data
+p:SkyItalia
+2af7:00820000:1838:fbff:131:0
+IEPG Data
+p:SkyItalia
+38ff:00820000:2648:fbff:131:0
+IEPG Data
+p:SkyItalia
+2e15:00820000:1a2c:fbff:132:0
+Dl861
+p:SkyItalia
+2518:00820000:2260:fbff:132:0
+Dl1011
+p:SkyItalia
+2519:00820000:2260:fbff:132:0
+Dl1012
+p:SkyItalia
+2c21:00820000:1a90:fbff:132:0
+Dl681
+p:SkyItalia
+2d49:00820000:2774:fbff:132:0
+Dl671
+p:SkyItalia
+2b55:00820000:1900:fbff:132:0
+Dl641
+p:SkyItalia
+0e57:00820000:16a8:fbff:132:0
+FGDL_5800
+p:SkyItalia
+0e5a:00820000:16a8:fbff:132:0
+BGDL_5800
+p:SkyItalia
+295f:00820000:1edc:0071:132:0
+SAMSUNG370
+p:Cyfrowy Polsat S.A.
+0f87:00820000:2198:fbff:132:0
+Dl951
+p:SkyItalia
+0f8a:00820000:2198:fbff:132:0
+Dl583
+p:SkyItalia
+2dae:00820000:170c:fbff:132:0
+Dl821
+p:SkyItalia
+2bbd:00820000:19c8:fbff:132:0
+BGDL_6600
+p:SkyItalia
+1cd4:00820000:1ce8:0071:132:0
+Samsung2
+p:Cyfrowy Polsat S.A.
+2ce6:00820000:2580:fbff:132:0
+Dl591
+p:SkyItalia
+1ce7:00820000:1ce8:0071:132:0
+HD2000
+p:
+1fed:00820000:189c:fbff:132:0
+FGDL_6300
+p:SkyItalia
+1fee:00820000:189c:fbff:132:0
+BGDL_6300
+p:SkyItalia
+1fef:00820000:189c:fbff:132:0
+Downl IKUSI
+p:SkyItalia
+2af0:00820000:1838:fbff:132:0
+Dl622
+p:SkyItalia
+2af5:00820000:1838:fbff:132:0
+Dl621
+p:SkyItalia
+38fd:00820000:2648:fbff:132:0
+FGDL_800
+p:SkyItalia
+2937:00820000:1edc:0071:143:0
+EDCPH
+p:Cyfrowy Polsat S.A.
+8fff:00820000:1edc:0071:143:0
+EDCPS
+p:Cyfrowy Polsat S.A.
+0e56:00820000:16a8:fbff:144:0
+Connessione internet Primafila
+p:SkyItalia
+2dc9:00820000:1a2c:fbff:144:0
+Cinema Active
+p:SkyItalia
+38ce:00820000:2648:fbff:144:0
+Sky Radio
+p:SkyItalia
+1fd2:00820000:189c:fbff:144:0
+Primafila Sky
+p:SkyItalia
+38e3:00820000:2648:fbff:144:0
+Novita' Sky
+p:SkyItalia
+3bee:00820000:0064:fbff:144:0
+Sky Music
+p:SkyItalia
+1d98:00820000:2f44:013e:145:0
+Eepg
+p:NetMed
+0017:00820000:1edc:0071:171:0
+Strefa Abonenta
+p:Cyfrowy Polsat S.A.
+0e59:00820000:16a8:fbff:250:0
+DL IKUSI EPG
+p:SkyItalia
+2c7f:00820000:251c:fbff:250:0
+XDOME
+p:SkyItalia
+2bbc:00820000:19c8:fbff:250:0
+DL IKUSI MI
+p:SkyItalia
+38fe:00820000:2648:fbff:250:0
+ikusi
+p:SkyItalia
+end
+Have a lot of bugs!
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/lamedb.192 b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/lamedb.192
new file mode 100755 (executable)
index 0000000..096a943
--- /dev/null
@@ -0,0 +1,4962 @@
+eDVB services /4/
+transponders
+00c00000:03eb:0001
+       s 11243750:22000000:0:4:192:2:0
+/
+00c00000:03ef:0001
+       s 11302750:22000000:0:2:192:2:0:1:2:0:2
+/
+00c00000:03f0:0001
+       s 11317500:22000000:1:4:192:2:0
+/
+00c00000:03f2:0001
+       s 11347000:22000000:1:2:192:2:0:1:2:0:2
+/
+00c00000:03f3:0001
+       s 11361750:22000000:0:2:192:2:0:1:2:0:2
+/
+00c00000:03f4:0001
+       s 11376500:22000000:1:2:192:2:0:1:2:0:2
+/
+00c00000:03f7:0001
+       s 11420750:22000000:0:4:192:2:0
+/
+00c00000:03f8:0001
+       s 11435500:22000000:1:2:192:2:0:1:2:0:2
+/
+00c00000:03f9:0001
+       s 11464250:22000000:0:2:192:2:0:1:2:0:2
+/
+00c00000:03fa:0001
+       s 11479000:22000000:1:4:192:2:0
+/
+00c00000:03fb:0001
+       s 11493750:22000000:0:2:192:2:0:1:2:0:2
+/
+00c00000:03fc:0001
+       s 11508500:22000000:1:4:192:2:0
+/
+00c00000:03fd:0001
+       s 11523250:22000000:0:4:192:2:0
+/
+00c00000:03fe:0001
+       s 11538000:22000000:1:4:192:2:0
+/
+00c00000:0400:0001
+       s 11567500:22000000:1:4:192:2:0
+/
+00c00000:0401:0001
+       s 11582250:22000000:0:2:192:2:0:1:2:0:2
+/
+00c00000:0402:0001
+       s 11597000:22000000:1:4:192:2:0
+/
+00c00000:0403:0001
+       s 11611750:22000000:0:4:192:2:0
+/
+00c00000:0404:0001
+       s 11626500:22000000:1:2:192:2:0:1:2:0:2
+/
+00c00000:0405:0001
+       s 11641250:22000000:0:3:192:2:0:1:2:2:2
+/
+00c00000:0407:0001
+       s 11670750:22000000:0:2:192:2:0:1:2:0:2
+/
+00c00000:0408:0001
+       s 11685500:22000000:1:4:192:2:0
+/
+00c00000:040a:0001
+       s 10979000:22000000:1:4:192:2:0
+/
+00c00000:040d:0001
+       s 11023250:22000000:0:4:192:2:0
+/
+00c00000:040e:0001
+       s 11038000:22000000:1:4:192:2:0
+/
+00c00000:0410:0001
+       s 11067500:22000000:1:4:192:2:0
+/
+00c00000:0412:0001
+       s 11097000:22000000:1:4:192:2:0
+/
+00c00000:0414:0001
+       s 11126500:22000000:1:2:192:2:0:1:2:0:2
+/
+00c00000:0416:0001
+       s 11156000:22000000:1:4:192:2:0
+/
+00c00000:0417:0001
+       s 11170750:22000000:0:2:192:2:0:1:2:0:2
+/
+00c00000:041a:0001
+       s 10729000:22000000:1:2:192:2:0:1:2:0:2
+/
+00c00000:041b:0001
+       s 10743750:22000000:0:4:192:2:0
+/
+00c00000:041c:0001
+       s 10758500:22000000:1:4:192:2:0
+/
+00c00000:041d:0001
+       s 10773250:22000000:0:3:192:2:0:1:2:2:2
+/
+00c00000:041e:0001
+       s 10788000:22000000:1:4:192:2:0
+/
+00c00000:0420:0001
+       s 10817500:22000000:1:2:192:2:0:1:2:0:2
+/
+00c00000:0421:0001
+       s 10832250:22000000:0:2:192:2:0:1:2:0:2
+/
+00c00000:0422:0001
+       s 10847000:22000000:1:4:192:2:0
+/
+00c00000:0423:0001
+       s 10861750:22000000:0:5:192:2:0
+/
+00c00000:0424:0001
+       s 10876500:22000000:1:4:192:2:0
+/
+00c00000:0428:0001
+       s 10935500:22000000:1:2:192:2:0:1:2:0:2
+/
+00c00000:042a:0001
+       s 11739000:27500000:1:3:192:2:0
+/
+00c00000:042c:0001
+       s 11778000:27500000:1:3:192:2:0
+/
+00c00000:042e:0001
+       s 11817000:27500000:1:3:192:2:0
+/
+00c00000:0430:0001
+       s 11856000:27500000:1:3:192:2:0
+/
+00c00000:0431:0001
+       s 12109500:27500000:0:3:192:2:0
+/
+00c00000:0432:0001
+       s 11895000:27500000:1:3:192:2:0
+/
+00c00000:0434:0001
+       s 11934000:27500000:1:3:192:2:0
+/
+00c00000:0436:0001
+       s 11973000:27500000:1:3:192:2:0
+/
+00c00000:0437:0001
+       s 11953500:27500000:0:3:192:2:0
+/
+00c00000:0438:0001
+       s 12012000:29700000:1:2:192:2:0:1:2:1:2
+/
+00c00000:043a:0001
+       s 12051000:27500000:1:3:192:2:0
+/
+00c00000:043c:0001
+       s 12090000:27500000:1:3:192:2:0
+/
+00c00000:043e:0001
+       s 12129000:27500000:1:3:192:2:0
+/
+00c00000:0440:0001
+       s 12168000:29700000:1:2:192:2:0:1:2:1:2
+/
+00c00000:0441:0001
+       s 12187500:27500000:0:3:192:2:0
+/
+00c00000:0442:0001
+       s 12207000:29700000:1:2:192:2:0:1:2:1:2
+/
+00c00000:0443:0001
+       s 12226500:27500000:0:3:192:2:0
+/
+00c00000:0444:0001
+       s 12246000:29700000:1:2:192:2:0:1:2:1:2
+/
+00c00000:0445:0001
+       s 12265500:27500000:0:3:192:2:0
+/
+00c00000:0446:0001
+       s 12285000:27500000:1:3:192:2:0
+/
+00c00000:0448:0001
+       s 12324000:27500000:1:3:192:2:0
+/
+00c00000:044a:0001
+       s 12363000:27500000:1:3:192:2:0
+/
+00c00000:044c:0001
+       s 12402000:27500000:1:3:192:2:0
+/
+00c00000:044d:0001
+       s 11836500:27500000:0:3:192:2:0
+/
+00c00000:044e:0001
+       s 12441000:29700000:1:2:192:2:0:1:2:1:2
+/
+00c00000:0452:0001
+       s 12522000:22000000:1:4:192:2:0
+/
+00c00000:0453:0001
+       s 12544750:22000000:0:4:192:2:0
+/
+00c00000:0454:0001
+       s 12551500:22000000:1:4:192:2:0
+/
+00c00000:0455:0001
+       s 12574250:22000000:0:2:192:2:0:1:2:0:2
+/
+00c00000:0456:0001
+       s 12581000:22000000:1:4:192:2:0
+/
+00c00000:0457:0001
+       s 12603750:22000000:0:4:192:2:0
+/
+00c00000:0458:0001
+       s 12610500:22000000:1:4:192:2:0
+/
+00c00000:0459:0001
+       s 12633250:22000000:0:4:192:2:0
+/
+00c00000:045a:0001
+       s 12640000:22000000:1:4:192:2:0
+/
+00c00000:045b:0001
+       s 12662750:22000000:0:4:192:2:0
+/
+00c00000:045c:0001
+       s 12669500:22000000:1:2:192:2:0:1:2:0:2
+/
+00c00000:045d:0001
+       s 12692250:22000000:0:4:192:2:0
+/
+00c00000:045e:0001
+       s 12699000:22000000:1:4:192:2:0
+/
+00c00000:0460:0001
+       s 12728500:22000000:1:4:192:2:0
+/
+00c00000:04b1:0001
+       s 12421500:27500000:0:3:192:2:0
+/
+00c00000:0449:0035
+       s 12343500:27500000:0:3:192:2:0
+/
+00c00000:0451:0035
+       s 12515250:22000000:0:4:192:2:0
+/
+00c00000:045f:0035
+       s 12721750:22000000:0:4:192:2:0
+/
+00c00000:0001:0085
+       s 12070500:27500000:0:3:192:2:0
+/
+00c00000:0002:0085
+       s 11797500:27500000:0:3:192:2:0
+/
+00c00000:0003:0085
+       s 11719500:27500000:0:3:192:2:0
+/
+00c00000:0004:0085
+       s 12031500:27500000:0:3:192:2:0
+/
+00c00000:0005:0085
+       s 12460500:27500000:0:3:192:2:0
+/
+00c00000:0006:0085
+       s 11914500:27500000:0:9:192:2:0:1:1:0:2
+/
+00c00000:0007:0085
+       s 12148500:27500000:0:3:192:2:0
+/
+00c00000:000b:0085
+       s 12382500:27500000:0:9:192:2:0:1:1:0:2
+/
+00c00000:000c:0085
+       s 12304500:27500000:0:9:192:2:0:1:1:0:2
+/
+00c00000:000d:0085
+       s 11992500:27500000:0:9:192:2:0:1:1:0:2
+/
+00c00000:000e:0085
+       s 11875500:27500000:0:9:192:2:0:1:1:0:2
+/
+00c00000:000f:0085
+       s 10920750:22000000:0:5:192:2:0
+/
+00c00000:0011:0085
+       s 11758500:27500000:0:3:192:2:0
+/
+00c00000:0021:0085
+       s 12480000:27500000:1:3:192:2:0
+/
+end
+services
+2146:00c00000:0400:0001:0:0
+
+p:
+75e8:00c00000:0422:0001:0:0
+
+p:
+75e9:00c00000:0422:0001:0:0
+
+p:
+75ea:00c00000:0422:0001:0:0
+
+p:
+75eb:00c00000:0422:0001:0:0
+
+p:
+75ec:00c00000:0422:0001:0:0
+
+p:
+13f6:00c00000:0403:0001:0:0
+RTB
+p:
+13f7:00c00000:0403:0001:0:0
+RTI 1
+p:
+75fb:00c00000:0408:0001:0:0
+
+p:
+0300:00c00000:0007:0085:1:0
+RNF
+p:BetaDigital
+1200:00c00000:03fd:0001:1:0
+Bay TV 3
+p:BetaDigital
+1b00:00c00000:03fe:0001:1:0
+CCTV9 Documentary
+p:GlobeCast
+2b00:00c00000:0417:0001:1:0
+ORANGE SPORT INFO
+p:GlobeCast France
+0201:00c00000:0004:0085:1:0
+\86Blue\87 \86M\87ovie
+p:SKY,C:1810,C:1861
+0301:00c00000:0007:0085:1:0
+Channel21
+p:BetaDigital
+0701:00c00000:0005:0085:1:0
+\86D\87AS\86 VIERTE\87
+p:BetaDigital
+1201:00c00000:03fd:0001:1:0
+Bay TV 4
+p:BetaDigital
+1901:00c00000:03fa:0001:1:0
+TV5 MONDE
+p:CSAT
+1b01:00c00000:03fe:0001:1:0
+CCTV F
+p:GlobeCast
+2201:00c00000:044c:0001:1:0
+DISNEY XD
+p:CSAT
+2b01:00c00000:0417:0001:1:0
+KidsCo
+p:OrangeSAT
+7001:00c00000:0436:0001:1:0
+MTV Germany
+p:MTV Networks Europe
+7601:00c00000:0408:0001:1:0
+R. MADRID TV
+p:Digital+
+0202:00c00000:0007:0085:1:0
+JML Shop
+p:BetaDigital
+0702:00c00000:0005:0085:1:0
+Ojom TV
+p:BetaDigital
+1902:00c00000:03fa:0001:1:0
+LIBIDO TV
+p:
+1b02:00c00000:03fe:0001:1:0
+CCTV NEWS
+p:GlobeCast
+2202:00c00000:044c:0001:1:0
+L'EQUIPE TV
+p:CSAT
+2b02:00c00000:0417:0001:1:0
+E!Entertainement
+p:OrangeSAT
+7002:00c00000:0436:0001:1:0
+MTV PULSE
+p:MTV Networks Europe
+7602:00c00000:0408:0001:1:0
+NICK JR
+p:DIGITAL+
+0203:00c00000:0003:0085:1:0
+MGM
+p:SKY,C:1861
+1b03:00c00000:03fe:0001:1:0
+TV5MONDE EUROPE
+p:GlobeCast
+2203:00c00000:044c:0001:1:0
+PLANETE+ NOLIMIT
+p:CSAT
+7003:00c00000:0436:0001:1:0
+MTV IDOL
+p:MTV Networks Europe
+0204:00c00000:0003:0085:1:0
+Sky \86Nostalgie\87
+p:SKY,C:1861
+0304:00c00000:0005:0085:1:0
+iM1
+p:BetaDigital
+1904:00c00000:03fa:0001:1:0
+M6 MUSIC
+p:
+2204:00c00000:044c:0001:1:0
+NATIONAL GEO
+p:CSAT
+7004:00c00000:0436:0001:1:0
+VIVA Germany
+p:MTV Networks Europe
+7604:00c00000:0408:0001:1:0
+ANTENA 3
+p:DIGITAL +
+1905:00c00000:03fa:0001:1:0
+OFFRES CANAL READY
+p:CSAT
+2205:00c00000:044c:0001:1:0
+CINE+ CLASSIC
+p:CSAT
+2405:00c00000:0452:0001:1:0
+DIRECT STAR
+p:CSAT
+7005:00c00000:0436:0001:1:0
+Nick Jr France
+p:MTV Networks Europe
+7605:00c00000:0408:0001:1:0
+C+ DEP 2 HD
+p:DIGITAL+
+0206:00c00000:0011:0085:1:0
+\86Goldstar\87 TV
+p:SKY,C:1861
+0306:00c00000:0007:0085:1:0
+\86GOD \87Channel
+p:BetaDigital
+1906:00c00000:03fa:0001:1:0
+NRJ HITS
+p:CSAT
+2206:00c00000:044c:0001:1:0
+TRACE URBAN
+p:CSAT
+2406:00c00000:0452:0001:1:0
+LCP
+p:CSAT
+7606:00c00000:0408:0001:1:0
+MTV LIVE HD
+p:DIGITAL+
+0307:00c00000:0007:0085:1:0
+MediaShop- Meine Einkaufswelt
+p:BetaDigital
+1907:00c00000:03fa:0001:1:0
+FRENCH LOVER
+p:CSAT
+2207:00c00000:044c:0001:1:0
+CINE+ FAMIZ
+p:CSAT
+2407:00c00000:0452:0001:1:0
+FRANCE 4
+p:CSAT
+7007:00c00000:0436:0001:1:0
+MTV NL
+p:MTV Networks Europe
+7607:00c00000:0408:0001:1:0
+MEZZO LIVEHD
+p:DIGITAL+
+0008:00c00000:0002:0085:1:0
+Sky \86Comedy\87
+p:SKY,C:1861
+0308:00c00000:0005:0085:1:0
+SIXX
+p:ProSiebenSat.1
+1908:00c00000:03fa:0001:1:0
+GIRONDINS TV
+p:IMEDIA
+2f08:00c00000:0441:0001:1:0
+SUPER RTL
+p:RTL World
+7008:00c00000:0436:0001:1:0
+NICK/COMEDY
+p:MTV Networks Europe
+0009:00c00000:0002:0085:1:0
+Sky \86Action\87
+p:SKY,C:1861
+1909:00c00000:03fa:0001:1:0
+TELETOON+1
+p:CSAT
+2009:00c00000:0430:0001:1:0
+CANAL+
+p:CSAT
+2f09:00c00000:0441:0001:1:0
+SUPER RTL CH
+p:RTL
+000a:00c00000:0002:0085:1:0
+Sky \86Cinema\87
+p:SKY,C:1810,C:1861
+190a:00c00000:03fa:0001:1:0
+PINK TV/PINK X
+p:CSAT
+200a:00c00000:0430:0001:1:0
+CANAL+ DECALE
+p:CSAT
+240a:00c00000:0452:0001:1:0
+GULLI
+p:CSAT
+700a:00c00000:0436:0001:1:0
+Nicktoons (S)
+p:MTV Networks Europe
+760a:00c00000:0408:0001:1:0
+CINEMAGIC HD
+p:DIGITAL+
+000b:00c00000:0002:0085:1:0
+Sky \86Cinema\87 +\861\87
+p:SKY,C:1861
+200b:00c00000:0430:0001:1:0
+CANAL+ CINEMA
+p:CSAT
+240b:00c00000:0452:0001:1:0
+FRANCE Ô
+p:
+000c:00c00000:0004:0085:1:0
+\86N\87at\86G\87eo\86 Wild\87
+p:SKY,C:1861
+190c:00c00000:03fa:0001:1:0
+TS2
+p:
+200c:00c00000:0430:0001:1:0
+CANAL+
+p:CSAT
+760c:00c00000:0408:0001:1:0
+TCM AUTOR
+p:CMACLS
+000d:00c00000:0004:0085:1:0
+\86Nat\87ional \86Geo\87graphic
+p:SKY,C:1861
+200d:00c00000:0430:0001:1:0
+CANAL+ FAMILY
+p:CSAT
+000e:00c00000:0004:0085:1:0
+\86Discovery\87 Channel
+p:SKY,C:1861
+200e:00c00000:0430:0001:1:0
+CINE+ PREMIER
+p:CSAT
+760e:00c00000:0408:0001:1:0
+LA SIETE
+p:DIGITAL+
+000f:00c00000:0004:0085:1:0
+.
+p:SKY,C:1861
+200f:00c00000:0430:0001:1:0
+DISNEY CHANNEL
+p:CSAT
+0010:00c00000:0001:0085:1:0
+\86Fox\87 Serie
+p:SKY,C:1861
+2010:00c00000:0430:0001:1:0
+CANAL+ SPORT
+p:CSAT
+0011:00c00000:0003:0085:1:0
+Sky \86Sport\87 \86News\87
+p:SKY,C:1861
+2011:00c00000:0430:0001:1:0
+INFOSPORT+
+p:CSAT
+7611:00c00000:0408:0001:1:0
+C+ LIGA HD
+p:DIGITAL+
+0012:00c00000:0004:0085:1:0
+\86Sky\87 \86Sel\87ect
+p:SKY
+7612:00c00000:0408:0001:1:0
+CANAL+1 HD
+p:DIGITAL+
+0013:00c00000:0011:0085:1:0
+Junior
+p:SKY,C:1861
+2013:00c00000:0430:0001:1:0
+CANAL+
+p:IMEDIA
+7613:00c00000:0408:0001:1:0
+C+ ACCIÓN HD
+p:DIGITAL+
+0014:00c00000:0002:0085:1:0
+Sky \86Emotion\87
+p:SKY,C:1861
+7614:00c00000:0408:0001:1:0
+C+COMEDIA HD
+p:DIGITAL+
+0015:00c00000:0011:0085:1:0
+\86Beate\87-\86U\87hse.TV
+p:SKY,C:1861
+7615:00c00000:0408:0001:1:0
+C+ DCINE HD
+p:DIGITAL+
+0016:00c00000:0011:0085:1:0
+\86Heimat\87kanal
+p:SKY,C:1861
+2b16:00c00000:0417:0001:1:0
+ORANGE SPORT HD
+p:Globecast
+7616:00c00000:0408:0001:1:0
+C+XTRA HD
+p:DIGITAL+
+0017:00c00000:0001:0085:1:0
+\86Sky\87 \86Krimi\87
+p:SKY,C:1861
+2417:00c00000:0452:0001:1:0
+GOLF+
+p:CSAT
+2b17:00c00000:0417:0001:1:0
+ORANGE CINE MAX HD
+p:Globecast
+7617:00c00000:0408:0001:1:0
+CINEMAGIC HD
+p:DIGITAL+
+0018:00c00000:0011:0085:1:0
+Classica
+p:SKY,C:1861
+7618:00c00000:0408:0001:1:0
+C+ FÚTBOL HD
+p:DIGITAL+
+0019:00c00000:0003:0085:1:0
+\86Disney\87 \86Cin\87emagic
+p:SKY,C:1861
+7619:00c00000:0408:0001:1:0
+C+ DEPORT HD
+p:DIGITAL+
+001a:00c00000:0011:0085:1:0
+\86Disney\87 \86J\87unio\86r\87
+p:SKY,C:1861
+321a:00c00000:045f:0035:1:0
+Informatiekanaal
+p:TV Vlaanderen
+761a:00c00000:0408:0001:1:0
+EUROSPORT HD
+p:DIGITAL+
+001b:00c00000:0001:0085:1:0
+\86RTL\87 \86Crime\87
+p:SKY,C:1837,C:1861
+761b:00c00000:0408:0001:1:0
+CALLE 13 HD
+p:DIGITAL+
+001c:00c00000:0011:0085:1:0
+\86Disney\87 \86XD\87
+p:SKY,C:1861
+2f1c:00c00000:0441:0001:1:0
+VOX
+p:RTL World
+761c:00c00000:0408:0001:1:0
+FOX HD
+p:DIGITAL+
+001d:00c00000:0001:0085:1:0
+RTL \86Passion\87
+p:SKY,C:1837,C:1861
+201d:00c00000:0430:0001:1:0
+CANAL+
+p:CSAT
+251d:00c00000:0456:0001:1:0
+TF6
+p:CSAT
+2f1d:00c00000:0441:0001:1:0
+RTLNITRO
+p:RTL
+761d:00c00000:0408:0001:1:0
+AXN HD
+p:DIGITAL+
+001e:00c00000:0001:0085:1:0
+Sky \86Sport\87 \86Au\87s\86t\87ria
+p:SKY,C:1861
+251e:00c00000:0456:0001:1:0
+USHUAIA TV
+p:CSAT
+761e:00c00000:0408:0001:1:0
+NAT GEO HD
+p:DIGITAL+
+1c1f:00c00000:0451:0035:1:0
+EPG
+p:CANALDIGITAAL
+251f:00c00000:0456:0001:1:0
+EUROSPORT 2
+p:CSAT
+761f:00c00000:0408:0001:1:0
+MTV LIVE HD
+p:DIGITAL+
+0020:00c00000:0021:0085:1:0
+\86Sonnen\87klar \86TV\87
+p:BetaDigital
+2520:00c00000:0456:0001:1:0
+A LA DEMANDE
+p:CSAT
+7620:00c00000:0408:0001:1:0
+MEZZO LIVEHD
+p:DIGITAL+
+0021:00c00000:000f:0085:1:0
+\86Kinowelt\87 TV
+p:SKY,C:1833
+2521:00c00000:0456:0001:1:0
+SEASONS
+p:CSAT
+4e21:00c00000:043a:0001:1:0
+ProSieben Schweiz
+p:ProSiebenSat.1
+7621:00c00000:0408:0001:1:0
+CANAL+ 3D
+p:DIGITAL+
+0022:00c00000:0011:0085:1:0
+\86Disney\87 Channel
+p:SKY,C:1861
+2522:00c00000:0456:0001:1:0
+O.CINE MAX
+p:
+4e22:00c00000:043a:0001:1:0
+ProSieben Austria
+p:ProSiebenSat.1
+7622:00c00000:0408:0001:1:0
+TAQUILLA HD
+p:DIGITAL+
+0023:00c00000:000f:0085:1:0
+\86TNT Film\87 (TCM)
+p:SKY,C:1833
+2523:00c00000:0456:0001:1:0
+PIWI+
+p:CSAT
+4e23:00c00000:043a:0001:1:0
+Kabel 1 Schweiz
+p:ProSiebenSat.1
+7623:00c00000:0408:0001:1:0
+VIAJAR HD
+p:DIGITAL+
+0024:00c00000:0011:0085:1:0
+Syfy
+p:SKY,C:1861
+2024:00c00000:0430:0001:1:0
+CANAL+ SPORT
+p:CSAT
+2524:00c00000:0456:0001:1:0
+EXTREME SPORTS
+p:CSAT
+4e24:00c00000:043a:0001:1:0
+Kabel 1 Austria
+p:ProSiebenSat.1
+7624:00c00000:0408:0001:1:0
+COSMO HD
+p:DIGITAL+
+0025:00c00000:000f:0085:1:0
+\86AXN\87 Action
+p:SKY,C:1830,C:1833
+2525:00c00000:0456:0001:1:0
+MOTORS TV
+p:CSAT
+4e25:00c00000:043a:0001:1:0
+SAT.1 A
+p:ProSiebenSat.1
+7625:00c00000:0408:0001:1:0
+HOLLYWOOD HD
+p:DIGITAL+
+0026:00c00000:000f:0085:1:0
+\86Romance\87 TV
+p:SKY,C:1830,C:1833
+2526:00c00000:0456:0001:1:0
+EQUIDIA LIFE
+p:CSAT
+4e26:00c00000:043a:0001:1:0
+SAT.1 CH
+p:ProSiebenSat.1
+7626:00c00000:0408:0001:1:0
+TNT HD
+p:DIGITAL +
+0027:00c00000:000f:0085:1:0
+Cartoon Network (S)
+p:SKY,C:1833
+4e27:00c00000:043a:0001:1:0
+PULS 4 Austria
+p:ProSiebenSat.1,C:1833
+7627:00c00000:0408:0001:1:0
+NG WILD HD
+p:DIGITAL+
+0028:00c00000:0021:0085:1:0
+\86HSE24\87
+p:BetaDigital
+4e28:00c00000:043a:0001:1:0
+SAT.1 HH/SH
+p:ProSiebenSat.1
+7628:00c00000:0408:0001:1:0
+SYFY HD
+p:DIGITAL+
+0029:00c00000:0003:0085:1:0
+\86Sky\87 \86Hits\87
+p:SKY,C:1861
+4e29:00c00000:043a:0001:1:0
+SAT.1 NS/Bremen
+p:ProSiebenSat.1
+7629:00c00000:0408:0001:1:0
+DISNEY CH HD
+p:DIGITAL+
+7729:00c00000:0416:0001:1:0
+CINEMAGIC
+p:DIGITAL+
+002a:00c00000:0001:0085:1:0
+\8613\87th \86Street\87
+p:SKY,C:1861
+4e2a:00c00000:043a:0001:1:0
+SAT.1 RhlPf/Hessen
+p:ProSiebenSat.1
+772a:00c00000:0416:0001:1:0
+DISNEY XD
+p:DIGITAL+
+002b:00c00000:0002:0085:1:0
+Sky \86Cinema\87 +\8624\87
+p:SKY,C:1861
+772b:00c00000:0416:0001:1:0
+CAZA Y PESCA
+p:CAZPES
+332d:00c00000:045b:0001:1:0
+ORF III
+p:ORF,C:0d95,C:0648,C:0d05,C:09c4,C:1702,C:1833,C:098c
+6e2d:00c00000:0431:0001:1:0
+rbb Brandenburg
+p:ARD
+772d:00c00000:0416:0001:1:0
+BIO
+p:DIGITAL+
+002e:00c00000:0021:0085:1:0
+\86mediasparTV\87 Homeshopping
+p:BetaDigital
+272e:00c00000:0402:0001:1:0
+CNBC Europe
+p:CNBC
+332e:00c00000:045b:0001:1:0
+GoTV
+p:GoTV
+6e2e:00c00000:0431:0001:1:0
+rbb Berlin
+p:ARD
+772e:00c00000:0416:0001:1:0
+C+ YOMVI
+p:DIGITAL+
+002f:00c00000:0021:0085:1:0
+\86REGIO TV\87
+p:BetaDigital
+132f:00c00000:03ef:0001:1:0
+ORF1 HD
+p:ORF,C:0d05,C:0d95,C:0648,C:1702,C:1833,C:09c4,C:098c
+332f:00c00000:045b:0001:1:0
+.
+p:-
+772f:00c00000:0416:0001:1:0
+11156V SID 0x772f
+p:DVB-S QPSK 11156V 19.2°E
+0030:00c00000:0005:0085:1:0
+ERF 1
+p:BetaDigital
+1130:00c00000:0404:0001:1:0
+SES 5 launch HD
+p:ASTRA
+1330:00c00000:03ef:0001:1:0
+ORF2 HD
+p:ORF,C:0d05,C:0d95,C:0648,C:1702,C:1833,C:09c4,C:098c
+2f30:00c00000:0441:0001:1:0
+Channel 21
+p:RTL World
+3330:00c00000:045b:0001:1:0
+LT1-OOE
+p:-
+7730:00c00000:0416:0001:1:0
+COSMOPOLITAN
+p:COSMO
+1331:00c00000:03ef:0001:1:0
+ServusTV HD Oesterreich
+p:ServusTV
+3331:00c00000:045b:0001:1:0
+ESPN America (S)
+p:SKY,C:1702,C:1833,C:09c4,C:098c
+7031:00c00000:041b:0001:1:0
+tagesschau24
+p:ARD
+7731:00c00000:0416:0001:1:0
+HISTORIA
+p:HIST
+0032:00c00000:0001:0085:1:0
+\86TNT\87 \86Serie\87
+p:SKY,C:1861
+1332:00c00000:03ef:0001:1:0
+ServusTV HD Deutschland
+p:ServusTV
+3332:00c00000:045b:0001:1:0
+sixx Austria
+p:sevenonemedia,C:1702,C:1833,C:09c4,C:0d05,C:0d95,C:0648,C:098c
+7032:00c00000:041b:0001:1:0
+Einsfestival
+p:ARD
+7732:00c00000:0416:0001:1:0
+EUROSPORT
+p:ESP
+0033:00c00000:0021:0085:1:0
+TELE 5
+p:BetaDigital
+1333:00c00000:03ef:0001:1:0
+PVoD
+p:ServusTV
+2b33:00c00000:0417:0001:1:0
+KidsCo Bis
+p:OrangeSAT
+3333:00c00000:045b:0001:1:0
+VISIT-X.tv
+p:-
+7033:00c00000:041b:0001:1:0
+EinsPlus
+p:ARD
+0034:00c00000:0004:0085:1:0
+\86Spiegel\87 \86G\87eschichte
+p:SKY,C:1861
+7034:00c00000:041b:0001:1:0
+arte
+p:ARD
+0035:00c00000:0007:0085:1:0
+SES 01
+p:BetaDigital,C:1833
+2135:00c00000:0400:0001:1:0
+TELE MELODY
+p:CSAT
+3335:00c00000:045b:0001:1:0
+ESPN America
+p:arena
+7035:00c00000:041b:0001:1:0
+PHOENIX
+p:ARD
+7735:00c00000:0416:0001:1:0
+CINEMAGIC
+p:DIGITAL+
+0036:00c00000:0007:0085:1:0
+Beauty TV
+p:BetaDigital
+2136:00c00000:0400:0001:1:0
+CHAINE CHAMPIONS
+p:
+3336:00c00000:045b:0001:1:0
+ServusTV Deutschland
+p:ServusTV
+7036:00c00000:041b:0001:1:0
+Test-R
+p:ARD
+7736:00c00000:0416:0001:1:0
+DCINE ESPAÑOL
+p:DCESP
+0037:00c00000:000f:0085:1:0
+Eurosport 2 Deutschland
+p:SKY,C:1833
+3337:00c00000:045b:0001:1:0
+ServusTV Oesterreich
+p:ServusTV
+0038:00c00000:000f:0085:1:0
+Boomerang
+p:SKY,C:1833
+2138:00c00000:0400:0001:1:0
+PLANETE+THALASSA
+p:CSAT
+3138:00c00000:0459:0001:1:0
+MagicStar Digitalradio Promo
+p:MEDIA BROADCAST
+7738:00c00000:0416:0001:1:0
+24 HORAS
+p:24H
+0039:00c00000:000f:0085:1:0
+\86Bio\87graphy Channel
+p:SKY,C:1833
+2139:00c00000:0400:0001:1:0
+ESPN CLASSIC
+p:CSAT
+3139:00c00000:0459:0001:1:0
+K-TV
+p:MEDIA BROADCAST
+3339:00c00000:045b:0001:1:0
+L-TV/TVM
+p:-
+003a:00c00000:000f:0085:1:0
+History
+p:SKY,C:1833
+213a:00c00000:0400:0001:1:0
+11567V SID 0x213a
+p:DVB-S QPSK 11567V 19.2°E
+2f3a:00c00000:0441:0001:1:0
+n-tv
+p:RTL World
+773a:00c00000:0416:0001:1:0
+11156V SID 0x773a
+p:DVB-S QPSK 11156V 19.2°E
+003b:00c00000:000f:0085:1:0
+sportdigital
+p:SKY,C:1830,C:1861
+003c:00c00000:0007:0085:1:0
+VIVA AUT
+p:MTV Networks
+213c:00c00000:0400:0001:1:0
+MCS BIEN ETRE
+p:
+313c:00c00000:0459:0001:1:0
+dhd24.tv
+p:Media Broadcast
+003d:00c00000:0007:0085:1:0
+NICK/CC AUT
+p:MTV Networks
+6e3d:00c00000:0431:0001:1:0
+ARD-TEST-1
+p:ARD
+003e:00c00000:0005:0085:1:0
+\86EWTN kath\87olisches TV
+p:BetaDigital
+313e:00c00000:0459:0001:1:0
+Lustkanal.TV
+p:Media Broadcast
+003f:00c00000:0021:0085:1:0
+DMAX
+p:BetaDigital
+2f3f:00c00000:0441:0001:1:0
+Channel 21 ALT
+p:CBC
+313f:00c00000:0459:0001:1:0
+AEGYPTEN.TV
+p:MEDIA BROADCAST
+0040:00c00000:0005:0085:1:0
+QVC Beauty
+p:BetaDigital
+6e40:00c00000:0431:0001:1:0
+NDR FS MV
+p:ARD
+0041:00c00000:0007:0085:1:0
+\86DELUXE\87 MUSIC
+p:BetaDigital
+1f41:00c00000:042e:0001:1:0
+FRANCE 5
+p:CSAT
+6e41:00c00000:0431:0001:1:0
+NDR FS HH
+p:ARD
+0d42:00c00000:0454:0001:1:0
+QVC PLUS
+p:SES ASTRA
+1f42:00c00000:042e:0001:1:0
+CINE+ EMOTION
+p:CSAT
+2742:00c00000:0402:0001:1:0
+BBC World
+p:BBC
+6e42:00c00000:0431:0001:1:0
+NDR FS NDS
+p:ARD
+1f43:00c00000:042e:0001:1:0
+CINE+ FRISSON
+p:CSAT
+6e43:00c00000:0431:0001:1:0
+NDR FS SH
+p:ARD
+1f44:00c00000:042e:0001:1:0
+NRJ 12
+p:CSAT
+2144:00c00000:0400:0001:1:0
+OM TV
+p:CSAT
+2f44:00c00000:0454:0001:1:0
+QVC Deutschland
+p:SES ASTRA
+3144:00c00000:0459:0001:1:0
+Erotik 24
+p:MEDIA BROADCAST
+6e44:00c00000:0431:0001:1:0
+MDR Sachsen
+p:ARD
+7a44:00c00000:0410:0001:1:0
+ANDALUCIA TV
+p:Telefonica Servicios Audiovisuales
+1f45:00c00000:042e:0001:1:0
+PARIS PREMIERE
+p:CSAT
+2145:00c00000:0400:0001:1:0
+OL TV
+p:CSAT
+6e45:00c00000:0431:0001:1:0
+MDR S-Anhalt
+p:ARD
+0046:00c00000:0007:0085:1:0
+SES 02
+p:BetaDigital,C:1702,C:1801,C:1830
+1f46:00c00000:042e:0001:1:0
+13EME RUE
+p:CSAT
+3146:00c00000:0459:0001:1:0
+rhein main tv
+p:MEDIA BROADCAST
+6e46:00c00000:0431:0001:1:0
+MDR Thüringen
+p:ARD
+6f46:00c00000:0445:0001:1:0
+SR Fernsehen
+p:ARD
+7a46:00c00000:0410:0001:1:0
+Russia Today
+p:Harmonic
+0047:00c00000:0007:0085:1:0
+\86H\87OPE \86C\87hannel\86 deutsch\87
+p:BetaDigital
+1f47:00c00000:042e:0001:1:0
+MEZZO
+p:CSAT
+3147:00c00000:0459:0001:1:0
+Deutsche Girls 2
+p:MEDIA BROADCAST
+6e47:00c00000:0431:0001:1:0
+SWR Fernsehen RP
+p:ARD
+6f47:00c00000:0445:0001:1:0
+BR-alpha
+p:ARD
+7a47:00c00000:0410:0001:1:0
+TELEMADRID SAT
+p:Telefonica Servicios Audiovisuales
+1f48:00c00000:042e:0001:1:0
+FRANCE 3
+p:CSAT
+3148:00c00000:0459:0001:1:0
+Juwelo TV
+p:MEDIA BROADCAST
+7a48:00c00000:0410:0001:1:0
+TELESUR
+p:Telefonica Servicios Audiovisuales
+0049:00c00000:0005:0085:1:0
+.
+p:BetaDigital
+1f49:00c00000:042e:0001:1:0
+SPORT+
+p:CSAT
+2649:00c00000:0460:0001:1:0
+FR3 CAEN
+p:CSAT
+004a:00c00000:0005:0085:1:0
+Press TV
+p:BetaDigital
+1f4a:00c00000:042e:0001:1:0
+I>TELE
+p:CSAT
+264a:00c00000:0460:0001:1:0
+FR3 NANTES
+p:CSAT
+314a:00c00000:0459:0001:1:0
+Dreamgirls.TV
+p:MEDIA BROADCAST
+264b:00c00000:0460:0001:1:0
+FR3 NICE
+p:CSAT
+314b:00c00000:0459:0001:1:0
+Erotik Sat
+p:MEDIA BROADCAST
+004c:00c00000:0021:0085:1:0
+.
+p:BetaDigital
+1f4c:00c00000:042e:0001:1:0
+MEZZO.
+p:CSAT
+264c:00c00000:0460:0001:1:0
+FR3 ORLEANS
+p:CSAT
+314c:00c00000:0459:0001:1:0
+123Damenwahl
+p:MEDIA BROADCAST
+004d:00c00000:0021:0085:1:0
+HSE24 TREND
+p:BetaDigital
+1f4d:00c00000:042e:0001:1:0
+NCMESS
+p:CSAT
+264d:00c00000:0460:0001:1:0
+FR3 DIJON
+p:CSAT
+314d:00c00000:0459:0001:1:0
+SexySat
+p:MEDIA BROADCAST
+264e:00c00000:0460:0001:1:0
+FR3 POITIERS
+p:CSAT
+274e:00c00000:0402:0001:1:0
+Best of shopping
+p:Groupe M6
+314e:00c00000:0459:0001:1:0
+Maennersache TV
+p:MEDIA BROADCAST
+264f:00c00000:0460:0001:1:0
+FR3 REIMS
+p:CSAT
+274f:00c00000:0402:0001:1:0
+M6 BOUTIQUE LA CHAINE
+p:Groupe M6
+314f:00c00000:0459:0001:1:0
+Date Line
+p:MEDIA BROADCAST
+2650:00c00000:0460:0001:1:0
+FR3 GRENOBLE
+p:CSAT
+3150:00c00000:0459:0001:1:0
+Fotohandy
+p:MEDIA BROADCAST
+2651:00c00000:0460:0001:1:0
+FR3 LILLE
+p:CSAT
+3151:00c00000:0459:0001:1:0
+Mobile Sex
+p:MEDIA BROADCAST
+1252:00c00000:03fd:0001:1:0
+\86Lokal TV\87 Portal
+p:BetaDigital
+2652:00c00000:0460:0001:1:0
+FR3 STRASBOURG
+p:CSAT
+3152:00c00000:0459:0001:1:0
+SEX-Kontakte
+p:MEDIA BROADCAST
+2653:00c00000:0460:0001:1:0
+FR3 MONTPELLIER
+p:CSAT
+2753:00c00000:0402:0001:1:0
+Bloomberg Europe TV
+p:Arqiva
+3153:00c00000:0459:0001:1:0
+Kamasutra TV
+p:MEDIA BROADCAST
+2654:00c00000:0460:0001:1:0
+FR3 VIA STELLA
+p:CSAT
+3154:00c00000:0459:0001:1:0
+Teledate TV
+p:MEDIA BROADCAST
+1f55:00c00000:042e:0001:1:0
+I>TELE
+p:CSAT
+2755:00c00000:0402:0001:1:0
+TELEMADRID SAT
+p:Telefonica Spain
+3155:00c00000:0459:0001:1:0
+Traumgirls.TV
+p:MEDIA BROADCAST
+3355:00c00000:045b:0001:1:0
+Tirol TV
+p:-
+1f56:00c00000:042e:0001:1:0
+NRJ 12
+p:CSAT
+2756:00c00000:0402:0001:1:0
+ANDALUCIA TV
+p:Telefonica Spain
+3156:00c00000:0459:0001:1:0
+Das Erotische TV
+p:MEDIA BROADCAST
+1f57:00c00000:042e:0001:1:0
+FRANCE 3
+p:CSAT
+1f58:00c00000:042e:0001:1:0
+FRANCE 5
+p:CSAT
+2f58:00c00000:0454:0001:1:0
+LibertyTV FR
+p:SES ASTRA
+1b59:00c00000:03fc:0001:1:0
+Montagne TV
+p:GlobeCast
+3159:00c00000:0459:0001:1:0
+Shop24Direct
+p:Media Broadcast
+1b5a:00c00000:03fc:0001:1:0
+ETB Sat
+p:GlobeCast
+275a:00c00000:0402:0001:1:0
+CANAL SUR RADIO
+p:Telefonica Spain
+2f5a:00c00000:0454:0001:1:0
+Bibel TV
+p:SES ASTRA
+315a:00c00000:0459:0001:1:0
+DiaetTV
+p:MEDIA BROADCAST
+275b:00c00000:0402:0001:1:0
+TELESUR
+p:Telefonica Spain
+2f5b:00c00000:0454:0001:1:0
+eUrotic
+p:SES ASTRA
+315b:00c00000:0459:0001:1:0
+Cambabes24
+p:MEDIA BROADCAST
+125c:00c00000:03f7:0001:1:0
+SES 03
+p:BetaDigital
+315c:00c00000:0459:0001:1:0
+dhd24 plus
+p:Media Broadcast
+445c:00c00000:0453:0001:1:0
+SAT.1
+p:ProSiebenSat.1
+125d:00c00000:03f7:0001:1:0
+SES 04
+p:BetaDigital
+275d:00c00000:0402:0001:1:0
+Russia Today Español
+p:OVERON
+445d:00c00000:0453:0001:1:0
+ProSieben
+p:ProSiebenSat.1
+125e:00c00000:03f7:0001:1:0
+\86DAF\87-AnlegerTV
+p:BetaDigital
+1b5e:00c00000:03fc:0001:1:0
+Renault TV
+p:GlobeCast
+445e:00c00000:0453:0001:1:0
+kabel eins
+p:ProSiebenSat.1
+125f:00c00000:03f7:0001:1:0
+Channel21 Express
+p:BetaDigital
+315f:00c00000:0459:0001:1:0
+EROTIKA TV - NEU!
+p:MEDIA BROADCAST
+445f:00c00000:0453:0001:1:0
+N24
+p:ProSiebenSat.1
+1260:00c00000:03f7:0001:1:0
+SES 05
+p:BetaDigital
+1b60:00c00000:03fc:0001:1:0
+Cubavision Internacional
+p:GlobeCast
+3160:00c00000:0459:0001:1:0
+BunnyClub24
+p:MEDIA BROADCAST
+4460:00c00000:0453:0001:1:0
+SIXX
+p:ProSiebenSat.1
+1261:00c00000:03f7:0001:1:0
+SES 06
+p:BetaDigital
+1b61:00c00000:03fc:0001:1:0
+Al Jazeera Channel
+p:GlobeCast
+3161:00c00000:0459:0001:1:0
+Clipmobile
+p:MEDIA BROADCAST
+4461:00c00000:0453:0001:1:0
+SAT.1 emotions
+p:ProSiebenSat.1,C:1702,C:1801
+1262:00c00000:03f7:0001:1:0
+SES 07
+p:BetaDigital
+1b62:00c00000:03fc:0001:1:0
+RedeRecord
+p:GlobeCast
+1c62:00c00000:0457:0001:1:0
+STB Comag
+p:SES ASTRA
+3162:00c00000:0459:0001:1:0
+SmartCast Test
+p:MEDIA BROADCAST
+4462:00c00000:0453:0001:1:0
+kabel eins classics
+p:ProSiebenSat.1,C:1702,C:1801
+7562:00c00000:0412:0001:1:0
+C+ MULTI-X
+p:DIGITAL+
+1263:00c00000:03f7:0001:1:0
+SES 08
+p:BetaDigital
+1b63:00c00000:03fc:0001:1:0
+Arirang TV
+p:GlobeCast
+3163:00c00000:0459:0001:1:0
+StarParadies D
+p:MEDIA BROADCAST
+4463:00c00000:0453:0001:1:0
+SAT.1 Bayern
+p:ProSiebenSat.1
+7563:00c00000:0412:0001:1:0
+MULTI-X (2)
+p:DIGITAL+
+1264:00c00000:03f7:0001:1:0
+SES 09
+p:BetaDigital
+1b64:00c00000:03fc:0001:1:0
+Al Jazeera English
+p:GlobeCast
+3164:00c00000:0459:0001:1:0
+FTL Deutschland
+p:MEDIA BROADCAST
+4464:00c00000:0453:0001:1:0
+SAT.1 NRW
+p:ProSiebenSat.1
+1465:00c00000:040d:0001:1:0
+SES 5 launch
+p:ASTRA
+7565:00c00000:0412:0001:1:0
+TAQUILLA 5
+p:TQ5
+1266:00c00000:03f7:0001:1:0
+anixe iTV
+p:BetaDigital
+1b66:00c00000:03fc:0001:1:0
+NHK World TV
+p:GlobeCast
+6d66:00c00000:0437:0001:1:0
+ZDF
+p:ZDFvision
+7566:00c00000:0412:0001:1:0
+TAQUILLA 6
+p:TQ6
+1267:00c00000:03f7:0001:1:0
+Volksmusik
+p:BetaDigital
+2f67:00c00000:0454:0001:1:0
+TV8 Mont Blanc
+p:SES ASTRA
+6d67:00c00000:0437:0001:1:0
+3sat
+p:ZDFvision
+7567:00c00000:0412:0001:1:0
+TAQUILLA 7
+p:TQ7
+1268:00c00000:03f7:0001:1:0
+SOPHIA TV
+p:BetaDigital
+2f68:00c00000:0454:0001:1:0
+Vivolta
+p:SES ASTRA
+6d68:00c00000:0437:0001:1:0
+KiKA
+p:ZDFvision
+7468:00c00000:03f0:0001:1:0
+FOX CRIME
+p:DIGITAL+
+7568:00c00000:0412:0001:1:0
+TAQUILLA X
+p:TQ10
+1269:00c00000:03f7:0001:1:0
+Die Neue Zeit TV
+p:BetaDigital
+6f69:00c00000:042c:0001:1:0
+Cartoon Network
+p:TBS
+7469:00c00000:03f0:0001:1:0
+NOVA
+p:DIGITAL+
+7569:00c00000:0412:0001:1:0
+TAQUILLA XX
+p:TQX
+126a:00c00000:03f7:0001:1:0
+.
+p:BetaDigital
+1b6a:00c00000:03fc:0001:1:0
+TV GALICIA
+p:GlobeCast
+6f6a:00c00000:042c:0001:1:0
+CNN Int.
+p:CNN
+746a:00c00000:03f0:0001:1:0
+EL GARAGE TV
+p:DIGITAL+
+756a:00c00000:0412:0001:1:0
+TAQ XXHARD
+p:TQXX
+126b:00c00000:03f7:0001:1:0
+.
+p:BetaDigital
+6d6b:00c00000:0437:0001:1:0
+ZDFinfo
+p:ZDFvision
+746b:00c00000:03f0:0001:1:0
+DISNEY JR
+p:DIGITAL+
+756b:00c00000:0412:0001:1:0
+C+ LIGA 2
+p:DIGITAL+
+126c:00c00000:03f7:0001:1:0
+.
+p:BetaDigital
+746c:00c00000:03f0:0001:1:0
+C+ ACCIÓN
+p:CPC1
+756c:00c00000:0412:0001:1:0
+11097V SID 0x756c
+p:DVB-S QPSK 11097V 19.2°E
+126d:00c00000:03f7:0001:1:0
+.
+p:BetaDigital
+6f6d:00c00000:042c:0001:1:0
+TCM
+p:TBS
+746d:00c00000:03f0:0001:1:0
+C+ COMEDIA
+p:CPC2
+126e:00c00000:03f7:0001:1:0
+.1.
+p:BetaDigital,C:1830,C:1837,C:1843,C:1860
+146e:00c00000:040d:0001:1:0
+RTS SAT
+p:SES ASTRA
+6d6e:00c00000:0437:0001:1:0
+zdf_neo
+p:ZDFvision
+746e:00c00000:03f0:0001:1:0
+C+ DCINE
+p:CPC3
+756e:00c00000:0412:0001:1:0
+C+LIGA2 A
+p:DIGITAL+
+126f:00c00000:03f7:0001:1:0
+.2.
+p:BetaDigital,C:1830,C:1843,C:1860
+6f6f:00c00000:042c:0001:1:0
+Boomerang
+p:TBS
+746f:00c00000:03f0:0001:1:0
+FOX
+p:FOXGE
+756f:00c00000:0412:0001:1:0
+TAQUILLA 8
+p:TQ8
+1270:00c00000:03f7:0001:1:0
+.3.
+p:BetaDigital,C:1830,C:1843,C:1860
+6d70:00c00000:0437:0001:1:0
+zdf.kultur
+p:ZDFvision
+6f70:00c00000:042c:0001:1:0
+Boing
+p:Arqiva
+7470:00c00000:03f0:0001:1:0
+11317V SID 0x7470
+p:DVB-S QPSK 11317V 19.2°E
+7570:00c00000:0412:0001:1:0
+C+  TOROS
+p:DIGITAL+
+7471:00c00000:03f0:0001:1:0
+AXN WHITE
+p:DIGITAL+
+7571:00c00000:0412:0001:1:0
+MULTI-X (1)
+p:DIGITAL+
+7472:00c00000:03f0:0001:1:0
+11317V SID 0x7472
+p:DVB-S QPSK 11317V 19.2°E
+7572:00c00000:0412:0001:1:0
+MULTI-X (3)
+p:DIGITAL+
+7473:00c00000:03f0:0001:1:0
+11317V SID 0x7473
+p:DVB-S QPSK 11317V 19.2°E
+7573:00c00000:0412:0001:1:0
+MULTIDEP.5
+p:DIGITAL+
+7474:00c00000:03f0:0001:1:0
+11317V SID 0x7474
+p:DVB-S QPSK 11317V 19.2°E
+7574:00c00000:0412:0001:1:0
+MULTIDEP.6
+p:DIGITAL+
+6f76:00c00000:0457:0001:1:0
+WDR Aachen
+p:ARD
+7576:00c00000:0412:0001:1:0
+MULTIDEP.7
+p:DIGITAL+
+6f77:00c00000:0457:0001:1:0
+WDR Wuppertal
+p:ARD
+7477:00c00000:03f0:0001:1:0
+AXN
+p:AXN
+7577:00c00000:0412:0001:1:0
+C+LIGA2 B
+p:DIGITAL+
+6f78:00c00000:0457:0001:1:0
+WDR Bonn
+p:ARD
+7478:00c00000:03f0:0001:1:0
+11317V SID 0x7478
+p:DVB-S QPSK 11317V 19.2°E
+7578:00c00000:0412:0001:1:0
+C+LIGA2 C
+p:DIGITAL+
+6f79:00c00000:0457:0001:1:0
+WDR Duisburg
+p:ARD
+7479:00c00000:03f0:0001:1:0
+CANAL+1 ...30
+p:DIGITAL+
+7579:00c00000:0412:0001:1:0
+C+LIGA2 D
+p:DIGITAL+
+1c7a:00c00000:0457:0001:1:0
+Sky News Intl
+p:SES ASTRA
+427c:00c00000:0446:0001:1:0
+AB MOTEURS
+p:ABSAT,C:0100,C:0500
+427d:00c00000:0446:0001:1:0
+AB1
+p:ABSAT,C:0100,C:0000
+427e:00c00000:0446:0001:1:0
+ANIMAUX
+p:ABSAT,C:0100,C:0500
+427f:00c00000:0446:0001:1:0
+ENCYCLO
+p:ABSAT,C:0100,C:0500
+1c80:00c00000:0457:0001:1:0
+TV TRWAM
+p:SES ASTRA
+4280:00c00000:0446:0001:1:0
+XXL
+p:ABSAT,C:0100,C:0500
+7080:00c00000:0443:0001:1:0
+RTL Austria
+p:RTL
+0381:00c00000:0021:0085:1:0
+\86e8 t\87ele\86v\87ision
+p:BetaDigital
+2581:00c00000:0458:0001:1:0
+HISTOIRE
+p:CSAT
+4281:00c00000:0446:0001:1:0
+ESCALES
+p:ABSAT,C:0100,C:0500
+0382:00c00000:0021:0085:1:0
+MediaShop- Neuheiten
+p:BetaDigital
+4282:00c00000:0446:0001:1:0
+toute L'HISTOIRE
+p:ABSAT,C:0100,C:0500
+0383:00c00000:0021:0085:1:0
+meinTVshop
+p:BetaDigital
+2583:00c00000:0458:0001:1:0
+MA CHAINE SPORT
+p:CSAT
+0384:00c00000:0021:0085:1:0
+SPORT1
+p:BetaDigital
+2584:00c00000:0458:0001:1:0
+M6 MUSIC BLACK
+p:CSAT
+4284:00c00000:0446:0001:1:0
+NT1
+p:ABSAT
+2585:00c00000:0458:0001:1:0
+M6 MUSIC CLUB
+p:CSAT
+4285:00c00000:0446:0001:1:0
+DORCEL TV
+p:ABSAT,C:0100,C:0500
+7085:00c00000:0443:0001:1:0
+VOX Austria
+p:RTL
+2e86:00c00000:0405:0001:1:0
+RTL HD Austria
+p:CBC
+4286:00c00000:0446:0001:1:0
+ACTION
+p:ABSAT,C:0100,C:0500
+2587:00c00000:0458:0001:1:0
+CUISINE+
+p:CSAT
+4287:00c00000:0446:0001:1:0
+MANGAS
+p:ABSAT,C:0100,C:0500
+2588:00c00000:0458:0001:1:0
+PLANETE+ JUSTICE
+p:CSAT
+7788:00c00000:0424:0001:1:0
+10876V SID 0x7788
+p:DVB-S QPSK 10876V 19.2°E
+2589:00c00000:0458:0001:1:0
+CANAL J
+p:CSAT
+4289:00c00000:0446:0001:1:0
+CINE POLAR
+p:ABSAT,C:0100,C:0500
+7789:00c00000:0424:0001:1:0
+CANAL+ GOLF
+p:DIGITAL+
+258a:00c00000:0458:0001:1:0
+DISCOVERY
+p:CSAT
+2f8a:00c00000:0454:0001:1:0
+BFM TV
+p:SES ASTRA
+428a:00c00000:0446:0001:1:0
+CINE FX
+p:ABSAT,C:0100,C:0000
+708a:00c00000:0443:0001:1:0
+RTL2 Austria
+p:RTL
+778a:00c00000:0424:0001:1:0
+CANAL ODISEA
+p:Digital+
+2f8b:00c00000:0454:0001:1:0
+BFM TV
+p:SES ASTRA
+428b:00c00000:0446:0001:1:0
+RTL9
+p:ABSAT,C:0100,C:0500
+778b:00c00000:0424:0001:1:0
+PLAYBOY TV
+p:Playboy TV
+428c:00c00000:0446:0001:1:0
+CHASSE et PECHE
+p:ABSAT,C:0100,C:0500
+778c:00c00000:0424:0001:1:0
+10876V SID 0x778c
+p:DVB-S QPSK 10876V 19.2°E
+238d:00c00000:044a:0001:1:0
+GUIDE TV
+p:CSAT
+428d:00c00000:0446:0001:1:0
+STYLIA
+p:ABSAT
+778d:00c00000:0424:0001:1:0
+NAT GEOGRAPH
+p:NATGEO
+128e:00c00000:03f7:0001:1:0
+Date1TV
+p:BetaDigital
+2f8e:00c00000:0454:0001:1:0
+Direct 8 TV
+p:SES ASTRA
+768e:00c00000:041e:0001:1:0
+TAQUILLA 1
+p:TQ1
+778e:00c00000:0424:0001:1:0
+C+ FÚTBOL
+p:CPD1
+128f:00c00000:03f7:0001:1:0
+Friends TV
+p:BetaDigital
+2f8f:00c00000:0454:0001:1:0
+Direct 8 TV
+p:SES ASTRA
+708f:00c00000:0443:0001:1:0
+SUPER RTL A
+p:RTL
+768f:00c00000:041e:0001:1:0
+TAQUILLA 2
+p:TQ2
+778f:00c00000:0424:0001:1:0
+C+ DEPORTES
+p:CPD2
+1290:00c00000:03f7:0001:1:0
+Turbodating TV
+p:BetaDigital
+2390:00c00000:044a:0001:1:0
+ENREGISTREMENTS
+p:CSAT
+2e90:00c00000:0405:0001:1:0
+VOX HD Austria
+p:CBC
+4290:00c00000:0446:0001:1:0
+NT1
+p:ABSAT
+7690:00c00000:041e:0001:1:0
+TAQUILLA 3
+p:TQ3
+7790:00c00000:0424:0001:1:0
+CALLE 13
+p:CL13
+1291:00c00000:03f7:0001:1:0
+Love TV
+p:BetaDigital
+2391:00c00000:044a:0001:1:0
+C+ DEMANDE
+p:CSAT
+7691:00c00000:041e:0001:1:0
+TAQUILLA 4
+p:TQ4
+0292:00c00000:0005:0085:1:0
+\86Daystar Television\87 Network
+p:BetaDigital
+1292:00c00000:03f7:0001:1:0
+.6live
+p:BetaDigital
+2392:00c00000:044a:0001:1:0
+12363V SID 0x2392
+p:DVB-S QPSK 12363V 19.2°E
+6e92:00c00000:04b1:0001:1:0
+WDR Bielefeld
+p:ARD
+7692:00c00000:041e:0001:1:0
+C+ MultiDEP
+p:DIGITAL+
+7792:00c00000:0424:0001:1:0
+CANAL+ LIGA
+p:DIGITAL+
+0293:00c00000:0005:0085:1:0
+collection
+p:BetaDigital
+1293:00c00000:03f7:0001:1:0
+Amore TV
+p:BetaDigital
+6e93:00c00000:04b1:0001:1:0
+WDR Dortmund
+p:ARD
+7693:00c00000:041e:0001:1:0
+TAQUILLA X
+p:DIGITAL+
+7793:00c00000:0424:0001:1:0
+CANAL+ LIGA
+p:DIGITAL+
+1294:00c00000:03f7:0001:1:0
+Partnersuche TV
+p:BetaDigital
+2f94:00c00000:0454:0001:1:0
+BFM Business
+p:SES ASTRA
+6e94:00c00000:04b1:0001:1:0
+WDR Düsseldorf
+p:ARD
+7094:00c00000:0443:0001:1:0
+VOX CH
+p:RTL
+7694:00c00000:041e:0001:1:0
+C+ MultiCINE
+p:DIGITAL+
+0295:00c00000:0021:0085:1:0
+AstroTV
+p:BetaDigital
+1295:00c00000:03f7:0001:1:0
+Teleglück TV
+p:BetaDigital
+6e95:00c00000:04b1:0001:1:0
+WDR Essen
+p:ARD
+7695:00c00000:041e:0001:1:0
+TAQUILLA XY
+p:TXY
+7795:00c00000:0424:0001:1:0
+DECASA
+p:DIGITAL+
+0296:00c00000:0005:0085:1:0
+1-2-3.tv
+p:BetaDigital
+1296:00c00000:03f7:0001:1:0
+Kontaktbörse TV
+p:BetaDigital
+2396:00c00000:044a:0001:1:0
+ESPACE CLIENT
+p:CSAT
+6e96:00c00000:04b1:0001:1:0
+WDR Münster
+p:ARD
+7596:00c00000:0422:0001:1:0
+10847V SID 0x7596
+p:DVB-S QPSK 10847V 19.2°E
+7696:00c00000:041e:0001:1:0
+CARTOON NET.
+p:CTN
+7796:00c00000:0424:0001:1:0
+SYFY
+p:DIGITAL +
+1297:00c00000:03f7:0001:1:0
+Verliebt TV
+p:BetaDigital
+6e97:00c00000:04b1:0001:1:0
+WDR Siegen
+p:ARD
+7697:00c00000:041e:0001:1:0
+TAQUILLA X
+p:DIGITAL+
+7797:00c00000:0424:0001:1:0
+DISCOVERY
+p:DCR
+1298:00c00000:03f7:0001:1:0
+Zeit für Gefühle
+p:BetaDigital
+7798:00c00000:0424:0001:1:0
+10876V SID 0x7798
+p:DVB-S QPSK 10876V 19.2°E
+1299:00c00000:03f7:0001:1:0
+Club1 TV
+p:BetaDigital
+2199:00c00000:0448:0001:1:0
+
+p:CSAT
+2f99:00c00000:0454:0001:1:0
+CashTV
+p:SES ASTRA
+7699:00c00000:041e:0001:1:0
+CARTOONITO
+p:DIGITAL+
+129a:00c00000:03f7:0001:1:0
+Liebesglück.TV
+p:BetaDigital
+219a:00c00000:0448:0001:1:0
+ONZEO
+p:CSAT
+2e9a:00c00000:0405:0001:1:0
+SUPER RTL HD
+p:CBC
+749a:00c00000:041c:0001:1:0
+DIVINITY
+p:DIGITAL+
+769a:00c00000:041e:0001:1:0
+MULTIDEP.1
+p:Digital+
+129b:00c00000:03f7:0001:1:0
+Telefonchat TV
+p:BetaDigital
+749b:00c00000:041c:0001:1:0
+FOX NEWS
+p:FOXNWS
+769b:00c00000:041e:0001:1:0
+MULTIDEP.4
+p:Digital+
+129c:00c00000:03f7:0001:1:0
+Dreamdate TV
+p:BetaDigital
+749c:00c00000:041c:0001:1:0
+BABY TV
+p:DIGITAL+
+759c:00c00000:0422:0001:1:0
+C+ PORTADA
+p:DIGITAL+
+769c:00c00000:041e:0001:1:0
+MULTIDEP.3
+p:Digital+
+779c:00c00000:0424:0001:1:0
+C+ FÚTBOL
+p:CPD1
+129d:00c00000:03f7:0001:1:0
+Chat TV
+p:BetaDigital
+239d:00c00000:044a:0001:1:0
+
+p:CSAT
+749d:00c00000:041c:0001:1:0
+CANAL CLUB
+p:DIGITAL+
+769d:00c00000:041e:0001:1:0
+MULTIDEP.2
+p:Digital +
+779d:00c00000:0424:0001:1:0
+C+ DEPORTES
+p:CPD2
+129e:00c00000:03f7:0001:1:0
+Beate Uhse Sexy Sat
+p:BetaDigital
+219e:00c00000:0448:0001:1:0
+O.CINE GEANTS
+p:
+429e:00c00000:0446:0001:1:0
+XXL 
+p:AB
+749e:00c00000:041c:0001:1:0
+BOING
+p:DIGITAL+
+769e:00c00000:041e:0001:1:0
+C+LIGA2 E
+p:DIGITALT+
+129f:00c00000:03f7:0001:1:0
+Flirten TV
+p:BetaDigital
+209f:00c00000:0432:0001:1:0
+CINE+ CLUB
+p:CSAT
+219f:00c00000:0448:0001:1:0
+NAUTICAL CHANNEL
+p:CSAT
+749f:00c00000:041c:0001:1:0
+ENERGY
+p:DIGITAL+
+769f:00c00000:041e:0001:1:0
+10788V SID 0x769f
+p:DVB-S QPSK 10788V 19.2°E
+12a0:00c00000:03f7:0001:1:0
+Singletreff TV
+p:BetaDigital
+20a0:00c00000:0432:0001:1:0
+MCM
+p:CSAT
+74a0:00c00000:041c:0001:1:0
+BARÇA TV
+p:BARNA
+76a0:00c00000:041e:0001:1:0
+10788V SID 0x76a0
+p:DVB-S QPSK 10788V 19.2°E
+12a1:00c00000:03f7:0001:1:0
+Achtung Singles TV
+p:BetaDigital
+20a1:00c00000:0432:0001:1:0
+TV BREIZH
+p:CSAT
+74a1:00c00000:041c:0001:1:0
+ANIMAX
+p:DIGITAL+
+0fa2:00c00000:0451:0035:1:0
+SBS6
+p:CANALDIGITAAL
+12a2:00c00000:03f7:0001:1:0
+SAT Flirt TV
+p:BetaDigital
+20a2:00c00000:0432:0001:1:0
+MCM POP
+p:CSAT
+23a2:00c00000:044a:0001:1:0
+
+p:CSAT
+74a2:00c00000:041c:0001:1:0
+MTV ESPAÑA
+p:DIGITAL+
+76a2:00c00000:041e:0001:1:0
+C+ MultiCINE
+p:DIGITAL+
+0fa3:00c00000:0451:0035:1:0
+NET5
+p:CANALDIGITAAL
+12a3:00c00000:03f7:0001:1:0
+GayBoys LIVE
+p:BetaDigital
+20a3:00c00000:0432:0001:1:0
+A VOIR CE SOIR
+p:CSAT
+21a3:00c00000:0448:0001:1:0
+12324V SID 0x21a3
+p:DVB-S QPSK 12324V 19.2°E
+23a3:00c00000:044a:0001:1:0
+CSAT DEMANDE
+p:CSAT
+42a3:00c00000:0446:0001:1:0
+DORCEL TV 
+p:AB
+74a3:00c00000:041c:0001:1:0
+C.ESTRELLAS
+p:GALAV
+76a3:00c00000:041e:0001:1:0
+C+ MultiDEP
+p:DIGITAL+
+20a4:00c00000:0432:0001:1:0
+W9
+p:CSAT
+23a4:00c00000:044a:0001:1:0
+
+p:CSAT
+2ea4:00c00000:0405:0001:1:0
+RTL2 HD Austria
+p:CBC
+74a4:00c00000:041c:0001:1:0
+MOTORS TV
+p:
+75a4:00c00000:0422:0001:1:0
+10847V SID 0x75a4
+p:DVB-S QPSK 10847V 19.2°E
+20a5:00c00000:0432:0001:1:0
+FRANCE 2
+p:CSAT
+21a5:00c00000:0448:0001:1:0
+PRIVATE SPICE
+p:CSAT
+23a5:00c00000:044a:0001:1:0
+
+p:CSAT
+33a5:00c00000:03eb:0001:1:0
+ORF SPORT+
+p:ORF,C:0d95,C:0648,C:0d05,C:09c4,C:1702,C:1833,C:098c
+33a6:00c00000:03eb:0001:1:0
+VOLKS TV
+p:-
+75a6:00c00000:0422:0001:1:0
+10847V SID 0x75a6
+p:DVB-S QPSK 10847V 19.2°E
+21a7:00c00000:0448:0001:1:0
+
+p:CSAT
+33a7:00c00000:03eb:0001:1:0
+ATV2
+p:ATV,C:0d05,C:0d95,C:0648,C:09c4,C:1702,C:1833,C:098c
+00a8:00c00000:0001:0085:1:0
+\86Motorvis\87ion TV
+p:SKY,C:1861
+20a8:00c00000:0432:0001:1:0
+TEST CDN 8
+p:CSAT
+21a8:00c00000:0448:0001:1:0
+CDN12
+p:CSAT
+33a8:00c00000:03eb:0001:1:0
+.
+p:-
+20a9:00c00000:0432:0001:1:0
+
+p:CSAT
+21a9:00c00000:0448:0001:1:0
+MCS EXTREME
+p:
+33a9:00c00000:03eb:0001:1:0
+Schau TV
+p:-
+75a9:00c00000:0422:0001:1:0
+CANAL+ GUÍA
+p:DIGITAL+
+33aa:00c00000:03eb:0001:1:0
+Starparadies AT
+p:-
+75aa:00c00000:0422:0001:1:0
+
+p:Digital +
+0fab:00c00000:0451:0035:1:0
+NED1
+p:CANALDIGITAAL
+20ab:00c00000:0432:0001:1:0
+11895V SID 0x20ab
+p:DVB-S QPSK 11895V 19.2°E
+33ab:00c00000:03eb:0001:1:0
+RIC
+p:-
+75ab:00c00000:0422:0001:1:0
+
+p:DIGITAL+
+0fac:00c00000:0451:0035:1:0
+NED2
+p:CANALDIGITAAL
+33ac:00c00000:03eb:0001:1:0
+TELE 5 Austria
+p:ATV
+0fad:00c00000:0451:0035:1:0
+NED3
+p:CANALDIGITAAL
+20ad:00c00000:0432:0001:1:0
+MCM TOP
+p:CSAT
+33ad:00c00000:03eb:0001:1:0
+MELODIE Express
+p:ORS
+0fae:00c00000:0451:0035:1:0
+Nickelodeon
+p:CANALDIGITAAL
+20ae:00c00000:0432:0001:1:0
+TF1
+p:CSAT
+33ae:00c00000:03eb:0001:1:0
+.
+p:ORS
+75ae:00c00000:0422:0001:1:0
+
+p:Digital +
+0faf:00c00000:0451:0035:1:0
+NGC
+p:CANALDIGITAAL
+20af:00c00000:0432:0001:1:0
+M6
+p:IMEDIA
+21af:00c00000:0448:0001:1:0
+MOSAIQUE C+
+p:CSAT
+75af:00c00000:0422:0001:1:0
+
+p:DIGITAL+
+0fb0:00c00000:0451:0035:1:0
+BVN
+p:CANALDIGITAAL
+21b0:00c00000:0448:0001:1:0
+MOSAIQUE
+p:CSAT
+75b0:00c00000:0422:0001:1:0
+C+ TAQUILLA
+p:DIGITAL+
+21b1:00c00000:0448:0001:1:0
+12324V SID 0x21b1
+p:DVB-S QPSK 12324V 19.2°E
+75b1:00c00000:0422:0001:1:0
+CANAL+ GUÍA
+p:DIGITAL+
+75b2:00c00000:0422:0001:1:0
+C+ TAQUILLA
+p:DIGITAL+
+20b3:00c00000:0432:0001:1:0
+TF1
+p:CSAT
+20b4:00c00000:0432:0001:1:0
+M6
+p:CSAT
+20b5:00c00000:0432:0001:1:0
+W9
+p:CSAT
+20b6:00c00000:0432:0001:1:0
+FRANCE 2
+p:CSAT
+12b8:00c00000:03f7:0001:1:0
+Multytext
+p:BetaDigital
+77bb:00c00000:040a:0001:1:0
+10979V SID 0x77bb
+p:DVB-S QPSK 10979V 19.2°E
+1bbc:00c00000:0423:0001:1:0
+TVP1
+p:Telewizja Polska SA
+77bc:00c00000:040a:0001:1:0
+FDF
+p:DIGITAL+
+1bbd:00c00000:0423:0001:1:0
+TVP2
+p:TVP
+1bbe:00c00000:0423:0001:1:0
+TVP INFO
+p:TVP
+77be:00c00000:040a:0001:1:0
+CLAN  TVE
+p:Digital+
+1bbf:00c00000:0423:0001:1:0
+TVP Sport
+p:TVP
+77bf:00c00000:040a:0001:1:0
+LA SEXTA
+p:Digital+
+1bc0:00c00000:0423:0001:1:0
+TV Polonia
+p:TVP
+21c0:00c00000:0448:0001:1:0
+MOSAIQUE C+
+p:CSAT
+76c0:00c00000:040e:0001:1:0
+CANAL+ 1
+p:DIGITAL+
+77c0:00c00000:040a:0001:1:0
+TVE 1
+p:TVE 1
+1bc1:00c00000:0423:0001:1:0
+TVP Historia
+p:TVP
+21c1:00c00000:0448:0001:1:0
+MOSAIQUE
+p:CSAT
+76c1:00c00000:040e:0001:1:0
+11038V SID 0x76c1
+p:DVB-S QPSK 11038V 19.2°E
+77c1:00c00000:040a:0001:1:0
+HOLLYWOOD
+p:HOLLYW
+1bc2:00c00000:0423:0001:1:0
+TVP Kultura
+p:TVP
+24c2:00c00000:043c:0001:1:0
+O.CINE CHOC
+p:
+77c2:00c00000:040a:0001:1:0
+LA 2
+p:La2
+1bc3:00c00000:0423:0001:1:0
+BELSAT TV
+p:TVP SA
+24c3:00c00000:043c:0001:1:0
+O.CINE NOVO
+p:
+76c3:00c00000:040e:0001:1:0
+DISNEY CH.
+p:DCH
+77c3:00c00000:040a:0001:1:0
+TELECINCO
+p:DIGITAL+
+1bc4:00c00000:0423:0001:1:0
+TVP Seriale
+p:TVP
+24c4:00c00000:043c:0001:1:0
+O.CINE HAPPY
+p:
+76c4:00c00000:040e:0001:1:0
+SPORTMANÍA
+p:SPM
+77c4:00c00000:040a:0001:1:0
+
+p:DIGITAL+
+22c5:00c00000:045a:0001:1:0
+TRACE TROPICAL
+p:IMEDIA
+76c5:00c00000:040e:0001:1:0
+40 TV
+p:+MUS
+77c5:00c00000:040a:0001:1:0
+CANAL+ XTRA
+p:DIGITAL+
+22c6:00c00000:045a:0001:1:0
+LA CHAINE METEO
+p:CSAT
+75c6:00c00000:0422:0001:1:0
+C+ PORTADA
+p:DIGITAL+
+77c6:00c00000:040a:0001:1:0
+10979V SID 0x77c6
+p:DVB-S QPSK 10979V 19.2°E
+22c7:00c00000:045a:0001:1:0
+CINE+ STAR
+p:CSAT
+75c7:00c00000:0422:0001:1:0
+
+p:DIGITAL+
+76c7:00c00000:040e:0001:1:0
+TCM
+p:TCM
+77c7:00c00000:040a:0001:1:0
+CUATRO
+p:Digital+
+23c8:00c00000:044a:0001:1:0
+DT11
+p:CSAT
+76c8:00c00000:040e:0001:1:0
+PAR. COMEDY
+p:NC
+22c9:00c00000:045a:0001:1:0
+EQUIDIA LIVE
+p:CSAT
+32c9:00c00000:045d:0001:1:0
+ORF1
+p:ORF,C:0d05,C:0d95,C:0648,C:1702,C:1833,C:09c4,C:098c
+76c9:00c00000:040e:0001:1:0
+VIAJAR
+p:VJR
+77c9:00c00000:040a:0001:1:0
+TNT
+p:CMA30
+22ca:00c00000:045a:0001:1:0
+DISNEY CHANNEL+1
+p:CSAT
+23ca:00c00000:044a:0001:1:0
+DT13
+p:CSAT
+32ca:00c00000:045d:0001:1:0
+ORF2
+p:ORF,C:0d95,C:0d05,C:0648,C:1702,C:1833,C:09c4,C:098c
+6dca:00c00000:044d:0001:1:0
+Das Erste
+p:ARD
+75ca:00c00000:0422:0001:1:0
+
+p:DIGITAL+
+76ca:00c00000:040e:0001:1:0
+CANAL+ 2
+p:DIGITAL+
+22cb:00c00000:045a:0001:1:0
+DISNEY JUNIOR
+p:CSAT
+32cb:00c00000:045d:0001:1:0
+ORF2 W
+p:ORF,C:0d95,C:0d05,C:0648,C:1702,C:1833,C:09c4,C:098c
+6dcb:00c00000:044d:0001:1:0
+Bayerisches FS Süd
+p:ARD
+22cc:00c00000:045a:0001:1:0
+DISNEY CINEMAGIC
+p:CSAT
+32cc:00c00000:045d:0001:1:0
+ORF2 N
+p:ORF,C:0d95,C:0d05,C:0648,C:1702,C:1833,C:09c4,C:098c
+6dcc:00c00000:044d:0001:1:0
+hr-fernsehen
+p:ARD
+75cc:00c00000:0422:0001:1:0
+
+p:DIGITAL+
+76cc:00c00000:040e:0001:1:0
+TELEDEPORTE
+p:TDEP
+22cd:00c00000:045a:0001:1:0
+DISNEY MAGIC+1
+p:CSAT
+32cd:00c00000:045d:0001:1:0
+ORF2 B
+p:ORF,C:0d95,C:0d05,C:0648,C:1702,C:1833,C:09c4,C:098c
+32ce:00c00000:045d:0001:1:0
+ORF2 O
+p:ORF,C:0d95,C:0d05,C:0648,C:1702,C:1833,C:09c4,C:098c
+6dce:00c00000:044d:0001:1:0
+Bayerisches FS Nord
+p:ARD
+75ce:00c00000:0422:0001:1:0
+
+p:DIGITAL +
+76ce:00c00000:040e:0001:1:0
+CANAL COCINA
+p:CACOC
+22cf:00c00000:045a:0001:1:0
+E! ENTERTAINMENT
+p:CSAT
+32cf:00c00000:045d:0001:1:0
+ORF2 S
+p:ORF,C:0d95,C:0d05,C:0648,C:1702,C:1833,C:09c4,C:098c
+6dcf:00c00000:044d:0001:1:0
+WDR Köln
+p:ARD
+75cf:00c00000:0422:0001:1:0
+
+p:Digital +
+1bd0:00c00000:0423:0001:1:0
+TVP HD
+p:TVP
+32d0:00c00000:045d:0001:1:0
+ORF2 T
+p:ORF,C:0d95,C:0d05,C:0648,C:1702,C:1833,C:09c4,C:098c
+32d1:00c00000:045d:0001:1:0
+ORF2 V
+p:ORF,C:0d95,C:0d05,C:0648,C:1702,C:1833,C:09c4,C:098c
+6dd1:00c00000:044d:0001:1:0
+SWR Fernsehen BW
+p:ARD
+20d2:00c00000:043e:0001:1:0
+A LA CARTE 1
+p:CSAT
+32d2:00c00000:045d:0001:1:0
+ORF2 St
+p:ORF,C:0d95,C:0d05,C:0648,C:1702,C:1833,C:09c4,C:098c
+20d3:00c00000:043e:0001:1:0
+A LA CARTE 2
+p:CSAT
+32d3:00c00000:045d:0001:1:0
+ORF2 K
+p:ORF,C:0d95,C:0d05,C:0648,C:1702,C:1833,C:09c4,C:098c
+07d4:00c00000:0449:0035:1:0
+RTL4
+p:CANALDIGITAAL
+20d4:00c00000:043e:0001:1:0
+A LA CARTE 3
+p:CSAT
+32d4:00c00000:045d:0001:1:0
+ATV
+p:ATV+,C:0d05,C:0d95,C:0648,C:1702,C:1833,C:09c4,C:098c
+07d5:00c00000:0449:0035:1:0
+RTL5
+p:CANALDIGITAAL
+20d5:00c00000:043e:0001:1:0
+A LA CARTE 4
+p:CSAT
+32d5:00c00000:045d:0001:1:0
+HITRADIO OE3
+p:ORF,C:0d05,C:0d95,C:0648,C:1702,C:1833,C:09c4,C:098c
+07d6:00c00000:0449:0035:1:0
+RTL7
+p:CANALDIGITAAL
+20d6:00c00000:043e:0001:1:0
+A LA CARTE 5
+p:CSAT
+32d6:00c00000:045d:0001:1:0
+ORF2E
+p:ORF
+1fd7:00c00000:0434:0001:1:0
+EUROSPORT
+p:CSAT
+20d7:00c00000:043e:0001:1:0
+A LA CARTE 6
+p:CSAT
+1fd8:00c00000:0434:0001:1:0
+TMC
+p:CSAT
+20d8:00c00000:043e:0001:1:0
+A LA CARTE 7
+p:CSAT
+77d8:00c00000:040a:0001:1:0
+NAT GEO WILD
+p:DIGITAL+
+1fd9:00c00000:0434:0001:1:0
+PLANETE+
+p:CSAT
+20d9:00c00000:043e:0001:1:0
+A LA CARTE 8
+p:CSAT
+75d9:00c00000:0422:0001:1:0
+
+p:Digital +
+1fda:00c00000:0434:0001:1:0
+TELETOON+
+p:CSAT
+1fdb:00c00000:0434:0001:1:0
+VOYAGE
+p:CSAT
+20db:00c00000:043e:0001:1:0
+A LA CARTE 10
+p:CSAT
+32db:00c00000:045d:0001:1:0
+R IC
+p:-
+1fdc:00c00000:0434:0001:1:0
+LCI
+p:CSAT
+20dc:00c00000:043e:0001:1:0
+A LA CARTE 11
+p:CSAT
+00dd:00c00000:0004:0085:1:0
+Sky \86Sport\87 \861\87
+p:SKY,C:1861
+1fdd:00c00000:0434:0001:1:0
+TEVA
+p:CSAT
+75dd:00c00000:0422:0001:1:0
+TEST TÉCNICO
+p:DIGITAL+
+00de:00c00000:0004:0085:1:0
+Sky \86Sport\87 \862\87
+p:SKY,C:1861
+1fde:00c00000:0434:0001:1:0
+COMEDIE+
+p:CSAT
+75de:00c00000:0422:0001:1:0
+TEST_CSD1
+p:DIGITAL+
+00df:00c00000:0004:0085:1:0
+\86Sky Bu\87ndes\86li\87ga
+p:SKY,C:1861
+07df:00c00000:0449:0035:1:0
+Discovery
+p:CANALDIGITAAL
+1fdf:00c00000:0434:0001:1:0
+ARTE
+p:CSAT
+75df:00c00000:0422:0001:1:0
+TEST_CSD2
+p:DIGITAL+
+1fe0:00c00000:0434:0001:1:0
+SERIE CLUB
+p:CSAT
+75e0:00c00000:0422:0001:1:0
+TEST_CSD3
+p:DIGITAL+
+79e0:00c00000:0443:0001:1:0
+Eurosport Deutschland
+p:SES Astra
+1fe1:00c00000:0434:0001:1:0
+JUNE
+p:CSAT
+6ee1:00c00000:04b1:0001:1:0
+Radio Bremen TV
+p:ARD
+75e1:00c00000:0422:0001:1:0
+TEST_CSD4
+p:DIGITAL+
+1fe2:00c00000:0434:0001:1:0
+TIJI
+p:CSAT
+75e2:00c00000:0422:0001:1:0
+TEST_CSD5
+p:DIGITAL+
+2ee3:00c00000:0441:0001:1:0
+\86RTL\87 Television
+p:RTL World,c:0000a3,c:010068,c:020069,c:0300a3
+31e3:00c00000:045f:0035:1:0
+VTM
+p:TV Vlaanderen
+75e3:00c00000:0422:0001:1:0
+
+p:DIGITAL+
+07e4:00c00000:0449:0035:1:0
+Animal Planet/TLC
+p:CANALDIGITAAL
+2ee4:00c00000:0441:0001:1:0
+RTL Regional NRW
+p:RTL World
+31e4:00c00000:045f:0035:1:0
+2BE
+p:TV Vlaanderen
+25e5:00c00000:045e:0001:1:0
+FR3 AMIENS
+p:CSAT
+2ee5:00c00000:0441:0001:1:0
+RTL HB NDS
+p:RTL World
+31e5:00c00000:045f:0035:1:0
+VT4
+p:TV Vlaanderen
+25e6:00c00000:045e:0001:1:0
+FR3 BESANCON
+p:CSAT
+2ee6:00c00000:0441:0001:1:0
+RTL FS
+p:RTL World
+25e7:00c00000:045e:0001:1:0
+FR3 BORDEAUX
+p:CSAT
+31e7:00c00000:045f:0035:1:0
+een
+p:TV Vlaanderen
+25e8:00c00000:045e:0001:1:0
+FR3 NANCY
+p:CSAT
+31e8:00c00000:045f:0035:1:0
+Canvas
+p:TV Vlaanderen
+07e9:00c00000:0449:0035:1:0
+EUROSPORT
+p:CANALDIGITAAL
+25e9:00c00000:045e:0001:1:0
+FR3 CLERMONT FD
+p:CSAT
+31e9:00c00000:045f:0035:1:0
+Vitaya
+p:TV Vlaanderen
+07ea:00c00000:0449:0035:1:0
+EUROSPORT CZ
+p:CANALDIGITAAL
+25ea:00c00000:045e:0001:1:0
+FR3 PARIS
+p:CSAT
+79ea:00c00000:0443:0001:1:0
+HSE24 EXTRA
+p:SES Astra
+1feb:00c00000:0434:0001:1:0
+TMC
+p:CSAT
+25eb:00c00000:045e:0001:1:0
+FR3 RENNES
+p:CSAT
+6eeb:00c00000:04b1:0001:1:0
+WDR Test A
+p:ARD
+13ec:00c00000:0403:0001:1:0
+3D Tile Format
+p:SES ASTRA
+1fec:00c00000:0434:0001:1:0
+ARTE
+p:CSAT
+23ec:00c00000:044a:0001:1:0
+12363V SID 0x23ec
+p:DVB-S QPSK 12363V 19.2°E
+25ec:00c00000:045e:0001:1:0
+FR3 ROUEN
+p:CSAT
+6fec:00c00000:042a:0001:1:0
+MTV FRANCE
+p:MTV Networks Europe
+13ed:00c00000:0403:0001:1:0
+ASTRA 3D demo
+p:SES ASTRA
+25ed:00c00000:045e:0001:1:0
+FR3 LIMOGES
+p:CSAT
+75ed:00c00000:0422:0001:1:0
+
+p:Digital+
+25ee:00c00000:045e:0001:1:0
+FR3 LYON
+p:CSAT
+6fee:00c00000:042a:0001:1:0
+MTV Hits
+p:MTV Networks Europe
+75ee:00c00000:0422:0001:1:0
+
+p:Digital +
+07ef:00c00000:0449:0035:1:0
+Veronica/DisneyXD
+p:CANALDIGITAAL
+25ef:00c00000:045e:0001:1:0
+FR3 MARSEILLE
+p:CSAT
+6fef:00c00000:042a:0001:1:0
+MTV Dance
+p:MTV Networks Europe
+75ef:00c00000:0422:0001:1:0
+
+p:DIGITAL+
+25f0:00c00000:045e:0001:1:0
+FR3 TOULOUSE
+p:CSAT
+31f0:00c00000:045f:0035:1:0
+VIJFtv
+p:TV Vlaanderen
+6ff0:00c00000:042a:0001:1:0
+VH1
+p:MTV Networks Europe
+23f1:00c00000:0452:0001:1:0
+DIRECT STAR
+p:CSAT
+31f1:00c00000:045f:0035:1:0
+vtmKazoom/Kanaal Z
+p:TV Vlaanderen
+6ff1:00c00000:042a:0001:1:0
+VH1 Classic
+p:MTV Networks Europe
+75f1:00c00000:0422:0001:1:0
+
+p:Digital+
+23f2:00c00000:0452:0001:1:0
+LCP
+p:CSAT
+6ff2:00c00000:042a:0001:1:0
+NICKELODEON France.
+p:MTV Networks Europe
+75f2:00c00000:0422:0001:1:0
+
+p:Digital+
+07f3:00c00000:0449:0035:1:0
+RTL8
+p:CANALDIGITAAL
+23f3:00c00000:0452:0001:1:0
+FRANCE 4
+p:CSAT
+6ff3:00c00000:042a:0001:1:0
+MTV ROCKS
+p:MTV Networks Europe
+75f3:00c00000:0422:0001:1:0
+
+p:Contactanos
+07f4:00c00000:0449:0035:1:0
+Comedy Central/Kindernet
+p:CANALDIGITAAL
+23f4:00c00000:0452:0001:1:0
+A LA CARTE 9
+p:CSAT
+2ef4:00c00000:0441:0001:1:0
+RTL2
+p:RTL World
+31f4:00c00000:045f:0035:1:0
+Man-X
+p:TV Vlaanderen
+6ff4:00c00000:042a:0001:1:0
+Nick
+p:MTV Networks Europe
+75f4:00c00000:0422:0001:1:0
+10847V SID 0x75f4
+p:DVB-S QPSK 10847V 19.2°E
+79f4:00c00000:0443:0001:1:0
+EuroNews
+p:Globecast
+23f5:00c00000:0452:0001:1:0
+CANALPLAY
+p:CSAT
+6ff5:00c00000:042a:0001:1:0
+MTV BASE FRANCE
+p:MTV Networks Europe
+75f5:00c00000:0422:0001:1:0
+
+p:DIGITAL +
+1af6:00c00000:03fe:0001:1:0
+beIN SPORT1
+p:
+23f6:00c00000:0452:0001:1:0
+GULLI
+p:CSAT
+31f6:00c00000:045f:0035:1:0
+Acht
+p:TV Vlaanderen
+23f7:00c00000:0452:0001:1:0
+FRANCE Ô
+p:CSAT
+6ff7:00c00000:042a:0001:1:0
+GAME ONE
+p:MTV Networks Europe
+11f8:00c00000:03fd:0001:1:0
+a.tv
+p:BetaDigital
+13f8:00c00000:0403:0001:1:0
+HOLIDAY
+p:SES ASTRA
+1af8:00c00000:03fe:0001:1:0
+Russia Today
+p:GlobeCast
+6ff8:00c00000:042a:0001:1:0
+MTV Hits.
+p:MTV Networks Europe
+11f9:00c00000:03fd:0001:1:0
+\86Franken Fern\87sehen
+p:BetaDigital
+13f9:00c00000:0403:0001:1:0
+TRT Turk
+p:SES ASTRA
+1af9:00c00000:03fe:0001:1:0
+France 24 (en Français)
+p:GlobeCast
+23f9:00c00000:0452:0001:1:0
+GOLF+
+p:CSAT
+75f9:00c00000:0408:0001:1:0
+NITRO
+p:DIGITAL+
+07fa:00c00000:0449:0035:1:0
+Hustler TV
+p:CANALDIGITAAL
+11fa:00c00000:03fd:0001:1:0
+Franken SAT
+p:BetaDigital
+1afa:00c00000:03fe:0001:1:0
+France 24 (in English)
+p:GlobeCast
+6ffa:00c00000:042a:0001:1:0
+VH1.
+p:MTV Networks Europe
+75fa:00c00000:0408:0001:1:0
+C+ DEP 2 HD
+p:DIGITAL+
+07fb:00c00000:0449:0035:1:0
+Hustler TV CZ
+p:CANALDIGITAAL
+11fb:00c00000:03fd:0001:1:0
+Lokal SAT
+p:BetaDigital
+13fb:00c00000:0403:0001:1:0
+REDLIGHT PLATINUM
+p:TELESPAZIO
+2afb:00c00000:0417:0001:1:0
+ORANGE CINE HAPPY
+p:GlobeCast France
+6ffb:00c00000:042a:0001:1:0
+VH1 Classic.
+p:MTV Networks Europe
+02fc:00c00000:0005:0085:1:0
+ANIXE SD
+p:BetaDigital
+07fc:00c00000:0449:0035:1:0
+Planet
+p:Canaldigitaal
+11fc:00c00000:03fd:0001:1:0
+mütv/RFO
+p:BetaDigital
+1afc:00c00000:03fe:0001:1:0
+beIN SPORT2
+p:
+2afc:00c00000:0417:0001:1:0
+ORANGE CINE CHOC
+p:GlobeCast France
+6ffc:00c00000:042a:0001:1:0
+NICKELODEON France
+p:MTV Networks Europe
+75fc:00c00000:0408:0001:1:0
+C+ RADIOS
+p:DIGITAL+
+02fd:00c00000:0007:0085:1:0
+pearl.tv Technik-Shop
+p:BetaDigital
+07fd:00c00000:0449:0035:1:0
+Dorcel TV
+p:Canaaldigitaal
+11fd:00c00000:03fd:0001:1:0
+\86ONTV\87 Regional
+p:BetaDigital
+21fd:00c00000:044c:0001:1:0
+MAISON+
+p:CSAT
+2afd:00c00000:0417:0001:1:0
+ORANGE CINE NOVO
+p:GlobeCast France
+6ffd:00c00000:042a:0001:1:0
+MTV ROCKS.
+p:MTV Networks Europe
+75fd:00c00000:0408:0001:1:0
+C+ infoDEPORTE
+p:DIGITAL +
+11fe:00c00000:03fd:0001:1:0
+Bay TV 1
+p:BetaDigital
+1afe:00c00000:03fe:0001:1:0
+France 24 (in Arabic)
+p:GlobeCast
+21fe:00c00000:044c:0001:1:0
+JIMMY
+p:CSAT
+2afe:00c00000:0417:0001:1:0
+ORANGE CINE GEANTS
+p:GlobeCast France
+2efe:00c00000:0441:0001:1:0
+RTL Living
+p:RTL
+75fe:00c00000:0408:0001:1:0
+NEOX
+p:DIGITAL+
+07ff:00c00000:0449:0035:1:0
+Animax
+p:CANALDIGITAAL
+11ff:00c00000:03fd:0001:1:0
+Bay TV 2
+p:BetaDigital
+1aff:00c00000:03fe:0001:1:0
+FASHION ONE
+p:GlobeCast Asia
+21ff:00c00000:044c:0001:1:0
+SYFY
+p:CSAT
+2aff:00c00000:0417:0001:1:0
+Test 1
+p:GlobeCast France
+6fff:00c00000:0436:0001:1:0
+MTV Music 24
+p:MTV Networks Europe
+75ff:00c00000:0408:0001:1:0
+PANDA
+p:DIGITAL+
+0803:00c00000:0449:0035:2:0
+RTL RADIO
+p:CANALDIGITAAL
+6f03:00c00000:0445:0001:2:0
+hr1
+p:ARD HR
+0804:00c00000:0449:0035:2:0
+RTL 1440
+p:CANALDIGITAAL
+6f04:00c00000:0445:0001:2:0
+hr2
+p:ARD HR
+6f05:00c00000:0445:0001:2:0
+hr3
+p:ARD HR
+6f06:00c00000:0445:0001:2:0
+hr4
+p:ARD HR
+0807:00c00000:0449:0035:2:0
+NL-Radio 1
+p:CANALDIGITAAL
+6f07:00c00000:0445:0001:2:0
+YOU FM
+p:ARD HR
+0808:00c00000:0449:0035:2:0
+NL-Radio 2
+p:CANALDIGITAAL
+6f08:00c00000:0445:0001:2:0
+hr-iNFO
+p:ARD HR
+0809:00c00000:0449:0035:2:0
+NL-3FM
+p:CANALDIGITAAL
+080a:00c00000:0449:0035:2:0
+NL-Radio 4
+p:CANALDIGITAAL
+080b:00c00000:0449:0035:2:0
+NL-Radio 5
+p:CANALDIGITAAL
+080c:00c00000:0449:0035:2:0
+NL-Radio 6
+p:CANALDIGITAAL
+6f0c:00c00000:0445:0001:2:0
+MDR1 SACHSEN
+p:ARD MDR
+6f0d:00c00000:0445:0001:2:0
+MDR1 SA-ANHALT
+p:ARD MDR
+6f0e:00c00000:0445:0001:2:0
+MDR1 THÜRINGEN
+p:ARD MDR
+6f0f:00c00000:0445:0001:2:0
+MDR FIGARO
+p:ARD MDR
+0810:00c00000:0449:0035:2:0
+Sky Radio
+p:CANALDIGITAAL
+6f10:00c00000:0445:0001:2:0
+MDR JUMP
+p:ARD MDR
+6f11:00c00000:0445:0001:2:0
+MDR SPUTNIK
+p:ARD MDR
+0812:00c00000:0449:0035:2:0
+Radio538
+p:CANALDIGITAAL
+6f12:00c00000:0445:0001:2:0
+MDR INFO
+p:ARD MDR
+0813:00c00000:0449:0035:2:0
+Radio10Gold
+p:CANALDIGITAAL
+6f13:00c00000:0445:0001:2:0
+MDR KLASSIK
+p:ARD MDR
+0814:00c00000:0449:0035:2:0
+Radio Veronica
+p:CANALDIGITAAL
+0815:00c00000:0449:0035:2:0
+Classic FM
+p:CANALDIGITAAL
+6f15:00c00000:0445:0001:2:0
+NDR 2
+p:ARD NDR
+6f16:00c00000:0445:0001:2:0
+NDR Kultur
+p:ARD NDR
+0817:00c00000:0449:0035:2:0
+Slam FM
+p:CANALDIGITAAL
+6f17:00c00000:0445:0001:2:0
+NDR Info
+p:ARD NDR
+6f18:00c00000:0445:0001:2:0
+N-JOY
+p:ARD NDR
+6f19:00c00000:0445:0001:2:0
+NDR 90,3
+p:ARD NDR
+6f1a:00c00000:0445:0001:2:0
+NDR1WelleNord
+p:ARD NDR
+6f1b:00c00000:0445:0001:2:0
+NDR 1 Radio MV
+p:ARD NDR
+6f1c:00c00000:0445:0001:2:0
+NDR 1 Nieders.
+p:ARD NDR
+6f1d:00c00000:0445:0001:2:0
+NDR Info Spez.
+p:ARD NDR
+6f20:00c00000:0445:0001:2:0
+Bremen Eins
+p:ARD RB
+6f21:00c00000:0445:0001:2:0
+Nordwestradio
+p:ARD RB
+6f22:00c00000:0445:0001:2:0
+Bremen Vier
+p:ARD RB
+6f24:00c00000:0445:0001:2:0
+Inforadio
+p:ARD rbb
+6f25:00c00000:0445:0001:2:0
+Kulturradio
+p:ARD rbb
+7725:00c00000:0416:0001:2:0
+11156V SID 0x7725
+p:DVB-S QPSK 11156V 19.2°E
+6f26:00c00000:0445:0001:2:0
+Antenne Brandenburg
+p:ARD rbb
+6f27:00c00000:0445:0001:2:0
+radioBERLIN 88,8
+p:ARD rbb
+6f28:00c00000:0445:0001:2:0
+radioeins
+p:ARD rbb
+6f29:00c00000:0445:0001:2:0
+Fritz
+p:ARD rbb
+6f2d:00c00000:0445:0001:2:0
+SR1 Europawelle
+p:ARD SR
+6f2e:00c00000:0445:0001:2:0
+SR2 KulturRadio
+p:ARD SR
+6f2f:00c00000:0445:0001:2:0
+SR3 Saarlandwelle
+p:ARD SR
+6f31:00c00000:0445:0001:2:0
+SWR1 BW
+p:ARD SWR
+6f32:00c00000:0445:0001:2:0
+SWR1 RP
+p:ARD SWR
+6f33:00c00000:0445:0001:2:0
+SWR2
+p:ARD SWR
+6f34:00c00000:0445:0001:2:0
+SWR3
+p:ARD SWR
+6f35:00c00000:0445:0001:2:0
+SWR4 BW
+p:ARD SWR
+6f36:00c00000:0445:0001:2:0
+SWR4 RP
+p:ARD SWR
+6f37:00c00000:0445:0001:2:0
+DASDING
+p:ARD SWR
+6f38:00c00000:0445:0001:2:0
+SWRinfo
+p:ARD SWR
+213b:00c00000:0400:0001:2:0
+CANALSAT RADIOS
+p:CSAT
+6f3b:00c00000:0445:0001:2:0
+1LIVE
+p:ARD WDR
+6f3c:00c00000:0445:0001:2:0
+WDR 2
+p:ARD WDR
+6f3d:00c00000:0445:0001:2:0
+WDR 3
+p:ARD WDR
+6f3e:00c00000:0445:0001:2:0
+WDR 4
+p:ARD WDR
+6f3f:00c00000:0445:0001:2:0
+WDR 5
+p:ARD WDR
+6f40:00c00000:0445:0001:2:0
+WDR Funkhaus Europa
+p:ARD WDR
+3341:00c00000:045b:0001:2:0
+OE1
+p:ORF
+6f41:00c00000:0445:0001:2:0
+1LIVE diggi
+p:ARD WDR
+3342:00c00000:045b:0001:2:0
+OE1 DD
+p:ORF
+6f42:00c00000:0445:0001:2:0
+KIRAKA
+p:ARD WDR
+3343:00c00000:045b:0001:2:0
+OE2 W
+p:ORF
+6f43:00c00000:0445:0001:2:0
+WDR Event
+p:ARD WDR
+3344:00c00000:045b:0001:2:0
+OE2 N
+p:ORF
+3345:00c00000:045b:0001:2:0
+OE2 B
+p:ORF
+7a45:00c00000:0410:0001:2:0
+CANAL SUR RADIO
+p:Telefonica Servicios Audiovisuales
+3346:00c00000:045b:0001:2:0
+OE2 O
+p:ORF
+2147:00c00000:0400:0001:2:0
+FRANCE MUSIQUE
+p:CSAT
+3347:00c00000:045b:0001:2:0
+OE2 S
+p:ORF
+2148:00c00000:0400:0001:2:0
+FIP
+p:CSAT
+3348:00c00000:045b:0001:2:0
+OE2 T
+p:ORF
+2149:00c00000:0400:0001:2:0
+FRANCE INFO
+p:CSAT
+3349:00c00000:045b:0001:2:0
+OE2 V
+p:ORF
+214a:00c00000:0400:0001:2:0
+FRANCE INTER
+p:CSAT
+334a:00c00000:045b:0001:2:0
+OE2 St
+p:ORF
+214b:00c00000:0400:0001:2:0
+FRANCE BLEU
+p:CSAT
+334b:00c00000:045b:0001:2:0
+OE2 K
+p:ORF
+214c:00c00000:0400:0001:2:0
+RFI INTERNAT
+p:CSAT
+214d:00c00000:0400:0001:2:0
+RADIO CLASSIQUE
+p:CSAT
+334d:00c00000:045b:0001:2:0
+OE3
+p:ORF
+214e:00c00000:0400:0001:2:0
+EUROPE 1
+p:CSAT
+334e:00c00000:045b:0001:2:0
+FM4
+p:ORF
+214f:00c00000:0400:0001:2:0
+RMC INFO
+p:CSAT
+2150:00c00000:0400:0001:2:0
+RTL
+p:CSAT
+3350:00c00000:045b:0001:2:0
+U1 Tirol
+p:U1 Tirol
+2151:00c00000:0400:0001:2:0
+RIRE & CHANSONS
+p:CSAT
+2152:00c00000:0400:0001:2:0
+SUD RADIO
+p:CSAT
+2153:00c00000:0400:0001:2:0
+MC DOUALIYA
+p:CSAT
+2154:00c00000:0400:0001:2:0
+TSF JAZZ
+p:CSAT
+3354:00c00000:045b:0001:2:0
+RADIO MARIA
+p:Radio Maria Österreich
+2155:00c00000:0400:0001:2:0
+NOSTALGIE
+p:CSAT
+2156:00c00000:0400:0001:2:0
+BFM BUSINESS
+p:CSAT
+2157:00c00000:0400:0001:2:0
+JAZZ RADIO
+p:CSAT
+2158:00c00000:0400:0001:2:0
+NRJ
+p:CSAT
+2159:00c00000:0400:0001:2:0
+VIRGIN RADIO
+p:CSAT
+215a:00c00000:0400:0001:2:0
+RTL2
+p:CSAT
+215b:00c00000:0400:0001:2:0
+SKYROCK
+p:CSAT
+215c:00c00000:0400:0001:2:0
+FUN RADIO
+p:CSAT
+215d:00c00000:0400:0001:2:0
+LE MOUV'
+p:CSAT
+215e:00c00000:0400:0001:2:0
+NOVA
+p:CSAT
+215f:00c00000:0400:0001:2:0
+RADIO DJ FG
+p:CSAT
+2160:00c00000:0400:0001:2:0
+VIBRATION
+p:CSAT
+2161:00c00000:0400:0001:2:0
+CONTACT FM
+p:CSAT
+2162:00c00000:0400:0001:2:0
+RADIO LATINA
+p:CSAT
+2163:00c00000:0400:0001:2:0
+RFM
+p:CSAT
+2164:00c00000:0400:0001:2:0
+CHERIE FM
+p:CSAT
+2165:00c00000:0400:0001:2:0
+11567V SID 0x2165
+p:DVB-S QPSK 11567V 19.2°E
+2166:00c00000:0400:0001:2:0
+VOLTAGE
+p:CSAT
+2167:00c00000:0400:0001:2:0
+OUI FM
+p:CSAT
+2168:00c00000:0400:0001:2:0
+ADO
+p:CSAT
+2169:00c00000:0400:0001:2:0
+11567V SID 0x2169
+p:DVB-S QPSK 11567V 19.2°E
+216a:00c00000:0400:0001:2:0
+11567V SID 0x216a
+p:DVB-S QPSK 11567V 19.2°E
+216b:00c00000:0400:0001:2:0
+RADIO NOTRE DAME
+p:CSAT
+316b:00c00000:0459:0001:2:0
+Inselradio
+p:MEDIA BROADCAST
+216c:00c00000:0400:0001:2:0
+RADIO ALFA
+p:CSAT
+6d6c:00c00000:0437:0001:2:0
+DKULTUR
+p:ZDFvision
+216d:00c00000:0400:0001:2:0
+RCJ / SHALOM
+p:CSAT
+316d:00c00000:0459:0001:2:0
+radio top40
+p:MEDIA BROADCAST
+6d6d:00c00000:0437:0001:2:0
+DLF
+p:ZDFvision
+1b6e:00c00000:03fc:0001:2:0
+ETB Radio 1
+p:GlobeCast
+216e:00c00000:0400:0001:2:0
+BEUR FM
+p:CSAT
+316e:00c00000:0459:0001:2:0
+ffn digital
+p:MEDIA BROADCAST
+146f:00c00000:040d:0001:2:0
+Radio Beograd
+p:SES ASTRA
+1b6f:00c00000:03fc:0001:2:0
+ETB Radio 2
+p:GlobeCast
+216f:00c00000:0400:0001:2:0
+BBC ARABIC
+p:CSAT
+316f:00c00000:0459:0001:2:0
+Radio Paloma
+p:MEDIA BROADCAST
+2170:00c00000:0400:0001:2:0
+RFI MULTILINGUE
+p:CSAT
+3170:00c00000:0459:0001:2:0
+WRN Deutsch
+p:MEDIA BROADCAST
+2171:00c00000:0400:0001:2:0
+RCI SAT
+p:CSAT
+3171:00c00000:0459:0001:2:0
+Antenne 50Plus
+p:MEDIA BROADCAST
+6d71:00c00000:0437:0001:2:0
+DRadio Wissen
+p:ZDFvision
+2172:00c00000:0400:0001:2:0
+11567V SID 0x2172
+p:DVB-S QPSK 11567V 19.2°E
+3172:00c00000:0459:0001:2:0
+Alternative FM
+p:MEDIA BROADCAST
+2173:00c00000:0400:0001:2:0
+FRANCE CULTURE
+p:CSAT
+3173:00c00000:0459:0001:2:0
+Radio Gloria
+p:MEDIA BROADCAST
+2174:00c00000:0400:0001:2:0
+11567V SID 0x2174
+p:DVB-S QPSK 11567V 19.2°E
+3174:00c00000:0459:0001:2:0
+HIT RADIO FFH
+p:MEDIA BROADCAST
+2175:00c00000:0400:0001:2:0
+BBCW SERVICE
+p:CSAT
+3175:00c00000:0459:0001:2:0
+planet radio
+p:MEDIA BROADCAST
+2176:00c00000:0400:0001:2:0
+RADIO COURTOISIE
+p:CSAT
+3176:00c00000:0459:0001:2:0
+harmony.fm
+p:MEDIA BROADCAST
+3177:00c00000:0459:0001:2:0
+Radio Regenbogen
+p:MEDIA BROADCAST
+1c79:00c00000:0457:0001:2:0
+Radio Horeb
+p:Eurociel
+1c7c:00c00000:0457:0001:2:0
+Radio neue Hoffnung
+p:RADIO Neue Hoffnung
+1c82:00c00000:0457:0001:2:0
+Radio Maryja
+p:SES ASTRA
+238e:00c00000:044a:0001:2:0
+12363V SID 0x238e
+p:DVB-S QPSK 12363V 19.2°E
+1497:00c00000:040d:0001:2:0
+Mint
+p:Telesat
+1498:00c00000:040d:0001:2:0
+Bel RTL
+p:CANALDIGITAAL
+7598:00c00000:0422:0001:2:0
+RADIOS ESP
+p:DIGITAL+
+1499:00c00000:040d:0001:2:0
+Radio Contact
+p:CANALDIGITAAL
+7599:00c00000:0422:0001:2:0
+10847V SID 0x7599
+p:DVB-S QPSK 10847V 19.2°E
+759a:00c00000:0422:0001:2:0
+10847V SID 0x759a
+p:DVB-S QPSK 10847V 19.2°E
+759b:00c00000:0422:0001:2:0
+10847V SID 0x759b
+p:DVB-S QPSK 10847V 19.2°E
+00a0:00c00000:0007:0085:2:0
+\86ROCK ANT\87ENNE
+p:BetaDigital
+00a1:00c00000:0007:0085:2:0
+ERF Plus
+p:BetaDigital
+14a5:00c00000:040d:0001:2:0
+Pure FM
+p:CANALDIGITAAL
+14a6:00c00000:040d:0001:2:0
+Classic21
+p:CANALDIGITAAL
+14a7:00c00000:040d:0001:2:0
+VivaCite
+p:CANALDIGITAAL
+14a8:00c00000:040d:0001:2:0
+Musiq 3
+p:CANALDIGITAAL
+00a9:00c00000:0007:0085:2:0
+\86sunshine\87 live
+p:BetaDigital
+14a9:00c00000:040d:0001:2:0
+La Premiere
+p:CANALDIGITAAL
+00aa:00c00000:0007:0085:2:0
+\86ANTENNE\87 BAYERN
+p:BetaDigital,c:010160,c:030160
+00ab:00c00000:0005:0085:2:0
+domradio
+p:BetaDigital
+00ac:00c00000:0005:0085:2:0
+egoFM
+p:BetaDigital
+00ad:00c00000:0005:0085:2:0
+\86Klassik\87 Radio
+p:BetaDigital
+00ae:00c00000:0005:0085:2:0
+.
+p:BetaDigital
+00af:00c00000:0005:0085:2:0
+\86HOPE Ch\87annel Radio
+p:BetaDigital
+33af:00c00000:03eb:0001:2:0
+.
+p:ORS
+00b0:00c00000:0007:0085:2:0
+TEDDY
+p:BetaDigital
+33b0:00c00000:03eb:0001:2:0
+.
+p:ORS
+00b1:00c00000:0005:0085:2:0
+JAM FM
+p:BetaDigital
+33b1:00c00000:03eb:0001:2:0
+.
+p:ORS
+33b2:00c00000:03eb:0001:2:0
+.
+p:ORS
+33b3:00c00000:03eb:0001:2:0
+.
+p:ORS
+0fbe:00c00000:0451:0035:2:0
+BNR Nieuwsradio
+p:Canaldigitaal
+0fc3:00c00000:0451:0035:2:0
+FunX
+p:CANALDIGITAAL
+31ea:00c00000:045f:0035:2:0
+VRT Radio1
+p:TV Vlaanderen
+31eb:00c00000:045f:0035:2:0
+VRT Radio2
+p:TV Vlaanderen
+31ec:00c00000:045f:0035:2:0
+MNM
+p:TV Vlaanderen
+31ed:00c00000:045f:0035:2:0
+Studio Brussel
+p:TV Vlaanderen
+6eed:00c00000:04b1:0001:2:0
+MEHRKANALTEST
+p:ARD
+31ee:00c00000:045f:0035:2:0
+Klara
+p:TV Vlaanderen
+6ef0:00c00000:0445:0001:2:0
+Bayern 1
+p:ARD BR
+6ef1:00c00000:0445:0001:2:0
+Bayern 2
+p:ARD BR
+31f2:00c00000:045f:0035:2:0
+Q-music
+p:TV Vlaanderen
+6ef2:00c00000:0445:0001:2:0
+BAYERN 3
+p:ARD BR
+31f3:00c00000:045f:0035:2:0
+JOEfm
+p:TV Vlaanderen
+6ef3:00c00000:0445:0001:2:0
+BR-KLASSIK
+p:ARD BR
+6ef4:00c00000:0445:0001:2:0
+B5 aktuell
+p:ARD BR
+31f5:00c00000:045f:0035:2:0
+Nostalgie
+p:TV Vlaanderen
+6ef5:00c00000:0445:0001:2:0
+BAYERN plus
+p:ARD BR
+6ef6:00c00000:0445:0001:2:0
+on3-radio
+p:ARD BR
+6ef8:00c00000:0445:0001:2:0
+B5 plus
+p:ARD BR
+1000:00c00000:0451:0035:12:0
+Nagra DL DSR7141
+p:Canaldigitaal
+1001:00c00000:0451:0035:12:0
+pace DL DSR8141
+p:Canaldigitaal
+1002:00c00000:0451:0035:12:0
+Nagra DL DSR 8141
+p:Canaldigitaal
+1003:00c00000:0451:0035:12:0
+Hyunda SAT801
+p:Canaldigitaal
+1c21:00c00000:0457:0001:12:0
+ROVI Guide
+p:ROVI corporation
+1c23:00c00000:0457:0001:12:0
+STB Setone
+p:SES  ASTRA
+1c2c:00c00000:0457:0001:12:0
+tvtv premium
+p:SES ASTRA
+1337:00c00000:03ef:0001:12:0
+SGI_1007
+p:ORS
+1c3e:00c00000:0457:0001:12:0
+Triax-Hirschmann
+p:SES ASTRA
+3145:00c00000:0459:0001:12:0
+RAPS
+p:MEDIA BROADCAST
+144f:00c00000:0403:0001:12:0
+KaCTFL
+p:SES ASTRA
+1c50:00c00000:0457:0001:12:0
+tvtv Digital
+p:SES ASTRA
+2b52:00c00000:0417:0001:12:0
+SSU SAMSUNG
+p:Globecast
+1c54:00c00000:0457:0001:12:0
+FP URMET
+p:SES ASTRA
+6e5a:00c00000:0431:0001:12:0
+ARD-Data-1
+p:ARD
+1c60:00c00000:0457:0001:12:0
+STB Comag1
+p:SES ASTRA
+1c63:00c00000:0457:0001:12:0
+STB Panasonic
+p:SES ASTRA
+1c64:00c00000:0457:0001:12:0
+STB Ten Haaft
+p:SES ASTRA
+1c66:00c00000:0457:0001:12:0
+Datendienst T1M
+p:
+1c69:00c00000:0457:0001:12:0
+tvtv RP
+p:SES ASTRA
+1c6f:00c00000:0457:0001:12:0
+tvtv DIGITAL
+p:SES ASTRA
+1c70:00c00000:0457:0001:12:0
+KaCTFL
+p:
+2773:00c00000:0402:0001:12:0
+Data System
+p:SES ASTRA
+1c77:00c00000:0457:0001:12:0
+Samsung iDTV EU Upgrade
+p:SES ASTRA
+1c78:00c00000:0457:0001:12:0
+TDT Data
+p:SES ASTRA
+1c7d:00c00000:0457:0001:12:0
+STB METZ Werke
+p:SES ASTRA
+1c7e:00c00000:0457:0001:12:0
+IDS DOWNLOAD SVC
+p:SES ASTRA
+1c7f:00c00000:0457:0001:12:0
+STB Sony Spain
+p:SES ASTRA
+0f80:00c00000:0002:0085:12:0
+
+p:betaresearch
+1c81:00c00000:0457:0001:12:0
+Kathrein DVB SSU
+p:SES ASTRA
+0f86:00c00000:0001:0085:12:0
+BData3
+p:BetaDigital
+1c86:00c00000:0457:0001:12:0
+STB Telestar
+p:SES ASTRA
+0f8c:00c00000:0011:0085:12:0
+HUMAX PR-HD3000C
+p:
+0f9a:00c00000:0011:0085:12:0
+Pace TDC 866 NSDX
+p:
+0f9d:00c00000:000c:0085:12:0
+Pace TDS 866 NSD
+p:
+0f9e:00c00000:000c:0085:12:0
+Pace TDS 866 NSDX
+p:
+0fa5:00c00000:0011:0085:12:0
+Samsung CAB IPDL
+p:
+0fa6:00c00000:0011:0085:12:0
+Philips dic 2221 IPDL
+p:
+0fa7:00c00000:0011:0085:12:0
+Thomson SAT IPDL
+p:
+0dac:00c00000:0002:0085:12:0
+CPT_TP69
+p:SKY
+0dad:00c00000:0001:0085:12:0
+CPT_TP83
+p:SKY
+0dae:00c00000:0003:0085:12:0
+CPT_TP65
+p:SKY
+0daf:00c00000:0004:0085:12:0
+CPT_TP81
+p:SKY
+0db0:00c00000:0011:0085:12:0
+CPT_TP67
+p:SKY
+0fb1:00c00000:000c:0085:12:0
+Pace TDS 865 NSDX
+p:
+33b4:00c00000:03eb:0001:12:0
+Handan OTA
+p:ORS
+0fb5:00c00000:0002:0085:12:0
+Thomson DCI12PRE
+p:
+0fb6:00c00000:0002:0085:12:0
+Philips DIS 2221
+p:
+0fb8:00c00000:0002:0085:12:0
+Pace DS 830 NP
+p:
+0fbc:00c00000:000c:0085:12:0
+Pace TDS 865 NSD
+p:
+0fc3:00c00000:000c:0085:12:0
+HUMAX PR-HD3000S
+p:
+33c5:00c00000:045b:0001:12:0
+Opentech OTA1
+p:ORS
+33c6:00c00000:045b:0001:12:0
+Opentech OTA2
+p:ORS
+33c7:00c00000:045b:0001:12:0
+Opentech OTA3
+p:ORS
+33c8:00c00000:045b:0001:12:0
+Opentech OTA4
+p:-
+1ee6:00c00000:0457:0001:12:0
+SGI_1111
+p:SES ASTRA
+0ff0:00c00000:0451:0035:12:0
+DownloadCDS
+p:CANALDIGITAAL
+0ff2:00c00000:0451:0035:12:0
+Hyundai SAT901
+p:Canaldigitaal
+0ffb:00c00000:0451:0035:12:0
+Philips DL DSR 7121
+p:CANALDIGITAAL
+0ffc:00c00000:0451:0035:12:0
+Nagra DL DSR7121
+p:CANALDIGITAAL
+0ffd:00c00000:0451:0035:12:0
+Philips DL DSR 8121
+p:CANALDIGITAAL
+0ffe:00c00000:0451:0035:12:0
+Nagra DL DSR 8121
+p:CANALDIGITAAL
+0fff:00c00000:0451:0035:12:0
+pace DL DSR7141
+p:Canaldigitaal
+3208:00c00000:045f:0035:22:0
+KetOp12
+p:TV Vlaanderen
+3210:00c00000:045f:0035:22:0
+vtmKazoom/Kanaal Z (MPEG4)
+p:TV Vlaanderen
+3216:00c00000:045f:0035:22:0
+Acht (MPEG4)
+p:TV Vlaanderen
+3218:00c00000:045f:0035:22:0
+Man-X (MPEG4)
+p:TV Vlaanderen
+1523:00c00000:0455:0001:22:0
+Dr.DishTV-Welt der Technik
+p:BetaDigital
+5277:00c00000:041d:0001:22:0
+ASTRA Portal
+p:BetaDigital
+1479:00c00000:040d:0001:22:0
+La Une HD
+p:SES ASTRA
+147a:00c00000:040d:0001:22:0
+La Deux
+p:SES ASTRA
+147b:00c00000:040d:0001:22:0
+La Trois
+p:Telesat
+1483:00c00000:040d:0001:22:0
+RTL-TVi HD
+p:SES ASTRA
+1484:00c00000:040d:0001:22:0
+Club-RTL
+p:SES ASTRA
+1485:00c00000:040d:0001:22:0
+Plug-RTL
+p:SES ASTRA
+7500:00c00000:0420:0001:25:0
+C+ ACCIÓN HD
+p:DIGITAL+
+7501:00c00000:0420:0001:25:0
+EUROSPORT HD
+p:DIGITAL+
+7502:00c00000:0420:0001:25:0
+C+ DCINE HD
+p:DIGITAL+
+7504:00c00000:0420:0001:25:0
+FOX HD
+p:DIGITAL+
+7508:00c00000:0420:0001:25:0
+COSMO HD
+p:DIGITAL+
+7509:00c00000:0420:0001:25:0
+C+ ACCIÓN HD
+p:DIGITAL+
+750a:00c00000:0420:0001:25:0
+EUROSPORT HD
+p:DIGITAL+
+750b:00c00000:0420:0001:25:0
+C+ DCINE HD
+p:DIGITAL+
+ef10:00c00000:0421:0001:25:0
+RTL HD
+p:CBC,c:0000ff,c:020020,c:0300ff,c:040103,c:050001,C:1830,C:1843,C:1860
+ef11:00c00000:0421:0001:25:0
+VOX HD
+p:CBC,C:1830,C:1843,C:1860
+ef14:00c00000:0421:0001:25:0
+SPORT1 HD
+p:BetaDigital,C:1830,C:1843,C:1860
+ef15:00c00000:0421:0001:25:0
+RTL2 HD
+p:BetaDigital,C:1830,C:1843,C:1860
+1518:00c00000:0455:0001:25:0
+sonnenklar.TV HD
+p:BetaDigital
+1519:00c00000:0455:0001:25:0
+TELE 5 HD
+p:BetaDigital,C:1830,C:1843,C:1860
+151a:00c00000:0455:0001:25:0
+DMAX HD
+p:BetaDigital,C:1830,C:1843,C:1860
+151b:00c00000:0455:0001:25:0
+Juwelo HD
+p:BetaDigital
+781e:00c00000:0428:0001:25:0
+MEZZO LIVEHD
+p:DIGITAL+
+781f:00c00000:0428:0001:25:0
+CALLE 13 HD
+p:DIGITAL+
+7820:00c00000:0428:0001:25:0
+CINEMAGIC HD
+p:DIGITAL+
+7821:00c00000:0428:0001:25:0
+NAT GEO HD
+p:DIGITAl+
+7822:00c00000:0428:0001:25:0
+C+ DEPORT HD
+p:DIGITAL+
+7823:00c00000:0428:0001:25:0
+MEZZO LIVE HD
+p:DIGITAL+
+7824:00c00000:0428:0001:25:0
+CALLE 13 HD
+p:DIGITAL+
+7825:00c00000:0428:0001:25:0
+CINEMAGIC HD
+p:DIGITAL+
+7826:00c00000:0428:0001:25:0
+CINEMAGIC HD
+p:DIGITAL+
+7827:00c00000:0428:0001:25:0
+CINEMAGIC HD
+p:DIGITAL+
+7828:00c00000:0428:0001:25:0
+C+ DEPORT HD
+p:DIGITAL+
+2329:00c00000:0442:0001:25:0
+TF1 HD
+p:CSAT
+7829:00c00000:0428:0001:25:0
+NAT GEO HD
+p:DIGITAl+
+782a:00c00000:0428:0001:25:0
+C+ DEPORT HD
+p:DIGITAL+
+232b:00c00000:0442:0001:25:0
+NATIONAL GEO HD
+p:CSAT
+2333:00c00000:0442:0001:25:0
+PARIS PREMIERE HD
+p:CSAT
+2335:00c00000:0442:0001:25:0
+EUROSPORT HD
+p:CSAT
+2338:00c00000:0442:0001:25:0
+DISNEY HD
+p:CSAT
+233d:00c00000:0442:0001:25:0
+TF1 HD
+p:CSAT
+283d:00c00000:03fb:0001:25:0
+Das Erste HD
+p:ARD,c:0013ed,c:0113ee,c:0213f0,c:0313ed,c:050001
+283e:00c00000:03fb:0001:25:0
+arte HD
+p:ARD
+233f:00c00000:0442:0001:25:0
+NATIONAL GEO HD
+p:CSAT
+283f:00c00000:03fb:0001:25:0
+SWR BW HD
+p:ARD
+2840:00c00000:03fb:0001:25:0
+SWR RP HD
+p:ARD
+2347:00c00000:0442:0001:25:0
+PARIS PREMIERE HD
+p:CSAT
+2349:00c00000:0442:0001:25:0
+EUROSPORT HD
+p:CSAT
+234c:00c00000:0442:0001:25:0
+DISNEY HD
+p:CSAT
+7850:00c00000:041a:0001:25:0
+AXN HD
+p:DIGITAL+
+7851:00c00000:041a:0001:25:0
+C+COMEDIA HD
+p:DIGITAL+
+7852:00c00000:041a:0001:25:0
+C+ LIGA HD
+p:DIGITAL+
+7853:00c00000:041a:0001:25:0
+C+ DEP 2 HD
+p:DIGITAL+
+7854:00c00000:041a:0001:25:0
+TAQUILLA HD
+p:DIGITAL+
+2855:00c00000:0401:0001:25:0
+BR Süd HD
+p:ARD
+7855:00c00000:041a:0001:25:0
+CANAL+ 3D
+p:DIGITAL+
+2856:00c00000:0401:0001:25:0
+BR Nord HD
+p:ARD
+7856:00c00000:041a:0001:25:0
+AXN HD
+p:DIGITAL+
+2857:00c00000:0401:0001:25:0
+NDR FS NDS HD
+p:ARD
+7857:00c00000:041a:0001:25:0
+C+COMEDIA HD
+p:DIGITAL+
+2458:00c00000:0440:0001:25:0
+ARTE HD
+p:CSAT
+2858:00c00000:0401:0001:25:0
+NDR FS MV HD
+p:ARD
+7858:00c00000:041a:0001:25:0
+C+ LIGA HD
+p:DIGITAL+
+2859:00c00000:0401:0001:25:0
+NDR FS HH HD
+p:ARD
+7859:00c00000:041a:0001:25:0
+C+ LIGA HD
+p:DIGITAL+
+245a:00c00000:0440:0001:25:0
+PENTHOUSE HD
+p:CSAT
+285a:00c00000:0401:0001:25:0
+NDR FS SH HD
+p:ARD
+785a:00c00000:041a:0001:25:0
+C+ DEP 2 HD
+p:DIGITAL+
+285b:00c00000:0401:0001:25:0
+PHOENIX HD
+p:ARD
+2b5c:00c00000:03f3:0001:25:0
+Das Erste HD alt
+p:ARD
+245e:00c00000:0440:0001:25:0
+M6 HD
+p:CSAT
+2460:00c00000:0440:0001:25:0
+W9 HD
+p:CSAT
+2261:00c00000:0438:0001:25:0
+CANAL+ HD
+p:CSAT
+2461:00c00000:0440:0001:25:0
+USHUAIA TV HD
+p:CSAT
+2262:00c00000:0438:0001:25:0
+CANAL+ DECALE HD
+p:
+2462:00c00000:0440:0001:25:0
+FRANCE 2 HD
+p:CSAT
+2263:00c00000:0438:0001:25:0
+CANAL+ CINEMA HD
+p:
+2264:00c00000:0438:0001:25:0
+CANAL+ SPORT HD
+p:CSAT
+1265:00c00000:03f7:0001:25:0
+ASTRA 3D Demo
+p:BetaDigital
+2265:00c00000:0438:0001:25:0
+CANAL+ FAMILY HD
+p:
+1966:00c00000:044e:0001:25:0
+MEZZO LIVE HD
+p:CSAT
+2b66:00c00000:03f3:0001:25:0
+ZDF HD
+p:ZDFvision
+1967:00c00000:044e:0001:25:0
+M6 MUSIC HD
+p:CSAT
+1968:00c00000:044e:0001:25:0
+TF6 HD
+p:
+0069:00c00000:000c:0085:25:0
+Sky \86Sport\87 \86HD\87 \86Extra\87
+p:SKY,C:1861
+1969:00c00000:044e:0001:25:0
+SERIE CLUB HD
+p:CSAT
+006a:00c00000:000c:0085:25:0
+Sky \86Action HD\87
+p:SKY,C:1861
+196a:00c00000:044e:0001:25:0
+O.CINE MAX HD
+p:CSAT
+006b:00c00000:000c:0085:25:0
+\86Sky\87 \86Hits\87 \86HD\87
+p:SKY,C:1861
+006c:00c00000:000c:0085:25:0
+Sky \86Sport\87 \86News\87 \86HD\87
+p:SKY,C:1861
+246c:00c00000:0440:0001:25:0
+ARTE HD
+p:CSAT
+526c:00c00000:041d:0001:25:0
+ANIXE HD
+p:BetaDigital
+006e:00c00000:000d:0085:25:0
+Sky \86Atlantic\87 \86HD\87
+p:SKY,C:1861
+246e:00c00000:0440:0001:25:0
+PENTHOUSE HD
+p:CSAT
+006f:00c00000:000d:0085:25:0
+\86Disney\87 \86Cin\87emagic \86HD\87
+p:SKY,C:1861
+526f:00c00000:041d:0001:25:0
+QVC HD
+p:BetaDigital
+0070:00c00000:000d:0085:25:0
+\86NatGeo\87 \86HD\87
+p:SKY,C:1861
+2270:00c00000:0438:0001:25:0
+CINE+ PREMIER HD
+p:CSAT
+2b70:00c00000:03f3:0001:25:0
+arte HD alt
+p:ARD
+5270:00c00000:041d:0001:25:0
+HSE24 HD
+p:BetaDigital
+0071:00c00000:000d:0085:25:0
+\86Hist\87ory \86HD\87
+p:SKY,C:1861
+0072:00c00000:000d:0085:25:0
+Sky \86Sport\87 \86HD 2\87
+p:SKY,C:1861
+2472:00c00000:0440:0001:25:0
+M6 HD
+p:CSAT
+1973:00c00000:044e:0001:25:0
+NAT GEO WILD HD
+p:CSAT
+5273:00c00000:041d:0001:25:0
+NICK/CC HD
+p:MTV Networks,C:1830,C:1843,C:1860
+0074:00c00000:000b:0085:25:0
+\86Disney\87 Channel \86HD\87
+p:SKY,C:1861
+2474:00c00000:0440:0001:25:0
+W9 HD
+p:CSAT
+5274:00c00000:041d:0001:25:0
+N24 HD
+p:BetaDigital,C:1830,C:1843,C:1860
+ef74:00c00000:03f9:0001:25:0
+SAT.1 HD
+p:ProSiebenSat.1,C:1830,C:1843,C:1860
+0075:00c00000:000b:0085:25:0
+\86Sky\87 \863D\87
+p:SKY,C:1861
+2275:00c00000:0438:0001:25:0
+CANAL+ HD
+p:CSAT
+2475:00c00000:0440:0001:25:0
+USHUAIA TV HD
+p:CSAT
+ef75:00c00000:03f9:0001:25:0
+ProSieben HD
+p:ProSiebenSat.1,C:1830,C:1843,C:1860
+0076:00c00000:000b:0085:25:0
+\86N\87at \86G\87eo \86Wild\87 \86HD\87
+p:SKY,C:1861
+2276:00c00000:0438:0001:25:0
+CANAL+ DECALE HD
+p:
+2476:00c00000:0440:0001:25:0
+FRANCE 2 HD
+p:CSAT
+ef76:00c00000:03f9:0001:25:0
+kabel eins HD
+p:ProSiebenSat.1,C:1830,C:1843,C:1860
+0077:00c00000:000b:0085:25:0
+\86ESPN\87 America \86HD\87
+p:SKY,C:1861
+2277:00c00000:0438:0001:25:0
+CANAL+ CINEMA HD
+p:
+ef77:00c00000:03f9:0001:25:0
+SIXX HD
+p:ProSiebenSat.1,C:1830,C:1843,C:1860
+0078:00c00000:000e:0085:25:0
+Sky \86Select\87 \86HD\87
+p:SKY,C:1861
+2278:00c00000:0438:0001:25:0
+CANAL+ SPORT HD
+p:CSAT
+2478:00c00000:0440:0001:25:0
+PENTHOUSE HD
+p:CSAT
+0079:00c00000:000e:0085:25:0
+\86B\87LUE \86M\87OVIE \86HD\87
+p:SKY,C:1861
+2279:00c00000:0438:0001:25:0
+CANAL+ FAMILY HD
+p:
+007a:00c00000:000e:0085:25:0
+.
+p:SKY,C:1861
+197a:00c00000:044e:0001:25:0
+MEZZO LIVE HD
+p:CSAT
+2b7a:00c00000:03f3:0001:25:0
+zdf_neo HD
+p:ZDFvision
+007b:00c00000:000e:0085:25:0
+\86TNT\87 \86Serie\87 \86HD\87
+p:SKY,C:1861
+197b:00c00000:044e:0001:25:0
+M6 MUSIC HD
+p:CSAT
+007c:00c00000:000e:0085:25:0
+Fox HD
+p:SKY,C:1861
+197c:00c00000:044e:0001:25:0
+TF6 HD
+p:CSAT
+197d:00c00000:044e:0001:25:0
+SERIE CLUB HD
+p:
+197e:00c00000:044e:0001:25:0
+O.CINE MAX HD
+p:CSAT
+227f:00c00000:0438:0001:25:0
+CANAL+ HD
+p:CSAT
+6f80:00c00000:0457:0001:25:0
+WDR HD Aachen
+p:ARD
+0081:00c00000:0006:0085:25:0
+Sky \86Sport\87 \86HD 1\87
+p:SKY,C:1861
+6f81:00c00000:0457:0001:25:0
+WDR HD Wuppertal
+p:ARD
+0082:00c00000:0006:0085:25:0
+\86Disc\87overy \86HD\87
+p:SKY,C:1861
+6f82:00c00000:0457:0001:25:0
+WDR HD Bonn
+p:ARD
+7882:00c00000:0414:0001:25:0
+HOLLYWOODHD
+p:DIGITAL+
+0083:00c00000:0006:0085:25:0
+Sky \86Cinema\87 \86HD\87
+p:SKY,C:1861
+6f83:00c00000:0457:0001:25:0
+WDR HD Duisburg
+p:ARD
+7883:00c00000:0414:0001:25:0
+TNT HD
+p:DIGITAL+
+0084:00c00000:0006:0085:25:0
+\86Eurosp\87ort \86HD\87
+p:SKY,C:1861
+2284:00c00000:0438:0001:25:0
+CINE+ PREMIER HD
+p:CSAT
+2b84:00c00000:03f3:0001:25:0
+zdf.kultur HD
+p:ZDFvision
+7884:00c00000:0414:0001:25:0
+NG WILD HD
+p:DIGITAL+
+7885:00c00000:0414:0001:25:0
+SYFY HD
+p:DIGITAL+
+7886:00c00000:0414:0001:25:0
+DISNEY CH HD
+p:DIGITAL+
+1987:00c00000:044e:0001:25:0
+NAT GEO WILD HD
+p:
+7887:00c00000:0414:0001:25:0
+HOLLYWOODHD
+p:DIGITAL+
+7888:00c00000:0414:0001:25:0
+TNT HD
+p:DIGITAL+
+7889:00c00000:0414:0001:25:0
+NG WILD HD
+p:DIGITAL+
+788a:00c00000:0414:0001:25:0
+SYFY HD
+p:DIGITAL+
+788b:00c00000:0414:0001:25:0
+DISNEY CH HD
+p:DIGITAL+
+2b8e:00c00000:03f2:0001:25:0
+3sat HD
+p:ZDFvision
+2b98:00c00000:03f2:0001:25:0
+KiKA HD
+p:ZDFvision
+189d:00c00000:03f4:0001:25:0
+beIN SPORT1 HD
+p:GlobeCast
+189e:00c00000:03f4:0001:25:0
+beIN SPORT2 HD
+p:GlobeCast
+2ba2:00c00000:03f2:0001:25:0
+ZDFinfo HD
+p:ZDFvision
+6ea5:00c00000:04b1:0001:25:0
+WDR HD Köln
+p:ARD
+6ea6:00c00000:04b1:0001:25:0
+WDR HD Bielefeld
+p:ARD
+6ea7:00c00000:04b1:0001:25:0
+WDR HD Dortmund
+p:ARD
+6ea8:00c00000:04b1:0001:25:0
+WDR HD Düsseldorf
+p:ARD
+6ea9:00c00000:04b1:0001:25:0
+WDR HD Essen
+p:ARD
+6eaa:00c00000:04b1:0001:25:0
+WDR HD Münster
+p:ARD
+6eab:00c00000:04b1:0001:25:0
+WDR HD Siegen
+p:ARD
+21ad:00c00000:0448:0001:25:0
+MOSAIQUE C+
+p:CSAT
+21ae:00c00000:0448:0001:25:0
+MOSAIQUE
+p:CSAT
+26b0:00c00000:045c:0001:25:0
+BRAVA HD
+p:CSAT
+18b1:00c00000:03f4:0001:25:0
+beIN SPORT1 HD
+p:GlobeCast
+26b1:00c00000:045c:0001:25:0
+TCM HD
+p:CSAT
+18b2:00c00000:03f4:0001:25:0
+beIN SPORT2 HD
+p:GlobeCast
+26b2:00c00000:045c:0001:25:0
+TEVA HD
+p:CSAT
+14b4:00c00000:0407:0001:25:0
+SAT.1 HD Austria
+p:ProSiebenSat.1
+14b5:00c00000:0407:0001:25:0
+ProSieben HD Austria
+p:ProSiebenSat.1
+14b6:00c00000:0407:0001:25:0
+kabel eins HD Austria
+p:ProSiebenSat.1
+14b7:00c00000:0407:0001:25:0
+PULS 4 HD Austria
+p:ProSiebenSat.1
+26b7:00c00000:045c:0001:25:0
+DISCOVERY HD
+p:CSAT
+6fb8:00c00000:042c:0001:25:0
+MTV Live HD
+p:MTV Networks Europe
+26b9:00c00000:045c:0001:25:0
+GOLF+ HD
+p:CSAT
+6fb9:00c00000:042c:0001:25:0
+MTV Live HD
+p:MTV Networks Europe
+24bb:00c00000:043c:0001:25:0
+MA CHAINE SPORT HD
+p:CSAT
+26c4:00c00000:045c:0001:25:0
+BRAVA HD
+p:CSAT
+26c5:00c00000:045c:0001:25:0
+TCM HD
+p:CSAT
+26c6:00c00000:045c:0001:25:0
+TEVA HD
+p:CSAT
+19c9:00c00000:0444:0001:25:0
+13EME RUE HD
+p:CSAT
+19ca:00c00000:0444:0001:25:0
+DISNEY JUNIOR HD
+p:CSAT
+19cb:00c00000:0444:0001:25:0
+SYFY HD
+p:CSAT
+26cb:00c00000:045c:0001:25:0
+DISCOVERY HD
+p:CSAT
+74cc:00c00000:03f8:0001:25:0
+CANAL+1 HD
+p:DIGITAL+
+26cd:00c00000:045c:0001:25:0
+GOLF+ HD
+p:CSAT
+74cd:00c00000:03f8:0001:25:0
+C+ FÚTBOL HD
+p:DIGITAL+
+74ce:00c00000:03f8:0001:25:0
+VIAJAR HD
+p:DIGITAL+
+24cf:00c00000:043c:0001:25:0
+MA CHAINE SPORT HD
+p:CSAT
+74cf:00c00000:03f8:0001:25:0
+C+ XTRA HD
+p:DIGITAL+
+19d0:00c00000:0444:0001:25:0
+BRAVA HD TEST1
+p:CSAT
+19d1:00c00000:0444:0001:25:0
+BRAVA HD TEST2
+p:CSAT
+74d1:00c00000:03f8:0001:25:0
+C+ FÚTBOL HD
+p:DIGITAL+
+74d2:00c00000:03f8:0001:25:0
+C+ FÚTBOL HD
+p:DIGITAL+
+74d3:00c00000:03f8:0001:25:0
+VIAJAR HD
+p:DIGITAL+
+74d4:00c00000:03f8:0001:25:0
+C+ XTRA HD
+p:DIGITAL+
+74d5:00c00000:03f8:0001:25:0
+CANAL+1 HD
+p:DIGITAL+
+26d7:00c00000:045c:0001:25:0
+GOLF+ HD
+p:CSAT
+19dd:00c00000:0444:0001:25:0
+13EME RUE HD
+p:CSAT
+19de:00c00000:0444:0001:25:0
+DISNEY JUNIOR HD
+p:CSAT
+19df:00c00000:0444:0001:25:0
+SYFY HD
+p:CSAT
+24e1:00c00000:043c:0001:25:0
+DISNEY XD HD
+p:CSAT
+24e2:00c00000:043c:0001:25:0
+DISNEY MAGIC HD
+p:CSAT
+6eea:00c00000:04b1:0001:25:0
+WDR Test B
+p:ARD
+6eec:00c00000:04b1:0001:25:0
+Einsfestival HD
+p:ARD
+24f5:00c00000:043c:0001:25:0
+DISNEY XD HD
+p:CSAT
+24f6:00c00000:043c:0001:25:0
+DISNEY MAGIC HD
+p:CSAT
+13fa:00c00000:0403:0001:25:0
+EUROSPORT 3D
+p:,C:0500
+74fe:00c00000:0420:0001:25:0
+FOX HD
+p:DIGITAL+
+74ff:00c00000:0420:0001:25:0
+COSMO HD
+p:DIGITAL+
+0f03:00c00000:0001:0085:100:0
+12070H SID 0xf03
+p:DVB-S QPSK 12070H 19.2°E
+7603:00c00000:0408:0001:100:0
+11685V SID 0x7603
+p:DVB-S QPSK 11685V 19.2°E
+0f07:00c00000:0002:0085:100:0
+11797H SID 0xf07
+p:DVB-S QPSK 11797H 19.2°E
+7507:00c00000:0420:0001:100:0
+10817V SID 0x7507
+p:DVB-S2 8PSK 10817V 19.2°E
+7609:00c00000:0408:0001:100:0
+11685V SID 0x7609
+p:DVB-S QPSK 11685V 19.2°E
+7726:00c00000:0416:0001:100:0
+11156V SID 0x7726
+p:DVB-S QPSK 11156V 19.2°E
+7727:00c00000:0416:0001:100:0
+11156V SID 0x7727
+p:DVB-S QPSK 11156V 19.2°E
+7728:00c00000:0416:0001:100:0
+11156V SID 0x7728
+p:DVB-S QPSK 11156V 19.2°E
+7737:00c00000:0416:0001:100:0
+11156V SID 0x7737
+p:DVB-S QPSK 11156V 19.2°E
+7564:00c00000:0412:0001:100:0
+11097V SID 0x7564
+p:DVB-S QPSK 11097V 19.2°E
+1f68:00c00000:042e:0001:100:0
+11817V SID 0x1f68
+p:DVB-S QPSK 11817V 19.2°E
+ef6a:00c00000:0421:0001:100:0
+10832H SID 0xef6a
+p:DVB-S2 8PSK 10832H 19.2°E
+756d:00c00000:0412:0001:100:0
+11097V SID 0x756d
+p:DVB-S QPSK 11097V 19.2°E
+7475:00c00000:03f0:0001:100:0
+11317V SID 0x7475
+p:DVB-S QPSK 11317V 19.2°E
+7476:00c00000:03f0:0001:100:0
+11317V SID 0x7476
+p:DVB-S QPSK 11317V 19.2°E
+0f8d:00c00000:0007:0085:100:0
+12148H SID 0xf8d
+p:DVB-S QPSK 12148H 19.2°E
+258f:00c00000:0458:0001:100:0
+12610V SID 0x258f
+p:DVB-S QPSK 12610V 19.2°E
+0f91:00c00000:0007:0085:100:0
+12148H SID 0xf91
+p:DVB-S QPSK 12148H 19.2°E
+7791:00c00000:0424:0001:100:0
+10876V SID 0x7791
+p:DVB-S QPSK 10876V 19.2°E
+7594:00c00000:0422:0001:100:0
+10847V SID 0x7594
+p:DVB-S QPSK 10847V 19.2°E
+7794:00c00000:0424:0001:100:0
+10876V SID 0x7794
+p:DVB-S QPSK 10876V 19.2°E
+0f95:00c00000:0007:0085:100:0
+12148H SID 0xf95
+p:DVB-S QPSK 12148H 19.2°E
+0f96:00c00000:0007:0085:100:0
+12148H SID 0xf96
+p:DVB-S QPSK 12148H 19.2°E
+0f97:00c00000:0007:0085:100:0
+12148H SID 0xf97
+p:DVB-S QPSK 12148H 19.2°E
+0f98:00c00000:0007:0085:100:0
+12148H SID 0xf98
+p:DVB-S QPSK 12148H 19.2°E
+7698:00c00000:041e:0001:100:0
+10788V SID 0x7698
+p:DVB-S QPSK 10788V 19.2°E
+759d:00c00000:0422:0001:100:0
+10847V SID 0x759d
+p:DVB-S QPSK 10847V 19.2°E
+759e:00c00000:0422:0001:100:0
+10847V SID 0x759e
+p:DVB-S QPSK 10847V 19.2°E
+0f9f:00c00000:0007:0085:100:0
+12148H SID 0xf9f
+p:DVB-S QPSK 12148H 19.2°E
+759f:00c00000:0422:0001:100:0
+10847V SID 0x759f
+p:DVB-S QPSK 10847V 19.2°E
+75a0:00c00000:0422:0001:100:0
+10847V SID 0x75a0
+p:DVB-S QPSK 10847V 19.2°E
+0fa1:00c00000:0007:0085:100:0
+12148H SID 0xfa1
+p:DVB-S QPSK 12148H 19.2°E
+75a1:00c00000:0422:0001:100:0
+10847V SID 0x75a1
+p:DVB-S QPSK 10847V 19.2°E
+76a1:00c00000:041e:0001:100:0
+10788V SID 0x76a1
+p:DVB-S QPSK 10788V 19.2°E
+0fa2:00c00000:0001:0085:100:0
+12070H SID 0xfa2
+p:DVB-S QPSK 12070H 19.2°E
+75a2:00c00000:0422:0001:100:0
+10847V SID 0x75a2
+p:DVB-S QPSK 10847V 19.2°E
+0fa3:00c00000:0007:0085:100:0
+12148H SID 0xfa3
+p:DVB-S QPSK 12148H 19.2°E
+75a3:00c00000:0422:0001:100:0
+10847V SID 0x75a3
+p:DVB-S QPSK 10847V 19.2°E
+0fa4:00c00000:0005:0085:100:0
+12460H SID 0xfa4
+p:DVB-S QPSK 12460H 19.2°E
+74a5:00c00000:041c:0001:100:0
+10758V SID 0x74a5
+p:DVB-S QPSK 10758V 19.2°E
+75a7:00c00000:0422:0001:100:0
+10847V SID 0x75a7
+p:DVB-S QPSK 10847V 19.2°E
+75a8:00c00000:0422:0001:100:0
+10847V SID 0x75a8
+p:DVB-S QPSK 10847V 19.2°E
+0dab:00c00000:0002:0085:100:0
+11797H SID 0xdab
+p:DVB-S QPSK 11797H 19.2°E
+75ad:00c00000:0422:0001:100:0
+10847V SID 0x75ad
+p:DVB-S QPSK 10847V 19.2°E
+0fb4:00c00000:0005:0085:100:0
+12460H SID 0xfb4
+p:DVB-S QPSK 12460H 19.2°E
+0fb7:00c00000:0007:0085:100:0
+12148H SID 0xfb7
+p:DVB-S QPSK 12148H 19.2°E
+12b7:00c00000:03f7:0001:100:0
+11420H SID 0x12b7
+p:DVB-S QPSK 11420H 19.2°E
+12b9:00c00000:03f7:0001:100:0
+11420H SID 0x12b9
+p:DVB-S QPSK 11420H 19.2°E
+12ba:00c00000:03f7:0001:100:0
+11420H SID 0x12ba
+p:DVB-S QPSK 11420H 19.2°E
+0fbb:00c00000:0005:0085:100:0
+12460H SID 0xfbb
+p:DVB-S QPSK 12460H 19.2°E
+12bb:00c00000:03f7:0001:100:0
+11420H SID 0x12bb
+p:DVB-S QPSK 11420H 19.2°E
+0fbd:00c00000:0007:0085:100:0
+12148H SID 0xfbd
+p:DVB-S QPSK 12148H 19.2°E
+23bd:00c00000:044a:0001:100:0
+12363V SID 0x23bd
+p:DVB-S QPSK 12363V 19.2°E
+0fbf:00c00000:0007:0085:100:0
+12148H SID 0xfbf
+p:DVB-S QPSK 12148H 19.2°E
+12bf:00c00000:03f7:0001:100:0
+11420H SID 0x12bf
+p:DVB-S QPSK 11420H 19.2°E
+0fc0:00c00000:0005:0085:100:0
+12460H SID 0xfc0
+p:DVB-S QPSK 12460H 19.2°E
+0fc1:00c00000:0005:0085:100:0
+12460H SID 0xfc1
+p:DVB-S QPSK 12460H 19.2°E
+0fc4:00c00000:0001:0085:100:0
+12070H SID 0xfc4
+p:DVB-S QPSK 12070H 19.2°E
+0fc6:00c00000:0005:0085:100:0
+12460H SID 0xfc6
+p:DVB-S QPSK 12460H 19.2°E
+76c6:00c00000:040e:0001:100:0
+11038V SID 0x76c6
+p:DVB-S QPSK 11038V 19.2°E
+0fc7:00c00000:0005:0085:100:0
+12460H SID 0xfc7
+p:DVB-S QPSK 12460H 19.2°E
+77ca:00c00000:040a:0001:100:0
+10979V SID 0x77ca
+p:DVB-S QPSK 10979V 19.2°E
+77cb:00c00000:040a:0001:100:0
+10979V SID 0x77cb
+p:DVB-S QPSK 10979V 19.2°E
+76cd:00c00000:040e:0001:100:0
+11038V SID 0x76cd
+p:DVB-S QPSK 11038V 19.2°E
+74d0:00c00000:03f8:0001:100:0
+11435V SID 0x74d0
+p:DVB-S2 8PSK 11435V 19.2°E
+75d6:00c00000:0422:0001:100:0
+10847V SID 0x75d6
+p:DVB-S QPSK 10847V 19.2°E
+0de3:00c00000:0001:0085:100:0
+12070H SID 0xde3
+p:DVB-S QPSK 12070H 19.2°E
+23e4:00c00000:044a:0001:100:0
+12363V SID 0x23e4
+p:DVB-S QPSK 12363V 19.2°E
+23e5:00c00000:044a:0001:100:0
+12363V SID 0x23e5
+p:DVB-S QPSK 12363V 19.2°E
+23e6:00c00000:044a:0001:100:0
+12363V SID 0x23e6
+p:DVB-S QPSK 12363V 19.2°E
+1c38:00c00000:0457:0001:128:0
+STB Skardin
+p:SES ASTRA
+1c4b:00c00000:0457:0001:128:0
+STB Inverto
+p:SES ASTRA
+1c5b:00c00000:0457:0001:128:0
+Opentech
+p:SES ASTRA
+1c5c:00c00000:0457:0001:128:0
+SKYMASTER1
+p:SES ASTRA
+1c5f:00c00000:0457:0001:128:0
+SKYMASTER2
+p:SES ASTRA
+1c6d:00c00000:0457:0001:128:0
+STB Sandmartin
+p:SES ASTRA
+1c71:00c00000:0457:0001:128:0
+Panasonic Viera
+p:SES ASTRA
+1ee7:00c00000:0457:0001:128:0
+SES-LCN2
+p:SES ASTRA
+000c:00c00000:0454:0001:129:0
+ASTRA SDT
+p:SES ASTRA
+000d:00c00000:0457:0001:129:0
+ASTRA SDT
+p:SES ASTRA
+1c34:00c00000:0457:0001:129:0
+Samsung2
+p:SES ASTRA
+3390:00c00000:045d:0001:129:0
+AlphaCrypt
+p:ORF
+33a5:00c00000:045d:0001:129:0
+Crenova OTA Service
+p:ORS
+33ae:00c00000:045d:0001:129:0
+VESTEL DOWNLOAD
+p:ORF
+33c3:00c00000:045b:0001:129:0
+Arion OTA1
+p:ORS
+33c9:00c00000:045b:0001:129:0
+SSU-Test
+p:-
+0ff1:00c00000:0451:0035:129:0
+Downl CAM new
+p:CANALDIGITAAL
+1c30:00c00000:0457:0001:130:0
+HUMAX DOWNLOAD SVC
+p:SES ASTRA
+206a:00c00000:0430:0001:135:0
+CDSA
+p:CSAT
+2185:00c00000:0400:0001:135:0
+RADIO 1
+p:CSAT
+2186:00c00000:0400:0001:135:0
+RADIO 2
+p:CSAT
+2187:00c00000:0400:0001:135:0
+RADIO 3
+p:CSAT
+2188:00c00000:0400:0001:135:0
+RADIO FRANCE
+p:CSAT
+239f:00c00000:044a:0001:135:0
+EPG
+p:CSAT
+21c2:00c00000:0448:0001:135:0
+MOSA 2
+p:CSAT
+21c3:00c00000:0448:0001:135:0
+MOSA 3
+p:CSAT
+21c4:00c00000:0448:0001:135:0
+MOSA 4
+p:CSAT
+21c5:00c00000:0448:0001:135:0
+MOSA 5
+p:CSAT
+240c:00c00000:0452:0001:138:0
+A LA CARTE
+p:CSAT
+240d:00c00000:0452:0001:138:0
+A LA CARTE
+p:CSAT
+2140:00c00000:0400:0001:138:0
+NOUVEAU DECODEUR
+p:CSAT
+2142:00c00000:0400:0001:138:0
+CANALSAT RADIOS
+p:CSAT
+218e:00c00000:0400:0001:138:0
+NOUVEAU DECODEUR
+p:CSAT
+21ca:00c00000:0448:0001:138:0
+NOUVEAU DECODEUR
+p:CSAT
+21cb:00c00000:0448:0001:138:0
+NOUVEAU DECODEUR
+p:CSAT
+1c83:00c00000:0457:0001:170:0
+Kathrein Download
+p:SES ASTRA
+1c40:00c00000:0457:0001:171:0
+STB SMEL
+p:SES ASTRA
+1c6c:00c00000:0457:0001:171:0
+HDS Europe
+p:SES ASTRA
+1c6e:00c00000:0457:0001:171:0
+STB Strong
+p:SES ASTRA
+1c76:00c00000:0457:0001:171:0
+STB SRADIX
+p:SES ASTRA
+0a82:00c00000:0004:0085:178:0
+Videotext
+p:BetaResearch
+23b8:00c00000:044a:0001:192:0
+DOWNLOAD DUALS PHILIPS
+p:CSAT
+23b9:00c00000:044a:0001:192:0
+DOWNLOAD REN PACE
+p:CSAT
+23ba:00c00000:044a:0001:192:0
+DOWNLOAD G5 SAMSUNG
+p:CSAT
+23bb:00c00000:044a:0001:192:0
+DOWNLOAD G5 PACE
+p:CSAT
+23be:00c00000:044a:0001:192:0
+DOWNLOAD G5+ PACE
+p:CSAT
+23bf:00c00000:044a:0001:192:0
+DOWNLOAD G5+ SAGEM
+p:CSAT
+1fcc:00c00000:042e:0001:192:0
+DOWNLOAD TNTSAT TRIAX
+p:CSAT
+23e7:00c00000:044a:0001:192:0
+DOWNLOAD TNTSAT 9191
+p:CSAT
+23e8:00c00000:044a:0001:192:0
+DOWNLOAD TNTSAT 9192
+p:CSAT
+23e9:00c00000:044a:0001:192:0
+DOWNLOAD TNTSAT 9193
+p:CSAT
+2007:00c00000:0434:0001:193:0
+DATA SYSTEM[76]
+p:CSAT
+270f:00c00000:045c:0001:193:0
+DATA SYSTEM[116]
+p:CSAT
+251b:00c00000:043c:0001:193:0
+DATA SYSTEM[84]
+p:CSAT
+2327:00c00000:045a:0001:193:0
+DATA SYSTEM[114]
+p:CSAT
+2133:00c00000:043e:0001:193:0
+DATA SYSTEM[86]
+p:CSAT
+2647:00c00000:045e:0001:193:0
+DATA SYSTEM[118]
+p:CSAT
+2453:00c00000:0452:0001:193:0
+DATA SYSTEM[106]
+p:CSAT
+1b58:00c00000:03fc:0001:193:0
+DATA SYSTEM 76
+p:CSAT
+1b58:00c00000:03fe:0001:193:0
+DATA SYSTEM[76]
+p:CSAT
+225f:00c00000:044c:0001:193:0
+DATA SYSTEM[100]
+p:CSAT
+1963:00c00000:03fa:0001:193:0
+DATA SYSTEM[18]
+p:CSAT
+206b:00c00000:0430:0001:193:0
+DATA SYSTEM[72]
+p:CSAT
+6f71:00c00000:042c:0001:193:0
+DATA_SYS_68
+p:DT CSAT
+257f:00c00000:0456:0001:193:0
+DATA SYSTEM[88]
+p:CSAT
+0a83:00c00000:0004:0085:193:0
+NDS Applikation
+p:SKY
+238b:00c00000:0442:0001:193:0
+DATA SYSTEM[90]
+p:CSAT
+2197:00c00000:0400:0001:193:0
+DATA SYSTEM[24]
+p:CSAT
+1fa3:00c00000:042e:0001:193:0
+DATA SYSTEM[70]
+p:CSAT
+26ab:00c00000:0460:0001:193:0
+DATA SYSTEM[120]
+p:CSAT
+24b7:00c00000:0440:0001:193:0
+DATA SYSTEM[110]
+p:CSAT
+22c3:00c00000:0438:0001:193:0
+DATA SYSTEM[80]
+p:CSAT
+19c7:00c00000:044e:0001:193:0
+DATA SYSTEM[102]
+p:CSAT
+42cb:00c00000:0446:0001:193:0
+DATA SYSTEM 94
+p:ABSAT
+20cf:00c00000:0432:0001:193:0
+DATA SYSTEM[74]
+p:CSAT
+25e3:00c00000:0458:0001:193:0
+DATA SYSTEM[112]
+p:CSAT
+6fea:00c00000:042a:0001:193:0
+Data_System_TR_66
+p:MTV Networks Europe
+23ef:00c00000:044a:0001:193:0
+DATA SYSTEM[98]
+p:CSAT
+21fb:00c00000:0448:0001:193:0
+DATA SYSTEM[96]
+p:CSAT
+6ffe:00c00000:0436:0001:193:0
+DATA SYSTEM TR 78
+p:MTV Networks Europe
+2408:00c00000:0452:0001:195:0
+A LA CARTE
+p:CSAT
+2409:00c00000:0452:0001:195:0
+A LA CARTE
+p:CSAT
+23bc:00c00000:044a:0001:195:0
+CANALPLAY
+p:
+219b:00c00000:0448:0001:197:0
+MOSAIQUE
+p:CSAT
+219c:00c00000:0448:0001:197:0
+MOSA 2
+p:CSAT
+219d:00c00000:0448:0001:197:0
+MOSA 3
+p:CSAT
+21a2:00c00000:0448:0001:197:0
+MOSA 5
+p:CSAT
+21a6:00c00000:0448:0001:197:0
+MOSA 4
+p:CSAT
+21ac:00c00000:0448:0001:197:0
+MOSAIQUE C+
+p:CSAT
+213d:00c00000:0400:0001:198:0
+CANALSAT RADIOS
+p:CSAT
+213e:00c00000:0400:0001:198:0
+RADIOS 2
+p:CSAT
+213f:00c00000:0400:0001:198:0
+RADIOS 3
+p:CSAT
+00c8:00c00000:0003:0085:198:0
+BDL VoD
+p:Sky
+23aa:00c00000:044a:0001:201:0
+M6 REPLAY
+p:CSAT
+23ab:00c00000:044a:0001:201:0
+CANALPLAY
+p:CSAT
+0105:00c00000:0002:0085:211:0
+\86Sky\87 \86Sel\87ect \862\87
+p:,C:1861
+0106:00c00000:0002:0085:211:0
+\86Sky Bu\87ndes\86li\87ga\86 1\87
+p:,C:1861
+0107:00c00000:0002:0085:211:0
+Sky \86Sport\87 \8610\87
+p:,C:1861
+0108:00c00000:0002:0085:211:0
+\86Sky \87Select \86Event B\87
+p:,C:1861
+010f:00c00000:0003:0085:211:0
+\86Sky\87 \86Sel\87ect \863\87
+p:,C:1861
+0110:00c00000:0003:0085:211:0
+\86Sky Bu\87ndes\86li\87ga\86 2\87
+p:,C:1861
+0111:00c00000:0003:0085:211:0
+Sky \86Sport\87 \8611\87
+p:,C:1861
+0119:00c00000:0003:0085:211:0
+\86Sky\87 \86Sel\87ect \864\87
+p:,C:1861
+011a:00c00000:0003:0085:211:0
+\86Sky Bu\87ndes\86li\87ga\86 3\87
+p:,C:1861
+011b:00c00000:0003:0085:211:0
+Sky \86Sport\87 \869\87
+p:,C:1861
+0123:00c00000:0003:0085:211:0
+\86Sky\87 \86Sel\87ect \865\87
+p:,C:1861
+0124:00c00000:0003:0085:211:0
+\86Sky Bu\87ndes\86li\87ga\86 4\87
+p:,C:1861
+0125:00c00000:0003:0085:211:0
+Sky \86Sport\87 \868\87
+p:,C:1861
+012d:00c00000:0003:0085:211:0
+\86Sky\87 \86Sel\87ect \866\87
+p:,C:1861
+012e:00c00000:0003:0085:211:0
+\86Sky Bu\87ndes\86li\87ga\86 5\87
+p:,C:1861
+012f:00c00000:0003:0085:211:0
+Sky \86Sport\87 \867\87
+p:,C:1861
+0137:00c00000:0011:0085:211:0
+\86Sky\87 \86Sel\87ect \867\87
+p:,C:1861
+0138:00c00000:0011:0085:211:0
+\86Sky Bu\87ndes\86li\87ga\86 6\87
+p:,C:1861
+0139:00c00000:0011:0085:211:0
+Sky \86Sport\87 \866\87
+p:,C:1861
+0141:00c00000:0011:0085:211:0
+\86Sky\87 \86Sel\87ect \868\87
+p:,C:1861
+0142:00c00000:0011:0085:211:0
+\86Sky Bu\87ndes\86li\87ga\86 7\87
+p:,C:1861
+0143:00c00000:0011:0085:211:0
+Sky \86Sport\87 \865\87
+p:,C:1861
+014b:00c00000:0011:0085:211:0
+\86Sky\87 \86Sel\87ect \869\87
+p:,C:1861
+014c:00c00000:0011:0085:211:0
+\86Sky Bu\87ndes\86li\87ga\86 8\87
+p:,C:1861
+014d:00c00000:0011:0085:211:0
+Sky \86Sport\87 \864\87
+p:,C:1861
+0156:00c00000:0001:0085:211:0
+\86Sky Bu\87ndes\86li\87ga\86 9\87
+p:,C:1861
+0159:00c00000:0001:0085:211:0
+\86Blue\87 \86M\87ovie \861\87
+p:,C:1810,C:1861
+0160:00c00000:0001:0085:211:0
+\86Sky Bu\87ndes\86li\87ga\86 10\87
+p:,C:1861
+0163:00c00000:0001:0085:211:0
+\86Blue\87 \86M\87ovie \862\87
+p:,C:1810,C:1861
+016b:00c00000:0001:0085:211:0
+Sky \86Sport\87 \8612\87
+p:,C:1861
+016d:00c00000:0001:0085:211:0
+\86Blue\87 \86M\87ovie \863\87
+p:,C:1810,C:1861
+0175:00c00000:0001:0085:211:0
+Sky \86Sport\87 \8613\87
+p:,C:1861
+00f1:00c00000:0003:0085:211:0
+Sky \86Sport\87 \86News\87
+p:SKY,C:1861
+00f2:00c00000:000c:0085:211:0
+Sky \86Sport\87 \86News\87 \86HD\87
+p:SKY,C:1861
+00fb:00c00000:0002:0085:211:0
+\86Sky\87 \86Sel\87ect \861\87
+p:,C:1861
+00fc:00c00000:0002:0085:211:0
+\86Sky Bu\87ndes\86li\87ga\86 11\87
+p:,C:1861
+00fd:00c00000:0002:0085:211:0
+Sky \86Sport\87 \863\87
+p:,C:1861
+00fe:00c00000:0002:0085:211:0
+\86Sky \87Select \86Event A\87
+p:,C:1861
+1c1e:00c00000:0451:0035:212:0
+EPG Nagra
+p:CANALDIGITAAL
+end
+Have a lot of bugs!
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/lamedb.282 b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/lamedb.282
new file mode 100644 (file)
index 0000000..8d9df67
--- /dev/null
@@ -0,0 +1,3414 @@
+eDVB services /4/
+transponders
+011c0000:07d1:0002
+       s 11719500:29500000:0:3:284:2:0:1:1:0:2
+/
+011c0000:07d2:0002
+       s 11739000:27500000:1:2:284:2:0
+/
+011c0000:07d3:0002
+       s 11758500:29500000:0:3:284:2:0:1:1:0:2
+/
+011c0000:07d4:0002
+       s 11778000:27500000:1:2:284:2:0
+/
+011c0000:07d5:0002
+       s 11797500:29500000:0:3:284:2:0:1:1:0:2
+/
+011c0000:07d6:0002
+       s 11817000:27500000:1:2:284:2:0
+/
+011c0000:07d7:0002
+       s 11836500:27500000:0:2:284:2:0
+/
+011c0000:07d8:0002
+       s 11856000:29500000:1:3:284:2:0:1:1:0:2
+/
+011c0000:07d9:0002
+       s 11875500:27500000:0:2:284:2:0
+/
+011c0000:07da:0002
+       s 11895000:27500000:1:2:284:2:0
+/
+011c0000:07db:0002
+       s 11914500:27500000:0:2:284:2:0
+/
+011c0000:07dc:0002
+       s 11934000:27500000:1:2:284:2:0
+/
+011c0000:07dd:0002
+       s 11953500:27500000:0:2:284:2:0
+/
+011c0000:07de:0002
+       s 11973000:27500000:1:2:284:2:0
+/
+011c0000:07df:0002
+       s 11992500:27500000:0:2:284:2:0
+/
+011c0000:07e0:0002
+       s 12012000:29500000:1:3:284:2:0:1:1:0:2
+/
+011c0000:07e1:0002
+       s 12031500:27500000:0:2:284:2:0
+/
+011c0000:07e2:0002
+       s 12051000:27500000:1:2:284:2:0
+/
+011c0000:07e4:0002
+       s 12090000:29500000:1:3:284:2:0:1:1:0:2
+/
+011c0000:07e5:0002
+       s 12109500:27500000:0:2:284:2:0
+/
+011c0000:07e6:0002
+       s 12129000:27500000:1:2:284:2:0
+/
+011c0000:07e7:0002
+       s 12148500:27500000:0:2:284:2:0
+/
+011c0000:07e8:0002
+       s 12168000:29500000:1:3:284:2:0:1:1:0:2
+/
+011c0000:07e9:0002
+       s 12187500:27500000:0:2:284:2:0
+/
+011c0000:07ea:0002
+       s 12207000:27500000:1:2:284:2:0
+/
+011c0000:07eb:0002
+       s 12226500:27500000:0:2:284:2:0
+/
+011c0000:07ec:0002
+       s 12246000:29500000:1:3:284:2:0:1:1:0:2
+/
+011c0000:07ed:0002
+       s 12265500:29500000:0:3:284:2:0:1:1:0:2
+/
+011c0000:07ee:0002
+       s 12285000:27500000:1:2:284:2:0
+/
+011c0000:07ef:0002
+       s 12304500:27500000:0:2:284:2:0
+/
+011c0000:07f0:0002
+       s 12324000:29500000:1:3:284:2:0:1:1:0:2
+/
+011c0000:07f1:0002
+       s 12343500:29500000:0:3:284:2:0:1:1:0:2
+/
+011c0000:07f2:0002
+       s 12363000:29500000:1:3:284:2:0:1:1:0:2
+/
+011c0000:07f3:0002
+       s 12382500:29500000:0:3:284:2:0:1:1:0:2
+/
+011c0000:07f4:0002
+       s 12402000:27500000:1:2:284:2:0
+/
+011c0000:07f5:0002
+       s 12421000:27500000:0:2:284:2:0
+/
+011c0000:07f6:0002
+       s 12441000:27500000:1:2:284:2:0
+/
+011c0000:07f7:0002
+       s 12460500:29500000:0:3:284:2:0:1:1:0:2
+/
+011c0000:07f9:0002
+       s 10714000:22000000:0:4:284:2:0
+/
+011c0000:07fa:0002
+       s 10729000:22000000:1:4:284:2:0
+/
+011c0000:07fb:0002
+       s 10743750:22000000:0:4:284:2:0
+/
+011c0000:07fc:0002
+       s 10758500:22000000:1:4:284:2:0
+/
+011c0000:07fd:0002
+       s 10773250:22000000:0:4:284:2:0
+/
+011c0000:07fe:0002
+       s 10788000:22000000:1:4:284:2:0
+/
+011c0000:07ff:0002
+       s 10802750:22000000:0:4:284:2:0
+/
+011c0000:0800:0002
+       s 10817500:22000000:1:4:284:2:0
+/
+011c0000:0801:0002
+       s 10832250:22000000:0:4:284:2:0
+/
+011c0000:0802:0002
+       s 10847000:22000000:1:4:284:2:0
+/
+011c0000:0803:0002
+       s 10861750:22000000:0:4:284:2:0
+/
+011c0000:0804:0002
+       s 10876500:22000000:1:4:284:2:0
+/
+011c0000:0805:0002
+       s 10891250:22000000:0:4:284:2:0
+/
+011c0000:0806:0002
+       s 10906000:22000000:1:4:284:2:0
+/
+011c0000:0807:0002
+       s 10920750:22000000:0:4:284:2:0
+/
+011c0000:0808:0002
+       s 10935500:22000000:1:4:284:2:0
+/
+011c0000:08fd:0002
+       s 11261170:27500000:0:2:284:2:0
+/
+011c0000:08fe:0002
+       s 11259670:27500000:1:2:284:2:0
+/
+011c0000:08ff:0002
+       s 11307000:27500000:0:2:284:2:0
+/
+011c0000:0900:0002
+       s 11343000:27500000:1:2:284:2:0
+/
+011c0000:0902:0002
+       s 11426330:27500000:1:2:284:2:0
+/
+011c0000:0907:0002
+       s 11222170:27500000:0:2:284:2:0
+/
+011c0000:0908:0002
+       s 11223670:27500000:1:2:284:2:0
+/
+011c0000:0909:0002
+       s 11344500:27500000:0:2:284:2:0
+/
+011c0000:090a:0002
+       s 11307000:27500000:1:2:284:2:0
+/
+011c0000:090b:0002
+       s 11390000:27500000:0:2:284:2:0
+/
+011c0000:090c:0002
+       s 11390330:27500000:1:2:284:2:0
+/
+011c0000:0961:0002
+       s 11469230:27500000:0:2:284:2:0
+/
+011c0000:0963:0002
+       s 11507690:27500000:0:2:284:2:0
+/
+011c0000:0964:0002
+       s 11526920:27500000:1:2:284:2:0
+/
+011c0000:0965:0002
+       s 11546150:27500000:0:2:284:2:0
+/
+011c0000:0966:0002
+       s 11565380:27500000:1:2:284:2:0
+/
+011c0000:0967:0002
+       s 11584620:27500000:0:2:284:2:0
+/
+011c0000:0968:0002
+       s 11603850:27500000:1:2:284:2:0
+/
+011c0000:0969:0002
+       s 11623080:27500000:0:2:284:2:0
+/
+011c0000:096a:0002
+       s 11642000:27500000:1:2:284:2:0
+/
+011c0000:096b:0002
+       s 11661540:27500000:0:2:284:2:0
+/
+011c0000:096c:0002
+       s 11680770:27500000:1:2:284:2:0
+/
+011c0000:0a29:0002
+       s 12559670:27500000:0:2:284:2:0
+/
+011c0000:0a2a:0002
+       s 12560020:27500000:1:2:284:2:0
+/
+011c0000:0a2b:0002
+       s 12643350:27500000:0:2:284:2:0
+/
+011c0000:0a2c:0002
+       s 12643350:27500000:1:2:284:2:0
+/
+011c0000:0a33:0002
+       s 12523000:27500000:0:2:284:2:0
+/
+011c0000:0a34:0002
+       s 12523000:27500000:1:2:284:2:0
+/
+011c0000:0a35:0002
+       s 12606650:27500000:0:2:284:2:0
+/
+011c0000:0a36:0002
+       s 12606650:27500000:1:2:284:2:0
+/
+011c2f26:07e3:0002
+       s 12070500:27500000:0:2:284:2:0
+/
+end
+services
+1600:011c0000:0807:0002:0:0
+
+p:
+1601:011c0000:0966:0002:0:0
+
+p:
+1406:011c0000:0807:0002:0:0
+
+p:
+1207:011c0000:0963:0002:0:0
+
+p:
+1407:011c0000:0807:0002:0:0
+
+p:
+1208:011c0000:0963:0002:0:0
+
+p:
+1209:011c0000:0963:0002:0:0
+
+p:
+1212:011c0000:07dc:0002:0:0
+
+p:
+1213:011c0000:07dc:0002:0:0
+
+p:
+1214:011c0000:07dc:0002:0:0
+
+p:
+1215:011c0000:07dc:0002:0:0
+
+p:
+1216:011c0000:07dc:0002:0:0
+
+p:
+1017:011c0000:0966:0002:0:0
+
+p:
+132a:011c0000:0963:0002:0:0
+
+p:
+232d:011c0000:0963:0002:0:0
+
+p:
+0f36:011c0000:0968:0002:0:0
+
+p:
+0f37:011c0000:0968:0002:0:0
+
+p:
+0f38:011c0000:07e0:0002:0:0
+
+p:
+0f39:011c0000:07f7:0002:0:0
+
+p:
+0f3a:011c0000:07f3:0002:0:0
+
+p:
+133e:011c0000:0961:0002:0:0
+
+p:
+133f:011c0000:0961:0002:0:0
+
+p:
+1340:011c0000:0961:0002:0:0
+
+p:
+1341:011c0000:0961:0002:0:0
+
+p:
+1342:011c0000:0807:0002:0:0
+
+p:
+114a:011c0000:07db:0002:0:0
+
+p:
+114b:011c0000:07db:0002:0:0
+
+p:
+114c:011c0000:07db:0002:0:0
+
+p:
+114d:011c0000:07db:0002:0:0
+
+p:
+114e:011c0000:07db:0002:0:0
+
+p:
+1276:011c0000:07dc:0002:0:0
+
+p:
+1277:011c0000:07dc:0002:0:0
+
+p:
+1278:011c0000:07dc:0002:0:0
+
+p:
+1279:011c0000:07dc:0002:0:0
+
+p:
+2479:011c0000:0963:0002:0:0
+
+p:
+127a:011c0000:07dc:0002:0:0
+
+p:
+247a:011c0000:0963:0002:0:0
+
+p:
+247f:011c0000:0963:0002:0:0
+
+p:
+2489:011c0000:07ef:0002:0:0
+
+p:
+13a2:011c0000:0807:0002:0:0
+
+p:
+13a5:011c0000:0807:0002:0:0
+
+p:
+13a6:011c0000:0807:0002:0:0
+
+p:
+14ab:011c0000:0966:0002:0:0
+
+p:
+11ae:011c0000:07db:0002:0:0
+
+p:
+15ae:011c0000:0966:0002:0:0
+
+p:
+11af:011c0000:07db:0002:0:0
+
+p:
+15af:011c0000:0966:0002:0:0
+
+p:
+11b0:011c0000:07db:0002:0:0
+
+p:
+15b0:011c0000:0807:0002:0:0
+
+p:
+11b1:011c0000:07db:0002:0:0
+
+p:
+15b1:011c0000:0807:0002:0:0
+
+p:
+11b2:011c0000:07db:0002:0:0
+
+p:
+15b2:011c0000:0961:0002:0:0
+
+p:
+15b3:011c0000:0961:0002:0:0
+
+p:
+15b4:011c0000:0966:0002:0:0
+
+p:
+15b5:011c0000:0807:0002:0:0
+
+p:
+d3b9:011c0000:0a2b:0002:0:0
+
+p:
+d3ba:011c0000:0a35:0002:0:0
+
+p:
+d3c1:011c0000:0a2b:0002:0:0
+
+p:
+d7d0:011c0000:0a35:0002:0:0
+
+p:
+12da:011c0000:0961:0002:0:0
+
+p:
+12db:011c0000:0961:0002:0:0
+
+p:
+12dc:011c0000:0961:0002:0:0
+
+p:
+12dd:011c0000:0961:0002:0:0
+
+p:
+12de:011c0000:0961:0002:0:0
+
+p:
+10e6:011c0000:0966:0002:0:0
+
+p:
+10e7:011c0000:0961:0002:0:0
+
+p:
+10e8:011c0000:0966:0002:0:0
+
+p:
+10e9:011c0000:0807:0002:0:0
+
+p:
+10ea:011c0000:07db:0002:0:0
+
+p:
+15fa:011c0000:0807:0002:0:0
+
+p:
+15fc:011c0000:0807:0002:0:0
+
+p:
+15fd:011c0000:0807:0002:0:0
+
+p:
+15fe:011c0000:0807:0002:0:0
+
+p:
+15ff:011c0000:0807:0002:0:0
+
+p:
+1200:011c0000:07ee:0002:1:0
+Nat Geo+1hr
+p:BSkyB
+2400:011c0000:07f9:0002:1:0
+Channel 4
+p:BSkyB
+0401:011c0000:0804:0002:1:0
+5562
+p:BSKYB
+d101:011c0000:090c:0002:1:0
+movies24+
+p:BSkyB
+0402:011c0000:0804:0002:1:0
+5563
+p:BSKYB
+1202:011c0000:07eb:0002:1:0
+Sky Sports 4
+p:BSkyB
+1c02:011c0000:07d4:0002:1:0
+
+p:
+0403:011c0000:0804:0002:1:0
+5560
+p:BSKYB
+1203:011c0000:07eb:0002:1:0
+Sky Sports 1
+p:BSkyB
+c503:011c0000:0965:0002:1:0
+Life
+p:BSkyB
+0404:011c0000:0804:0002:1:0
+5561
+p:BSKYB
+2404:011c0000:07f9:0002:1:0
+Film4
+p:BSkyB
+d804:011c0000:0a36:0002:1:0
+Zee TV
+p:BSkyB
+1205:011c0000:07eb:0002:1:0
+Sky Sports 3
+p:BSkyB
+cc06:011c0000:08ff:0002:1:0
+LIVINGit+1
+p:BSkyB
+d106:011c0000:090c:0002:1:0
+ARY News
+p:BSkyB
+1907:011c0000:07ff:0002:1:0
+ETV2
+p:BSkyB
+d007:011c0000:0909:0002:1:0
+Elite TV 2
+p:BSkyB
+cc08:011c0000:08ff:0002:1:0
+Challenge+1
+p:BSkyB
+2409:011c0000:07f9:0002:1:0
+Film4 +1
+p:BSkyB
+cc09:011c0000:08ff:0002:1:0
+Bravo 2
+p:BSkyB
+d809:011c0000:0a36:0002:1:0
+Zee Cinema
+p:BSkyB
+1e0a:011c0000:07df:0002:1:0
+7360
+p:BSkyB
+cc0a:011c0000:08ff:0002:1:0
+LIVING
+p:BSkyB
+190b:011c0000:07ff:0002:1:0
+BBC 1 Wales
+p:BSkyB
+270b:011c0000:07dd:0002:1:0
+6780
+p:BSkyB
+cc0b:011c0000:08ff:0002:1:0
+Channel One+1
+p:BSkyB
+190c:011c0000:07ff:0002:1:0
+BBC 2 Wales
+p:BSkyB
+270c:011c0000:07dd:0002:1:0
+6781
+p:BSkyB
+d00c:011c0000:0909:0002:1:0
+Food Network
+p:BSkyB
+c50d:011c0000:0965:0002:1:0
+Monte Carlo TV
+p:BSkyB
+170e:011c0000:0963:0002:1:0
+ISM Test1 v5
+p:BSkyB
+240e:011c0000:07f9:0002:1:0
+More4 +1
+p:BSkyB
+c50e:011c0000:0965:0002:1:0
+AvaTest
+p:BSkyB
+d80e:011c0000:0a36:0002:1:0
+Zing
+p:BSkyB
+120f:011c0000:07ee:0002:1:0
+yd2oe6
+p:BSkyB
+270f:011c0000:0805:0002:1:0
+10135
+p:BSkyB
+1210:011c0000:07ee:0002:1:0
+yd1oe6
+p:BSkyB
+1710:011c0000:07e9:0002:1:0
+ComedyCentral
+p:BSkyB
+1612:011c0000:07d7:0002:1:0
+Sky Mdn Greats
+p:BSkyB
+d813:011c0000:0a36:0002:1:0
+Zee Punjabi
+p:BSkyB
+1e14:011c0000:07f5:0002:1:0
+FIVE
+p:BSkyB
+2814:011c0000:0806:0002:1:0
+ITV3
+p:BSkyB
+cd14:011c0000:0902:0002:1:0
+GEO UK
+p:BSkyB
+1915:011c0000:07ff:0002:1:0
+BBC 1 Scotland
+p:BSkyB
+1e15:011c0000:07f5:0002:1:0
+Channel TBC
+p:BSkyB
+2815:011c0000:0806:0002:1:0
+ITV3+1
+p:BSkyB
+1916:011c0000:07ff:0002:1:0
+BBC 2 Scotland
+p:BSkyB
+1e16:011c0000:07f5:0002:1:0
+FIVE
+p:BSkyB
+d016:011c0000:0909:0002:1:0
+Food Netwrk+1
+p:BSkyB
+1e17:011c0000:07f5:0002:1:0
+FIVE
+p:BSkyB
+d818:011c0000:0a36:0002:1:0
+Zee Café
+p:BSkyB
+1519:011c0000:07e7:0002:1:0
+Sky Sports 4
+p:BSkyB
+cd19:011c0000:0902:0002:1:0
+AAG
+p:BSkyB
+151a:011c0000:07e7:0002:1:0
+FX+
+p:BSkyB
+1d1a:011c0000:07de:0002:1:0
+ITV1 Central S
+p:BSkyB
+cc1a:011c0000:08ff:0002:1:0
+propeller
+p:BSkyB
+1d1b:011c0000:07de:0002:1:0
+ITV1 Central E
+p:BSkyB
+d01b:011c0000:0909:0002:1:0
+Blue Kiss TV
+p:BSkyB
+151c:011c0000:07e7:0002:1:0
+Sky Sports 4
+p:BSkyB
+c51c:011c0000:0965:0002:1:0
+50460
+p:BSKYB
+d41c:011c0000:0a2c:0002:1:0
+MATV National
+p:BSkyB
+281d:011c0000:0806:0002:1:0
+G54
+p:BSkyB
+1e1e:011c0000:07f5:0002:1:0
+FIVE USA
+p:BSkyB
+cd1e:011c0000:0902:0002:1:0
+price-drop tv
+p:BSkyB
+1e1f:011c0000:07f5:0002:1:0
+FIVE USA+1
+p:BSkyB
+271f:011c0000:0801:0002:1:0
+ITV4+1
+p:BSkyB
+1920:011c0000:07ff:0002:1:0
+BBC 2 NI
+p:BSkyB
+d020:011c0000:0909:0002:1:0
+wedding tv
+p:BSkyB
+c521:011c0000:0965:0002:1:0
+50465
+p:BSKYB
+cb21:011c0000:0907:0002:1:0
+UCB TV
+p:BSkyB
+d421:011c0000:0a2c:0002:1:0
+Military
+p:BSkyB
+cb22:011c0000:0907:0002:1:0
+horror ch+1
+p:BSkyB
+1e23:011c0000:07f5:0002:1:0
+FIVER
+p:BSkyB
+cd23:011c0000:0902:0002:1:0
+MAX
+p:BSkyB
+1e24:011c0000:07f5:0002:1:0
+FIVER+1
+p:BSkyB
+2724:011c0000:0801:0002:1:0
+ITV1 Wales
+p:BSkyB
+cb24:011c0000:0907:0002:1:0
+UMMAH CHNL
+p:BSkyB
+cb25:011c0000:0907:0002:1:0
+Clubland TV
+p:BSkyB
+d025:011c0000:0909:0002:1:0
+Nick Jr. 2
+p:BSkyB
+d325:011c0000:0a29:0002:1:0
+ATN Bangla UK
+p:BSkyB
+c526:011c0000:0965:0002:1:0
+50470
+p:BSKYB
+cb26:011c0000:0907:0002:1:0
+Jewelry Maker
+p:BSkyB
+d326:011c0000:0a29:0002:1:0
+IQRA TV
+p:BSkyB
+d426:011c0000:0a2c:0002:1:0
+Nickelodeon
+p:BSkyB
+cb27:011c0000:0907:0002:1:0
+Fashion TV
+p:BSkyB
+cb28:011c0000:0907:0002:1:0
+Get Lucky TV
+p:BSkyB
+cd28:011c0000:0902:0002:1:0
+COLORS
+p:BSkyB
+2329:011c0000:0803:0002:1:0
+Disney Chnl
+p:BSkyB
+232a:011c0000:0803:0002:1:0
+Disney Cine
+p:BSkyB
+cb2a:011c0000:0907:0002:1:0
+Lava
+p:BSkyB
+d02a:011c0000:0909:0002:1:0
+Hidayat TV
+p:BSkyB
+122b:011c0000:0968:0002:1:0
+Sky Thriller
+p:BSkyB
+132b:011c0000:07e7:0002:1:0
+Sky Spts News
+p:BSkyB
+232b:011c0000:0803:0002:1:0
+Disney Cine+1
+p:BSkyB
+c52b:011c0000:0965:0002:1:0
+50475
+p:BSKYB
+d42b:011c0000:0a2c:0002:1:0
+Pitch TV
+p:BSkyB
+122c:011c0000:0968:0002:1:0
+Sky Prem+1
+p:BSkyB
+132c:011c0000:07e7:0002:1:0
+SP News
+p:BSkyB
+232c:011c0000:0803:0002:1:0
+Play Disney
+p:BSkyB
+d32c:011c0000:0a29:0002:1:0
+KICC TV
+p:BSkyB
+122d:011c0000:0968:0002:1:0
+History
+p:BSkyB
+132d:011c0000:07e7:0002:1:0
+Sky Spts News
+p:BSkyB
+cb2d:011c0000:0907:0002:1:0
+Chat Box
+p:BSkyB
+cd2d:011c0000:0902:0002:1:0
+OBE
+p:BSkyB
+132e:011c0000:07e7:0002:1:0
+Sky Spts News
+p:BSkyB
+232e:011c0000:07d7:0002:1:0
+9006
+p:BSkyB
+272e:011c0000:0801:0002:1:0
+ITV1 West
+p:BSkyB
+cb2e:011c0000:0907:0002:1:0
+Cinémoi movies
+p:BSkyB
+d32e:011c0000:0a29:0002:1:0
+Channel 'S'
+p:BSkyB
+122f:011c0000:0968:0002:1:0
+Bio
+p:BSkyB
+232f:011c0000:0803:0002:1:0
+Disney Chnl+1
+p:BSkyB
+cb2f:011c0000:0907:0002:1:0
+Just4us
+p:BSkyB
+d02f:011c0000:0909:0002:1:0
+LivexxxBabes
+p:BSkyB
+d32f:011c0000:0a29:0002:1:0
+Peace TV
+p:BSkyB
+1a30:011c0000:07dd:0002:1:0
+BBC NEWS
+p:BSkyB
+c530:011c0000:0965:0002:1:0
+50480
+p:BSKYB
+cb30:011c0000:0907:0002:1:0
+The Other Side
+p:BSkyB
+d330:011c0000:0a29:0002:1:0
+Peace TV Urdu
+p:BSkyB
+d430:011c0000:0a2c:0002:1:0
+STAR News
+p:BSkyB
+1a31:011c0000:07dd:0002:1:0
+BBC PARL'MNT
+p:BSkyB
+2331:011c0000:07ee:0002:1:0
+Sky 1 ETV Slot1
+p:BSkyB
+d031:011c0000:0909:0002:1:0
+Essex Babes
+p:BSkyB
+d331:011c0000:0a29:0002:1:0
+Bangla TV
+p:BSkyB
+1332:011c0000:07e7:0002:1:0
+Sky Sports 1
+p:BSkyB
+2332:011c0000:0803:0002:1:0
+Play Disney+
+p:BSkyB
+cd32:011c0000:0902:0002:1:0
+Diva TV
+p:BSkyB
+d332:011c0000:0a29:0002:1:0
+Info TV +1
+p:BSkyB
+1133:011c0000:07d7:0002:1:0
+Sky Family
+p:BSkyB
+1233:011c0000:0968:0002:1:0
+Sky Premiere
+p:BSkyB
+2333:011c0000:07d2:0002:1:0
+6008
+p:BSkyB
+d333:011c0000:0a29:0002:1:0
+Faith World TV
+p:BSkyB
+d334:011c0000:0a29:0002:1:0
+Channel i
+p:BSkyB
+d335:011c0000:0a29:0002:1:0
+Showcase +1
+p:BSkyB
+1537:011c0000:07e7:0002:1:0
+ComedyCtralX
+p:BSkyB
+cd37:011c0000:0902:0002:1:0
+ARY QTV
+p:BSkyB
+2738:011c0000:0801:0002:1:0
+ITV1 W Country
+p:BSkyB
+cc38:011c0000:08ff:0002:1:0
+S4C2
+p:BSkyB
+1139:011c0000:07ee:0002:1:0
+RealmadridTV
+p:BSkyB
+1839:011c0000:07d9:0002:1:0
+Discovery
+p:BSkyB
+c739:011c0000:096b:0002:1:0
+mta-muslim tv
+p:BSkyB
+d039:011c0000:090a:0002:1:0
+Aastha TV
+p:BSkyB
+113a:011c0000:07db:0002:1:0
+TV5
+p:BSkyB
+153a:011c0000:07e7:0002:1:0
+Sky Sports 4
+p:BSkyB
+183a:011c0000:07d9:0002:1:0
+Animal Planet
+p:BSkyB
+d43a:011c0000:0a2c:0002:1:0
+Elite TV
+p:BSkyB
+183b:011c0000:07d9:0002:1:0
+Disc.RealTime
+p:BSkyB
+253b:011c0000:0a34:0002:1:0
+TV SHOP
+p:BSkyB
+183c:011c0000:07d9:0002:1:0
+Discovery+1
+p:BSkyB
+253c:011c0000:0a34:0002:1:0
+CBS Reality
+p:BSkyB
+183d:011c0000:07d9:0002:1:0
+Travel & Living
+p:BSkyB
+253d:011c0000:0a34:0002:1:0
+JML Active
+p:BSkyB
+283d:011c0000:07fe:0002:1:0
+BBC 1 W Mids
+p:BSkyB
+c73d:011c0000:096b:0002:1:0
+Word Network
+p:BSkyB
+183e:011c0000:07d9:0002:1:0
+Disc.Science
+p:BSkyB
+1c3e:011c0000:07e1:0002:1:0
+QVC
+p:BSkyB
+233e:011c0000:0967:0002:1:0
+Arsenal TV
+p:BSkyB
+283e:011c0000:07fe:0002:1:0
+BBC 1 N West
+p:BSkyB
+c73e:011c0000:096b:0002:1:0
+SuperCasino
+p:BSkyB
+d03e:011c0000:090a:0002:1:0
+Ideal World
+p:BSkyB
+183f:011c0000:07d9:0002:1:0
+Disc.Knowldge
+p:BSkyB
+1c3f:011c0000:07e1:0002:1:0
+QVC Test
+p:BSkyB
+253f:011c0000:0a34:0002:1:0
+Record TV
+p:BSkyB
+283f:011c0000:07fe:0002:1:0
+BBC 1 Yrks&Lin
+p:BSkyB
+d43f:011c0000:0a2c:0002:1:0
+The Style Ntwk
+p:BSkyB
+1840:011c0000:07d9:0002:1:0
+Home & Health
+p:BSkyB
+2540:011c0000:0a34:0002:1:0
+Sangat
+p:BSkyB
+2840:011c0000:07fe:0002:1:0
+BBC 1 Yorks
+p:BSkyB
+d740:011c0000:0a34:0002:1:0
+Gems.tv 2
+p:BSkyB
+1841:011c0000:07d9:0002:1:0
+Disc.Turbo
+p:BSkyB
+2441:011c0000:07f9:0002:1:0
+c4 l
+p:BSkyB
+2541:011c0000:0a34:0002:1:0
+JML Home&DIY
+p:BSkyB
+2841:011c0000:07fe:0002:1:0
+BBC 1 E Mids
+p:BSkyB
+cd41:011c0000:0902:0002:1:0
+Screenshop2
+p:BSkyB
+1842:011c0000:07d9:0002:1:0
+Discovery
+p:BSkyB
+2842:011c0000:07fe:0002:1:0
+BBC 1 East (E)
+p:BSkyB
+cd42:011c0000:0902:0002:1:0
+speedauctiontv
+p:BSkyB
+1843:011c0000:07d9:0002:1:0
+QUEST
+p:BSkyB
+c743:011c0000:096b:0002:1:0
+CCTV News
+p:BSkyB
+d043:011c0000:090a:0002:1:0
+High Street TV
+p:BSkyB
+2f44:011c0000:07f4:0002:1:0
+ITV1 Mer SE
+p:BSkyB
+d444:011c0000:0a2c:0002:1:0
+ComedyCtrl+1
+p:BSkyB
+2f45:011c0000:07f4:0002:1:0
+ITV1 Mer N
+p:BSkyB
+d745:011c0000:0a34:0002:1:0
+Sunrise TV
+p:BSkyB
+cd46:011c0000:0902:0002:1:0
+Bloomberg
+p:BSkyB
+d746:011c0000:0a34:0002:1:0
+Gems.tv 1
+p:BSkyB
+1647:011c0000:07e9:0002:1:0
+Nat Geo Wild
+p:BSkyB
+d747:011c0000:0a34:0002:1:0
+DBN
+p:BSkyB
+cb48:011c0000:0907:0002:1:0
+SportxxxGirls
+p:BSkyB
+d048:011c0000:090a:0002:1:0
+Ideal Extra
+p:BSkyB
+d748:011c0000:0a34:0002:1:0
+Stop + Shop
+p:BSkyB
+d449:011c0000:0a2c:0002:1:0
+OceanFinance
+p:BSkyB
+d749:011c0000:0a33:0002:1:0
+AIT Int'l
+p:BSkyB
+1f4a:011c0000:07d4:0002:1:0
+8010
+p:BSkyB
+c74b:011c0000:096b:0002:1:0
+Inspiration
+p:BSkyB
+cd4b:011c0000:0902:0002:1:0
+Glory TV
+p:BSkyB
+d74b:011c0000:0a2b:0002:1:0
+Body In Balance
+p:BSkyB
+274c:011c0000:07fc:0002:1:0
+ITV1 London
+p:BSkyB
+cc4c:011c0000:096a:0002:1:0
+Flava
+p:BSkyB
+d04d:011c0000:090a:0002:1:0
+Create & Craft
+p:BSkyB
+164e:011c0000:07e9:0002:1:0
+Eurosport UK
+p:BSkyB
+2f4e:011c0000:07f4:0002:1:0
+ITV1 Anglia W
+p:BSkyB
+164f:011c0000:07e9:0002:1:0
+5711
+p:BSkyB
+d74f:011c0000:0a33:0002:1:0
+OHTV
+p:BSkyB
+1a50:011c0000:07dd:0002:1:0
+BBC ALBA
+p:BSkyB
+2851:011c0000:07fe:0002:1:0
+ETV5
+p:BSkyB
+cc51:011c0000:096a:0002:1:0
+Bliss
+p:BSkyB
+1652:011c0000:07e9:0002:1:0
+TCM
+p:BSkyB
+1c52:011c0000:07e1:0002:1:0
+bid tv
+p:BSkyB
+cb52:011c0000:0907:0002:1:0
+Northern Birds
+p:BSkyB
+d052:011c0000:090a:0002:1:0
+Club Paradiso
+p:BSkyB
+d453:011c0000:0a2c:0002:1:0
+Nick Jr
+p:BSkyB
+c355:011c0000:07ef:0002:1:0
+1356
+p:BSkyB
+d155:011c0000:090c:0002:1:0
+CelebrityShop
+p:BSkyB
+d355:011c0000:0a2a:0002:1:0
+wedding tv asia
+p:BSkyB
+1456:011c0000:07eb:0002:1:0
+Sky Arts 2
+p:BSkyB
+2756:011c0000:07fc:0002:1:0
+ITV2
+p:BSkyB
+cc56:011c0000:096a:0002:1:0
+Scuzz
+p:BSkyB
+d156:011c0000:090c:0002:1:0
+ChatGirl TV2
+p:BSkyB
+d356:011c0000:0a2a:0002:1:0
+Travel Channel
+p:BSkyB
+2457:011c0000:07ee:0002:1:0
+Pub Channel
+p:BSkyB
+2757:011c0000:07fc:0002:1:0
+CITV
+p:BSkyB
+c757:011c0000:096b:0002:1:0
+SouthForYou
+p:BSkyB
+d057:011c0000:090a:0002:1:0
+Motors TV
+p:BSkyB
+d157:011c0000:090c:0002:1:0
+Tease Me TV2
+p:BSkyB
+d357:011c0000:0a2a:0002:1:0
+Rocks TV
+p:BSkyB
+0458:011c0000:0909:0002:1:0
+53205
+p:BSkyB
+2758:011c0000:07fc:0002:1:0
+ITV4
+p:BSkyB
+2f58:011c0000:07f4:0002:1:0
+ITV1 Yorks E
+p:BSkyB
+c758:011c0000:096b:0002:1:0
+FRANCE 24
+p:BSkyB
+cb58:011c0000:0907:0002:1:0
+Controversial tv
+p:BSkyB
+d158:011c0000:090c:0002:1:0
+Climax3 - 1
+p:BSkyB
+d358:011c0000:0a2a:0002:1:0
+Euronews
+p:BSkyB
+d458:011c0000:0a2c:0002:1:0
+Pitch World 
+p:BSkyB
+1b59:011c0000:07da:0002:1:0
+MTV
+p:BSkyB
+c759:011c0000:096b:0002:1:0
+TBN Europe
+p:BSkyB
+d159:011c0000:090c:0002:1:0
+Climax3 - 2
+p:BSkyB
+1b5a:011c0000:07da:0002:1:0
+VH1
+p:BSkyB
+d15a:011c0000:090c:0002:1:0
+Climax3 - 3
+p:BSkyB
+d35a:011c0000:0a2a:0002:1:0
+JML Cookshop
+p:BSkyB
+1b5b:011c0000:07da:0002:1:0
+MTV ROCKS
+p:BSkyB
+c75b:011c0000:096b:0002:1:0
+GOD Channel
+p:BSkyB
+cc5b:011c0000:096a:0002:1:0
+DanceNationTV
+p:BSkyB
+d15b:011c0000:090c:0002:1:0
+Adult Channel
+p:BSkyB
+d35b:011c0000:0a2a:0002:1:0
+SAB TV
+p:BSkyB
+cb5c:011c0000:0907:0002:1:0
+BET +1
+p:BSkyB
+d15c:011c0000:090c:0002:1:0
+Playboy TV
+p:BSkyB
+125d:011c0000:07ee:0002:1:0
+Sky 1
+p:BSkyB
+1b5d:011c0000:07da:0002:1:0
+MTV+1 
+p:BSkyB
+d15d:011c0000:090c:0002:1:0
+Top Shelf TV
+p:BSkyB
+d35d:011c0000:0a2a:0002:1:0
+O'seasproperty
+p:BSkyB
+d45d:011c0000:0a2c:0002:1:0
+54365
+p:BSkyB
+1b5e:011c0000:07da:0002:1:0
+MTV HITS
+p:BSkyB
+d15e:011c0000:090c:0002:1:0
+40 n Naughty
+p:BSkyB
+d35e:011c0000:0a2a:0002:1:0
+CBS Action
+p:BSkyB
+125f:011c0000:07ee:0002:1:0
+Sky1
+p:BSkyB
+1b5f:011c0000:07da:0002:1:0
+MTV BASE
+p:BSkyB
+1260:011c0000:07ea:0002:1:0
+Sky News
+p:BSkyB
+1b60:011c0000:07da:0002:1:0
+MTV CLASSIC
+p:BSkyB
+2760:011c0000:07fc:0002:1:0
+ITV1 Granada
+p:BSkyB
+cc60:011c0000:096a:0002:1:0
+True Movies
+p:BSkyB
+d360:011c0000:0a2a:0002:1:0
+Best Direct
+p:BSkyB
+1261:011c0000:07eb:0002:1:0
+Sky1
+p:BSkyB
+1b61:011c0000:07da:0002:1:0
+VIVA
+p:BSkyB
+d061:011c0000:090a:0002:1:0
+MUTV
+p:BSkyB
+d361:011c0000:0a2a:0002:1:0
+Bilberry TV
+p:BSkyB
+1262:011c0000:07ea:0002:1:0
+Sky News
+p:BSkyB
+1b62:011c0000:07da:0002:1:0
+MTV
+p:BSkyB
+2462:011c0000:07ee:0002:1:0
+Sky Sports 2
+p:BSkyB
+2f62:011c0000:07f4:0002:1:0
+ITV1 TT S
+p:BSkyB
+2463:011c0000:07ef:0002:1:0
+At The Races
+p:BSkyB
+1b64:011c0000:07da:0002:1:0
+MTV SHOWS
+p:BSkyB
+2464:011c0000:0963:0002:1:0
+ISM Sky1 v6
+p:BSkyB
+1965:011c0000:07d6:0002:1:0
+Home
+p:BSkyB
+2465:011c0000:0963:0002:1:0
+ISM Sports 1 v6
+p:BSkyB
+cc65:011c0000:096a:0002:1:0
+True Movies 2
+p:BSkyB
+1266:011c0000:07ea:0002:1:0
+Sky News UK (Cable)
+p:BSkyB
+1966:011c0000:07d6:0002:1:0
+Eden
+p:BSkyB
+1b66:011c0000:07da:0002:1:0
+MTV DANCE
+p:BSkyB
+2466:011c0000:0963:0002:1:0
+9318
+p:BSkyB
+cb66:011c0000:0907:0002:1:0
+Press TV
+p:BSkyB
+d066:011c0000:090a:0002:1:0
+Jewellery Ch.
+p:BSkyB
+1267:011c0000:07ea:0002:1:0
+Sky News Eire (Cable)
+p:BSkyB
+2467:011c0000:0963:0002:1:0
+9319
+p:BSkyB
+1968:011c0000:07d6:0002:1:0
+GOLD
+p:BSkyB
+bf68:011c0000:0963:0002:1:0
+ (sub b +1000)
+p:BSkyB
+d368:011c0000:0a2a:0002:1:0
+JML Choice
+p:BSkyB
+1969:011c0000:07d6:0002:1:0
+YeSTERDAY
+p:BSkyB
+196a:011c0000:07d6:0002:1:0
+Dave
+p:BSkyB
+1a6a:011c0000:07dd:0002:1:0
+ETV3
+p:BSkyB
+246a:011c0000:0963:0002:1:0
+EIA2 Test
+p:BSkyB
+276a:011c0000:07fc:0002:1:0
+ITV1 Anglia E
+p:BSkyB
+cc6a:011c0000:096a:0002:1:0
+Tiny Pop
+p:BSkyB
+196b:011c0000:07d6:0002:1:0
+UKTV Food +1
+p:BSkyB
+196c:011c0000:07d6:0002:1:0
+Good Food
+p:BSkyB
+206c:011c0000:07fa:0002:1:0
+E4+1
+p:BSkyB
+2f6c:011c0000:07f4:0002:1:0
+ITV1 Central SW
+p:BSkyB
+1b6d:011c0000:07da:0002:1:0
+MTV Trax
+p:BSkyB
+286f:011c0000:0800:0002:1:0
+BBC 1 West
+p:BSkyB
+cc6f:011c0000:096a:0002:1:0
+NME TV
+p:BSkyB
+1070:011c0000:07e5:0002:1:0
+Sky Sports 2
+p:BSkyB
+1270:011c0000:07ee:0002:1:0
+Sky News+1
+p:BSkyB
+1970:011c0000:07d6:0002:1:0
+Uktv Docs~
+p:BSkyB
+2470:011c0000:0963:0002:1:0
+9328
+p:BSkyB
+2870:011c0000:0800:0002:1:0
+BBC 1 S East
+p:BSkyB
+d070:011c0000:090a:0002:1:0
+Ideal & More
+p:BSkyB
+1771:011c0000:07d2:0002:1:0
+LIVING
+p:BSkyB
+2071:011c0000:07fa:0002:1:0
+E4
+p:BSkyB
+2871:011c0000:0800:0002:1:0
+BBC 1 South
+p:BSkyB
+1772:011c0000:07d2:0002:1:0
+Challenge
+p:BSkyB
+2872:011c0000:0800:0002:1:0
+BBC 1 S West
+p:BSkyB
+1773:011c0000:07d2:0002:1:0
+LIVING Loves
+p:BSkyB
+2473:011c0000:0963:0002:1:0
+SOM Trigger Test
+p:BSkyB
+2773:011c0000:0801:0002:1:0
+G49
+p:BSkyB
+2873:011c0000:0800:0002:1:0
+BBC 1 NE & C
+p:BSkyB
+1774:011c0000:07d2:0002:1:0
+Bravo
+p:BSkyB
+2774:011c0000:07fc:0002:1:0
+ITV1 Central W
+p:BSkyB
+2874:011c0000:0800:0002:1:0
+BBC 1 Oxford
+p:BSkyB
+cc74:011c0000:096a:0002:1:0
+POP
+p:BSkyB
+1775:011c0000:07d2:0002:1:0
+LIVING +1
+p:BSkyB
+1975:011c0000:07d6:0002:1:0
+7611
+p:BSkyB
+cf75:011c0000:0908:0002:1:0
+movies4men
+p:BSkyB
+1076:011c0000:07e5:0002:1:0
+Sky Sports 1
+p:BSkyB
+1776:011c0000:07d2:0002:1:0
+Bravo+1
+p:BSkyB
+1976:011c0000:07d6:0002:1:0
+UK Food~
+p:BSkyB
+cf76:011c0000:0908:0002:1:0
+movies4men 2
+p:BSkyB
+1777:011c0000:07d2:0002:1:0
+LIVINGit
+p:BSkyB
+2077:011c0000:07fa:0002:1:0
+Channel 4 +1
+p:BSkyB
+2477:011c0000:0963:0002:1:0
+8N2
+p:BSkyB
+d377:011c0000:0a2a:0002:1:0
+Believe TV
+p:BSkyB
+1078:011c0000:07e5:0002:1:0
+Sky Sports 1
+p:BSkyB
+1778:011c0000:07d2:0002:1:0
+Channel One
+p:BSkyB
+1978:011c0000:07d6:0002:1:0
+Watch
+p:BSkyB
+2078:011c0000:07fa:0002:1:0
+Channel 4 +1
+p:BSkyB
+2478:011c0000:0963:0002:1:0
+EIA2 Test 5
+p:BSkyB
+1979:011c0000:07d6:0002:1:0
+alibi
+p:BSkyB
+2079:011c0000:07fa:0002:1:0
+Channel 4 +1
+p:BSkyB
+cc79:011c0000:096a:0002:1:0
+Tiny Pop +1
+p:BSkyB
+cf79:011c0000:0908:0002:1:0
+Sahara One
+p:BSkyB
+197a:011c0000:07d6:0002:1:0
+Blighty
+p:BSkyB
+207a:011c0000:07fa:0002:1:0
+Channel 4 +1
+p:BSkyB
+107b:011c0000:07e5:0002:1:0
+Sky Sports 3
+p:BSkyB
+207b:011c0000:07fa:0002:1:0
+Channel 4 +1
+p:BSkyB
+177c:011c0000:07d2:0002:1:0
+Challenge+
+p:BSkyB
+1a7c:011c0000:07dd:0002:1:0
+T7 STRM-0
+p:BSkyB
+207c:011c0000:07fa:0002:1:0
+Channel 4 +1
+p:BSkyB
+247c:011c0000:07ef:0002:1:0
+SkyPoker.com
+p:BSkyB
+c47c:011c0000:0964:0002:1:0
+ComedyCtrl+1
+p:BSkyB
+cf7c:011c0000:0908:0002:1:0
+PTV Global
+p:BSkyB
+d37c:011c0000:0a2a:0002:1:0
+Horse & Country
+p:BSkyB
+107d:011c0000:07e5:0002:1:0
+Sky Sports 1
+p:BSkyB
+1a7d:011c0000:07dd:0002:1:0
+T7 STRM-1
+p:BSkyB
+247d:011c0000:07ef:0002:1:0
+Sky Vegas
+p:BSkyB
+107e:011c0000:07ea:0002:1:0
+Sky Sports 2
+p:BSkyB
+157e:011c0000:07d7:0002:1:0
+Sky DramaRom
+p:BSkyB
+177e:011c0000:07d2:0002:1:0
+Bravo+
+p:BSkyB
+277e:011c0000:07fc:0002:1:0
+10110
+p:BSkyB
+cf7e:011c0000:0908:0002:1:0
+jazeerachildren
+p:BSkyB
+277f:011c0000:07fc:0002:1:0
+10111
+p:BSkyB
+cc7f:011c0000:096a:0002:1:0
+Kix!
+p:BSkyB
+bb80:011c0000:0963:0002:1:0
+___4110
+p:BSkyB
+1581:011c0000:07ea:0002:1:0
+Sky Sports 2
+p:BSkyB
+1b81:011c0000:07da:0002:1:0
+Mti
+p:BSkyB
+2481:011c0000:07ef:0002:1:0
+1429
+p:BSkyB
+2581:011c0000:07fb:0002:1:0
+RTE One
+p:BSkyB
+c481:011c0000:0964:0002:1:0
+ComedyCentral
+p:BSkyB
+2482:011c0000:07e9:0002:1:0
+Chelsea TV
+p:BSkyB
+2582:011c0000:07fb:0002:1:0
+RTE TWO
+p:BSkyB
+2583:011c0000:07fb:0002:1:0
+TG4
+p:BSkyB
+2883:011c0000:0800:0002:1:0
+ETV6
+p:BSkyB
+cc83:011c0000:096a:0002:1:0
+The Vault
+p:BSkyB
+2484:011c0000:07ef:0002:1:0
+Crime
+p:BSkyB
+2584:011c0000:07fb:0002:1:0
+9604
+p:BSkyB
+cb84:011c0000:08fd:0002:1:0
+Travel Ch +1
+p:BSkyB
+1c85:011c0000:07e6:0002:1:0
+S4C
+p:BSkyB
+2585:011c0000:07fb:0002:1:0
+TV3
+p:BSkyB
+1586:011c0000:07ea:0002:1:0
+Disney XD+1
+p:BSkyB
+1a86:011c0000:07dd:0002:1:0
+ETV1.
+p:BskyB
+2486:011c0000:07ef:0002:1:0
+Disney XD
+p:BSkyB
+c486:011c0000:0964:0002:1:0
+GayDateTV
+p:BSkyB
+cb86:011c0000:08fd:0002:1:0
+CBS Reality+1
+p:BSkyB
+d386:011c0000:0a2a:0002:1:0
+JML Direct
+p:BSkyB
+cb87:011c0000:08fd:0002:1:0
+3e
+p:BSkyB
+1788:011c0000:07d2:0002:1:0
+Bravo~
+p:BSkyB
+2788:011c0000:0805:0002:1:0
+ITV1 Border
+p:BSkyB
+cb88:011c0000:08fd:0002:1:0
+Max TV
+p:BSkyB
+cb89:011c0000:08fd:0002:1:0
+horror channel
+p:BSkyB
+cc89:011c0000:096a:0002:1:0
+PopGirl
+p:BSkyB
+168a:011c0000:07e9:0002:1:0
+E! Entertainm
+p:BSkyB
+cb8a:011c0000:08fd:0002:1:0
+Gay Network 
+p:BSkyB
+138b:011c0000:0968:0002:1:0
+History +1 hour
+p:BSkyB
+158b:011c0000:07e5:0002:1:0
+FX
+p:BSkyB
+c48b:011c0000:0964:0002:1:0
+Channel M
+p:BSkyB
+cb8b:011c0000:08fd:0002:1:0
+Wonderful
+p:BSkyB
+138c:011c0000:07dc:0002:1:0
+Sky Intro
+p:BSkyB
+1c8c:011c0000:07e6:0002:1:0
+7308
+p:BSkyB
+cb8c:011c0000:08fd:0002:1:0
+STAR Plus
+p:BSkyB
+cb8d:011c0000:08fd:0002:1:0
+Thane Direct
+p:BSkyB
+cc8d:011c0000:096a:0002:1:0
+Chart Show TV
+p:BSkyB
+cb8e:011c0000:08fd:0002:1:0
+DM Digital
+p:BSkyB
+cb8f:011c0000:08fd:0002:1:0
+CNBC
+p:BSkyB
+2490:011c0000:07ef:0002:1:0
+At The Races
+p:BSkyB
+cb90:011c0000:08fd:0002:1:0
+Africa Channel
+p:BSkyB
+1091:011c0000:07ef:0002:1:0
+ESPN
+p:BSkyB
+1391:011c0000:07e7:0002:1:0
+Eurosport2 UK
+p:BSkyB
+1591:011c0000:07e5:0002:1:0
+Cartoonito
+p:BSkyB
+cb91:011c0000:08fd:0002:1:0
+STAR Gold
+p:BSkyB
+1592:011c0000:07e5:0002:1:0
+TCM 2
+p:BSkyB
+2792:011c0000:0805:0002:1:0
+ITV1 TT N
+p:BSkyB
+cc92:011c0000:096a:0002:1:0
+PopGirl +1
+p:BSkyB
+2094:011c0000:07fa:0002:1:0
+More4
+p:BSkyB
+cb94:011c0000:08fe:0002:1:0
+Open Access 3
+p:BSkyB
+d395:011c0000:0a2a:0002:1:0
+Fitness TV
+p:BSkyB
+cb96:011c0000:08fe:0002:1:0
+SmartLive
+p:BSkyB
+2797:011c0000:0805:0002:1:0
+Men & Motors
+p:BSkyB
+cc97:011c0000:096a:0002:1:0
+True Ent
+p:BSkyB
+b798:011c0000:0963:0002:1:0
+___4109
+p:BSkyB
+cf98:011c0000:0908:0002:1:0
+Venus TV
+p:BSkyB
+1199:011c0000:0966:0002:1:0
+Sky Preview
+p:BSkyB
+cb99:011c0000:08fe:0002:1:0
+mov4men2 +1
+p:BSkyB
+cf99:011c0000:0908:0002:1:0
+Vintage TV
+p:BSkyB
+c49a:011c0000:0964:0002:1:0
+Dating Channel
+p:BSkyB
+cb9b:011c0000:08fe:0002:1:0
+Rural TV
+p:BSkyB
+279c:011c0000:0805:0002:1:0
+ITV1 Meridian S
+p:BSkyB
+139d:011c0000:0807:0002:1:0
+NDTV 24x7
+p:BSkyB
+189d:011c0000:07fd:0002:1:0
+BBC 1 London
+p:BSkyB
+279d:011c0000:0805:0002:1:0
+ITV1 Meridian E
+p:BSkyB
+cb9d:011c0000:08fe:0002:1:0
+Showcase
+p:BSkyB
+189e:011c0000:07fd:0002:1:0
+BBC 2 England
+p:BSkyB
+119f:011c0000:07e5:0002:1:0
+Sky Sports 3
+p:BSkyB
+c49f:011c0000:0964:0002:1:0
+Islam Channel
+p:BSkyB
+c69f:011c0000:0969:0002:1:0
+Russia Today
+p:BSkyB
+cb9f:011c0000:08fe:0002:1:0
+revelation
+p:BSkyB
+11a1:011c0000:07e5:0002:1:0
+Sky Sports 3
+p:BSkyB
+13a1:011c0000:0807:0002:1:0
+Current TV
+p:BSkyB
+d7a1:011c0000:0900:0002:1:0
+House Of Fun
+p:BSkyB
+18a2:011c0000:07fd:0002:1:0
+ETV
+p:BSkyB
+d7a2:011c0000:0900:0002:1:0
+Starz TV
+p:BSkyB
+11a3:011c0000:07dc:0002:1:0
+Sky Intro
+p:BSkyB
+c7a3:011c0000:096c:0002:1:0
+Al Jazeera Eng
+p:BSkyB
+cba3:011c0000:08fe:0002:1:0
+Sikh TV
+p:BSkyB
+c7a4:011c0000:096c:0002:1:0
+NHK World TV
+p:BSkyB
+d7a4:011c0000:0900:0002:1:0
+Lucky Star
+p:BSkyB
+18a5:011c0000:07fd:0002:1:0
+BBC TES 2
+p:BSkyB
+d7a5:011c0000:0900:0002:1:0
+Brit Asia TV
+p:BSkyB
+27a6:011c0000:0805:0002:1:0
+ITV1 Anglia S
+p:BSkyB
+c7a6:011c0000:096c:0002:1:0
+Hallmark +1
+p:BSkyB
+cba6:011c0000:08fe:0002:1:0
+B4U Movies
+p:BSkyB
+2fa7:011c0000:07f4:0002:1:0
+12199
+p:BSkyB
+c7a7:011c0000:096c:0002:1:0
+Setanta Ireland
+p:BSkyB
+cba7:011c0000:08fe:0002:1:0
+B4U Music
+p:BSkyB
+d7a7:011c0000:0900:0002:1:0
+Babestation
+p:BSkyB
+c5a8:011c0000:0967:0002:1:0
+Racing UK
+p:BSkyB
+c7a8:011c0000:096c:0002:1:0
+Setanta Sports1
+p:BSkyB
+16a9:011c0000:07eb:0002:1:0
+1871 SOM Test
+p:BSkyB
+c7a9:011c0000:096c:0002:1:0
+Premier Sports
+p:BSkyB
+d7a9:011c0000:0900:0002:1:0
+NDTV Imagine
+p:BSkyB
+16aa:011c0000:07eb:0002:1:0
+CommunityChnl
+p:BSkyB
+d7aa:011c0000:0900:0002:1:0
+STAR One
+p:BSkyB
+18ab:011c0000:07fd:0002:1:0
+BBC TES 3
+p:BSkyB
+c7ab:011c0000:096c:0002:1:0
+Prem Spts Xtra
+p:BSkyB
+d7ab:011c0000:0900:0002:1:0
+ComedyCtlX+1
+p:BSkyB
+16ac:011c0000:07eb:0002:1:0
+FOX News
+p:BSkyB
+18ac:011c0000:07fd:0002:1:0
+BBC FOUR
+p:BSkyB
+d7ac:011c0000:0900:0002:1:0
+Babeworld.tv
+p:BSkyB
+11ad:011c0000:07dc:0002:1:0
+Sky Intro
+p:BSkyB
+18ad:011c0000:07fd:0002:1:0
+CBBC Channel
+p:BSkyB
+c5ad:011c0000:0967:0002:1:0
+SupremeMastr
+p:BSkyB
+d7ad:011c0000:0900:0002:1:0
+Takbeer TV
+p:BSkyB
+18ae:011c0000:07fd:0002:1:0
+CBeebies
+p:BSkyB
+c4ae:011c0000:0964:0002:1:0
+Extreme Sports
+p:BSkyB
+d7ae:011c0000:0900:0002:1:0
+My Channel
+p:BSkyB
+18af:011c0000:07fd:0002:1:0
+BBC THREE
+p:BSkyB
+1db0:011c0000:07df:0002:1:0
+Home+1
+p:BSkyB
+27b0:011c0000:0805:0002:1:0
+ITV1 Yorks W
+p:BSkyB
+ccb0:011c0000:090b:0002:1:0
+Investigation
+p:BSkyB
+1db1:011c0000:07df:0002:1:0
+7601
+p:BSkyB
+c6b1:011c0000:0969:0002:1:0
+PTV Prime
+p:BSkyB
+c5b2:011c0000:0967:0002:1:0
+Sikh Channel
+p:BSkyB
+c6b2:011c0000:0969:0002:1:0
+Abu Dhabi TV
+p:BSkyB
+1db5:011c0000:07df:0002:1:0
+GOLD +1
+p:BSkyB
+27b5:011c0000:0805:0002:1:0
+ITV2+1
+p:BSkyB
+ccb5:011c0000:090b:0002:1:0
+Animal Plnt+1
+p:BSkyB
+d7b5:011c0000:0900:0002:1:0
+WatchmeTV.TV
+p:BSkyB
+1db6:011c0000:07df:0002:1:0
+Uktv Gold+1~
+p:BSkyB
+c5b7:011c0000:0967:0002:1:0
+Film24
+p:BSkyB
+13b8:011c0000:07ef:0002:1:0
+Sky Active Ads
+p:BSkyB
+15b8:011c0000:0804:0002:1:0
+Nickelodeon
+p:BSkyB
+c4b8:011c0000:0964:0002:1:0
+Tease Me
+p:BSkyB
+15b9:011c0000:0804:0002:1:0
+Nick Replay
+p:BSkyB
+27b9:011c0000:0805:0002:1:0
+G53
+p:BSkyB
+15ba:011c0000:0804:0002:1:0
+Nicktoons
+p:BSkyB
+1dba:011c0000:07df:0002:1:0
+Eden+1
+p:BSkyB
+ccba:011c0000:090b:0002:1:0
+Disc.Sci+1
+p:BSkyB
+d7ba:011c0000:0900:0002:1:0
+Psychic TV
+p:BSkyB
+15bb:011c0000:0804:0002:1:0
+Nick Jr.
+p:BSkyB
+18bb:011c0000:07fd:0002:1:0
+BBC 1 NI
+p:BSkyB
+d3bb:011c0000:0a2b:0002:1:0
+Noor TV
+p:BSkyB
+14bc:011c0000:07e7:0002:1:0
+S1Test
+p:BSkyB
+1bbc:011c0000:07e2:0002:1:0
+Cartoon Netwrk
+p:BSkyB
+c5bc:011c0000:0967:0002:1:0
+ESPN America
+p:BSkyB
+d3bc:011c0000:0a2b:0002:1:0
+Jackpot
+p:BSkyB
+d7bc:011c0000:0900:0002:1:0
+Ahlulbayt TV
+p:BSkyB
+1bbd:011c0000:07e2:0002:1:0
+Boomerang +1
+p:BSkyB
+d3bd:011c0000:0a2b:0002:1:0
+Luxe TV
+p:BSkyB
+1bbe:011c0000:07e2:0002:1:0
+Boomerang
+p:BSkyB
+c6be:011c0000:0969:0002:1:0
+PCNE Chinese
+p:BSkyB
+cbbe:011c0000:08fe:0002:1:0
+Gospel Channel
+p:BSkyB
+18bf:011c0000:07fd:0002:1:0
+FIVE
+p:BSkyB
+1bbf:011c0000:07e2:0002:1:0
+CN Too
+p:BSkyB
+1dbf:011c0000:07df:0002:1:0
+Watch +1
+p:BSkyB
+cbbf:011c0000:08fe:0002:1:0
+AAJ TAK
+p:BSkyB
+ccbf:011c0000:090b:0002:1:0
+DMAX
+p:BSkyB
+d7bf:011c0000:0a35:0002:1:0
+Television X
+p:BSkyB
+1dc0:011c0000:07df:0002:1:0
+7616
+p:BSkyB
+c6c0:011c0000:0969:0002:1:0
+Information TV
+p:BSkyB
+d3c0:011c0000:0a2b:0002:1:0
+HiTV
+p:BSkyB
+d7c0:011c0000:0a35:0002:1:0
+TVX Amateur
+p:BSkyB
+c5c1:011c0000:0967:0002:1:0
+LiverpoolFCTV
+p:BSkyB
+c6c1:011c0000:0969:0002:1:0
+Showcase 2
+p:BSkyB
+d7c1:011c0000:0a35:0002:1:0
+Primetime
+p:BSkyB
+c4c2:011c0000:0964:0002:1:0
+Tease Me 3
+p:BSkyB
+cbc2:011c0000:08fe:0002:1:0
+Renault TV
+p:BSkyB
+d7c2:011c0000:0a35:0002:1:0
+TVX Brits
+p:BSkyB
+d3c3:011c0000:0a2b:0002:1:0
+LOVEWORLD TV
+p:BSkyB
+d7c3:011c0000:0a35:0002:1:0
+redhot amateur
+p:BSkyB
+1bc4:011c0000:07e2:0002:1:0
+Toonami I
+p:BSkyB
+1dc4:011c0000:07df:0002:1:0
+Really
+p:BSkyB
+cbc4:011c0000:08fe:0002:1:0
+Audi Channel
+p:BSkyB
+ccc4:011c0000:090b:0002:1:0
+DMAX+1
+p:BSkyB
+d3c4:011c0000:0a2b:0002:1:0
+UCTV
+p:BSkyB
+d7c4:011c0000:0a35:0002:1:0
+redhot 40+
+p:BSkyB
+1bc5:011c0000:07e2:0002:1:0
+Cartoon I
+p:BSkyB
+1dc5:011c0000:07df:0002:1:0
+UKTV Docs+1~
+p:BSkyB
+d3c5:011c0000:0a2b:0002:1:0
+Cream
+p:BSkyB
+c5c6:011c0000:0967:0002:1:0
+Channel AKA
+p:BSkyB
+cbc6:011c0000:08fe:0002:1:0
+NTV
+p:BSkyB
+d7c6:011c0000:0a35:0002:1:0
+redhot fetish
+p:BSkyB
+d7c7:011c0000:0a35:0002:1:0
+redhot Mums
+p:BSkyB
+1dc8:011c0000:07df:0002:1:0
+Dave ja vu
+p:BSkyB
+d7c8:011c0000:0a35:0002:1:0
+redhot TV
+p:BSkyB
+1dc9:011c0000:07df:0002:1:0
+UKTV G2+1.
+p:BSkyB
+c7c9:011c0000:0969:0002:1:0
+BabyTV
+p:BSkyB
+cbc9:011c0000:08fd:0002:1:0
+Crime+1
+p:BSkyB
+ccc9:011c0000:090b:0002:1:0
+DMAX+2
+p:BSkyB
+1dca:011c0000:07df:0002:1:0
+Good Food +1
+p:BSkyB
+cbca:011c0000:08fd:0002:1:0
+Jackpot Games
+p:BSkyB
+d7ca:011c0000:0a35:0002:1:0
+Filth
+p:BSkyB
+c5cb:011c0000:0967:0002:1:0
+Entrepreneur
+p:BSkyB
+d7cb:011c0000:0a35:0002:1:0
+Gay TV
+p:BSkyB
+12cc:011c0000:0966:0002:1:0
+
+p:
+10ce:011c0000:07d7:0002:1:0
+Sky Action
+p:BSkyB
+1dce:011c0000:07df:0002:1:0
+alibi +1
+p:BSkyB
+ccce:011c0000:090b:0002:1:0
+QUEST+1
+p:BSkyB
+d7ce:011c0000:0a35:0002:1:0
+Dirty Talk
+p:BSkyB
+10cf:011c0000:07d7:0002:1:0
+Sky Comedy
+p:BSkyB
+d7cf:011c0000:0a35:0002:1:0
+The Active Ch
+p:BSkyB
+10d0:011c0000:07d7:0002:1:0
+Sky ScFi/Horror
+p:BSkyB
+20d0:011c0000:07ea:0002:1:0
+8039
+p:BSkyB
+c5d0:011c0000:0967:0002:1:0
+Q
+p:BSkyB
+cfd0:011c0000:0909:0002:1:0
+E! Entertainm
+p:BSkyB
+10d1:011c0000:07d7:0002:1:0
+Sky Classics
+p:BSkyB
+10d2:011c0000:07d7:0002:1:0
+Sky Indie
+p:BSkyB
+ccd3:011c0000:090b:0002:1:0
+Disc.Know.+1
+p:BSkyB
+d7d3:011c0000:0900:0002:1:0
+N'toons Replay
+p:BSkyB
+c5d5:011c0000:0967:0002:1:0
+Magic
+p:BSkyB
+cfd5:011c0000:0909:0002:1:0
+ESPN Classic
+p:BSkyB
+17d7:011c0000:07df:0002:1:0
+6103
+p:BSkyB
+c6d7:011c0000:0900:0002:1:0
+CBS Drama
+p:BSkyB
+27d8:011c0000:0806:0002:1:0
+ITV Channel Is
+p:BSkyB
+ccd8:011c0000:090b:0002:1:0
+Discovery Shed
+p:BSkyB
+d6d9:011c0000:0a33:0002:1:0
+DAYSTAR
+p:BSkyB
+c5da:011c0000:0967:0002:1:0
+ESPN
+p:BSkyB
+cfda:011c0000:0909:0002:1:0
+Sumo TV
+p:BSkyB
+d6da:011c0000:0a33:0002:1:0
+BEN
+p:BSkyB
+d6db:011c0000:0908:0002:1:0
+Nollywood
+p:BSkyB
+ccdd:011c0000:090b:0002:1:0
+Disc.RT+1
+p:BSkyB
+d6dd:011c0000:0a33:0002:1:0
+EWTN
+p:BSkyB
+c4e0:011c0000:0965:0002:1:0
+Shop on TV
+p:BSkyB
+1de2:011c0000:07df:0002:1:0
+YeSTERDAY+1
+p:BSkyB
+27e2:011c0000:0806:0002:1:0
+STV
+p:BSkyB
+cce2:011c0000:090b:0002:1:0
+Home&Health+
+p:BSkyB
+bbe3:011c0000:0963:0002:1:0
+___99
+p:BSkyB
+1be4:011c0000:07e2:0002:1:0
+CNN
+p:BSkyB
+c4e5:011c0000:0965:0002:1:0
+GEO News
+p:BSkyB
+d6e5:011c0000:0a33:0002:1:0
+mov4men+1
+p:BSkyB
+15e6:011c0000:07ea:0002:1:0
+1869
+p:BSkyB
+d7e6:011c0000:0900:0002:1:0
+Hallmark
+p:BSkyB
+d6e8:011c0000:0a33:0002:1:0
+Live 960
+p:BSkyB
+c4ea:011c0000:0965:0002:1:0
+Gala TV
+p:BSkyB
+d6ea:011c0000:0a33:0002:1:0
+Madani Chnl
+p:BSkyB
+c4eb:011c0000:0965:0002:1:0
+AVAGO (Cable)
+p:BSkyB
+d6eb:011c0000:0a33:0002:1:0
+Music India
+p:BSkyB
+27ec:011c0000:0806:0002:1:0
+STV
+p:BSkyB
+d6ec:011c0000:0a33:0002:1:0
+55020
+p:BSkyB
+27ed:011c0000:0806:0002:1:0
+STV
+p:BSkyB
+d6ed:011c0000:0a33:0002:1:0
+Vox Africa
+p:BSkyB
+cfee:011c0000:0909:0002:1:0
+BET
+p:BSkyB
+d6ee:011c0000:0a33:0002:1:0
+AHLEBAIT TV
+p:BSkyB
+13ef:011c0000:07eb:0002:1:0
+Sky3
+p:BSkyB
+c4ef:011c0000:0965:0002:1:0
+ARY Digital
+p:BSkyB
+13f0:011c0000:07eb:0002:1:0
+Sky2
+p:BSkyB
+13f2:011c0000:07eb:0002:1:0
+1837
+p:BSkyB
+cbf2:011c0000:08ff:0002:1:0
+52210
+p:BSkyB
+13f3:011c0000:07ea:0002:1:0
+Sky3+1
+p:BSkyB
+03f6:011c0000:0909:0002:1:0
+53230
+p:BSkyB
+27f6:011c0000:0806:0002:1:0
+UTV
+p:BSkyB
+03f7:011c0000:0805:0002:1:0
+ITV1 Border
+p:BSkyB
+1af7:011c0000:0802:0002:1:0
+BBC 1 East (W)
+p:BSkyB
+1af8:011c0000:0802:0002:1:0
+BBC 1 CI
+p:BSkyB
+23f8:011c0000:07fa:0002:1:0
+e4
+p:BSkyB
+c4f9:011c0000:0965:0002:1:0
+V Channel
+p:BSkyB
+d2f9:011c0000:0969:0002:1:0
+Diva TV +1
+p:BSkyB
+11fa:011c0000:07ee:0002:1:0
+Sky Showcase
+p:BSkyB
+23fb:011c0000:07f9:0002:1:0
+Channel 4
+p:BSkyB
+d2fb:011c0000:0969:0002:1:0
+Syfy +1
+p:BSkyB
+11fc:011c0000:07ee:0002:1:0
+Sky Arts 1
+p:BSkyB
+12fc:011c0000:07e9:0002:1:0
+ShortsTV
+p:BSkyB
+1cfc:011c0000:07de:0002:1:0
+Sony TV Asia
+p:BSkyB
+23fc:011c0000:07f9:0002:1:0
+Channel 4
+p:BSkyB
+d0fc:011c0000:090c:0002:1:0
+movies 24
+p:BSkyB
+23fd:011c0000:07f9:0002:1:0
+Channel 4
+p:BSkyB
+23fe:011c0000:07f9:0002:1:0
+Channel 4
+p:BSkyB
+11ff:011c0000:07ee:0002:1:0
+Nat Geo
+p:BSkyB
+23ff:011c0000:07f9:0002:1:0
+Channel 4
+p:BSkyB
+d2ff:011c0000:096c:0002:1:0
+Syfy
+p:BSkyB
+1901:011c0000:07ff:0002:2:0
+BBC R5L
+p:BSkyB
+d137:011c0000:090c:0002:2:0
+Raaj Radio
+p:BSkyB
+1038:011c0000:07d4:0002:2:0
+EPG Background Audio.
+p:BSkyB
+d139:011c0000:090c:0002:2:0
+Starpoint Radio
+p:BSkyB
+cb3b:011c0000:0907:0002:2:0
+Sunrise
+p:BSkyB
+cb3c:011c0000:0907:0002:2:0
+BFBS Radio
+p:BSkyB
+d13c:011c0000:090c:0002:2:0
+Pulse Rated
+p:BSkyB
+cb3d:011c0000:0907:0002:2:0
+LBC 97.3
+p:BSkyB
+193e:011c0000:07ff:0002:2:0
+ETV3
+p:BSkyB
+cb3e:011c0000:0907:0002:2:0
+Heart
+p:BSkyB
+cb3f:011c0000:0907:0002:2:0
+Galaxy
+p:BSkyB
+d13f:011c0000:090c:0002:2:0
+The Word
+p:BSkyB
+1940:011c0000:07ff:0002:2:0
+BBC R5SX
+p:BSkyB
+d141:011c0000:090c:0002:2:0
+MOS Radio
+p:BSkyB
+254a:011c0000:0a34:0002:2:0
+Recordbrazil
+p:BSkyB
+254b:011c0000:0a34:0002:2:0
+Amar Radio
+p:BSkyB
+cc4b:011c0000:08ff:0002:2:0
+Premier
+p:BSkyB
+254c:011c0000:0a34:0002:2:0
+Sukh Sagar
+p:BSkyB
+254d:011c0000:0a34:0002:2:0
+Choice FM
+p:BSkyB
+254f:011c0000:0a34:0002:2:0
+UCB UK
+p:BSkyB
+2550:011c0000:0a34:0002:2:0
+UCB Insp
+p:BSkyB
+2551:011c0000:0a34:0002:2:0
+UCB Bible
+p:BSkyB
+2552:011c0000:0a34:0002:2:0
+UCB Gospel
+p:BSkyB
+2555:011c0000:0a34:0002:2:0
+Solar Radio
+p:BSkyB
+2557:011c0000:0a34:0002:2:0
+XFM
+p:BSkyB
+2558:011c0000:0a34:0002:2:0
+Capital
+p:BSkyB
+d758:011c0000:0a34:0002:2:0
+UCB Ireland
+p:BSkyB
+2559:011c0000:0a34:0002:2:0
+Gold
+p:BSkyB
+255b:011c0000:0a34:0002:2:0
+Khushkhabri
+p:BSkyB
+d75c:011c0000:0a34:0002:2:0
+punjabi radio
+p:BSkyB
+255e:011c0000:0a34:0002:2:0
+Kismat
+p:BSkyB
+1a5f:011c0000:07dd:0002:2:0
+BBC R1
+p:BSkyB
+1a60:011c0000:07dd:0002:2:0
+BBC R2
+p:BSkyB
+2560:011c0000:0a34:0002:2:0
+Chill
+p:BSkyB
+1a61:011c0000:07dd:0002:2:0
+BBC R3
+p:BSkyB
+1a62:011c0000:07dd:0002:2:0
+BBC R4 FM
+p:BSkyB
+2562:011c0000:0a34:0002:2:0
+Classic FM
+p:BSkyB
+1a63:011c0000:07dd:0002:2:0
+BBC R4 LW
+p:BSkyB
+1a65:011c0000:07dd:0002:2:0
+BBC R Scot.
+p:BSkyB
+1a66:011c0000:07dd:0002:2:0
+BBC R Wales
+p:BSkyB
+1a67:011c0000:07dd:0002:2:0
+BBC R Ulster
+p:BSkyB
+2567:011c0000:0a34:0002:2:0
+Planet Rock
+p:BSkyB
+1a68:011c0000:07dd:0002:2:0
+BBC Asian
+p:BSkyB
+1a69:011c0000:07dd:0002:2:0
+BBC WS
+p:BSkyB
+1a6b:011c0000:07dd:0002:2:0
+BBC R Cymru
+p:BSkyB
+1a6e:011c0000:07dd:0002:2:0
+BBC R1X
+p:BSkyB
+1a6f:011c0000:07dd:0002:2:0
+BBC 6 Music
+p:BSkyB
+1a70:011c0000:07dd:0002:2:0
+BBC Radio 7
+p:BSkyB
+1a71:011c0000:07dd:0002:2:0
+BBC R n Gael
+p:BSkyB
+1a72:011c0000:07dd:0002:2:0
+BBC  London
+p:BSkyB
+cf80:011c0000:0908:0002:2:0
+Absolute CR
+p:BSkyB
+cf81:011c0000:0908:0002:2:0
+Absolute
+p:BSkyB
+cf82:011c0000:0908:0002:2:0
+Absolute80s
+p:BSkyB
+cf83:011c0000:0908:0002:2:0
+Amrit Bani
+p:BSkyB
+1284:011c0000:07ea:0002:2:0
+SNR
+p:BSkyB
+cf84:011c0000:0908:0002:2:0
+InsightRadio
+p:BSkyB
+cf85:011c0000:0908:0002:2:0
+CC Radio
+p:BSkyB
+cf86:011c0000:0908:0002:2:0
+Desi Radio
+p:BSkyB
+cf87:011c0000:0908:0002:2:0
+Abs Rad 90s
+p:BSkyB
+cf88:011c0000:0908:0002:2:0
+RdioCaroline
+p:BSkyB
+cf89:011c0000:0908:0002:2:0
+Rainbow
+p:BSkyB
+258b:011c0000:07fb:0002:2:0
+RTE Radio 1
+p:BSkyB
+cf8b:011c0000:0908:0002:2:0
+Liberty
+p:BSkyB
+258c:011c0000:07fb:0002:2:0
+RTE 2FM
+p:BSkyB
+cf8c:011c0000:0908:0002:2:0
+Spectrum 1
+p:BSkyB
+258d:011c0000:07fb:0002:2:0
+RTE R na G
+p:BSkyB
+cf8d:011c0000:0908:0002:2:0
+TWR
+p:BSkyB
+258e:011c0000:07fb:0002:2:0
+RTE Lyric fm
+p:BSkyB
+cf8e:011c0000:0908:0002:2:0
+FWR
+p:BSkyB
+138f:011c0000:07dc:0002:2:0
+Chl Line-up
+p:BSkyB
+cf8f:011c0000:0908:0002:2:0
+WRN Europe
+p:BSkyB
+cf90:011c0000:0908:0002:2:0
+Yorkshire R
+p:BSkyB
+cf91:011c0000:0908:0002:2:0
+Gaydarradio
+p:BSkyB
+cf92:011c0000:0908:0002:2:0
+RTE R1 Extra
+p:BSkyB
+cf93:011c0000:0908:0002:2:0
+Family Radio
+p:BSkyB
+cf94:011c0000:0908:0002:2:0
+NME
+p:BSkyB
+cf95:011c0000:0908:0002:2:0
+VOT Radio
+p:BSkyB
+cf96:011c0000:0908:0002:2:0
+Jazz FM
+p:BSkyB
+c6a3:011c0000:0969:0002:2:0
+InTune
+p:BSkyB
+cba4:011c0000:08fd:0002:2:0
+Panjab Radio
+p:BSkyB
+c6a8:011c0000:0969:0002:2:0
+Kiss
+p:BSkyB
+c7aa:011c0000:096c:0002:2:0
+Newstalk
+p:BSkyB
+c6ac:011c0000:0969:0002:2:0
+Magic
+p:BSkyB
+d6e0:011c0000:0a33:0002:2:0
+EWTN
+p:BSkyB
+1be5:011c0000:07e2:0002:2:0
+5606
+p:BSkyB
+d6e6:011c0000:0a33:0002:2:0
+Real Radio
+p:BSkyB
+d6e7:011c0000:0a33:0002:2:0
+Smooth
+p:BSkyB
+27fe:011c0000:0806:0002:2:0
+talkSPORT
+p:BSkyB
+1019:011c0000:0807:0002:4:0
+Sky Box Office
+p:BSkyB
+1019:011c0000:0961:0002:4:0
+Sky Box Office
+p:BSkyB
+1019:011c0000:0966:0002:4:0
+Sky Box Office
+p:BSkyB
+1019:011c0000:07db:0002:4:0
+Sky Box Office
+p:BSkyB
+1019:011c0000:07dc:0002:4:0
+Sky Box Office
+p:BSkyB
+101a:011c0000:0807:0002:4:0
+Sky Box Office
+p:BSkyB
+101a:011c0000:0961:0002:4:0
+Sky Box Office
+p:BSkyB
+101a:011c0000:07dc:0002:4:0
+Sky Box Office
+p:BSkyB
+101b:011c0000:0807:0002:4:0
+Sky Box Office
+p:BSkyB
+101b:011c0000:0961:0002:4:0
+Sky Box Office
+p:BSkyB
+101b:011c0000:0966:0002:4:0
+Sky Box Office
+p:BSkyB
+101c:011c0000:0807:0002:4:0
+Sky Box Office
+p:BSkyB
+101c:011c0000:0966:0002:4:0
+Sky Box Office
+p:BSkyB
+101e:011c0000:0963:0002:4:0
+Hustler TV UK
+p:BSkyB
+1020:011c0000:0963:0002:4:0
+XXXFirst Timers
+p:BSkyB
+1021:011c0000:0807:0002:4:0
+Sky Box Office
+p:BSkyB
+1021:011c0000:0966:0002:4:0
+Sky Box Office
+p:BSkyB
+1022:011c0000:0963:0002:4:0
+Sky Box Office
+p:BSkyB
+1023:011c0000:0963:0002:4:0
+Playboy Lovers
+p:BSkyB
+1024:011c0000:07ef:0002:4:0
+XXX Mums
+p:BSkyB
+1025:011c0000:0963:0002:4:0
+100% Babes
+p:BSkyB
+1026:011c0000:0963:0002:4:0
+Girls Gone Wild
+p:BSkyB
+1027:011c0000:0963:0002:4:0
+Amateur Babes
+p:BSkyB
+1028:011c0000:0a2b:0002:4:0
+UK Swingers
+p:BSkyB
+1029:011c0000:0a35:0002:4:0
+Viewers' Wives
+p:BSkyB
+102b:011c0000:0a35:0002:4:0
+Xplicit Nightly
+p:BSkyB
+102d:011c0000:07f2:0002:4:0
+Sky Box Office
+p:BSkyB
+102e:011c0000:0963:0002:4:0
+XXX Gay
+p:BSkyB
+102f:011c0000:0a2b:0002:4:0
+Blue Tube
+p:BSkyB
+1034:011c0000:0968:0002:4:0
+Anytime
+p:BSkyB
+1034:011c0000:07e0:0002:4:0
+Anytime
+p:BSkyB
+1034:011c0000:07f3:0002:4:0
+Anytime
+p:BSkyB
+1034:011c0000:07f7:0002:4:0
+Anytime
+p:BSkyB
+0f01:011c0000:07f0:0002:25:0
+ESPN HD
+p:BSkyB
+0f02:011c0000:07f0:0002:25:0
+ESPN HD
+p:BSkyB
+0f09:011c0000:07ed:0002:25:0
+Sky Sp NewsHD
+p:BSkyB
+0f0a:011c0000:07f7:0002:25:0
+Sky News HD
+p:BSkyB
+0f0b:011c0000:0808:0002:25:0
+ITV1 HD
+p:BSkyB
+0f0c:011c0000:0808:0002:25:0
+ITV1 HD
+p:BSkyB
+0f0f:011c0000:0808:0002:25:0
+3855
+p:BSkyB
+0f10:011c0000:07e4:0002:25:0
+Comedy Cen HD
+p:BSkyB
+2710:011c0000:0801:0002:25:0
+ITV1 HD
+p:BSkyB
+0f11:011c0000:07ed:0002:25:0
+ESPN AmrcaHD
+p:BSkyB
+0f12:011c0000:07ed:0002:25:0
+Five HD
+p:BSkyB
+0f13:011c0000:07ed:0002:25:0
+Sky Sp NewsHD
+p:BSkyB
+0f15:011c0000:07f1:0002:25:0
+Sky1 HD
+p:BSkyB
+0516:011c0000:07f7:0002:25:0
+Sky 3D
+p:BSkyB
+0f16:011c0000:07e0:0002:25:0
+Sky Thriller HD
+p:BSkyB
+0f17:011c0000:07f7:0002:25:0
+Sky Arts 1 HD
+p:BSkyB
+0f18:011c0000:07d8:0002:25:0
+Sky Arts 2 HD
+p:BSkyB
+0f1a:011c0000:07d5:0002:25:0
+LIVING HD
+p:BSkyB
+0f1b:011c0000:07f1:0002:25:0
+Good Food HD
+p:BSkyB
+0f1c:011c0000:07e4:0002:25:0
+Eden HD
+p:BSkyB
+0f1d:011c0000:07e4:0002:25:0
+3869
+p:BSkyB
+0f1e:011c0000:07d3:0002:25:0
+3870
+p:BSkyB
+0f21:011c0000:07f0:0002:25:0
+Disney Cine HD
+p:BSkyB
+0f22:011c0000:07f0:0002:25:0
+Syfy HD
+p:BSkyB
+0f23:011c0000:07d5:0002:25:0
+Channel 4 HD
+p:BSkyB
+0f24:011c0000:07d8:0002:25:0
+E4 HD
+p:BSkyB
+0f25:011c0000:07d5:0002:25:0
+Sky Sports HD1
+p:BSkyB
+0f26:011c0000:07d1:0002:25:0
+Sky Sports HD2
+p:BSkyB
+0f28:011c0000:07f3:0002:25:0
+Hallmark HD
+p:BSkyB
+0f29:011c0000:07d1:0002:25:0
+Sky Sports HD2
+p:BSkyB
+0f2d:011c0000:07ec:0002:25:0
+NatGeoWild HD
+p:BSkyB
+0f2e:011c0000:07ec:0002:25:0
+History HD
+p:BSkyB
+0f2f:011c0000:07ec:0002:25:0
+Bio HD
+p:BSkyB
+0f30:011c0000:07ec:0002:25:0
+Crime HD
+p:BSkyB
+1d38:011c0000:07de:0002:25:0
+ITV1 HD
+p:BSkyB
+d83b:011c0000:0a36:0002:25:0
+Rush HD
+p:BSkyB
+233c:011c0000:07d3:0002:25:0
+9020
+p:BSkyB
+0f5c:011c0000:07d3:0002:25:0
+3932
+p:BSkyB
+d3be:011c0000:0a2b:0002:25:0
+Luxe TV HD
+p:BSkyB
+0ed9:011c0000:07f2:0002:25:0
+HD Retail Info
+p:BSkyB
+0eda:011c0000:07d5:0002:25:0
+Sky Sports HD1
+p:BSkyB
+0edb:011c0000:07f0:0002:25:0
+Discovery HD
+p:BSkyB
+0edc:011c0000:07d8:0002:25:0
+Eurosport HD
+p:BSkyB
+0ede:011c0000:07d1:0002:25:0
+MTVN HD
+p:BSkyB
+0edf:011c0000:07e0:0002:25:0
+MGM HD
+p:BSkyB
+0ee4:011c0000:07f3:0002:25:0
+Sky Classics HD
+p:BSkyB
+0ee6:011c0000:07ec:0002:25:0
+Sky Action HD
+p:BSkyB
+0ee7:011c0000:07e8:0002:25:0
+Sky MdnGrtsHD
+p:BSkyB
+0ee8:011c0000:07e8:0002:25:0
+Sky DraRomHD
+p:BSkyB
+0ee9:011c0000:07e8:0002:25:0
+Sky ScFi/HorHD
+p:BSkyB
+0eea:011c0000:07e0:0002:25:0
+Sky Family HD
+p:BSkyB
+0eeb:011c0000:07e8:0002:25:0
+Sky Comedy HD
+p:BSkyB
+0eec:011c0000:07f3:0002:25:0
+Sky Indie HD
+p:BSkyB
+0eed:011c0000:07e0:0002:25:0
+SkyPremiereHD
+p:BSkyB
+0eee:011c0000:07f2:0002:25:0
+Sky Sports HD3
+p:BSkyB
+0eef:011c0000:07d8:0002:25:0
+FX HD
+p:BSkyB
+0ef0:011c0000:07f2:0002:25:0
+Sky Sports HD3
+p:BSkyB
+0ef2:011c0000:07f1:0002:25:0
+Sky Sports HD4
+p:BSkyB
+0ef3:011c0000:07f1:0002:25:0
+Sky Sports HD4
+p:BSkyB
+0ef8:011c0000:07e4:0002:25:0
+Nat Geo HD
+p:BSkyB
+0ef9:011c0000:07d1:0002:25:0
+SkyShowcseHD
+p:BSkyB
+2000:011c0000:07fb:0002:130:0
+Games Slot 1
+p:BSkyB
+2003:011c0000:07eb:0002:130:0
+Movie Quiz
+p:BSkyB
+2005:011c0000:07fb:0002:130:0
+Games Slot 21
+p:BSkyB
+2007:011c0000:07fb:0002:130:0
+Portal Video 2
+p:BSkyB
+2008:011c0000:07fb:0002:130:0
+Sky Hub Video
+p:BSkyB
+c508:011c0000:0965:0002:130:0
+cso
+p:BSkyB
+200f:011c0000:0963:0002:130:0
+Games Slot 16
+p:BSkyB
+2715:011c0000:0801:0002:130:0
+ITVi Stream 2
+p:BSkyB
+201a:011c0000:07ea:0002:130:0
+Sky Hub Sky News Active
+p:BSkyB
+1523:011c0000:0804:0002:130:0
+1381
+p:BSkyB
+1524:011c0000:0804:0002:130:0
+1382
+p:BSkyB
+1525:011c0000:0804:0002:130:0
+1383
+p:BSkyB
+1526:011c0000:0804:0002:130:0
+1384
+p:BSkyB
+1527:011c0000:0804:0002:130:0
+1385
+p:BSkyB
+1528:011c0000:0804:0002:130:0
+1386
+p:BSkyB
+152d:011c2f26:07e3:0002:130:0
+1391
+p:BSkyB
+d32d:011c0000:0a29:0002:130:0
+PlayJam 2
+p:BSkyB
+152e:011c2f26:07e3:0002:130:0
+1392
+p:BSkyB
+152f:011c2f26:07e3:0002:130:0
+1393
+p:BSkyB
+1530:011c2f26:07e3:0002:130:0
+1394
+p:BSkyB
+1531:011c2f26:07e3:0002:130:0
+1395
+p:BSkyB
+c531:011c0000:0965:0002:130:0
+Mirada
+p:BSkyB
+1532:011c2f26:07e3:0002:130:0
+1396
+p:BSkyB
+1533:011c2f26:07e3:0002:130:0
+1397
+p:BSkyB
+1534:011c2f26:07e3:0002:130:0
+1398
+p:BSkyB
+1535:011c2f26:07e3:0002:130:0
+1399
+p:BSkyB
+1c40:011c0000:07e1:0002:130:0
+QVC
+p:BSkyB
+1c41:011c0000:07e1:0002:130:0
+QVC IMM Test
+p:BSkyB
+1f41:011c0000:0966:0002:130:0
+Sky Text Holidays
+p:BSkyB
+1f42:011c0000:07dc:0002:130:0
+Personal Organiser
+p:BSkyB
+1c43:011c0000:07e1:0002:130:0
+QVC Mosaic Test
+p:BSkyB
+1f43:011c0000:0803:0002:130:0
+Vegas Roulette II
+p:BSkyB
+1c44:011c0000:07e1:0002:130:0
+QVC MOSAIC
+p:BSkyB
+1f44:011c0000:07fb:0002:130:0
+Games Slot 13
+p:BSkyB
+1f45:011c0000:07fb:0002:130:0
+Cartoon Network Game 4
+p:BSkyB
+1f46:011c0000:0966:0002:130:0
+Sky Preview Active
+p:BSkyB
+1f47:011c0000:07ea:0002:130:0
+Sky Bet Reg
+p:BSkyB
+1f4b:011c0000:07e5:0002:130:0
+Installation Survey
+p:BSkyB
+1f4c:011c0000:0961:0002:130:0
+TV Picks 2009
+p:BSkyB
+1f4e:011c0000:07ee:0002:130:0
+Sky Upgrade Dal
+p:BSkyB
+d44e:011c0000:0a2c:0002:130:0
+54350
+p:BSkyB
+1f4f:011c0000:0803:0002:130:0
+FAQ Development
+p:BSkyB
+1f50:011c0000:07ee:0002:130:0
+Movie Finder
+p:BSkyB
+1f53:011c0000:07eb:0002:130:0
+Ad Showcase
+p:BSkyB
+1f54:011c0000:07eb:0002:130:0
+Remote Control Look Up App
+p:BSkyB
+1f55:011c0000:07ef:0002:130:0
+iSales Viewing Upgrade
+p:BSkyB
+1f57:011c0000:07ee:0002:130:0
+Vegas Wanted DOA
+p:BSkyB
+1f5a:011c0000:0803:0002:130:0
+Vegas Golden Doubloons
+p:BSkyB
+1f5b:011c0000:07ea:0002:130:0
+Sky Bingo Test
+p:BSkyB
+c15c:011c0000:0963:0002:130:0
+49500
+p:BSkyB
+1f5e:011c0000:0803:0002:130:0
+Vegas Cleopatra
+p:BSkyB
+1f5f:011c0000:07fb:0002:130:0
+Games Slot 3
+p:BSkyB
+275f:011c0000:07fc:0002:130:0
+ITVi Stream 44
+p:BSkyB
+1f60:011c0000:07ea:0002:130:0
+Sky Bingo
+p:BSkyB
+1263:011c0000:07ea:0002:130:0
+Sky News
+p:BSkyB
+1f63:011c0000:0963:0002:130:0
+Vegas Elvis
+p:BSkyB
+1f64:011c0000:07d4:0002:130:0
+Sky Active WML Browser
+p:BSkyB
+1f67:011c0000:07d7:0002:130:0
+Sprint
+p:BSkyB
+1f69:011c0000:07ea:0002:130:0
+iSales Hardware
+p:BSkyB
+2469:011c0000:07dc:0002:130:0
+Sky Intro Active
+p:BSkyB
+1f6a:011c0000:0803:0002:130:0
+Vegas Blackjack
+p:BSkyB
+1f6c:011c0000:0966:0002:130:0
+eSales Test
+p:BSkyB
+1f6d:011c0000:07e7:0002:130:0
+Sky Bet Active
+p:BSkyB
+1f70:011c0000:07e5:0002:130:0
+Vegas Rainbow Riches
+p:BSkyB
+1f71:011c0000:07e7:0002:130:0
+Vegas Video Poker
+p:BSkyB
+2471:011c0000:0963:0002:130:0
+1787
+p:BSkyB
+1f72:011c0000:07e9:0002:130:0
+Vegas Bar x5
+p:BSkyB
+1f73:011c0000:07fb:0002:130:0
+Cartoon Network Game 1
+p:BSkyB
+2f76:011c0000:07f4:0002:130:0
+ITVi Quad
+p:BSkyB
+1479:011c0000:07ee:0002:130:0
+Directgov
+p:BSkyB
+1f7a:011c0000:07e5:0002:130:0
+Sports Swiching Browser
+p:BSkyB
+1f7c:011c0000:0966:0002:130:0
+High Score
+p:BSkyB
+1f7d:011c0000:07e9:0002:130:0
+SkyBet,Casino,Bingo&Poker
+p:BSkyB
+1f7e:011c0000:07fb:0002:130:0
+Games Slot 5
+p:BSkyB
+1f7f:011c0000:07fb:0002:130:0
+Games Slot 7
+p:BSkyB
+1f81:011c0000:07dc:0002:130:0
+Sky Customer Service
+p:BSkyB
+1b82:011c0000:07da:0002:130:0
+7042
+p:BSkyB
+1f82:011c0000:07e7:0002:130:0
+Super 6's
+p:BSkyB
+1083:011c0000:07e5:0002:130:0
+SBL
+p:BSkyB
+1f85:011c0000:07ee:0002:130:0
+Vegas Hit It Poker
+p:BSkyB
+1f88:011c0000:0968:0002:130:0
+Wap Casino One
+p:BSkyB
+1f8a:011c0000:07fb:0002:130:0
+Games Slot 6
+p:BSkyB
+cf8a:011c0000:0908:0002:130:0
+Free & Prize PlayJam Games
+p:BSkyB
+1f8b:011c0000:07eb:0002:130:0
+SOM Test Bert/Ernie
+p:BSkyB
+1f90:011c0000:07e9:0002:130:0
+Vegas Cluedo
+p:BSkyB
+1f95:011c0000:07d4:0002:130:0
+Sky Active
+p:BSkyB
+c695:011c0000:0969:0002:130:0
+Wired Ocean
+p:BSkyB
+1f98:011c0000:0961:0002:130:0
+Portal Video 6
+p:BSkyB
+1fa0:011c0000:07eb:0002:130:0
+Vegas Monopoly
+p:BSkyB
+1fa1:011c0000:0803:0002:130:0
+Vegas Diamond Compass
+p:BSkyB
+1fa2:011c0000:07e9:0002:130:0
+Vegas House of Horror
+p:BSkyB
+2fa6:011c0000:07f4:0002:130:0
+12198
+p:BSkyB
+14a7:011c0000:0966:0002:130:0
+DVD  Extras
+p:BSkyB
+1fa7:011c0000:07e9:0002:130:0
+Vegas DOND
+p:BSkyB
+14a8:011c0000:0966:0002:130:0
+Movies Active
+p:BSkyB
+1fab:011c0000:07fb:0002:130:0
+Sky Games
+p:BSkyB
+1fac:011c0000:07e7:0002:130:0
+Sky Bet At The Races
+p:BSkyB
+1fad:011c0000:07fb:0002:130:0
+Games Slot 9
+p:BSkyB
+1fb3:011c0000:07fb:0002:130:0
+Game Slot 20
+p:BSkyB
+1fb6:011c0000:07fb:0002:130:0
+Game Slot 18
+p:BSkyB
+1fbc:011c0000:07fb:0002:130:0
+Games Slot 12
+p:BSkyB
+1fbf:011c0000:07e5:0002:130:0
+I-Service App
+p:BSkyB
+1fc0:011c0000:07fb:0002:130:0
+Game Slot 22
+p:BSkyB
+1fc5:011c0000:0963:0002:130:0
+Rewards from Sky
+p:BSkyB
+1fc6:011c0000:07ef:0002:130:0
+iSales Sky Products
+p:BSkyB
+1fc8:011c0000:07fb:0002:130:0
+Cartoon Network Game 2
+p:BSkyB
+1fc9:011c0000:0803:0002:130:0
+Vegas Caribbean Stud
+p:BSkyB
+1fca:011c0000:07fb:0002:130:0
+Cartoon Network Game 3
+p:BSkyB
+1fcb:011c0000:07fb:0002:130:0
+Games Slot 25
+p:BSkyB
+1fcc:011c0000:07fb:0002:130:0
+Game Slot 26
+p:BSkyB
+1fcd:011c0000:07fb:0002:130:0
+Games Slot 19
+p:BSkyB
+1fce:011c0000:07fb:0002:130:0
+Games Slot 4 (catflap)
+p:BSkyB
+20cf:011c0000:07e9:0002:130:0
+Vegas Monty Python
+p:BSkyB
+1fd0:011c0000:07eb:0002:130:0
+launchpad
+p:BSkyB
+1fd1:011c0000:07ea:0002:130:0
+Sky Bingo WML
+p:BSkyB
+1fd2:011c0000:07fb:0002:130:0
+Game Slot 17
+p:BSkyB
+1fd3:011c0000:07d7:0002:130:0
+Carbon Calculator
+p:BSkyB
+1fd7:011c0000:07fb:0002:130:0
+Games Slot 2
+p:BSkyB
+1ae0:011c0000:07f6:0002:130:0
+STREAM-0
+p:BSkyB
+1ae1:011c0000:07f6:0002:130:0
+STREAM-1
+p:BSkyB
+1ae2:011c0000:07f6:0002:130:0
+STREAM-2
+p:BSkyB
+1fe2:011c0000:07ee:0002:130:0
+Vegas Cashino
+p:BSkyB
+1ae3:011c0000:07f6:0002:130:0
+STREAM-3
+p:BSkyB
+1ae4:011c0000:07f6:0002:130:0
+STREAM-4
+p:BSkyB
+1ae5:011c0000:07f6:0002:130:0
+STREAM-5
+p:BSkyB
+1ae6:011c0000:07f6:0002:130:0
+STREAM-6
+p:BSkyB
+1fe6:011c0000:07fb:0002:130:0
+Games Slot 10
+p:BSkyB
+1fe9:011c0000:07fb:0002:130:0
+Games Slot 11
+p:BSkyB
+1fea:011c0000:07fb:0002:130:0
+Games Slot 14
+p:BSkyB
+1fef:011c0000:0803:0002:130:0
+Vegas 3 Card poker
+p:BSkyB
+13f1:011c0000:07eb:0002:130:0
+1840
+p:BSkyB
+1ff7:011c0000:07d4:0002:130:0
+Portal Video 5
+p:BSkyB
+1ff8:011c0000:07d7:0002:130:0
+Pin Reminder Service
+p:BSkyB
+1ffb:011c0000:0963:0002:130:0
+Dummy Eire Service
+p:BSkyB
+1319:011c0000:0961:0002:131:0
+IEPG data 8
+p:BSkyB
+105d:011c0000:07d4:0002:131:0
+IEPG data 1
+p:BSkyB
+131a:011c0000:0961:0002:132:0
+DCS8
+p:BSkyB
+1252:011c0000:07dc:0002:132:0
+DCS6
+p:BSkyB
+105e:011c0000:07d4:0002:132:0
+DCS1
+p:BSkyB
+1572:011c2f26:07e3:0002:132:0
+DCS14
+p:BSkyB
+10c2:011c0000:07e5:0002:132:0
+DCS2
+p:BSkyB
+11ee:011c0000:07db:0002:132:0
+DCS5
+p:BSkyB
+155f:011c2f26:07e3:0002:133:0
+1471
+p:BSkyB
+1560:011c2f26:07e3:0002:133:0
+1472
+p:BSkyB
+1561:011c2f26:07e3:0002:133:0
+1473
+p:BSkyB
+1562:011c2f26:07e3:0002:133:0
+1474
+p:BSkyB
+1563:011c2f26:07e3:0002:133:0
+1475
+p:BSkyB
+1564:011c2f26:07e3:0002:133:0
+1476
+p:BSkyB
+1565:011c2f26:07e3:0002:133:0
+1477
+p:BSkyB
+1566:011c2f26:07e3:0002:133:0
+1478
+p:BSkyB
+1567:011c2f26:07e3:0002:133:0
+1479
+p:BSkyB
+1569:011c0000:0804:0002:133:0
+1481
+p:BSkyB
+156a:011c0000:0804:0002:133:0
+1482
+p:BSkyB
+156b:011c0000:0804:0002:133:0
+1483
+p:BSkyB
+156c:011c0000:0804:0002:133:0
+1484
+p:BSkyB
+156d:011c0000:0804:0002:133:0
+1485
+p:BSkyB
+13b0:011c0000:0966:0002:133:0
+MMS 1
+p:BSkyB
+13b1:011c0000:0966:0002:133:0
+MMS 2
+p:BSkyB
+13b2:011c0000:0807:0002:133:0
+MMS 3
+p:BSkyB
+13b3:011c0000:0807:0002:133:0
+MMS 4
+p:BSkyB
+13b4:011c0000:0961:0002:133:0
+MMS 5
+p:BSkyB
+13b5:011c0000:0961:0002:133:0
+MMS 6
+p:BSkyB
+13b6:011c0000:0966:0002:133:0
+MMS 7
+p:BSkyB
+13b7:011c0000:0807:0002:133:0
+MMS 8
+p:BSkyB
+1b1c:011c0000:0802:0002:134:0
+BBC HD
+p:BSkyB
+1b21:011c0000:0802:0002:134:0
+6945
+p:BSkyB
+0f27:011c0000:07f2:0002:135:0
+SBO HD1
+p:BSkyB
+0ee3:011c0000:07f2:0002:135:0
+SBO HD2
+p:BSkyB
+end
+Have a lot of bugs!
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/sat130.info b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/sat130.info
new file mode 100644 (file)
index 0000000..f397d74
--- /dev/null
@@ -0,0 +1,17 @@
+<default>
+       <prerequisites>
+               <tag type="services" />
+               <bcastsystem type="DVB-S" />
+               <satellite type="130" />
+       </prerequisites>
+       
+       <info>
+               <author>tmbinc@elitedvb.net</author>
+               <name>Hotbird (13.0E)</name>
+       </info>
+
+       <files type="directories">
+               <file type="services" name="lamedb.130">
+               </file>
+       </files>
+</default>
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/sat192.info b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/sat192.info
new file mode 100644 (file)
index 0000000..d4cf2f4
--- /dev/null
@@ -0,0 +1,17 @@
+<default>
+       <prerequisites>
+               <tag type="services" />
+               <bcastsystem type="DVB-S" />
+               <satellite type="192" />
+       </prerequisites>
+       
+       <info>
+               <author>tmbinc@elitedvb.net</author>
+               <name>Astra (19.2E)</name>
+       </info>
+
+       <files type="directories">
+               <file type="services" name="lamedb.192">
+               </file>
+       </files>
+</default>
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/sat282.info b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-defaultservices/sat282.info
new file mode 100644 (file)
index 0000000..7103ed4
--- /dev/null
@@ -0,0 +1,17 @@
+<default>
+       <prerequisites>
+               <tag type="services" />
+               <bcastsystem type="DVB-S" />
+               <satellite type="284" />
+       </prerequisites>
+       
+       <info>
+               <author>tmbinc@elitedvb.net</author>
+               <name>Astra/Eurobird (28.2E)</name>
+       </info>
+
+       <files type="directories">
+               <file type="services" name="lamedb.282">
+               </file>
+       </files>
+</default>
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins.bb b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins.bb
new file mode 100755 (executable)
index 0000000..26a8195
--- /dev/null
@@ -0,0 +1,122 @@
+DESCRIPTION = "Additional plugins for Enigma2"
+MAINTAINER = "Felix Domke <tmbinc@elitedvb.net>"
+LICENSE = "Proprietary"
+LIC_FILES_CHKSUM = "file://COPYING;md5=8e37f34d0e40d32ea2bc90ee812c9131"
+
+PACKAGES_DYNAMIC = "enigma2-plugin-*"
+
+# if you want experimental, use:
+#SRCREV="87fd2f1120962f553ecb1a88bbee46ed821df975"
+SRCREV="c8fc96e8e51e1ef71e1709f9dd6f733007f9463e"
+SRCDATE="20110215"
+BRANCH="master"
+PV = "experimental-git${SRCDATE}"
+PR = "r5"
+
+FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}/vuplus:"
+
+SRC_URI="git://code.vuplus.com/git/dvbapp-plugin.git;protocol=git;branch=${BRANCH};tag=${SRCREV}"
+
+EXTRA_OECONF = " \
+        BUILD_SYS=${BUILD_SYS} \
+        HOST_SYS=${HOST_SYS} \
+        STAGING_INCDIR=${STAGING_INCDIR} \
+        STAGING_LIBDIR=${STAGING_LIBDIR} \
+"
+
+SRC_URI_append_vuplus = " \
+          file://enigma2_plugins_mytube_tpm.patch;patch=1;pnum=1 \
+          file://enigma2_plugins_20110810.patch;patch=1;pnum=1 \
+          file://enigma2_plugins_webinterface_tpm.patch;patch=1;pnum=1 \
+          file://enigma2_plugins_ac3lipsync_dolby.patch;patch=1;pnum=1 \
+          file://enigma2_plugins_autoresolution_fix.patch;patch=1;pnum=1 \
+          file://enigma2_plugins_dependency.patch;patch=1;pnum=1 \
+           file://dreamboxweb.png \
+           file://dreamboxwebtv.png \
+           file://favicon.ico"
+
+FILES_${PN} += " /usr/share/enigma2 /usr/share/fonts "
+FILES_${PN}-meta = "${datadir}/meta"
+PACKAGES += "${PN}-meta"
+PACKAGE_ARCH = "${MACHINE_ARCH}"
+
+inherit autotools
+
+S = "${WORKDIR}/git"
+
+DEPENDS = "python-pyopenssl python-gdata streamripper python-mutagen python-daap"
+DEPENDS += "enigma2"
+#DEPENDS += "enigma2-plugin-extensions-openwebif"
+
+
+def modify_po():
+       import os
+       try:
+               os.system("find ./ -name \"*.po\" > ./po_list")
+               os.system("find ./ -name \"*.pot\" >> ./po_list")
+               po_list = []
+               po_list = open('po_list','r+').readlines()
+               for x in po_list:
+                       changeword1(x)
+               changeword1('enigma2-plugins/networkwizard/src/networkwizard.xml ')
+               changeword2('enigma2-plugins/webinterface/src/web-data/tpl/default/index.html ')
+               os.system('rm po_list')
+       except:
+               print 'word patch error '
+               return
+
+def changeword1(file):
+       fn = file[:-1]
+       fnn = file[:-1]+'_n'
+       cmd = "sed s/Dreambox/STB/g "+fn+" > "+fnn
+       os.system(cmd)
+       cmd1 = "mv "+fnn+" "+fn
+       os.system(cmd1)
+
+def changeword2(file):
+       fn = file[:-1]
+       fnn = file[:-1]+'_n'
+       cmd = "sed s/Dreambox/Vu+/g "+fn+" > "+fnn
+       os.system(cmd)
+       cmd1 = "mv "+fnn+" "+fn
+       os.system(cmd1)
+
+do_unpack_append(){
+       modify_po()
+}
+
+
+do_install_append_vuplus() {
+       install -m 0644 ${WORKDIR}/dreamboxweb.png ${D}/usr/lib/enigma2/python/Plugins/Extensions/WebInterface/web-data/img/
+       install -m 0644 ${WORKDIR}/dreamboxwebtv.png ${D}/usr/lib/enigma2/python/Plugins/Extensions/WebInterface/web-data/tpl/default/streaminterface/img
+       install -m 0644 ${WORKDIR}/favicon.ico ${D}/usr/lib/enigma2/python/Plugins/Extensions/WebInterface/web-data/img/
+}
+
+python populate_packages_prepend() {
+        enigma2_plugindir = bb.data.expand('${libdir}/enigma2/python/Plugins', d)
+        do_split_packages(d, enigma2_plugindir, '^(\w+/\w+)', 'enigma2-plugin-%s', '%s', recursive=True, match_path=True, prepend=True)
+        do_split_packages(d, enigma2_plugindir, '^(\w+/\w+).*/.*\.la$', 'enigma2-plugin-%s-dev', '%s (development)', recursive=True, match_path=True, prepend=True)
+        do_split_packages(d, enigma2_plugindir, '^(\w+/\w+).*/.*\.a$', 'enigma2-plugin-%s-staticdev', '%s (static development)', recursive=True, match_path=True, prepend=True)
+        do_split_packages(d, enigma2_plugindir, '^(\w+/\w+).*/\.debug/', 'enigma2-plugin-%s-dbg', '%s (debug)', recursive=True, match_path=True, prepend=True)
+        def parseControlFile(dir, d, package):
+                import os
+               #ac3lipsync is renamed since 20091121 to audiosync.. but rename in cvs is not possible without lost of revision history..
+               #so the foldername is still ac3lipsync
+               if package == 'audiosync':
+                       package = 'ac3lipsync'
+                src = open(dir + "/" + package.split('-')[-1] + "/CONTROL/control").read()
+                for line in src.splitlines():
+                        name, value = line.strip().split(': ', 1)
+                        if name == 'Description':
+                                d.setVar('DESCRIPTION_' + package, value)
+                        elif name == 'Depends':
+                                d.setVar('RDEPENDS_' + package, ' '.join(value.split(', ')))
+                        elif name == 'Replaces':
+                                d.setVar('RREPLACES_' + package, ' '.join(value.split(', ')))
+                        elif name == 'Conflicts':
+                                d.setVar('RCONFLICTS_' + package, ' '.join(value.split(', ')))
+        srcdir = d.getVar('S', True)
+        for package in d.getVar('PACKAGES', True).split():
+                if package.startswith('enigma2-plugin-') and not package.endswith('-dev') and not package.endswith('-dbg') and not package.endswith('-staticdev'):
+                        parseControlFile(srcdir, d, package)
+}
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/dreamboxweb.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/dreamboxweb.png
new file mode 100755 (executable)
index 0000000..9a2c570
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/dreamboxweb.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/dreamboxwebtv.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/dreamboxwebtv.png
new file mode 100755 (executable)
index 0000000..3fcdf53
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/dreamboxwebtv.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_20110810.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_20110810.patch
new file mode 100644 (file)
index 0000000..31ea5a5
--- /dev/null
@@ -0,0 +1,1808 @@
+diff --git a/mytube/meta/plugin_mytube.xml b/mytube/meta/plugin_mytube.xml
+index eb2a0fd..56e1686 100644
+--- a/mytube/meta/plugin_mytube.xml
++++ b/mytube/meta/plugin_mytube.xml
+@@ -3,7 +3,8 @@
+                     <hardware type="dm8000" />
+                     <hardware type="dm800" />
+                   <hardware type="dm800se" />
+-                    <hardware type="dm500hd" />       
++                    <hardware type="dm500hd" />
++                  <hardware type="dm7020hd" />
+                     <tag type="Multimedia" />
+         </prerequisites>
+           <info>
+diff --git a/mytube/po/de.po b/mytube/po/de.po
+index b487673..c56c84e 100644
+--- a/mytube/po/de.po
++++ b/mytube/po/de.po
+@@ -7,9 +7,9 @@ msgid ""
+ msgstr ""
+ "Project-Id-Version: tuxbox-enigma 0.0.1\n"
+ "Report-Msgid-Bugs-To: \n"
+-"POT-Creation-Date: 2009-05-29 17:38+0200\n"
+-"PO-Revision-Date: 2008-05-16 17:15+0100\n"
+-"Last-Translator: Stefan Pluecken <mladen.horvat@multimedia-labs.de>\n"
++"POT-Creation-Date: 2011-06-12 19:07+0100\n"
++"PO-Revision-Date: 2011-06-12 19:22+0100\n"
++"Last-Translator: JuSt611 <Software@Strasdas.de>\n"
+ "Language-Team: none\n"
+ "MIME-Version: 1.0\n"
+ "Content-Type: text/plain; charset=UTF-8\n"
+@@ -18,448 +18,690 @@ msgstr ""
+ "X-Poedit-Language: German\n"
+ "X-Poedit-Country: GERMANY\n"
+ "X-Poedit-SourceCharset: iso-8859-15\n"
++"X-Poedit-Basepath: .\n"
++"X-Poedit-SearchPath-0: ../src\n"
+-msgid " Results"
+-msgstr " Ergebnisse"
++#: ../src/MyTubeSearch.py:161
++#: ../src/plugin.py:52
++msgid "Relevance"
++msgstr "Relevanz"
+-msgid "Added: "
+-msgstr "Hinzugefügt: "
++#: ../src/MyTubeSearch.py:162
++#: ../src/plugin.py:53
++msgid "View Count"
++msgstr "Aufrufe"
+-msgid "All"
+-msgstr "Alle"
++#: ../src/MyTubeSearch.py:163
++#: ../src/plugin.py:54
++msgid "Published"
++msgstr "Veröffentlicht"
++
++#: ../src/MyTubeSearch.py:164
++#: ../src/plugin.py:55
++msgid "Rating"
++msgstr "Bewertung"
++#: ../src/MyTubeSearch.py:168
++#: ../src/plugin.py:59
+ msgid "All Time"
+-msgstr ""
++msgstr "Allzeit"
+-msgid "An error occured."
+-msgstr "Es ist ein Fehler aufgetreten."
++#: ../src/MyTubeSearch.py:169
++#: ../src/plugin.py:60
++msgid "This Month"
++msgstr "Diesen Monat"
+-msgid "Ascending"
+-msgstr "aufsteigend"
++#: ../src/MyTubeSearch.py:170
++#: ../src/plugin.py:61
++msgid "This Week"
++msgstr "Diese Woche"
+-msgid "Ask user"
+-msgstr "Nutzer fragen"
++#: ../src/MyTubeSearch.py:171
++#: ../src/plugin.py:62
++msgid "Today"
++msgstr "Heute"
+-msgid "Australia"
+-msgstr "Australien"
++#: ../src/MyTubeSearch.py:175
++#: ../src/plugin.py:66
++#: ../src/plugin.py:619
++#: ../src/plugin.py:625
++#: ../src/plugin.py:1743
++msgid "Yes"
++msgstr "Ja"
+-msgid "Author: "
+-msgstr "Author: "
++#: ../src/MyTubeSearch.py:176
++#: ../src/plugin.py:67
++#: ../src/plugin.py:620
++#: ../src/plugin.py:626
++msgid "No"
++msgstr "Nein"
++#: ../src/MyTubeSearch.py:180
++#: ../src/MyTubeSearch.py:200
++#: ../src/plugin.py:71
++#: ../src/plugin.py:91
++msgid "All"
++msgstr "Alle"
++
++#: ../src/MyTubeSearch.py:181
++#: ../src/plugin.py:72
++msgid "Film & Animation"
++msgstr "Film & Animation"
++
++#: ../src/MyTubeSearch.py:182
++#: ../src/plugin.py:73
+ msgid "Autos & Vehicles"
+ msgstr "Autos und Fahrzeuge"
+-msgid "Brazil"
+-msgstr "Brasilien"
++#: ../src/MyTubeSearch.py:183
++#: ../src/plugin.py:74
++msgid "Music"
++msgstr "Musik"
+-msgid "Canada"
+-msgstr "Kanada"
++#: ../src/MyTubeSearch.py:184
++#: ../src/plugin.py:75
++msgid "Pets & Animals"
++msgstr "Tiere"
+-msgid "Choose target folder"
+-msgstr "Wähle Zielverzeichnis"
++#: ../src/MyTubeSearch.py:185
++#: ../src/plugin.py:76
++msgid "Sports"
++msgstr "Sport"
+-msgid "Clear history on Exit:"
+-msgstr "Verlauf beim Verlassen löschen:"
++#: ../src/MyTubeSearch.py:186
++#: ../src/plugin.py:77
++msgid "Travel & Events"
++msgstr "Reisen & Events"
+-msgid "Close"
+-msgstr "Schließen"
++#: ../src/MyTubeSearch.py:187
++#: ../src/plugin.py:78
++msgid "Short Movies"
++msgstr "Kurzvideos"
++
++#: ../src/MyTubeSearch.py:188
++#: ../src/plugin.py:79
++msgid "Gaming"
++msgstr "Spiele"
++#: ../src/MyTubeSearch.py:189
++#: ../src/plugin.py:80
+ msgid "Comedy"
+ msgstr "Komödien"
+-msgid "Czech Republic"
+-msgstr "Tschechien"
+-
+-msgid "Descending"
+-msgstr "absteigend"
+-
+-msgid "Display search results by:"
+-msgstr "Suchergebnisse anzeigen:"
+-
+-msgid "Do you want to see more entries?"
+-msgstr "Weitere Videos?"
+-
+-msgid "Download Video"
+-msgstr "Video runterladen"
+-
+-msgid "Download location"
+-msgstr "Download Verzeichnis:"
++#: ../src/MyTubeSearch.py:190
++#: ../src/plugin.py:81
++msgid "People & Blogs"
++msgstr "Leute & Blogs"
+-msgid "Downloading screenshots. Please wait..."
+-msgstr "Bilder werden geladen. Bitte warten..."
++#: ../src/MyTubeSearch.py:191
++#: ../src/plugin.py:82
++msgid "News & Politics"
++msgstr "Nachrichten & Politik"
+-msgid "Duration: "
+-msgstr "Dauer: "
++#: ../src/MyTubeSearch.py:192
++#: ../src/plugin.py:83
++msgid "Entertainment"
++msgstr "Unterhaltung"
++#: ../src/MyTubeSearch.py:193
++#: ../src/plugin.py:84
+ msgid "Education"
+ msgstr "Bildung"
+-msgid "Enter your search term(s)"
+-msgstr "Suchbegriff eingeben"
++#: ../src/MyTubeSearch.py:194
++#: ../src/plugin.py:85
++msgid "Howto & Style"
++msgstr "Tipps & Tricks"
+-msgid "Entertainment"
+-msgstr "Unterhaltung"
++#: ../src/MyTubeSearch.py:195
++#: ../src/plugin.py:86
++msgid "Nonprofits & Activism"
++msgstr "Non-Profit"
+-msgid "Fetching feed entries"
+-msgstr "Lade feeds"
++#: ../src/MyTubeSearch.py:196
++#: ../src/plugin.py:87
++msgid "Science & Technology"
++msgstr "Wissenschaft & Technik"
+-msgid "Fetching search entries"
+-msgstr "Lade Suchergebnisse"
++#: ../src/MyTubeSearch.py:201
++#: ../src/MyTubeSearch.py:208
++#: ../src/plugin.py:92
++#: ../src/plugin.py:99
++msgid "Australia"
++msgstr "Australien"
+-msgid "Film & Animation"
+-msgstr "Film & Animation"
++#: ../src/MyTubeSearch.py:202
++#: ../src/plugin.py:93
++msgid "Brazil"
++msgstr "Brasilien"
++#: ../src/MyTubeSearch.py:203
++#: ../src/plugin.py:94
++msgid "Canada"
++msgstr "Kanada"
++
++#: ../src/MyTubeSearch.py:204
++#: ../src/plugin.py:95
++msgid "Czech Republic"
++msgstr "Tschechien"
++
++#: ../src/MyTubeSearch.py:205
++#: ../src/plugin.py:96
+ msgid "France"
+ msgstr "Frankreich"
+-msgid "Gaming"
+-msgstr "Spiele"
+-
++#: ../src/MyTubeSearch.py:206
++#: ../src/plugin.py:97
+ msgid "Germany"
+ msgstr "Deutschland"
++#: ../src/MyTubeSearch.py:207
++#: ../src/plugin.py:98
+ msgid "Great Britain"
+ msgstr "England"
+-msgid "HD videos"
+-msgstr "HD Videos"
+-
+-msgid "Help"
+-msgstr "Hilfe"
+-
+-msgid "History"
+-msgstr "Verlauf"
+-
++#: ../src/MyTubeSearch.py:209
++#: ../src/plugin.py:100
+ msgid "Holland"
+ msgstr "Holland"
++#: ../src/MyTubeSearch.py:210
++#: ../src/plugin.py:101
+ msgid "Hong Kong"
+ msgstr "Hong Kong"
+-msgid "Howto & Style"
+-msgstr "Tipps & Tricks"
+-
++#: ../src/MyTubeSearch.py:211
++#: ../src/plugin.py:102
+ msgid "India"
+ msgstr "Indien"
++#: ../src/MyTubeSearch.py:212
++#: ../src/plugin.py:103
+ msgid "Ireland"
+ msgstr "Irland"
++#: ../src/MyTubeSearch.py:213
++#: ../src/plugin.py:104
+ msgid "Israel"
+ msgstr "Israel"
++#: ../src/MyTubeSearch.py:214
++#: ../src/plugin.py:105
+ msgid "Italy"
+ msgstr "Italien"
++#: ../src/MyTubeSearch.py:215
++#: ../src/plugin.py:106
+ msgid "Japan"
+ msgstr "Japan"
+-msgid "Load feed on startup:"
+-msgstr "Feed beim Starten laden:"
+-
++#: ../src/MyTubeSearch.py:216
++#: ../src/plugin.py:107
+ msgid "Mexico"
+ msgstr "Mexiko"
+-msgid "More video entries."
+-msgstr "Weitere Video Einträge."
++#: ../src/MyTubeSearch.py:217
++#: ../src/plugin.py:108
++msgid "New Zealand"
++msgstr "Neuseeland"
+-msgid "Most discussed"
+-msgstr "Heiß diskutiert"
++#: ../src/MyTubeSearch.py:218
++#: ../src/plugin.py:109
++msgid "Poland"
++msgstr "Polen"
+-msgid "Most linked"
+-msgstr "Am meisten verlinkt"
++#: ../src/MyTubeSearch.py:219
++#: ../src/plugin.py:110
++msgid "Russia"
++msgstr "Russland"
+-msgid "Most popular"
+-msgstr "Beliebteste Videos"
++#: ../src/MyTubeSearch.py:220
++#: ../src/plugin.py:111
++msgid "South Korea"
++msgstr "Süd Korea"
+-msgid "Most recent"
+-msgstr "Neueste Videos"
++#: ../src/MyTubeSearch.py:221
++#: ../src/plugin.py:112
++msgid "Spain"
++msgstr "Spanien"
+-msgid "Most responded"
+-msgstr "Meiste Antworten"
++#: ../src/MyTubeSearch.py:222
++#: ../src/plugin.py:113
++msgid "Sweden"
++msgstr "Schweden"
+-msgid "Most viewed"
+-msgstr "Meistgesehen"
++#: ../src/MyTubeSearch.py:223
++#: ../src/plugin.py:114
++msgid "Taiwan"
++msgstr "Taiwan"
+-msgid "Music"
+-msgstr "Musik"
++#: ../src/MyTubeSearch.py:224
++#: ../src/plugin.py:115
++msgid "United States"
++msgstr "USA"
+-msgid "My TubePlayer"
+-msgstr "MyTube Player"
++#: ../src/MyTubeSearch.py:228
++#: ../src/plugin.py:119
++msgid "Ascending"
++msgstr "Aufsteigend"
+-msgid "MyTube Settings"
+-msgstr "MyTube Einstellungen"
++#: ../src/MyTubeSearch.py:229
++#: ../src/plugin.py:120
++msgid "Descending"
++msgstr "Absteigend"
+-msgid "MyTubePlayer"
+-msgstr "MyTube Player"
++#: ../src/MyTubeSearch.py:237
++#: ../src/plugin.py:128
++#: ../src/plugin.py:790
++msgid "HD videos"
++msgstr "HD Videos"
+-msgid "MyTubePlayer Help"
+-msgstr "MyTube Player Hilfe"
++#: ../src/MyTubeSearch.py:238
++#: ../src/plugin.py:129
++#: ../src/plugin.py:794
++msgid "Most viewed"
++msgstr "Meistgesehen"
+-msgid "MyTubePlayer active video downloads"
+-msgstr "aktive Video downloads"
++#: ../src/MyTubeSearch.py:239
++#: ../src/plugin.py:130
++#: ../src/plugin.py:792
++msgid "Top rated"
++msgstr "Beste Bewertung"
+-msgid "MyTubePlayer settings"
+-msgstr "MyTube Player Einstellungen"
++#: ../src/MyTubeSearch.py:240
++#: ../src/plugin.py:131
++#: ../src/plugin.py:799
++msgid "Recently featured"
++msgstr "Kürzlich featured"
+-msgid "MyTubeVideoInfoScreen"
+-msgstr "MyTubeVideoInfoScreen"
++#: ../src/MyTubeSearch.py:241
++#: ../src/plugin.py:132
++#: ../src/plugin.py:797
++msgid "Most discussed"
++msgstr "Heiß diskutiert"
+-msgid "MyTubeVideohelpScreen"
+-msgstr "MyTubeVideohelpScreen"
++#: ../src/MyTubeSearch.py:242
++#: ../src/plugin.py:133
++#: ../src/plugin.py:793
++msgid "Top favorites"
++msgstr "Top-Favoriten"
+-msgid "New Zealand"
+-msgstr "Neu Seeland"
++#: ../src/MyTubeSearch.py:243
++#: ../src/plugin.py:134
++#: ../src/plugin.py:798
++msgid "Most linked"
++msgstr "Am meisten verlinkt"
+-msgid "News & Politics"
+-msgstr "Nachrichten & Politik"
++#: ../src/MyTubeSearch.py:244
++#: ../src/plugin.py:135
++#: ../src/plugin.py:800
++msgid "Most responded"
++msgstr "Meiste Antworten"
+-msgid "No"
+-msgstr "Nein"
++#: ../src/MyTubeSearch.py:245
++#: ../src/plugin.py:136
++#: ../src/plugin.py:796
++msgid "Most recent"
++msgstr "Neueste Videos"
+-msgid "No playable video found! Stop playing this movie?"
+-msgstr "Kein abspielbares Video gefunden! Wiedergabe beenden?"
++#: ../src/MyTubeSearch.py:249
++#: ../src/MyTubeSearch.py:252
++#: ../src/plugin.py:139
++#: ../src/plugin.py:142
++msgid "Ask user"
++msgstr "Nutzer fragen"
+-msgid "No videos to display"
+-msgstr "Keine Videos zum anzeigen"
++#: ../src/MyTubeSearch.py:249
++#: ../src/MyTubeSearch.py:252
++#: ../src/plugin.py:139
++#: ../src/plugin.py:142
++msgid "Return to movie list"
++msgstr "Zurück zur Videoliste"
+-msgid "No, but play video again"
+-msgstr "Nein, aber Video noch mal abspielen"
++#: ../src/MyTubeSearch.py:249
++#: ../src/plugin.py:139
++msgid "Play next video"
++msgstr "nächstes Video"
+-msgid "No, but switch to video entries."
+-msgstr "Nein, aber zu den Videos zurück."
++#: ../src/MyTubeSearch.py:249
++#: ../src/plugin.py:139
++msgid "Play video again"
++msgstr "Video noch mal abspielen"
+-msgid "No, but switch to video search."
+-msgstr "Nein, aber zur Videosuche zurück"
++#: ../src/MyTubeSearch.py:314
++msgid " Results"
++msgstr " Ergebnisse"
+-msgid "Nonprofits & Activism"
+-msgstr "Non-Profit"
++#: ../src/MyTubeSearch.py:398
++#: ../src/MyTubeSearch.py:562
++#: ../src/plugin.py:281
++#: ../src/plugin.py:1280
++#: ../src/plugin.py:1466
++msgid "Close"
++msgstr "Schließen"
+-msgid "Not fetching feed entries"
+-msgstr "Lade keine feed Einträge"
++#: ../src/MyTubeSearch.py:399
++msgid "Save"
++msgstr "Speichern"
+-msgid "People & Blogs"
+-msgstr "Leute & Blogs"
++#: ../src/MyTubeSearch.py:412
++#: ../src/MyTubeSearch.py:415
++msgid "MyTubePlayer settings"
++msgstr "MyTube Player Einstellungen"
+-msgid "Pets & Animals"
+-msgstr "Tiere"
++#: ../src/MyTubeSearch.py:419
++msgid "Display search results by:"
++msgstr "Suchergebnisse anzeigen:"
+-msgid "Play YouTube movies"
+-msgstr "YouTube Videos abspielen"
++#: ../src/MyTubeSearch.py:420
++msgid "Search restricted content:"
++msgstr "Suche ohne Altersbeschränkung:"
+-msgid "Play next video"
+-msgstr "nächstes Video"
++#: ../src/MyTubeSearch.py:421
++msgid "Search category:"
++msgstr "Such-Kategorie:"
+-msgid "Play video again"
+-msgstr "Video noch mal abspielen"
++#: ../src/MyTubeSearch.py:422
++msgid "Search region:"
++msgstr "Such-Region:"
+-msgid "Please enter your search term."
+-msgstr "Bitte geben Sie einen Suchbegriff ein."
++#: ../src/MyTubeSearch.py:423
++msgid "Load feed on startup:"
++msgstr "Feed beim Starten laden:"
+-msgid "Please select a standard feed or try searching for videos."
+-msgstr "Wählen Sie einen Standard Feed oder suchen Sie nach Videos."
++#: ../src/MyTubeSearch.py:426
++msgid "Start with following feed:"
++msgstr "Beginne mit folgendem feed:"
+-msgid "Poland"
+-msgstr "Polen"
++#: ../src/MyTubeSearch.py:427
++msgid "Videoplayer stop/exit behavior:"
++msgstr "Verhalten beim Drücken der STOPP/EXIT-Taste:"
+-msgid "Published"
+-msgstr "Veröffentlicht"
++#: ../src/MyTubeSearch.py:428
++msgid "Videobrowser exit behavior:"
++msgstr "Verhalten nach Verlassen der Videoliste:"
+-msgid "Rating"
+-msgstr "Bewertung"
++#: ../src/MyTubeSearch.py:435
++msgid "Download location"
++msgstr "Download Verzeichnis:"
+-msgid "Ratings: "
+-msgstr "Bewertungen: "
++#: ../src/MyTubeSearch.py:438
++msgid "Clear history on Exit:"
++msgstr "Verlauf beim Verlassen löschen:"
+-msgid "Really quit MyTube Player?"
+-msgstr "MyTube Player wirklich beenden?"
++#: ../src/MyTubeSearch.py:459
++msgid "Choose target folder"
++msgstr "Wähle Zielverzeichnis"
+-msgid "Recently featured"
+-msgstr "Kürzlich featured"
++#: ../src/MyTubeSearch.py:575
++#: ../src/MyTubeSearch.py:591
++msgid "MyTubePlayer active video downloads"
++msgstr "aktive Video downloads"
+-msgid "Related video entries."
+-msgstr "Ähnliche Videos"
++#: ../src/plugin.py:271
++msgid ""
++"Welcome to the MyTube Youtube Player.\n"
++"\n"
++"While entering your search term(s) you will get suggestions displayed matching your search term.\n"
++"\n"
++"To select a suggestion press DOWN on your remote, select the desired result and press OK on your remote to start the search.\n"
++"\n"
++"Press exit to get back to the input field."
++msgstr ""
++"Herzlich Willkommen beim MyTube YouTube Player.\n"
++"\n"
++"Während der Eingabe Ihres Suchwortes erhalten Sie passende Vorschläge zu Ihrer Sucheingabe.\n"
++"\n"
++"Um einen Vorschlag auszuwählen, drücken Sie die NACH UNTEN-Taste, wählen den entsprechenden Eintrag aus und drücken die OK-Taste um die Suche zu starten.\n"
++"\n"
++"Um zur Such-Eingabemaske zurück zu gelangen, drücken Sie die EXIT-Taste."
+-msgid "Relevance"
+-msgstr "Relevanz"
++#: ../src/plugin.py:272
++msgid ""
++"Welcome to the MyTube Youtube Player.\n"
++"\n"
++"Use the Bouqet+ button to navigate to the search field and the Bouqet- to navigate to the video entries.\n"
++"\n"
++"To play a movie just press OK on your remote control.\n"
++"\n"
++"Press info to see the movie description.\n"
++"\n"
++"Press the Menu button for additional options.\n"
++"\n"
++"The Help button shows this help again."
++msgstr ""
++"Herzlich Willkommen beim MyTube YouTube Player.\n"
++"\n"
++"Nutzen Sie die Bouqet+ Taste um zur Sucheingabe zu gelangen und die Bouqet- Taste für die Video Einträge.\n"
++"\n"
++"Um ein Video abzuspielen drücken Sie die OK-Taste auf Ihrer Fernbedienung.\n"
++"\n"
++"Mit der Info-Taste erhalten Sie die erweiterte Beschreibung zu einem Video.\n"
++"\n"
++"Für weitere Einstellungen drücken Sie die Menü-Taste.\n"
++"\n"
++"Um diese Hilfe erneut anzuzeigen, drücken Sie die Hilfe-Taste."
+-msgid "Response video entries."
+-msgstr "Video Antworten"
++#: ../src/plugin.py:282
++msgid "Std. Feeds"
++msgstr "Std. Feeds"
+-msgid "Return to movie list"
+-msgstr "Zurück zur Videoliste"
++#: ../src/plugin.py:283
++msgid "History"
++msgstr "Verlauf"
+-msgid "Russia"
+-msgstr "Russland"
++#: ../src/plugin.py:398
++#: ../src/plugin.py:422
++#: ../src/plugin.py:464
++msgid "Genuine Dreambox validation failed!"
++msgstr "Prüfung auf Original-Dreambox gescheitert!"
+-msgid "Save"
+-msgstr "Speichern"
++#: ../src/plugin.py:398
++#: ../src/plugin.py:422
++#: ../src/plugin.py:464
++msgid "Verify your Dreambox authenticity by running the genuine dreambox plugin!"
++msgstr "Bitte mit dem \"Genuine Dreambox Plugin\" auf Echtheit prüfen!"
+-msgid "Science & Technology"
+-msgstr "Wissenschaft & Technik"
++#: ../src/plugin.py:417
++#: ../src/plugin.py:476
++msgid "Fetching feed entries"
++msgstr "Lade feeds"
++#: ../src/plugin.py:417
++#: ../src/plugin.py:476
++msgid "Trying to download the Youtube feed entries. Please wait..."
++msgstr "YouTube feeds werden geladen, bitte warten..."
++
++#: ../src/plugin.py:434
++msgid "MyTubePlayer"
++msgstr "MyTube Player"
++
++#: ../src/plugin.py:438
+ msgid "Search Term(s)"
+ msgstr "Suchwort(e)"
+-msgid "Search category:"
+-msgstr "Such-Kategorie:"
++#: ../src/plugin.py:478
++msgid "Fetching search entries"
++msgstr "Lade Suchergebnisse"
+-msgid "Search region:"
+-msgstr "Such-Region:"
++#: ../src/plugin.py:478
++msgid "Trying to download the Youtube search results. Please wait..."
++msgstr "YouTube Suchergebnisse werden geladen, bitte warten..."
+-msgid "Search restricted content:"
+-msgstr "Suche ohne Altersbeschränkung:"
++#: ../src/plugin.py:480
++msgid "An error occured."
++msgstr "Es ist ein Fehler aufgetreten."
+-msgid "Select new feed to view."
+-msgstr "Neuen feed auswählen"
++#: ../src/plugin.py:480
++msgid "There was an error getting the feed entries. Please try again."
++msgstr "Fehler beim Laden der Suchergebnisse. Noch mal probieren."
+-msgid "Select your choice."
+-msgstr "Treffen Sie Ihre Wahl."
++#: ../src/plugin.py:483
++msgid "No videos to display"
++msgstr "Keine Videos zum anzeigen"
+-msgid "Short Movies"
+-msgstr "Kurzvideos"
++#: ../src/plugin.py:483
++msgid "Please select a standard feed or try searching for videos."
++msgstr "Wählen Sie einen Standard Feed oder suchen Sie nach Videos."
+-msgid "Sorry, video is not available!"
+-msgstr "Video nicht verfügbar!"
++#: ../src/plugin.py:485
++msgid "Not fetching feed entries"
++msgstr "Lade keine feed Einträge"
+-msgid "South Korea"
+-msgstr "Süd Korea"
++#: ../src/plugin.py:485
++msgid "Please enter your search term."
++msgstr "Bitte geben Sie einen Suchbegriff ein."
+-msgid "Spain"
+-msgstr "Spanien"
++#: ../src/plugin.py:504
++#: ../src/plugin.py:506
++#: ../src/plugin.py:513
++msgid "MyTubePlayer Help"
++msgstr "MyTube Player Hilfe"
+-msgid "Sports"
+-msgstr "Sport"
++#: ../src/plugin.py:525
++#: ../src/plugin.py:531
++msgid "MyTube Settings"
++msgstr "MyTube Einstellungen"
+-msgid "Start with following feed:"
+-msgstr "Beginne mit folgendem feed:"
++#: ../src/plugin.py:528
++#: ../src/plugin.py:543
++msgid "Select your choice."
++msgstr "Treffen Sie Ihre Wahl."
+-msgid "Std. Feeds"
+-msgstr "Std. Feeds"
++#: ../src/plugin.py:533
++msgid "View related videos"
++msgstr "Ähnliche Videos"
+-msgid "Stop playing this movie?"
+-msgstr "Wiedergabe beenden?"
++#: ../src/plugin.py:534
++msgid "View response videos"
++msgstr "Video Antworten"
+-msgid "Sweden"
+-msgstr "Schweden"
++#: ../src/plugin.py:538
++msgid "Download Video"
++msgstr "Video runterladen"
+-msgid "Tags: "
+-msgstr "Tags: "
++#: ../src/plugin.py:539
++msgid "View active downloads"
++msgstr "Aktive Downloads anzeigen"
+-msgid "Taiwan"
+-msgstr "Taiwan"
++#: ../src/plugin.py:577
++msgid "Enter your search term(s)"
++msgstr "Suchbegriff eingeben"
+-msgid "There was an error getting the feed entries. Please try again."
+-msgstr "Fehler beim Laden der Suchergebnisse. Noch mal probieren."
++#: ../src/plugin.py:621
++msgid "No, but switch to video entries."
++msgstr "Nein, aber zu den Videos zurück."
+-msgid "This Month"
+-msgstr "Diesen Monat"
++#: ../src/plugin.py:627
++msgid "No, but switch to video search."
++msgstr "Nein, aber zur Videosuche zurück"
+-msgid "This Week"
+-msgstr "Diese Woche"
++#: ../src/plugin.py:629
++msgid "Really quit MyTube Player?"
++msgstr "MyTube Player wirklich beenden?"
+-msgid "This is the help screen. Feed me with something to display."
+-msgstr ""
++#: ../src/plugin.py:722
++msgid "Sorry, video is not available!"
++msgstr "Video nicht verfügbar!"
+-msgid "Today"
+-msgstr "Heute"
++#: ../src/plugin.py:757
++msgid "Do you want to see more entries?"
++msgstr "Weitere Videos?"
+-msgid "Top favorites"
+-msgstr "Top-Favoriten"
++#: ../src/plugin.py:795
++msgid "Most popular"
++msgstr "Beliebteste Videos"
+-msgid "Top rated"
+-msgstr "Beste Bewertung"
++#: ../src/plugin.py:802
++msgid "Select new feed to view."
++msgstr "Neuen feed auswählen"
+-msgid "Travel & Events"
+-msgstr "Reisen & Events"
++#: ../src/plugin.py:968
++msgid "More video entries."
++msgstr "Weitere Video Einträge."
+-msgid "Trying to download the Youtube feed entries. Please wait..."
+-msgstr "YouTube feeds werden geladen, bitte warten..."
++#: ../src/plugin.py:976
++msgid "Related video entries."
++msgstr "Ähnliche Videos"
+-msgid "Trying to download the Youtube search results. Please wait..."
+-msgstr "YouTube Suchergebnisse werden geladen, bitte warten..."
++#: ../src/plugin.py:984
++msgid "Response video entries."
++msgstr "Video Antworten"
+-msgid "United States"
+-msgstr "USA"
++#: ../src/plugin.py:1103
++#: ../src/plugin.py:1341
++msgid "Added: "
++msgstr "Hinzugefügt: "
+-msgid "Videobrowser exit behavior:"
+-msgstr "Verhalten nach Verlassen der Videoliste:"
++#: ../src/plugin.py:1103
++#: ../src/plugin.py:1344
++msgid "Views: "
++msgstr "Aufrufe: "
+-msgid "Videoplayer stop/exit behavior:"
+-msgstr "Verhalten beim Drücken der STOPP/EXIT-Taste:"
++#: ../src/plugin.py:1103
++#: ../src/plugin.py:1335
++msgid "Duration: "
++msgstr "Dauer: "
+-msgid "View Count"
+-msgstr "Aufrufe"
++#: ../src/plugin.py:1103
++msgid "Ratings: "
++msgstr "Bewertungen: "
+-msgid "View active downloads"
+-msgstr "Aktive Downloads anzeigen"
++#: ../src/plugin.py:1309
++msgid "Downloading screenshots. Please wait..."
++msgstr "Bilder werden geladen. Bitte warten..."
+-msgid "View related videos"
+-msgstr "Ähnliche Videos"
++#: ../src/plugin.py:1338
++msgid "Author: "
++msgstr "Autor: "
+-msgid "View response videos"
+-msgstr "Video Antworten"
++#: ../src/plugin.py:1347
++msgid "Tags: "
++msgstr "Tags: "
+-msgid "Views: "
+-msgstr "Aufrufe: "
++#: ../src/plugin.py:1350
++msgid "MyTubeVideoInfoScreen"
++msgstr "MyTubeVideoInfoScreen"
+-msgid ""
+-"Welcome to the MyTube Youtube Player.\n"
+-"\n"
+-"Use the Bouqet+ button to navigate to the search field and the Bouqet- to "
+-"navigate to the video entries.\n"
+-"\n"
+-"To play a movie just press OK on your remote control.\n"
+-"\n"
+-"Press info to see the movie description.\n"
+-"\n"
+-"Press the Menu button for additional options.\n"
+-"\n"
+-"The Help button shows this help again."
+-msgstr ""
+-"Herzlich Willkommen beim MyTube YouTube Player.\n"
+-"\n"
+-"Nutzen Sie die Bouqet+ Taste um zur Sucheingabe zu gelangen und die Bouqet- "
+-"Taste für die Video Einträge.\n"
+-"\n"
+-"Um ein Video abzuspielen drücken Sie die OK-Taste auf Ihrer Fernbedienung.\n"
+-"\n"
+-"Mit der Info-Taste erhalten Sie die erweiterte Beschreibung zu einem Video.\n"
+-"\n"
+-"Für weitere Einstellungen drücken Sie die Menü-Taste.\n"
+-"\n"
+-"Um diese Hilfe erneut anzuzeigen, drücken Sie die Hilfe-Taste."
++#: ../src/plugin.py:1484
++msgid "Help"
++msgstr "Hilfe"
+-msgid ""
+-"Welcome to the MyTube Youtube Player.\n"
+-"\n"
+-"While entering your search term(s) you will get suggestions displayed "
+-"matching your search term.\n"
+-"\n"
+-"To select a suggestion press DOWN on your remote, select the desired result "
+-"and press OK on your remote to start the search.\n"
+-"\n"
+-"Press exit to get back to the input field."
+-msgstr ""
+-"Herzlich Willkommen beim MyTube YouTube Player.\n"
+-"\n"
+-"Während der Eingabe Ihres Suchwortes erhalten Sie passende Vorschläge zu "
+-"Ihrer Sucheingabe.\n"
+-"\n"
+-"Um einen Vorschlag auszuwählen drücken Sie die NACH UNTEN-Taste, wählen den "
+-"entsprechenden Eintrag aus und drücken die OK-Taste um die Suche zu "
+-"starten.\n"
+-"\n"
+-"Um zur Such-Eingabemaske zurück zu gelangen drücken Sie die EXIT-Taste."
++#: ../src/plugin.py:1488
++msgid "This is the help screen. Feed me with something to display."
++msgstr "Dies ist die MyTube Hilfe. Bitte ausfüllen."
+-msgid "Yes"
+-msgstr "Ja"
++#: ../src/plugin.py:1493
++msgid "MyTubeVideohelpScreen"
++msgstr "MyTubeVideohelpScreen"
++
++#: ../src/plugin.py:1744
++msgid "No, but play video again"
++msgstr "Nein, aber Video noch mal abspielen"
++#: ../src/plugin.py:1745
+ msgid "Yes, but play next video"
+ msgstr "Ja, aber nächstes Video abspielen"
++#: ../src/plugin.py:1746
+ msgid "Yes, but play previous video"
+ msgstr "Ja, aber vorheriges Video abspielen"
++#: ../src/plugin.py:1749
++msgid "Stop playing this movie?"
++msgstr "Wiedergabe beenden?"
++
++#: ../src/plugin.py:1751
++msgid "No playable video found! Stop playing this movie?"
++msgstr "Kein abspielbares Video gefunden! Wiedergabe beenden?"
++
++#: ../src/plugin.py:1797
++msgid "My TubePlayer"
++msgstr "MyTube Player"
++
++#: ../src/plugin.py:1798
++msgid "Play YouTube movies"
++msgstr "YouTube Videos abspielen"
++
+ #~ msgid "View Downloads"
+ #~ msgstr "Downloads anzeigen"
+diff --git a/mytube/src/MyTubeSearch.py b/mytube/src/MyTubeSearch.py
+index be63669..a1a324c 100755
+--- a/mytube/src/MyTubeSearch.py
++++ b/mytube/src/MyTubeSearch.py
+@@ -1,33 +1,28 @@
++from enigma import eListboxPythonMultiContent, RT_HALIGN_LEFT, RT_HALIGN_RIGHT, gFont, eTimer
+ from MyTubeService import GoogleSuggestions
+ from Screens.Screen import Screen
+ from Screens.LocationBox import MovieLocationBox
+-from Components.config import config, Config, ConfigSelection, ConfigText, getConfigListEntry, ConfigSubsection, ConfigYesNo, ConfigIP, ConfigNumber,ConfigLocations
++from Components.config import config, ConfigText, getConfigListEntry
++from Components.config import KEY_DELETE, KEY_BACKSPACE, KEY_ASCII, KEY_TIMEOUT
+ from Components.ConfigList import ConfigListScreen
+-from Components.config import KEY_DELETE, KEY_BACKSPACE, KEY_LEFT, KEY_RIGHT, KEY_HOME, KEY_END, KEY_TOGGLEOW, KEY_ASCII, KEY_TIMEOUT
+ from Components.ActionMap import ActionMap
+ from Components.Button import Button
+ from Components.Label import Label
+-from Components.ScrollLabel import ScrollLabel
+ from Components.Sources.List import List
+-from Components.Pixmap import Pixmap
+-from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest
+-from Components.Task import Task, Job, job_manager
+-from enigma import eListboxPythonMultiContent, RT_HALIGN_LEFT, RT_HALIGN_RIGHT, gFont, eListbox,ePoint,eTimer
++from Components.MultiContent import MultiContentEntryText 
+ from Components.Task import job_manager
+-from Tools.Directories import pathExists, fileExists, resolveFilename, SCOPE_HDD
++from Tools.Directories import resolveFilename, SCOPE_HDD
++
+ from threading import Thread
+ from threading import Condition
+ from xml.etree.cElementTree import parse as cet_parse
+ from StringIO import StringIO
+-
+-
+-import urllib
++#import urllib
+ from urllib import FancyURLopener
+ class MyOpener(FancyURLopener):
+       version = 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12'
+-
+ class ConfigTextWithGoogleSuggestions(ConfigText):
+       class SuggestionsThread(Thread):
+               def __init__(self, suggestionsService):
+@@ -151,122 +146,14 @@ class ConfigTextWithGoogleSuggestions(ConfigText):
+               if self.suggestionsWindow is not None:
+                       self.suggestionsWindow.enableSelection(value)
+-
+-config.plugins.mytube = ConfigSubsection()
+-config.plugins.mytube.search = ConfigSubsection()
+-
+-config.plugins.mytube.search.searchTerm = ConfigTextWithGoogleSuggestions("", False, threaded = True)
+-config.plugins.mytube.search.orderBy = ConfigSelection(
+-                              [
+-                               ("relevance", _("Relevance")),
+-                               ("viewCount", _("View Count")),
+-                               ("published", _("Published")),
+-                               ("rating", _("Rating"))
+-                              ], "relevance")
+-config.plugins.mytube.search.time = ConfigSelection(
+-                              [
+-                               ("all_time", _("All Time")),
+-                               ("this_month", _("This Month")),
+-                               ("this_week", _("This Week")),
+-                               ("today", _("Today"))
+-                              ], "all_time")
+-config.plugins.mytube.search.racy = ConfigSelection(
+-                              [
+-                               ("include", _("Yes")),
+-                               ("exclude", _("No"))
+-                              ], "include")
+-config.plugins.mytube.search.categories = ConfigSelection(
+-                              [
+-                               (None, _("All")),
+-                               ("Film", _("Film & Animation")),
+-                               ("Autos", _("Autos & Vehicles")),
+-                               ("Music", _("Music")),
+-                               ("Animals", _("Pets & Animals")),
+-                               ("Sports", _("Sports")),
+-                               ("Travel", _("Travel & Events")),
+-                               ("Shortmov", _("Short Movies")),
+-                               ("Games", _("Gaming")),
+-                               ("Comedy", _("Comedy")),
+-                               ("People", _("People & Blogs")),
+-                               ("News", _("News & Politics")),
+-                               ("Entertainment", _("Entertainment")),
+-                               ("Education", _("Education")),
+-                               ("Howto", _("Howto & Style")),
+-                               ("Nonprofit", _("Nonprofits & Activism")),
+-                               ("Tech", _("Science & Technology"))
+-                              ], None)
+-config.plugins.mytube.search.lr = ConfigSelection(
+-                              [
+-                               (None, _("All")),
+-                               ("au", _("Australia")),
+-                               ("br", _("Brazil")),                            
+-                               ("ca", _("Canada")),
+-                               ("cz", _("Czech Republic")),
+-                               ("fr", _("France")),
+-                               ("de", _("Germany")),
+-                               ("gb", _("Great Britain")),
+-                               ("au", _("Australia")),
+-                               ("nl", _("Holland")),
+-                               ("hk", _("Hong Kong")),
+-                               ("in", _("India")),
+-                               ("ie", _("Ireland")),
+-                               ("il", _("Israel")),
+-                               ("it", _("Italy")),
+-                               ("jp", _("Japan")),
+-                               ("mx", _("Mexico")),
+-                               ("nz", _("New Zealand")),
+-                               ("pl", _("Poland")),
+-                               ("ru", _("Russia")),
+-                               ("kr", _("South Korea")),
+-                               ("es", _("Spain")),
+-                               ("se", _("Sweden")),
+-                               ("tw", _("Taiwan")),
+-                               ("us", _("United States")) 
+-                              ], None)
+-config.plugins.mytube.search.sortOrder = ConfigSelection(
+-                              [
+-                               ("ascending", _("Ascending")),
+-                               ("descending", _("Descending"))
+-                              ], "ascending")
+-
+-config.plugins.mytube.general = ConfigSubsection()
+-config.plugins.mytube.general.showHelpOnOpen = ConfigYesNo(default = True)
+-config.plugins.mytube.general.loadFeedOnOpen = ConfigYesNo(default = True)
+-config.plugins.mytube.general.startFeed = ConfigSelection(
+-                              [
+-                               ("hd", _("HD videos")),
+-                               ("most_viewed", _("Most viewed")),
+-                               ("top_rated", _("Top rated")),
+-                               ("recently_featured", _("Recently featured")),
+-                               ("most_discussed", _("Most discussed")),
+-                               ("top_favorites", _("Top favorites")),
+-                               ("most_linked", _("Most linked")),
+-                               ("most_responded", _("Most responded")),
+-                               ("most_recent", _("Most recent"))
+-                              ], "most_viewed")
+-
+-config.plugins.mytube.general.on_movie_stop = ConfigSelection(default = "ask", choices = [
+-      ("ask", _("Ask user")), ("quit", _("Return to movie list")), ("playnext", _("Play next video")), ("playagain", _("Play video again")) ])
+-
+-config.plugins.mytube.general.on_exit = ConfigSelection(default = "ask", choices = [
+-      ("ask", _("Ask user")), ("quit", _("Return to movie list"))])
+-
+-
+ default = resolveFilename(SCOPE_HDD)
+ tmp = config.movielist.videodirs.value
+ if default not in tmp:
+       tmp.append(default)
+-config.plugins.mytube.general.videodir = ConfigSelection(default = default, choices = tmp)
+-config.plugins.mytube.general.history = ConfigText(default="")
+-config.plugins.mytube.general.clearHistoryOnClose = ConfigYesNo(default = False)
+-
+-#config.plugins.mytube.general.useHTTPProxy = ConfigYesNo(default = False)
+-#config.plugins.mytube.general.ProxyIP = ConfigIP(default=[0,0,0,0])
+-#config.plugins.mytube.general.ProxyPort = ConfigNumber(default=8080)
+ class MyTubeSuggestionsListScreen(Screen):
+       skin = """
+-              <screen name="MyTubeSuggestionsListScreen" position="60,93" zPosition="6" size="610,160" flags="wfNoBorder" >
++              <screen name="MyTubeSuggestionsListScreen" title="MyTube - Search" position="60,93" zPosition="6" size="610,160" flags="wfNoBorder" >
+                       <ePixmap position="0,0" zPosition="-1" size="610,160" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/MyTube/suggestions_bg.png" alphatest="on" transparent="1" backgroundColor="transparent"/>
+                       <widget source="suggestionslist" render="Listbox" position="10,5" zPosition="7" size="580,150" scrollbarMode="showOnDemand" transparent="1" >
+                               <convert type="TemplatedMultiContent">
+@@ -366,7 +253,7 @@ class MyTubeSuggestionsListScreen(Screen):
+ class MyTubeSettingsScreen(Screen, ConfigListScreen):
+       skin = """
+-              <screen name="MyTubeSettingsScreen" flags="wfNoBorder" position="0,0" size="720,576" title="MyTubePlayerMainScreen..." >
++              <screen name="MyTubeSettingsScreen" flags="wfNoBorder" position="0,0" size="720,576" title="MyTube - Settings" >
+                       <ePixmap position="0,0" zPosition="-1" size="720,576" pixmap="~/mytubemain_bg.png" alphatest="on" transparent="1" backgroundColor="transparent"/>
+                       <widget name="title" position="60,50" size="600,50" zPosition="5" valign="center" halign="left" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
+                       <widget name="config" zPosition="2" position="60,120" size="610,370" scrollbarMode="showOnDemand" transparent="1" />
+@@ -524,7 +411,7 @@ class MyTubeSettingsScreen(Screen, ConfigListScreen):
+ class MyTubeTasksScreen(Screen):
+       skin = """
+-              <screen name="MyTubeTasksScreen" flags="wfNoBorder" position="0,0" size="720,576" title="MyTubePlayerMainScreen..." >
++              <screen name="MyTubeTasksScreen" flags="wfNoBorder" position="0,0" size="720,576" title="MyTube - Tasks" >
+                       <ePixmap position="0,0" zPosition="-1" size="720,576" pixmap="~/mytubemain_bg.png" alphatest="on" transparent="1" backgroundColor="transparent"/>
+                       <widget name="title" position="60,50" size="600,50" zPosition="5" valign="center" halign="left" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
+                       <widget source="tasklist" render="Listbox" position="60,120" size="610,370" zPosition="7" scrollbarMode="showOnDemand" transparent="1" >
+@@ -610,7 +497,7 @@ class MyTubeTasksScreen(Screen):
+ class MyTubeHistoryScreen(Screen):
+       skin = """
+-              <screen name="MyTubeHistoryScreen" position="60,93" zPosition="6" size="610,160" flags="wfNoBorder" >
++              <screen name="MyTubeHistoryScreen" position="60,93" zPosition="6" size="610,160" flags="wfNoBorder" title="MyTube - History">
+                       <ePixmap position="0,0" zPosition="-1" size="610,160" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/MyTube/suggestions_bg.png" alphatest="on" transparent="1" backgroundColor="transparent"/>
+                       <widget source="historylist" render="Listbox" position="10,5" zPosition="7" size="580,150" scrollbarMode="showOnDemand" transparent="1" >
+                               <convert type="TemplatedMultiContent">
+diff --git a/mytube/src/MyTubeService.py b/mytube/src/MyTubeService.py
+index 246575c..fc3dafd 100755
+--- a/mytube/src/MyTubeService.py
++++ b/mytube/src/MyTubeService.py
+@@ -1,23 +1,24 @@
+ # -*- coding: iso-8859-1 -*-
+-from __init__ import bin2long, long2bin, rsa_pub1024, decrypt_block
++from enigma import ePythonMessagePump
++
++from __init__ import decrypt_block
++from ThreadQueue import ThreadQueue
+ import gdata.youtube
+ import gdata.youtube.service
+ from gdata.service import BadAuthentication
+-from Tools.LoadPixmap import LoadPixmap
+-from Components.config import config, Config, ConfigSelection, ConfigText, getConfigListEntry, ConfigSubsection, ConfigYesNo, ConfigIP, ConfigNumber
+-from Components.ConfigList import ConfigListScreen
+-from Components.config import KEY_DELETE, KEY_BACKSPACE, KEY_LEFT, KEY_RIGHT, KEY_HOME, KEY_END, KEY_TOGGLEOW, KEY_ASCII, KEY_TIMEOUT
+ from twisted.web import client
+ from twisted.internet import reactor
+-from urllib2 import Request, URLError, HTTPError, urlopen as urlopen2
+-from socket import gaierror,error
+-import re, os, sys, socket
++from urllib2 import Request, URLError, urlopen as urlopen2
++from socket import gaierror, error
++import os, socket
+ from urllib import quote, unquote_plus, unquote
+-import cookielib
+-from httplib import HTTPConnection,CannotSendRequest,BadStatusLine,HTTPException
+-HTTPConnection.debuglevel = 1
++from httplib import HTTPConnection, CannotSendRequest, BadStatusLine, HTTPException
++
+ from urlparse import parse_qs
++from threading import Thread
++
++HTTPConnection.debuglevel = 1
+ def validate_cert(cert, key):
+       buf = decrypt_block(cert[8:], key) 
+@@ -50,7 +51,7 @@ std_headers = {
+ class GoogleSuggestions():
+       def __init__(self, callback, ds = None, json = None, hl = None):
+-              self.callback = callback
++              self.gotFeed = callback
+               self.conn = HTTPConnection("google.com")
+               #GET /complete/search?output=toolbar&ds=yt&hl=en&jsonp=self.gotSuggestions&q=s
+               self.prepQuerry = "/complete/search?output=toolbar&"
+@@ -63,7 +64,7 @@ class GoogleSuggestions():
+               self.prepQuerry = self.prepQuerry + "jsonp=self.gotSuggestions&q="
+       def gotSuggestions(self, suggestslist):
+-              self.callback(suggestslist)
++              self.gotFeed(suggestslist)
+       def getSuggestions(self, querryString):
+               if querryString is not "":
+@@ -72,22 +73,22 @@ class GoogleSuggestions():
+                               self.conn.request("GET", querry)
+                       except (CannotSendRequest, gaierror, error):
+                               print "[MyTube]  Can not send request for suggestions"
+-                              self.callback(None)
++                              self.gotFeed(None)
+                       else:
+                               try:
+                                       response = self.conn.getresponse()
+                               except BadStatusLine:
+                                       print "[MyTube]  Can not get a response from google"
+-                                      self.callback(None)
++                                      self.gotFeed(None)
+                               else:
+                                       if response.status == 200:
+                                               data = response.read()
+                                               self.gotSuggestions(data)
+                                       else:
+-                                              self.callback(None)
++                                              self.gotFeed(None)
+                       self.conn.close()
+               else:
+-                      self.callback(None)
++                      self.gotFeed(None)
+ class MyTubeFeedEntry():
+@@ -224,16 +225,16 @@ class MyTubeFeedEntry():
+                       try:
+                               infopage = urlopen2(request).read()
+                               videoinfo = parse_qs(infopage)
+-                              if 'fmt_url_map' in videoinfo:
++                              if ('url_encoded_fmt_stream_map' or 'fmt_url_map') in videoinfo:
+                                       break
+                       except (URLError, HTTPException, socket.error), err:
+                               print "[MyTube] Error: unable to download video infopage",str(err)
+                               return video_url
+-              if 'fmt_url_map' not in videoinfo:
++              if ('url_encoded_fmt_stream_map' or 'fmt_url_map') not in videoinfo:
+                       # Attempt to see if YouTube has issued an error message
+                       if 'reason' not in videoinfo:
+-                              print '[MyTube] Error: unable to extract "fmt_url_map" parameter for unknown reason'
++                              print '[MyTube] Error: unable to extract "fmt_url_map" or "url_encoded_fmt_stream_map" parameter for unknown reason'
+                       else:
+                               reason = unquote_plus(videoinfo['reason'][0])
+                               print '[MyTube] Error: YouTube said: %s' % reason.decode('utf-8')
+@@ -241,22 +242,30 @@ class MyTubeFeedEntry():
+               video_fmt_map = {}
+               fmt_infomap = {}
+-              tmp_fmtUrlDATA = videoinfo['fmt_url_map'][0].split(',')
++              if videoinfo.has_key('url_encoded_fmt_stream_map'):
++                      tmp_fmtUrlDATA = videoinfo['url_encoded_fmt_stream_map'][0].split(',url=')
++              else:
++                      tmp_fmtUrlDATA = videoinfo['fmt_url_map'][0].split(',')
+               for fmtstring in tmp_fmtUrlDATA:
+-                      (fmtid,fmturl) = fmtstring.split('|')
++                      if videoinfo.has_key('url_encoded_fmt_stream_map'):
++                              (fmturl, fmtid) = fmtstring.split('&itag=')
++                              if fmturl.find("url=") !=-1:
++                                      fmturl = fmturl.replace("url=","")
++                      else:
++                              (fmtid,fmturl) = fmtstring.split('|')
+                       if VIDEO_FMT_PRIORITY_MAP.has_key(fmtid):
+                               video_fmt_map[VIDEO_FMT_PRIORITY_MAP[fmtid]] = { 'fmtid': fmtid, 'fmturl': unquote_plus(fmturl) }
+                       fmt_infomap[int(fmtid)] = unquote_plus(fmturl)
+               print "[MyTube] got",sorted(fmt_infomap.iterkeys())
+               if video_fmt_map and len(video_fmt_map):
+                       print "[MyTube] found best available video format:",video_fmt_map[sorted(video_fmt_map.iterkeys())[0]]['fmtid']
+-                      video_url = video_fmt_map[sorted(video_fmt_map.iterkeys())[0]]['fmturl']
++                      video_url = video_fmt_map[sorted(video_fmt_map.iterkeys())[0]]['fmturl'].split(';')[0]
+                       print "[MyTube] found best available video url:",video_url
+               
+               return video_url
+       
+       def getRelatedVideos(self):
+-              print "[MyTubeFeedEntry] getResponseVideos()"
++              print "[MyTubeFeedEntry] getRelatedVideos()"
+               for link in self.entry.link:
+                       #print "Related link: ", link.rel.endswith
+                       if link.rel.endswith("video.related"):
+@@ -279,13 +288,14 @@ class MyTubePlayerService():
+               print "[MyTube] MyTubePlayerService - init"
+               self.feedentries = []
+               self.feed = None
+-              
++                              
+       def startService(self):
+               print "[MyTube] MyTubePlayerService - startService"
+-              self.yt_service = gdata.youtube.service.YouTubeService()
+-              self.yt_service.developer_key = 'AI39si4AjyvU8GoJGncYzmqMCwelUnqjEMWTFCcUtK-VUzvWygvwPO-sadNwW5tNj9DDCHju3nnJEPvFy4WZZ6hzFYCx8rJ6Mw'
+-              self.yt_service.client_id = 'ytapi-dream-MyTubePlayer-i0kqrebg-0'
+-              self.loggedIn = False
++              self.yt_service = gdata.youtube.service.YouTubeService( 
++                      developer_key = 'AI39si4AjyvU8GoJGncYzmqMCwelUnqjEMWTFCcUtK-VUzvWygvwPO-sadNwW5tNj9DDCHju3nnJEPvFy4WZZ6hzFYCx8rJ6Mw',
++                      client_id = 'ytapi-dream-MyTubePlayer-i0kqrebg-0' 
++              )
++#             self.loggedIn = False
+               #os.environ['http_proxy'] = 'http://169.229.50.12:3128'
+               #proxy = os.environ.get('http_proxy')
+               #print "FOUND ENV PROXY-->",proxy
+@@ -295,23 +305,18 @@ class MyTubePlayerService():
+       def stopService(self):
+               print "[MyTube] MyTubePlayerService - stopService"
+               del self.ytService
+-              self.loggedIn = False
+-
+-      def isLoggedIn(self):
+-              return self.loggedIn
+-      def getFeed(self, url):
++      def getFeed(self, url, callback = None, errorback = None):
+               print "[MyTube] MyTubePlayerService - getFeed:",url
+               self.feedentries = []
+-              self.feed = self.yt_service.GetYouTubeVideoFeed(url)
+-              for entry in self.feed.entry:
+-                      MyFeedEntry = MyTubeFeedEntry(self, entry)
+-                      self.feedentries.append(MyFeedEntry)
+-              return self.feed                        
++              queryThread = YoutubeQueryThread(self.yt_service.GetYouTubeVideoFeed, url, self.gotFeed, self.gotFeedError, callback, errorback)
++              queryThread.start()
++              return queryThread              
+       def search(self, searchTerms, startIndex = 1, maxResults = 25,
+                                       orderby = "relevance", racy = "include", 
+-                                      author = "", lr = "", categories = "", sortOrder = "ascending"):
++                                      author = "", lr = "", categories = "", sortOrder = "ascending", 
++                                      callback = None, errorback = None):
+               print "[MyTube] MyTubePlayerService - search()"
+               self.feedentries = []
+               query = gdata.youtube.service.YouTubeVideoQuery()
+@@ -325,17 +330,24 @@ class MyTubePlayerService():
+                       query.categories = categories
+               query.start_index = startIndex
+               query.max_results = maxResults
+-              try:
+-                      feed = self.yt_service.YouTubeQuery(query)
+-              except gaierror:
+-                      feed = None
++              queryThread = YoutubeQueryThread(self.yt_service.YouTubeQuery, query, self.gotFeed, self.gotFeedError, callback, errorback)
++              queryThread.start()
++              return queryThread      
++      
++      def gotFeed(self, feed, callback):
+               if feed is not None:
+                       self.feed = feed
+                       for entry in self.feed.entry:
+                               MyFeedEntry = MyTubeFeedEntry(self, entry)
+                               self.feedentries.append(MyFeedEntry)
+-              return self.feed                
+-
++              if callback is not None:
++                      callback(self.feed)
++                      
++      def gotFeedError(self, exception, errorback):
++              if errorback is not None:
++                      errorback(exception)
++      
++      
+       def getTitle(self):
+               return self.feed.title.text
+@@ -354,5 +366,38 @@ class MyTubePlayerService():
+                               return link.href
+               return None
+-
++class YoutubeQueryThread(Thread):
++      def __init__(self, query, param, gotFeed, gotFeedError, callback, errorback):
++              Thread.__init__(self)
++              self.messagePump = ePythonMessagePump()
++              self.messages = ThreadQueue()
++              self.gotFeed = gotFeed
++              self.gotFeedError = gotFeedError
++              self.callback = callback
++              self.errorback = errorback
++              self.query = query
++              self.param = param
++              self.canceled = False
++              self.messagePump.recv_msg.get().append(self.finished)
++      
++      def cancel(self):
++              self.canceled = True
++      
++      def run(self):
++              try:
++                      feed = self.query(self.param)
++                      self.messages.push((True, feed, self.callback))
++                      self.messagePump.send(0)
++              except Exception, ex:
++                      self.messages.push((False, ex, self.errorback))
++                      self.messagePump.send(0)                        
++      
++      def finished(self, val):                
++              if not self.canceled:
++                      message = self.messages.pop()
++                      if message[0]:          
++                              self.gotFeed(message[1], message[2])
++                      else:
++                              self.gotFeedError(message[1], message[2])
++              
+ myTubeService = MyTubePlayerService()
+diff --git a/mytube/src/ThreadQueue.py b/mytube/src/ThreadQueue.py
+new file mode 100644
+index 0000000..ddec604
+--- /dev/null
++++ b/mytube/src/ThreadQueue.py
+@@ -0,0 +1,20 @@
++from threading import Lock
++
++class ThreadQueue:
++      def __init__(self):
++              self.__list = [ ]
++              self.__lock = Lock()
++
++      def push(self, val):
++              lock = self.__lock
++              lock.acquire()
++              self.__list.append(val)
++              lock.release()
++
++      def pop(self):
++              lock = self.__lock
++              lock.acquire()
++              ret = self.__list.pop()
++              lock.release()
++              return ret
++
+diff --git a/mytube/src/__init__.py b/mytube/src/__init__.py
+index c8c21ef..b7b3a56 100755
+--- a/mytube/src/__init__.py
++++ b/mytube/src/__init__.py
+@@ -1,8 +1,7 @@
+ # -*- coding: ISO-8859-1 -*-
+ from Components.Language import language
+ from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_LANGUAGE
+-import os,gettext
+-import sha
++import os, gettext, hashlib
+ PluginLanguageDomain = "MyTube"
+ PluginLanguagePath = "Extensions/MyTube/locale"
+@@ -35,7 +34,7 @@ def decrypt_block(src, mod):
+       if len(src) != 128 and len(src) != 202:
+               return None
+       dest = rsa_pub1024(src[:128], mod)
+-      hash = sha.new(dest[1:107])
++      hash = hashlib.sha1(dest[1:107])
+       if len(src) == 202:
+               hash.update(src[131:192])       
+       result = hash.digest()
+diff --git a/mytube/src/plugin.py b/mytube/src/plugin.py
+index 93b54c1..84b98c4 100755
+--- a/mytube/src/plugin.py
++++ b/mytube/src/plugin.py
+@@ -1,51 +1,44 @@
+-from Plugins.Plugin import PluginDescriptor
+-from MyTubeService import GoogleSuggestions, validate_cert, get_rnd
+-from MyTubeSearch import ConfigTextWithGoogleSuggestions
+-from Tools.BoundFunction import boundFunction
+-from Screens.MessageBox import MessageBox
+-from Screens.Screen import Screen
+-from Screens.ChoiceBox import ChoiceBox
+-from Screens.InfoBar import MoviePlayer
+-from Screens.VirtualKeyBoard import VirtualKeyBoard
+-from Components.ActionMap import ActionMap, NumberActionMap
++from Components.AVSwitch import AVSwitch
++from Components.ActionMap import ActionMap
++from Components.Button import Button
++from Components.ConfigList import ConfigListScreen
+ from Components.Label import Label
+-from Components.ScrollLabel import ScrollLabel
+-from Components.ProgressBar import ProgressBar
++from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest
+ from Components.Pixmap import Pixmap
+-from Components.Button import Button
++from Components.ProgressBar import ProgressBar
++from Components.ScrollLabel import ScrollLabel
++from Components.ServiceEventTracker import ServiceEventTracker
+ from Components.Sources.List import List
+-from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest
+-from Components.AVSwitch import AVSwitch
+-from Components.ActionMap import HelpableActionMap
+-from Components.config import config, Config, ConfigSelection, ConfigSubsection, ConfigText, getConfigListEntry, ConfigYesNo, ConfigIP, ConfigNumber,ConfigLocations
+-from Components.config import KEY_DELETE, KEY_BACKSPACE, KEY_LEFT, KEY_RIGHT, KEY_HOME, KEY_END, KEY_TOGGLEOW, KEY_ASCII, KEY_TIMEOUT
+-from Components.ConfigList import ConfigListScreen
+-from Components.ServiceEventTracker import ServiceEventTracker, InfoBarBase
+-from Components.Console import Console
+-from Components.Sources.Source import Source
+ from Components.Task import Task, Job, job_manager
++from Components.config import config, ConfigSelection, ConfigSubsection, ConfigText, ConfigYesNo, getConfigListEntry
++#, ConfigIP, ConfigNumber, ConfigLocations
++from MyTubeSearch import ConfigTextWithGoogleSuggestions, MyTubeSettingsScreen, MyTubeTasksScreen, MyTubeHistoryScreen
++from MyTubeService import validate_cert, get_rnd, myTubeService
++from Plugins.Plugin import PluginDescriptor
++from Screens.ChoiceBox import ChoiceBox
++from Screens.InfoBarGenerics import InfoBarNotifications
++from Screens.MessageBox import MessageBox
++from Screens.Screen import Screen
++from Screens.VirtualKeyBoard import VirtualKeyBoard
++from Tools.BoundFunction import boundFunction
++from Tools.Directories import resolveFilename, SCOPE_HDD, SCOPE_CURRENT_PLUGIN
++from Tools.Downloader import downloadWithProgress
+-from threading import Thread
+-from threading import Condition
++from __init__ import decrypt_block
+-from Tools.Directories import pathExists, fileExists, resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE, SCOPE_HDD, SCOPE_CURRENT_PLUGIN
+-from Tools.LoadPixmap import LoadPixmap
+-from Tools.Downloader import HTTPProgressDownloader, downloadWithProgress
+-from enigma import eTimer, quitMainloop,eListbox,ePoint, RT_HALIGN_LEFT, RT_HALIGN_RIGHT, RT_VALIGN_CENTER, eListboxPythonMultiContent, eListbox, gFont, getDesktop, ePicLoad, eServiceCenter, iServiceInformation, eServiceReference,iSeekableService,iServiceInformation, iPlayableService, iPlayableServicePtr
+-from os import path as os_path, system as os_system, unlink, stat, mkdir, popen, makedirs, listdir, access, rename, remove, W_OK, R_OK, F_OK
++from enigma import eTPM, eTimer, ePoint, RT_HALIGN_LEFT, RT_VALIGN_CENTER, gFont, ePicLoad, eServiceReference, iPlayableService
++from os import path as os_path, remove as os_remove
+ from twisted.web import client
+-from twisted.internet import reactor
+-from time import time
+-from Screens.InfoBarGenerics import InfoBarShowHide, InfoBarSeek, InfoBarNotifications, InfoBarServiceNotifications
+-from enigma import eTPM
+-from __init__ import bin2long, long2bin, rsa_pub1024, decrypt_block
++
++
+ etpm = eTPM()
+ rootkey = ['\x9f', '|', '\xe4', 'G', '\xc9', '\xb4', '\xf4', '#', '&', '\xce', '\xb3', '\xfe', '\xda', '\xc9', 'U', '`', '\xd8', '\x8c', 's', 'o', '\x90', '\x9b', '\\', 'b', '\xc0', '\x89', '\xd1', '\x8c', '\x9e', 'J', 'T', '\xc5', 'X', '\xa1', '\xb8', '\x13', '5', 'E', '\x02', '\xc9', '\xb2', '\xe6', 't', '\x89', '\xde', '\xcd', '\x9d', '\x11', '\xdd', '\xc7', '\xf4', '\xe4', '\xe4', '\xbc', '\xdb', '\x9c', '\xea', '}', '\xad', '\xda', 't', 'r', '\x9b', '\xdc', '\xbc', '\x18', '3', '\xe7', '\xaf', '|', '\xae', '\x0c', '\xe3', '\xb5', '\x84', '\x8d', '\r', '\x8d', '\x9d', '2', '\xd0', '\xce', '\xd5', 'q', '\t', '\x84', 'c', '\xa8', ')', '\x99', '\xdc', '<', '"', 'x', '\xe8', '\x87', '\x8f', '\x02', ';', 'S', 'm', '\xd5', '\xf0', '\xa3', '_', '\xb7', 'T', '\t', '\xde', '\xa7', '\xf1', '\xc9', '\xae', '\x8a', '\xd7', '\xd2', '\xcf', '\xb2', '.', '\x13', '\xfb', '\xac', 'j', '\xdf', '\xb1', '\x1d', ':', '?']
+ config.plugins.mytube = ConfigSubsection()
+ config.plugins.mytube.search = ConfigSubsection()
++
+ config.plugins.mytube.search.searchTerm = ConfigTextWithGoogleSuggestions("", False, threaded = True)
+ config.plugins.mytube.search.orderBy = ConfigSelection(
+                               [
+@@ -152,6 +145,7 @@ config.plugins.mytube.general.clearHistoryOnClose = ConfigYesNo(default = False)
+ #config.plugins.mytube.general.ProxyIP = ConfigIP(default=[0,0,0,0])
+ #config.plugins.mytube.general.ProxyPort = ConfigNumber(default=8080)
++
+ class downloadJob(Job):
+       def __init__(self, url, file, title):
+               Job.__init__(self, title)
+@@ -189,8 +183,6 @@ class downloadTask(Task):
+-from MyTubeService import myTubeService
+-from MyTubeSearch import MyTubeSettingsScreen,MyTubeTasksScreen,MyTubeHistoryScreen
+ class MyTubePlayerMainScreen(Screen, ConfigListScreen):
+@@ -198,7 +190,7 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen):
+       Details = {}
+       #(entry, Title, Description, TubeID, thumbnail, PublishedDate,Views,duration,ratings )  
+       skin = """
+-              <screen name="MyTubePlayerMainScreen" flags="wfNoBorder" position="0,0" size="720,576" title="MyTubePlayerMainScreen..." >
++              <screen name="MyTubePlayerMainScreen" flags="wfNoBorder" position="0,0" size="720,576" title="MyTube - Browser" >
+                       <ePixmap position="0,0" zPosition="-1" size="720,576" pixmap="~/mytubemain_bg.png" alphatest="on" transparent="1" backgroundColor="transparent"/>
+                       <widget name="config" zPosition="2" position="60,60" size="600,50" scrollbarMode="showNever" transparent="1" />
+                       <widget source="feedlist" render="Listbox" position="49,110" size="628,385" zPosition="1" scrollbarMode="showOnDemand" transparent="1" backgroundPixmap="~/list_bg.png" selectionPixmap="~/list_sel.png" >
+@@ -248,6 +240,8 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen):
+               self.ytfeed = None
+               self.currentFeedName = None
+               self.videolist = []
++              self.queryThread = None
++              self.queryRunning = False
+               self.video_playlist = []
+               self.statuslist = []
+@@ -339,6 +333,7 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen):
+                       "nextBouquet": self.switchToConfigList,
+                       "green": self.keyStdFeed,
+                       "yellow": self.handleHistory,
++                      "menu": self.handleMenu
+               }, -2)
+               self["historyactions"] = ActionMap(["ShortcutActions", "WizardActions", "MediaPlayerActions", "MovieSelectionActions", "HelpActions"],
+@@ -385,10 +380,12 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen):
+               current = self["config"].getCurrent()
+               if current[1].help_window.instance is not None:
+                       current[1].help_window.instance.hide()
++
+               self.statuslist.append(( _("Fetching feed entries"), _("Trying to download the Youtube feed entries. Please wait..." ) ))
+               self["feedlist"].style = "state"
+               self['feedlist'].setList(self.statuslist)
+-              self.Timer.start(200)
++              self.Timer.start(200)           
++      
+       def TimerFire(self):
+               self.Timer.stop()
+               if config.plugins.mytube.general.loadFeedOnOpen.value:
+@@ -473,7 +470,7 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen):
+                       self.switchToConfigList()
+       def handleMenu(self):
+-              if self.currList == "configlist":
++              if self.currList == "configlist" or self.currList == "status":
+                       menulist = (
+                                       (_("MyTube Settings"), "settings"),
+                               )
+@@ -644,6 +641,7 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen):
+               config.plugins.mytube.general.history.save()
+               config.plugins.mytube.general.save()
+               config.plugins.mytube.save()
++              self.cancelThread()
+               self.close()
+                       
+       def keyOK(self):
+@@ -901,16 +899,8 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen):
+               self.propagateUpDownNormally = True
+       def getFeed(self, feedUrl, feedName):
+-              try:
+-                      feed = myTubeService.getFeed(feedUrl)
+-              except Exception, e:
+-                      feed = None
+-                      print "Error querying feed :",feedName
+-                      print "E-->",e
+-                      self.setState('Error')
+-              if feed is not None:
+-                      self.ytfeed = feed
+-              self.buildEntryList()
++              self.queryStarted()
++              self.queryThread = myTubeService.getFeed(feedUrl, self.gotFeed, self.gotFeedError)
+       def getNextEntries(self, result):
+               if not result:
+@@ -943,26 +933,53 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen):
+                       self.searchFeed(searchContext)
+       def searchFeed(self, searchContext):
+-              print "[MyTubePlayer] searchFeed"
++              print "[MyTubePlayer] searchFeed"               
++              self.queryStarted()             
+               self.appendEntries = False
+-              try:
+-                      feed = myTubeService.search(searchContext, 
++              self.queryThread = myTubeService.search(searchContext, 
+                                       orderby = config.plugins.mytube.search.orderBy.value,
+                                       racy = config.plugins.mytube.search.racy.value,
+                                       lr = config.plugins.mytube.search.lr.value,
+                                       categories = [ config.plugins.mytube.search.categories.value ],
+-                                      sortOrder = config.plugins.mytube.search.sortOrder.value)
+-              except Exception, e:
+-                      feed = None
+-                      print "Error querying search for :",config.plugins.mytube.search.searchTerm.value
+-                      print "E-->",e
+-                      self.setState('Error')
++                                      sortOrder = config.plugins.mytube.search.sortOrder.value,
++                                      callback = self.gotSearchFeed, errorback = self.gotSearchFeedError)
++      
++      def queryStarted(self):
++              if self.queryRunning:
++                      self.cancelThread()
++              self.queryRunning = True                
++      
++      def queryFinished(self):
++              self.queryRunning = False
++      
++      def cancelThread(self):
++              print "[MyTubePlayer] cancelThread"
++              if self.queryThread is not None:
++                      self.queryThread.cancel()
++              self.queryFinished()
++      
++      def gotFeed(self, feed):
++              print "[MyTubePlayer] gotFeed"
++              self.queryFinished()
+               if feed is not None:
+                       self.ytfeed = feed
+-              if self.FirstRun == True:       
+-                      self.FirstRun = False
+               self.buildEntryList()
+-
++      
++      def gotFeedError(self, exception):
++              print "[MyTubePlayer] gotFeedError"
++              self.queryFinished()
++              self.setState('Error')
++      
++      def gotSearchFeed(self, feed):
++              if self.FirstRun:       
++                      self.FirstRun = False
++              self.gotFeed(feed)
++      
++      def gotSearchFeedError(self, exception):
++              if self.FirstRun:       
++                      self.FirstRun = False
++              self.gotFeedError(exception)
++      
+       def buildEntryList(self):
+               self.mytubeentries = None
+               self.screenshotList = []
+@@ -989,7 +1006,7 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen):
+                                       self["feedlist"].setIndex(0)
+                                       self["feedlist"].setList(self.videolist)
+                                       self["feedlist"].updateList(self.videolist)
+-                                      if self.FirstRun == True:       
++                                      if self.FirstRun and not config.plugins.mytube.general.loadFeedOnOpen.value:
+                                               self.switchToConfigList()
+                                       else:
+                                               self.switchToFeedList()
+@@ -1157,7 +1174,7 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen):
+                       if self.Details.has_key(tubeid):
+                               self.Details[tubeid]["thumbnail"] = ptr
+                       if (os_path.exists(thumbnailFile) == True):
+-                              remove(thumbnailFile)
++                              os_remove(thumbnailFile)
+                       del self.picloads[tubeid]
+               else:
+                       del self.picloads[tubeid]
+@@ -1186,7 +1203,7 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen):
+ class MyTubeVideoInfoScreen(Screen):
+       skin = """
+-              <screen name="MyTubeVideoInfoScreen" flags="wfNoBorder" position="0,0" size="720,576" title="MyTubePlayerMainScreen..." >
++              <screen name="MyTubeVideoInfoScreen" flags="wfNoBorder" position="0,0" size="720,576" title="MyTube - Video Info" >
+                       <ePixmap position="0,0" zPosition="-1" size="720,576" pixmap="~/mytubemain_bg.png" alphatest="on" transparent="1" backgroundColor="transparent"/>
+                       <widget name="title" position="60,50" size="600,50" zPosition="5" valign="center" halign="left" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
+                       <widget name="starsbg" pixmap="~/starsbar_empty.png" position="560,220" zPosition="5" size="100,20" transparent="1" alphatest="on" />
+@@ -1361,7 +1378,7 @@ class MyTubeVideoInfoScreen(Screen):
+                       self.thumbnails[picindex][3] = ptr
+                       if (os_path.exists(self.thumbnails[picindex][2]) == True):
+                               print "removing", self.thumbnails[picindex][2]
+-                              remove(self.thumbnails[picindex][2])
++                              os_remove(self.thumbnails[picindex][2])
+                               del self.picloads[picindex]
+                               if len(self.picloads) == 0:
+                                       self.timer.startLongTimer(3)
+@@ -1400,7 +1417,7 @@ class MyTubeVideoInfoScreen(Screen):
+ class MyTubeVideoHelpScreen(Screen):
+       skin = """
+-              <screen name="MyTubeVideoHelpScreen" flags="wfNoBorder" position="0,0" size="720,576" title="MyTubePlayerMainScreen..." >
++              <screen name="MyTubeVideoHelpScreen" flags="wfNoBorder" position="0,0" size="720,576" title="MyTube - Help" >
+                       <ePixmap position="0,0" zPosition="-1" size="720,576" pixmap="~/mytubemain_bg.png" alphatest="on" transparent="1" backgroundColor="transparent"/>
+                       <widget name="title" position="60,50" size="600,50" zPosition="5" valign="center" halign="left" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
+                       <widget name="detailtext" position="60,120" size="610,370" zPosition="10" font="Regular;21" transparent="1" halign="left" valign="top"/>
+@@ -1561,7 +1578,6 @@ class MyTubePlayer(Screen, InfoBarNotifications):
+               if self.infoCallback is not None:       
+                       self.infoCallback()
+-
+       def playNextFile(self):
+               print "playNextFile"
+               nextservice,error = self.nextCallback()
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_ac3lipsync_dolby.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_ac3lipsync_dolby.patch
new file mode 100644 (file)
index 0000000..13dc932
--- /dev/null
@@ -0,0 +1,13 @@
+diff --git a/audiosync/src/AC3delay.py b/audiosync/src/AC3delay.py
+index a92c859..6bbc86d 100644
+--- a/audiosync/src/AC3delay.py
++++ b/audiosync/src/AC3delay.py
+@@ -177,7 +177,7 @@ class AC3delay:
+                 tlist.append((description, x))
+                 if x == self.selectedAudioIndex:
+-                    if ((description.find("AC3") != -1 or description.find("AC-3") != -1) and not bDownmixEnabled) or description.find("DTS") != -1:
++                    if ((description.find("Dolby") != -1 or description.find("AC3") != -1 or description.find("AC-3") != -1) and not bDownmixEnabled) or description.find("DTS") != -1:
+                         self.whichAudio = AC3
+                         self.channelAudio = AC3
+                     else:
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_autoresolution_fix.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_autoresolution_fix.patch
new file mode 100644 (file)
index 0000000..481d00d
--- /dev/null
@@ -0,0 +1,14 @@
+diff --git a/autoresolution/src/plugin.py b/autoresolution/src/plugin.py
+old mode 100644
+new mode 100755
+index f034c06..0dee6ce
+--- a/autoresolution/src/plugin.py
++++ b/autoresolution/src/plugin.py
+@@ -302,6 +302,7 @@ class AutoResSetupMenu(Screen, ConfigListScreen):
+       def apply(self):
+               for x in self["config"].list:
++                      x[1].onDeselect(self.session)
+                       x[1].save()
+               self.close()
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_dependency.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_dependency.patch
new file mode 100644 (file)
index 0000000..711e5ce
--- /dev/null
@@ -0,0 +1,10 @@
+diff --git a/fancontrol2/CONTROL/control b/fancontrol2/CONTROL/control
+index b42c485..356ab02 100644
+--- a/fancontrol2/CONTROL/control
++++ b/fancontrol2/CONTROL/control
+@@ -3,4 +3,4 @@ Version: 2.5r1
+ Description: Temperature dependent fan control
+ Maintainer: IHAD joergm6 <joergm6@www.i-have-a-dreambox.com>
+ Homepage: http://www.i-have-a-dreambox.com
+-Depends: enigma2 (>> 2.6)
++Depends: enigma2 (>> 2.6), enigma2-plugin-extensions-webinterface
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_mytube_entry_vuplus.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_mytube_entry_vuplus.patch
new file mode 100644 (file)
index 0000000..21f754c
--- /dev/null
@@ -0,0 +1,13 @@
+diff --git a/mytube/src/MyTubeService.py b/mytube/src/MyTubeService.py
+index 7371026..1794db9 100755
+--- a/mytube/src/MyTubeService.py
++++ b/mytube/src/MyTubeService.py
+@@ -115,7 +115,7 @@ class MyTubeFeedEntry():
+               if self.entry.media.player:
+                       split = self.entry.media.player.url.split("=")
+                       ret = split.pop()
+-                      if ret == 'youtube_gdata':
++                      if ret == 'youtube_gdata' or ret == 'youtube_gdata_player':
+                               tmpval=split.pop()
+                               if tmpval.endswith("&feature"):
+                                       tmp = tmpval.split("&")
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_mytube_tpm.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_mytube_tpm.patch
new file mode 100644 (file)
index 0000000..53f3173
--- /dev/null
@@ -0,0 +1,149 @@
+diff --git a/mytube/src/plugin.py b/mytube/src/plugin.py
+index d6fbe85..93b54c1 100755
+--- a/mytube/src/plugin.py
++++ b/mytube/src/plugin.py
+@@ -385,44 +385,10 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen):
+               current = self["config"].getCurrent()
+               if current[1].help_window.instance is not None:
+                       current[1].help_window.instance.hide()
+-
+-              l3cert = etpm.getCert(eTPM.TPMD_DT_LEVEL3_CERT)
+-              if l3cert is None or l3cert is "":
+-                      self["videoactions"].setEnabled(False)
+-                      self["searchactions"].setEnabled(False)
+-                      self["config_actions"].setEnabled(False)
+-                      self["historyactions"].setEnabled(False)
+-                      self["statusactions"].setEnabled(True)
+-                      self.hideSuggestions()
+-                      self.statuslist = []
+-                      self.statuslist.append(( _("Genuine Dreambox validation failed!"), _("Verify your Dreambox authenticity by running the genuine dreambox plugin!" ) ))
+-                      self["feedlist"].style = "state"
+-                      self['feedlist'].setList(self.statuslist)
+-                      return
+-
+-              self.l3key = validate_cert(l3cert, self.l2key)
+-              if self.l3key is None:
+-                      print "l3cert invalid"
+-                      return
+-              rnd = get_rnd()
+-              if rnd is None:
+-                      print "random error"
+-                      return
+-
+-              val = etpm.challenge(rnd)
+-              result = decrypt_block(val, self.l3key)
+-
+-              self.statuslist = []
+-              if result[80:88] == rnd:
+-                      self.statuslist.append(( _("Fetching feed entries"), _("Trying to download the Youtube feed entries. Please wait..." ) ))
+-                      self["feedlist"].style = "state"
+-                      self['feedlist'].setList(self.statuslist)
+-                      self.Timer.start(200)
+-              else:
+-                      self.statuslist.append(( _("Genuine Dreambox validation failed!"), _("Verify your Dreambox authenticity by running the genuine dreambox plugin!" ) ))
+-                      self["feedlist"].style = "state"
+-                      self['feedlist'].setList(self.statuslist)               
+-      
++              self.statuslist.append(( _("Fetching feed entries"), _("Trying to download the Youtube feed entries. Please wait..." ) ))
++              self["feedlist"].style = "state"
++              self['feedlist'].setList(self.statuslist)
++              self.Timer.start(200)
+       def TimerFire(self):
+               self.Timer.stop()
+               if config.plugins.mytube.general.loadFeedOnOpen.value:
+@@ -453,49 +419,36 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen):
+                       self.statuslist = []
+                       self.hideSuggestions()
+                       result = None
+-                      if self.l3key is not None:
+-                              rnd = get_rnd()
+-                              if rnd is None:
+-                                      return
+-                              val = etpm.challenge(rnd)
+-                              result = decrypt_block(val, self.l3key)
+-                      if not result or result[80:88] != rnd:
++                      print "Genuine Dreambox validation passed"
++                      if self.FirstRun == True:
++                              self.appendEntries = False
++                              myTubeService.startService()
++                      if self.HistoryWindow is not None:
++                              self.HistoryWindow.deactivate()
++                              self.HistoryWindow.instance.hide()
++                      if status == 'getFeed':
++                              self.statuslist.append(( _("Fetching feed entries"), _("Trying to download the Youtube feed entries. Please wait..." ) ))
++                      elif status == 'getSearchFeed':
++                              self.statuslist.append(( _("Fetching search entries"), _("Trying to download the Youtube search results. Please wait..." ) ))
++                      elif status == 'Error':
++                              self.statuslist.append(( _("An error occured."), _("There was an error getting the feed entries. Please try again." ) ))
++                      elif status == 'noVideos':
+                               self["key_green"].show()
+-                              self.statuslist.append(( _("Genuine Dreambox validation failed!"), _("Verify your Dreambox authenticity by running the genuine dreambox plugin!" ) ))
+-                              self["feedlist"].style = "state"
+-                              self['feedlist'].setList(self.statuslist)
+-                      else:
+-                              print "Genuine Dreambox validation passed"
+-                              if self.FirstRun == True:
+-                                      self.appendEntries = False
+-                                      myTubeService.startService()
+-                              if self.HistoryWindow is not None:
+-                                      self.HistoryWindow.deactivate()
+-                                      self.HistoryWindow.instance.hide()
+-                              if status == 'getFeed':
+-                                      self.statuslist.append(( _("Fetching feed entries"), _("Trying to download the Youtube feed entries. Please wait..." ) ))
+-                              elif status == 'getSearchFeed':
+-                                      self.statuslist.append(( _("Fetching search entries"), _("Trying to download the Youtube search results. Please wait..." ) ))
+-                              elif status == 'Error':
+-                                      self.statuslist.append(( _("An error occured."), _("There was an error getting the feed entries. Please try again." ) ))
+-                              elif status == 'noVideos':
+-                                      self["key_green"].show()
+-                                      self.statuslist.append(( _("No videos to display"), _("Please select a standard feed or try searching for videos." ) ))
+-                              elif status == 'byPass':
+-                                      self.statuslist.append(( _("Not fetching feed entries"), _("Please enter your search term." ) ))
+-                                      self["feedlist"].style = "state"
+-                                      self['feedlist'].setList(self.statuslist)
+-                                      self.switchToConfigList()
++                              self.statuslist.append(( _("No videos to display"), _("Please select a standard feed or try searching for videos." ) ))
++                      elif status == 'byPass':
++                              self.statuslist.append(( _("Not fetching feed entries"), _("Please enter your search term." ) ))
+                               self["feedlist"].style = "state"
+                               self['feedlist'].setList(self.statuslist)
+-                              if self.FirstRun == True:
+-                                      if config.plugins.mytube.general.loadFeedOnOpen.value:
+-                                              if config.plugins.mytube.general.startFeed.value == 'hd':
+-                                                      self.FeedURL = "http://gdata.youtube.com/feeds/api/videos/-/HD"
+-                                              else:
+-                                                      self.FeedURL = self.BASE_STD_FEEDURL + str(config.plugins.mytube.general.startFeed.value)
+-                                              self.getFeed(self.FeedURL, str(config.plugins.mytube.general.startFeed.value))
+-
++                              self.switchToConfigList()
++                      self["feedlist"].style = "state"
++                      self['feedlist'].setList(self.statuslist)
++                      if self.FirstRun == True:
++                              if config.plugins.mytube.general.loadFeedOnOpen.value:
++                                      if config.plugins.mytube.general.startFeed.value == 'hd':
++                                              self.FeedURL = "http://gdata.youtube.com/feeds/api/videos/-/HD"
++                                      else:
++                                              self.FeedURL = self.BASE_STD_FEEDURL + str(config.plugins.mytube.general.startFeed.value)
++                                      self.getFeed(self.FeedURL, str(config.plugins.mytube.general.startFeed.value))
+       def handleHelpWindow(self):
+               print "[handleHelpWindow]"
+@@ -1775,17 +1728,8 @@ class MyTubePlayer(Screen, InfoBarNotifications):
+ def MyTubeMain(session, **kwargs):
+-      l2 = False
+-      l2cert = etpm.getCert(eTPM.TPMD_DT_LEVEL2_CERT)
+-      if l2cert is None:
+-              print "l2cert not found"
+-              return
+-      
+-      l2key = validate_cert(l2cert, rootkey)
+-      if l2key is None:
+-              print "l2cert invalid"
+-              return
+       l2 = True
++      l2key = None
+       if l2:
+               session.open(MyTubePlayerMainScreen,l2key)
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_mytube_vuplus.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_mytube_vuplus.patch
new file mode 100644 (file)
index 0000000..be02279
--- /dev/null
@@ -0,0 +1,74 @@
+diff --git a/mytube/src/plugin.py b/mytube/src/plugin.py
+index 8f9c71d..4420fe2 100755
+--- a/mytube/src/plugin.py
++++ b/mytube/src/plugin.py
+@@ -386,8 +386,10 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen):
+               if current[1].help_window.instance is not None:
+                       current[1].help_window.instance.hide()
+-              l3cert = etpm.getCert(eTPM.TPMD_DT_LEVEL3_CERT)
+-              if l3cert is None or l3cert is "":
++#             l3cert = etpm.getCert(eTPM.TPMD_DT_LEVEL3_CERT)
++#             if l3cert is None or l3cert is "":
++              l3cert = 0
++              if False:
+                       self["videoactions"].setEnabled(False)
+                       self["searchactions"].setEnabled(False)
+                       self["config_actions"].setEnabled(False)
+@@ -400,7 +402,8 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen):
+                       self['feedlist'].setList(self.statuslist)
+                       return
+-              self.l3key = validate_cert(l3cert, self.l2key)
++#             self.l3key = validate_cert(l3cert, self.l2key)
++              self.l3key = 0
+               if self.l3key is None:
+                       print "l3cert invalid"
+                       return
+@@ -409,11 +412,12 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen):
+                       print "random error"
+                       return
+-              val = etpm.challenge(rnd)
+-              result = decrypt_block(val, self.l3key)
++#             val = etpm.challenge(rnd)
++#             result = decrypt_block(val, self.l3key)
+               self.statuslist = []
+-              if result[80:88] == rnd:
++#             if result[80:88] == rnd:
++              if True:
+                       self.statuslist.append(( _("Fetching feed entries"), _("Trying to download the Youtube feed entries. Please wait..." ) ))
+                       self["feedlist"].style = "state"
+                       self['feedlist'].setList(self.statuslist)
+@@ -457,9 +461,10 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen):
+                               rnd = get_rnd()
+                               if rnd is None:
+                                       return
+-                              val = etpm.challenge(rnd)
+-                              result = decrypt_block(val, self.l3key)
+-                      if not result or result[80:88] != rnd:
++#                             val = etpm.challenge(rnd)
++#                             result = decrypt_block(val, self.l3key)
++#                     if not result or result[80:88] != rnd:
++                      if False:
+                               self["key_green"].show()
+                               self.statuslist.append(( _("Genuine Dreambox validation failed!"), _("Verify your Dreambox authenticity by running the genuine dreambox plugin!" ) ))
+                               self["feedlist"].style = "state"
+@@ -1776,12 +1781,14 @@ class MyTubePlayer(Screen, InfoBarNotifications):
+ def MyTubeMain(session, **kwargs):
+       l2 = False
+-      l2cert = etpm.getCert(eTPM.TPMD_DT_LEVEL2_CERT)
++#     l2cert = etpm.getCert(eTPM.TPMD_DT_LEVEL2_CERT)
++      l2cert = 0
+       if l2cert is None:
+               print "l2cert not found"
+               return
+       
+-      l2key = validate_cert(l2cert, rootkey)
++#     l2key = validate_cert(l2cert, rootkey)
++      l2key = 0
+       if l2key is None:
+               print "l2cert invalid"
+               return
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_webinterface_tpm.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/enigma2_plugins_webinterface_tpm.patch
new file mode 100644 (file)
index 0000000..918f74f
--- /dev/null
@@ -0,0 +1,31 @@
+diff --git a/webinterface/src/plugin.py b/webinterface/src/plugin.py
+index cbf42f8..caebbb0 100644
+--- a/webinterface/src/plugin.py
++++ b/webinterface/src/plugin.py
+@@ -228,7 +228,7 @@ def stopWebserver(session):
+ # on given ipaddress, port, w/o auth, w/o ssl
+ #===============================================================================
+ def startServerInstance(session, ipaddress, port, useauth=False, l2k=None, usessl=False):
+-      if hw.get_device_name().lower() != "dm7025":
++      if 0:
+               l3k = None              
+               l3c = tpm.getCert(eTPM.TPMD_DT_LEVEL3_CERT)
+               
+@@ -550,7 +550,7 @@ def checkBonjour():
+ def networkstart(reason, **kwargs):
+       l2r = False
+       l2k = None
+-      if hw.get_device_name().lower() != "dm7025":            
++      if 0:           
+               l2c = tpm.getCert(eTPM.TPMD_DT_LEVEL2_CERT)
+               
+               if l2c is None:
+@@ -579,7 +579,7 @@ def openconfig(session, **kwargs):
+ def configCB(result, session):
+       l2r = False
+       l2k = None
+-      if hw.get_device_name().lower() != "dm7025":            
++      if 0:           
+               l2c = tpm.getCert(eTPM.TPMD_DT_LEVEL2_CERT)
+               
+               if l2c is None:
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/favicon.ico b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/favicon.ico
new file mode 100755 (executable)
index 0000000..0d6f325
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-plugins/vuplus/favicon.ico differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-skins.bb b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-skins.bb
new file mode 100755 (executable)
index 0000000..451c7a1
--- /dev/null
@@ -0,0 +1,39 @@
+SUMMARY = "Skins for Enigma2"
+MAINTAINER = "Felix Domke <tmbinc@elitedvb.net>"
+LICENSE = "CLOSED"
+
+PACKAGES_DYNAMIC = "enigma2-skin-*"
+
+# if you want experimental, use:
+SRCREV="de610a460bec046f0dca9987ecba458303daaf1d"
+SRCDATE="20110128"
+BRANCH="master"
+PV = "experimental-git${SRCDATE}"
+PR = "r0"
+
+SRC_URI="git://schwerkraft.elitedvb.net/enigma2-skins/enigma2-skins.git;protocol=git;branch=${BRANCH};tag=${SRCREV}"
+
+FILES_${PN} += " /usr/share/enigma2 /usr/share/fonts "
+FILES_${PN}-meta = "${datadir}/meta"
+PACKAGES += "${PN}-meta"
+PACKAGE_ARCH = "all"
+
+inherit autotools
+
+S = "${WORKDIR}/git"
+
+python populate_packages_prepend () {
+       enigma2_skindir = bb.data.expand('${datadir}/enigma2', d)
+
+       do_split_packages(d, enigma2_skindir, '(.*?)/.*', 'enigma2-skin-%s', 'Enigma2 Skin: %s', recursive=True, match_path=True, prepend=True)
+}
+
+python populate_packages_append () {
+       enigma2_skindir = bb.data.expand('${datadir}/enigma2', d)
+
+       #clear rdepends by default
+       for package in bb.data.getVar('PACKAGES', d, 1).split():
+               bb.data.setVar('RDEPENDS_' + package, '', d)
+
+       #todo add support for control files in skindir.. like plugins
+}
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-streamproxy.bb b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-streamproxy.bb
new file mode 100644 (file)
index 0000000..197c569
--- /dev/null
@@ -0,0 +1,24 @@
+SUMMARY = "streamproxy manages streaming data to a PC using enigma2"
+LICENSE = "GPLv2"
+LIC_FILES_CHKSUM = "file://COPYING;md5=59530bdf33659b29e73d4adb9f9f6552"
+SRCREV = "b927ed8498a41a77e965abad099eb01dc5fef562"
+PR = "r3"
+
+SRC_URI = "file://streamproxy.xinetd.in \
+           file://streamproxy@.service \
+           file://streamproxy.socket"
+
+SCHWERKRAFT_PROJECT = "streamproxy"
+
+inherit autotools schwerkraft-git systemd xinetd
+
+do_install_append() {
+        install -d ${D}${systemd_unitdir}/system
+        ln -sf /dev/null ${D}${systemd_unitdir}/system/streamproxy.service
+}
+
+SYSTEMD_PACKAGES = "${PN}-systemd"
+SYSTEMD_SERVICE_${PN}-systemd = "streamproxy.socket"
+
+XINETD_PACKAGES = "${PN}-xinetd"
+XINETD_SERVICE_${PN}-xinetd = "streamproxy"
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-streamproxy/streamproxy.socket b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-streamproxy/streamproxy.socket
new file mode 100644 (file)
index 0000000..020201e
--- /dev/null
@@ -0,0 +1,8 @@
+[Unit]
+
+[Socket]
+ListenStream=8001
+Accept=yes
+
+[Install]
+WantedBy=sockets.target
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-streamproxy/streamproxy.xinetd.in b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-streamproxy/streamproxy.xinetd.in
new file mode 100644 (file)
index 0000000..d559929
--- /dev/null
@@ -0,0 +1,10 @@
+service streamproxy
+{
+       type = UNLISTED
+       socket_type = stream
+       protocol = tcp
+       wait = no
+       user = root
+       server = @BINDIR@/streamproxy
+       port = 8001
+}
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2-streamproxy/streamproxy@.service b/meta-openvuplus/recipes-enigma2/enigma2/enigma2-streamproxy/streamproxy@.service
new file mode 100644 (file)
index 0000000..9e4c78e
--- /dev/null
@@ -0,0 +1,5 @@
+[Unit]
+
+[Service]
+ExecStart=-/usr/bin/streamproxy
+StandardInput=socket
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2.bb b/meta-openvuplus/recipes-enigma2/enigma2/enigma2.bb
new file mode 100644 (file)
index 0000000..91455f7
--- /dev/null
@@ -0,0 +1,221 @@
+DESCRIPTION = "Enigma2 is an experimental, but useful framebuffer-based frontend for DVB functions"
+MAINTAINER = "Felix Domke <tmbinc@elitedvb.net>"
+LICENSE = "GPLv2"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=c9e255efa454e0155c1fd758df7dcaf3"
+DEPENDS = "jpeg libungif libmad libpng libsigc++-1.2 gettext-native \
+       dreambox-dvbincludes freetype libdvbsi++ python swig-native \
+       libfribidi libxmlccwrap libdreamdvd gstreamer gst-plugin-dvbmediasink \
+       gst-plugins-bad gst-plugins-good gst-plugins-ugly \
+"
+
+# DEPENDS += "wvdial wvstreams ppp usbmodeswitch usbmodeswitch-data djmount minidlna"
+
+RDEPENDS = "python-codecs python-core python-lang python-re python-threading \
+       python-xml python-fcntl gst-plugins-base-decodebin gst-plugins-base-decodebin2 python-stringold \
+       python-pickle gst-plugins-base-app gst-plugins-bad-fragmented \
+       gst-plugins-good-id3demux gst-plugins-ugly-mad gst-plugins-base-ogg gst-plugins-base-playbin \
+       gst-plugins-base-typefindfunctions gst-plugins-base-audioconvert gst-plugins-base-audioresample \
+       gst-plugins-good-wavparse python-netclient gst-plugins-ugly-mpegstream \
+       gst-plugins-good-flac gst-plugin-dvbmediasink gst-plugins-bad-mpegdemux gst-plugins-ugly-dvdsub \
+       gst-plugins-good-souphttpsrc gst-plugins-ugly-mpegaudioparse gst-plugins-base-subparse \
+       gst-plugins-good-apetag gst-plugins-good-icydemux gst-plugins-good-autodetect gst-plugins-good-flv \
+       glibc-gconv-iso8859-15 ethtool"
+
+GST_RTSP_RDEPENDS = "gst-plugins-good-udp gst-plugins-good-rtsp gst-plugins-good-rtp gst-plugins-good-rtpmanager"
+GST_ALSA_RDEPENDS = "gst-plugins-base-alsa alsa-conf"
+GST_MISC_RDEPENDS = "gst-plugins-good-matroska gst-plugins-good-isomp4 gst-plugins-base-vorbis gst-plugins-good-audioparsers"
+GST_DVD_RDEPENDS = "gst-plugins-bad-cdxaparse gst-plugins-ugly-cdio gst-plugins-bad-vcdsrc"
+GST_BASE_RDEPENDS = "${GST_ALSA_RDEPENDS} ${GST_MISC_RDEPENDS} ${GST_RTSP_RDEPENDS}"
+
+RDEPENDS_append_vuplus = " ${GST_BASE_RDEPENDS} ${GST_DVD_RDEPENDS} gst-plugins-good-avi"
+
+# 'forward depends' - no two providers can have the same PACKAGES_DYNAMIC, however both
+# enigma2 and enigma2-plugins produce enigma2-plugin-*.
+#DEPENDS += "enigma2-plugins"
+#PACKAGES_DYNAMIC = "enigma2-plugin-*"
+
+SUMMARY_enigma2-plugin-extensions-cutlisteditor = "enables you to cut your movies."
+RDEPENDS_enigma2-plugin-extensions-cutlisteditor = "aio-grab"
+SUMMARY_enigma2-plugin-extensions-graphmultiepg = "shows a graphical timeline EPG."
+SUMMARY_enigma2-plugin-extensions-pictureplayer = "displays photos on the TV."
+SUMMARY_enigma2-plugin-systemplugins-frontprocessorupdate = "keeps your frontprocessor up to date."
+SUMMARY_enigma2-plugin-systemplugins-positionersetup = "helps you installing a motorized dish."
+SUMMARY_enigma2-plugin-systemplugins-satelliteequipmentcontrol = "allows you to fine-tune DiSEqC-settings."
+SUMMARY_enigma2-plugin-systemplugins-satfinder = "helps you to align your dish."
+SUMMARY_enigma2-plugin-systemplugins-skinselector = "shows a menu with selectable skins."
+SUMMARY_enigma2-plugin-systemplugins-videomode = "selects advanced video modes"
+RDEPENDS_enigma2-plugin-extensions-dvdplayer = "libdreamdvd0"
+RDEPENDS_enigma2-plugin-systemplugins-nfiflash = "python-twisted-web"
+RDEPENDS_enigma2-plugin-systemplugins-softwaremanager = "python-twisted-web"
+RCONFLICTS_enigma2-plugin-systemplugins-softwaremanager = "enigma2-plugin-systemplugins-configurationbackup enigma2-plugin-systemplugins-softwareupdate"
+RREPLACES_enigma2-plugin-systemplugins-softwaremanager = "enigma2-plugin-systemplugins-configurationbackup enigma2-plugin-systemplugins-softwareupdate"
+SUMMARY_enigma2-plugin-systemplugins-crashlogautosubmit = "automatically send crashlogs to Dream Multimedia"
+RDEPENDS_enigma2-plugin-systemplugins-crashlogautosubmit = "python-twisted-mail python-twisted-names python-compression python-mime python-email"
+SUMMARY_enigma2-plugin-systemplugins-cleanupwizard = "informs you on low internal memory on system startup."
+SUMMARY_enigma2-plugin-extenstions-modem = "opens a menu to connect to internet via builtin modem."
+RDEPENDS_enigma2-plugin-extensions-modem = "dreambox-modem-ppp-scripts ppp"
+SUMMARY_enigma2-plugin-systemplugins-wirelesslan = "helps you configuring your wireless lan"
+RDEPENDS_enigma2-plugin-systemplugins-wirelesslan = "wpa-supplicant wireless-tools python-wifi"
+SUMMARY_enigma2-plugin-systemplugins-wirelesslansetup = "configure wireless lan"
+RDEPENDS_enigma2-plugin-systemplugins-wirelesslansetup = "wpa-supplicant wireless-tools python-wifi"
+SUMMARY_enigma2-plugin-systemplugins-networkwizard = "provides easy step by step network configuration"
+RDEPENDS_enigma2-plugin-extensions-webbrowser = "python-gdata libqtwebkite4 vuplus-webbrowser-utils qt4-embedded-fonts qt4-embedded-plugin-imageformat-gif qt4-embedded-plugin-imageformat-ico qt4-embedded-plugin-imageformat-jpeg qt4-embedded-plugin-imageformat-mng qt4-embedded-plugin-imageformat-svg qt4-embedded-plugin-imageformat-tiff qt4-embedded-plugin-iconengine-svgicon "
+SUMMARY_enigma2-plugin-systemplugins-crashreport = "automatically send crashlogs to Vu+"
+RDEPENDS_enigma2-plugin-systemplugins-crashreport = "python-twisted-mail python-twisted-names python-compression python-mime python-email"
+RDEPENDS_enigma2-plugin-systemplugins-3gmodemmanager = "ppp usbmodeswitch usbmodeswitch-data wvdial wvstreams libwvutils4.6 libwvstreams-extras libuniconf4.6"
+RDEPENDS_enigma2-plugin-systemplugins-wirelessaccesspoint = "hostap-daemon bridge-utils"
+RDEPENDS_enigma2-plugin-extensions-streamtv = "librtmp0 gst-plugins-bad-rtmp "
+RDEPENDS_enigma2-plugin-extensions-dlnabrowser = "djmount fuse-utils libfuse2 libupnp3 kernel-module-fuse "
+RDEPENDS_enigma2-plugin-extensions-dlnaserver = "minidlna libexif12 libavformat52 libavutil50 libavcodec52 libgsm1 libmp3lame0 libschroedinger-1.0-0 libtheora0 liboil"
+
+PN = "enigma2"
+PR = "r38"
+
+SRCDATE = "20110922"
+SRCREV = "5e19a3f8a5e8ce8a4e2cb2b601a1b8ef3554e4be"
+#SRCDATE is NOT used by git to checkout a specific revision
+#but we need it to build a ipk package version
+#when you like to checkout a specific revision of e2 you need
+#have to specify a commit id or a tag name in SRCREV
+
+# if you want experimental use
+####################################################
+BRANCH = "experimental"
+PV = "experimental-git${SRCDATE}"
+#SRCREV = ""
+####################################################
+
+# if you want a 2.7-based release, use
+####################################################
+#BRANCH="2.7"
+#PV = "2.7git${SRCDATE}"
+# if you want 2.7.0 use
+#SRCREV = "d5a16c6e9d0ee1cc2dc0d65b4321842dea4b0891"
+####################################################
+
+# if you want a vuplus release, use
+####################################################
+#BRANCH_vuplus = "vuplus"
+#PV_vuplus = "2.8git${SRCDATE}"
+#SRCREV_vuplus = "4186f8c308d9450353520a88eb5a5ee3940281d3"
+####################################################
+
+#if you want a vuplus experimental, use
+####################################################
+BRANCH_vuplus = "vuplus_experimental"
+PV_vuplus = "experimental-git${SRCDATE}"
+SRCREV_vuplus = ""
+####################################################
+
+# enigma2_vuplus_mediaplayer.patch is for trick-play in media player
+
+SRC_URI = "git://code.vuplus.com/git/dvbapp.git;protocol=http;branch=${BRANCH};tag=${SRCREV} \
+           file://enigma2_vuplus_skin.patch;patch=1;pnum=1 \
+           file://enigma2_vuplus_mediaplayer.patch;patch=1;pnum=1 \
+          file://enigma2_vuplus_mediaplayer_subtitle.patch;patch=1;pnum=1 \
+           file://enigma2_vuplus_remove_dreambox_enigma.patch;patch=1;pnum=1 \
+           file://enigma2_vuplus_vfd_mode.patch;patch=1;pnum=1 \
+           file://enigma2_vuplus_addlibpythondeps.patch;patch=1;pnum=1 \
+           file://MyriadPro-Regular.otf \
+           file://MyriadPro-Semibold.otf \
+           file://MyriadPro-SemiboldIt.otf \
+           file://750S \
+           file://Vu_HD \
+           file://number_key \
+           "
+
+SRC_URI_append = " ${@base_contains("MACHINE_FEATURES", "vuwlan", "file://enigma2_vuplus_networksetup.patch;patch=1;pnum=1", "", d)}"
+
+def change_po():
+        import os
+        try:
+                os.system("find ./ -name \"*.po\" > ./po_list")
+                os.system("find ./ -name \"*.pot\" >> ./po_list")
+                po_list = []
+                po_list = open('po_list','r+').readlines()
+                for x in po_list:
+                        changeword(x)
+                os.system('rm po_list')
+        except:
+                print 'word patch error '
+                return
+
+def changeword(file):
+        fn = file[:-1]
+        fnn = file[:-1]+'_n'
+        cmd = "sed s/Dreambox/STB/g "+fn+" > "+fnn
+        os.system(cmd)
+        cmd1 = "mv "+fnn+" "+fn
+        os.system(cmd1)
+
+do_unpack_append(){
+        change_po()
+}
+
+S = "${WORKDIR}/git"
+
+FILES_${PN} += "${datadir}/fonts ${datadir}/keymaps"
+FILES_${PN}-meta = "${datadir}/meta"
+PACKAGES += "${PN}-meta"
+PACKAGE_ARCH = "${MACHINE_ARCH}"
+
+inherit autotools pkgconfig
+
+
+do_compile_prepend_vuplus() {
+        install -m 0755 ${WORKDIR}/MyriadPro-Regular.otf ${S}/data/fonts/
+        install -m 0755 ${WORKDIR}/MyriadPro-Semibold.otf ${S}/data/fonts/
+        install -m 0755 ${WORKDIR}/MyriadPro-SemiboldIt.otf ${S}/data/fonts/
+        install -m 0755 ${WORKDIR}/750S/*.png ${S}/data/750S/
+        install -m 0755 ${WORKDIR}/750S/buttons/*.png ${S}/data/750S/buttons/
+        install -m 0755 ${WORKDIR}/750S/countries/*.png ${S}/data/750S/countries/
+        install -m 0755 ${WORKDIR}/750S/icons/*.png ${S}/data/750S/icons/
+        install -m 0755 ${WORKDIR}/750S/menu/*.png ${S}/data/750S/menu/
+        install -m 0755 ${WORKDIR}/750S/spinner/*.png ${S}/data/skin_default/spinner/
+        install -m 0755 ${WORKDIR}/Vu_HD/*.png ${S}/data/Vu_HD/
+        install -m 0755 ${WORKDIR}/Vu_HD/buttons/*.png ${S}/data/Vu_HD/buttons/
+        install -m 0755 ${WORKDIR}/Vu_HD/countries/*.png ${S}/data/Vu_HD/countries/
+        install -m 0755 ${WORKDIR}/Vu_HD/icons/*.png ${S}/data/Vu_HD/icons/
+        install -m 0755 ${WORKDIR}/Vu_HD/menu/*.png ${S}/data/Vu_HD/menu/
+        install -m 0755 ${WORKDIR}/number_key/*.png ${S}/data/skin_default/buttons/
+}
+
+EXTRA_OECONF = " \
+       ${@base_contains("MACHINE_FEATURES", "display-text-vfd", "--with-display-text-vfd" , "", d)} \
+       ${@base_contains("MACHINE_FEATURES", "display-graphic-vfd", "--with-display-graphic-vfd" , "", d)} \
+       ${@base_contains("MACHINE_FEATURES", "right-half-vfd-skin", "--with-set-right-half-vfd-skin" , "", d)} \
+       ${@base_contains("MACHINE_FEATURES", "enable-rc-kbd", "--with-remote-keyboard" , "", d)} \
+        BUILD_SYS=${BUILD_SYS} \
+        HOST_SYS=${HOST_SYS} \
+        STAGING_INCDIR=${STAGING_INCDIR} \
+        STAGING_LIBDIR=${STAGING_LIBDIR} \
+"
+
+python populate_packages_prepend() {
+        enigma2_plugindir = bb.data.expand('${libdir}/enigma2/python/Plugins', d)
+        do_split_packages(d, enigma2_plugindir, '^(\w+/\w+)/[a-zA-Z0-9_]+.*$', 'enigma2-plugin-%s', '%s', recursive=True, match_path=True, prepend=True)
+        do_split_packages(d, enigma2_plugindir, '^(\w+/\w+)/.*\.la$', 'enigma2-plugin-%s-dev', '%s (development)', recursive=True, match_path=True, prepend=True)
+        do_split_packages(d, enigma2_plugindir, '^(\w+/\w+)/.*\.a$', 'enigma2-plugin-%s-staticdev', '%s (static development)', recursive=True, match_path=True, prepend=True)
+        do_split_packages(d, enigma2_plugindir, '^(\w+/\w+)/(.*/)?\.debug/.*$', 'enigma2-plugin-%s-dbg', '%s (debug)', recursive=True, match_path=True, prepend=True)
+}
+
+RCONFLICTS_${PN} = "dreambox-keymaps"
+RREPLACES_${PN} = "dreambox-keymaps tuxbox-tuxtxt-32bpp (<= 0.0+cvs20090130-r1)"
+
+# workaround for opkg <= 0.1.7+svnr455-r19.1
+#pkg_preinst_${PN} () {
+#      if [ "x$D" != "x" ]; then
+#              exit 1
+#      fi
+#      if [ -f ${datadir}/fonts/tuxtxt.ttf ]; then
+#              cp -a ${datadir}/fonts/tuxtxt.ttf /tmp/tuxtxt.ttf
+#      fi
+#}
+#pkg_postinst_${PN} () {
+#      if [ "x$D" != "x" ]; then
+#              exit 1
+#      fi
+#      if [ -f /tmp/tuxtxt.ttf -a ! -f ${datadir}/fonts/tuxtxt.ttf ]; then
+#              mv /tmp/tuxtxt.ttf ${datadir}/fonts/tuxtxt.ttf
+#      fi
+#}
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/arrowdown.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/arrowdown.png
new file mode 100755 (executable)
index 0000000..436931d
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/arrowdown.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/arrowleft.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/arrowleft.png
new file mode 100755 (executable)
index 0000000..654beca
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/arrowleft.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/arrowright.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/arrowright.png
new file mode 100755 (executable)
index 0000000..a3af5c8
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/arrowright.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/arrowup.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/arrowup.png
new file mode 100755 (executable)
index 0000000..e9a0357
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/arrowup.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_b.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_b.png
new file mode 100755 (executable)
index 0000000..50fc6c6
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_b.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_bl.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_bl.png
new file mode 100755 (executable)
index 0000000..c1f7dd6
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_bl.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_br.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_br.png
new file mode 100755 (executable)
index 0000000..8584058
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_br.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_l.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_l.png
new file mode 100755 (executable)
index 0000000..caa0f1f
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_l.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_r.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_r.png
new file mode 100755 (executable)
index 0000000..5ad324f
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_r.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_t.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_t.png
new file mode 100755 (executable)
index 0000000..20ba7f7
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_t.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_tl.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_tl.png
new file mode 100755 (executable)
index 0000000..5cbf7d3
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_tl.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_tr.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_tr.png
new file mode 100755 (executable)
index 0000000..7902358
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/b_tr.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bar_ber.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bar_ber.png
new file mode 100755 (executable)
index 0000000..f94150a
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bar_ber.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bar_snr.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bar_snr.png
new file mode 100755 (executable)
index 0000000..18050ed
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bar_snr.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bg_list.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bg_list.png
new file mode 100755 (executable)
index 0000000..c1de3f0
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bg_list.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bg_main.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bg_main.png
new file mode 100755 (executable)
index 0000000..aaed82d
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bg_main.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bg_setup_600.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bg_setup_600.png
new file mode 100755 (executable)
index 0000000..624dade
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bg_setup_600.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bg_setup_650.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bg_setup_650.png
new file mode 100755 (executable)
index 0000000..fa3262b
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bg_setup_650.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_epg.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_epg.png
new file mode 100755 (executable)
index 0000000..9f586e9
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_epg.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_eventinfo.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_eventinfo.png
new file mode 100755 (executable)
index 0000000..5108758
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_eventinfo.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_info.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_info.png
new file mode 100755 (executable)
index 0000000..8393a9e
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_info.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu.png
new file mode 100755 (executable)
index 0000000..e7f9ede
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu_300.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu_300.png
new file mode 100755 (executable)
index 0000000..b81f37f
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu_300.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu_350.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu_350.png
new file mode 100755 (executable)
index 0000000..4f6f49c
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu_350.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu_a.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu_a.png
new file mode 100755 (executable)
index 0000000..0a6aa8e
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu_a.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu_c.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu_c.png
new file mode 100755 (executable)
index 0000000..f26e6bf
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_menu_c.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_multiepg.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_multiepg.png
new file mode 100755 (executable)
index 0000000..c1e3bf2
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/border_multiepg.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bottombar.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bottombar.png
new file mode 100755 (executable)
index 0000000..cda483c
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/bottombar.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_130x23px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_130x23px.png
new file mode 100755 (executable)
index 0000000..9d7fc72
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_130x23px.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_170x23px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_170x23px.png
new file mode 100755 (executable)
index 0000000..c40bf8f
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_170x23px.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_230x23px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_230x23px.png
new file mode 100755 (executable)
index 0000000..4bd5ec4
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_230x23px.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_230x27px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_230x27px.png
new file mode 100755 (executable)
index 0000000..11355ae
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_230x27px.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_250x32px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_250x32px.png
new file mode 100755 (executable)
index 0000000..3227078
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_250x32px.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_290x23px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_290x23px.png
new file mode 100755 (executable)
index 0000000..a1df44e
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_290x23px.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_360x23px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_360x23px.png
new file mode 100755 (executable)
index 0000000..aba4b0f
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_360x23px.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_360x32px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_360x32px.png
new file mode 100755 (executable)
index 0000000..3080055
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_360x32px.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_380x23px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_380x23px.png
new file mode 100755 (executable)
index 0000000..760a99e
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_380x23px.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_400x23px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_400x23px.png
new file mode 100755 (executable)
index 0000000..b4b79d8
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_400x23px.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_440x23px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_440x23px.png
new file mode 100755 (executable)
index 0000000..dcb6e22
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_440x23px.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_450x32px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_450x32px.png
new file mode 100755 (executable)
index 0000000..9f37cbb
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_450x32px.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_480x23px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_480x23px.png
new file mode 100755 (executable)
index 0000000..5e8b862
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_480x23px.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_500x23px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_500x23px.png
new file mode 100755 (executable)
index 0000000..2ad248f
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_500x23px.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_520x23px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_520x23px.png
new file mode 100755 (executable)
index 0000000..6de80e7
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_520x23px.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_520x27px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_520x27px.png
new file mode 100755 (executable)
index 0000000..fe6a62f
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_520x27px.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_550x27px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_550x27px.png
new file mode 100755 (executable)
index 0000000..b9ba933
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_550x27px.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_560x23px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_560x23px.png
new file mode 100755 (executable)
index 0000000..19a191b
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Selected_bar_560x23px.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Thumbs.db b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Thumbs.db
new file mode 100755 (executable)
index 0000000..3bfe524
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/Thumbs.db differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/blue.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/blue.png
new file mode 100755 (executable)
index 0000000..d059fd0
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/blue.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/blue_pressed.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/blue_pressed.png
new file mode 100755 (executable)
index 0000000..0c2769f
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/blue_pressed.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_blue.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_blue.png
new file mode 100755 (executable)
index 0000000..b014975
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_blue.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_blue_off.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_blue_off.png
new file mode 100755 (executable)
index 0000000..43b3f8d
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_blue_off.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_green.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_green.png
new file mode 100755 (executable)
index 0000000..0f37970
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_green.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_green_off.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_green_off.png
new file mode 100755 (executable)
index 0000000..8402afa
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_green_off.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_red.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_red.png
new file mode 100755 (executable)
index 0000000..45af492
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_red.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_red_off.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_red_off.png
new file mode 100755 (executable)
index 0000000..3611f21
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_red_off.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_yellow.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_yellow.png
new file mode 100755 (executable)
index 0000000..0f9b962
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_yellow.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_yellow_off.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_yellow_off.png
new file mode 100755 (executable)
index 0000000..aaa7dac
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/button_yellow_off.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/green-big.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/green-big.png
new file mode 100755 (executable)
index 0000000..f92f09f
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/green-big.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/green.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/green.png
new file mode 100755 (executable)
index 0000000..c6dd5a4
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/green.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_0.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_0.png
new file mode 100755 (executable)
index 0000000..a7f24a9
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_0.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_1.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_1.png
new file mode 100755 (executable)
index 0000000..04adba9
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_1.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_2.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_2.png
new file mode 100755 (executable)
index 0000000..cdcb98b
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_2.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_3.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_3.png
new file mode 100755 (executable)
index 0000000..d872b50
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_3.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_4.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_4.png
new file mode 100755 (executable)
index 0000000..de5a3a4
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_4.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_5.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_5.png
new file mode 100755 (executable)
index 0000000..d9029cd
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_5.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_6.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_6.png
new file mode 100755 (executable)
index 0000000..63f43ae
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_6.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_7.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_7.png
new file mode 100755 (executable)
index 0000000..b9be24e
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_7.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_8.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_8.png
new file mode 100755 (executable)
index 0000000..2237f09
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_8.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_9.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_9.png
new file mode 100755 (executable)
index 0000000..19c1467
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_9.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_blue.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_blue.png
new file mode 100755 (executable)
index 0000000..2721ea9
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_blue.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_green.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_green.png
new file mode 100755 (executable)
index 0000000..8e3260d
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_green.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_info.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_info.png
new file mode 100755 (executable)
index 0000000..903b04a
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_info.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_menu.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_menu.png
new file mode 100755 (executable)
index 0000000..7986ed8
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_menu.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_red.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_red.png
new file mode 100755 (executable)
index 0000000..3b7a052
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_red.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_text.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_text.png
new file mode 100755 (executable)
index 0000000..8e91a12
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_text.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_yellow.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_yellow.png
new file mode 100755 (executable)
index 0000000..e26d5c6
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/key_yellow.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/red-big.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/red-big.png
new file mode 100755 (executable)
index 0000000..7436673
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/red-big.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/red.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/red.png
new file mode 100755 (executable)
index 0000000..e80dba2
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/red.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_left_arrow.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_left_arrow.png
new file mode 100755 (executable)
index 0000000..5f18c6a
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_left_arrow.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_right_arrow.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_right_arrow.png
new file mode 100755 (executable)
index 0000000..4da823e
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_right_arrow.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_23p.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_23p.png
new file mode 100755 (executable)
index 0000000..4823e66
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_23p.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_23px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_23px.png
new file mode 100755 (executable)
index 0000000..201a7af
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_23px.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_39p.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_39p.png
new file mode 100755 (executable)
index 0000000..184aec2
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_39p.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_39px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_39px.png
new file mode 100755 (executable)
index 0000000..76386f5
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_39px.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_43p.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_43p.png
new file mode 100755 (executable)
index 0000000..d59bdcb
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_43p.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_48p.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_48p.png
new file mode 100755 (executable)
index 0000000..ac964ba
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_48p.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_48px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_48px.png
new file mode 100755 (executable)
index 0000000..792a677
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_48px.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_72p.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_72p.png
new file mode 100755 (executable)
index 0000000..a89abe0
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_72p.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_72px.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_72px.png
new file mode 100755 (executable)
index 0000000..f953fd3
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/singlelineList_selected_72px.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/yellow.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/yellow.png
new file mode 100755 (executable)
index 0000000..81031c0
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/buttons/yellow.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/Thumbs.db b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/Thumbs.db
new file mode 100755 (executable)
index 0000000..c043994
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/Thumbs.db differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/ad.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/ad.png
new file mode 100755 (executable)
index 0000000..1e215a9
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/ad.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/ae.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/ae.png
new file mode 100755 (executable)
index 0000000..f5807c2
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/ae.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/cz.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/cz.png
new file mode 100755 (executable)
index 0000000..00d0bd2
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/cz.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/de.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/de.png
new file mode 100755 (executable)
index 0000000..55f28f0
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/de.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/dk.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/dk.png
new file mode 100755 (executable)
index 0000000..a1b61d2
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/dk.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/en.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/en.png
new file mode 100755 (executable)
index 0000000..90fca70
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/en.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/es.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/es.png
new file mode 100755 (executable)
index 0000000..543b8fd
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/es.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/fi.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/fi.png
new file mode 100755 (executable)
index 0000000..3442265
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/fi.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/fr.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/fr.png
new file mode 100755 (executable)
index 0000000..28924eb
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/fr.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/gr.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/gr.png
new file mode 100755 (executable)
index 0000000..f052256
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/gr.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/hr.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/hr.png
new file mode 100755 (executable)
index 0000000..e769a80
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/hr.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/hu.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/hu.png
new file mode 100755 (executable)
index 0000000..1c59889
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/hu.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/is.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/is.png
new file mode 100755 (executable)
index 0000000..a276109
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/is.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/it.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/it.png
new file mode 100755 (executable)
index 0000000..6858d7c
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/it.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/lt.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/lt.png
new file mode 100755 (executable)
index 0000000..4bb0893
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/lt.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/missing.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/missing.png
new file mode 100755 (executable)
index 0000000..c677460
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/missing.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/nl.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/nl.png
new file mode 100755 (executable)
index 0000000..57829ae
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/nl.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/no.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/no.png
new file mode 100755 (executable)
index 0000000..9b4b6c1
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/no.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/pl.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/pl.png
new file mode 100755 (executable)
index 0000000..611604a
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/pl.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/pt.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/pt.png
new file mode 100755 (executable)
index 0000000..b302933
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/pt.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/ro.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/ro.png
new file mode 100755 (executable)
index 0000000..ea3b856
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/ro.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/ru.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/ru.png
new file mode 100755 (executable)
index 0000000..4dfa9fb
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/ru.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/se.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/se.png
new file mode 100755 (executable)
index 0000000..4966fc5
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/se.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/si.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/si.png
new file mode 100755 (executable)
index 0000000..72e753d
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/si.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/tr.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/tr.png
new file mode 100755 (executable)
index 0000000..19510ee
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/countries/tr.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/div-h.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/div-h.png
new file mode 100755 (executable)
index 0000000..d6fcc7f
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/div-h.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/div-v.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/div-v.png
new file mode 100755 (executable)
index 0000000..e97cab9
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/div-v.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/epg_more.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/epg_more.png
new file mode 100755 (executable)
index 0000000..9ec1d8a
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/epg_more.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/epg_next.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/epg_next.png
new file mode 100755 (executable)
index 0000000..33db35e
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/epg_next.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/epg_now.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/epg_now.png
new file mode 100755 (executable)
index 0000000..16264e6
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/epg_now.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/expandable-plugins.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/expandable-plugins.png
new file mode 100755 (executable)
index 0000000..9d6fa5f
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/expandable-plugins.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/expanded-plugins.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/expanded-plugins.png
new file mode 100755 (executable)
index 0000000..af65583
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/expanded-plugins.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/Thumbs.db b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/Thumbs.db
new file mode 100755 (executable)
index 0000000..7e8518a
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/Thumbs.db differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/clock.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/clock.png
new file mode 100755 (executable)
index 0000000..f3d675a
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/clock.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/dish.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/dish.png
new file mode 100755 (executable)
index 0000000..3bb8fde
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/dish.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/dish_scan.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/dish_scan.png
new file mode 100755 (executable)
index 0000000..d0b9766
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/dish_scan.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/dmm_logo.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/dmm_logo.png
new file mode 100755 (executable)
index 0000000..56f2965
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/dmm_logo.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock.png
new file mode 100755 (executable)
index 0000000..f3d675a
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock_add.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock_add.png
new file mode 100755 (executable)
index 0000000..487ac48
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock_add.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock_post.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock_post.png
new file mode 100755 (executable)
index 0000000..5716d99
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock_post.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock_pre.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock_pre.png
new file mode 100755 (executable)
index 0000000..ff42463
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock_pre.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock_prepost.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock_prepost.png
new file mode 100755 (executable)
index 0000000..871b396
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/epgclock_prepost.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/folder.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/folder.png
new file mode 100755 (executable)
index 0000000..bc0facb
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/folder.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/ico_mp_forward.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/ico_mp_forward.png
new file mode 100755 (executable)
index 0000000..3ef0e3c
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/ico_mp_forward.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/ico_mp_pause.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/ico_mp_pause.png
new file mode 100755 (executable)
index 0000000..8081752
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/ico_mp_pause.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/ico_mp_play.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/ico_mp_play.png
new file mode 100755 (executable)
index 0000000..dfc5a1e
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/ico_mp_play.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/ico_mp_rewind.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/ico_mp_rewind.png
new file mode 100755 (executable)
index 0000000..7941ec5
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/ico_mp_rewind.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/ico_mp_stop.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/ico_mp_stop.png
new file mode 100755 (executable)
index 0000000..da764ef
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/ico_mp_stop.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_channelselection_radio.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_channelselection_radio.png
new file mode 100755 (executable)
index 0000000..2f03644
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_channelselection_radio.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_channelselection_tv.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_channelselection_tv.png
new file mode 100755 (executable)
index 0000000..7e4f9df
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_channelselection_tv.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_crypt.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_crypt.png
new file mode 100755 (executable)
index 0000000..774ddac
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_crypt.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_crypt_off.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_crypt_off.png
new file mode 100755 (executable)
index 0000000..8f0cc9a
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_crypt_off.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_dolby.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_dolby.png
new file mode 100755 (executable)
index 0000000..fc0dea6
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_dolby.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_dolby_off.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_dolby_off.png
new file mode 100755 (executable)
index 0000000..dcae966
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_dolby_off.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_epg.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_epg.png
new file mode 100755 (executable)
index 0000000..3d38f34
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_epg.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_event.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_event.png
new file mode 100755 (executable)
index 0000000..1b7daf5
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_event.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_format.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_format.png
new file mode 100755 (executable)
index 0000000..421b803
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_format.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_format_off.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_format_off.png
new file mode 100755 (executable)
index 0000000..073ff74
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_format_off.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_mainmenu.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_mainmenu.png
new file mode 100755 (executable)
index 0000000..e6ddf9e
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_mainmenu.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_media.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_media.png
new file mode 100755 (executable)
index 0000000..6c33a88
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_media.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_note.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_note.png
new file mode 100755 (executable)
index 0000000..f83134f
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_note.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_rec.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_rec.png
new file mode 100755 (executable)
index 0000000..2f6e2a7
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_rec.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_rec_off.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_rec_off.png
new file mode 100755 (executable)
index 0000000..f86204d
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_rec_off.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_recorded.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_recorded.png
new file mode 100755 (executable)
index 0000000..453f39f
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_recorded.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_timerlist.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_timerlist.png
new file mode 100755 (executable)
index 0000000..2e88441
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_timerlist.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_txt.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_txt.png
new file mode 100755 (executable)
index 0000000..4a95661
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_txt.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_txt_off.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_txt_off.png
new file mode 100755 (executable)
index 0000000..8b4c689
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_txt_off.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_txt_x.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_txt_x.png
new file mode 100755 (executable)
index 0000000..c344c0a
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_txt_x.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_view.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_view.png
new file mode 100755 (executable)
index 0000000..988b419
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icon_view.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icons_off.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icons_off.png
new file mode 100755 (executable)
index 0000000..8cc9d2a
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icons_off.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icons_off_1.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icons_off_1.png
new file mode 100755 (executable)
index 0000000..8cc9d2a
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icons_off_1.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icons_off_X.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icons_off_X.png
new file mode 100755 (executable)
index 0000000..cbab99b
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/icons_off_X.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/input_error.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/input_error.png
new file mode 100755 (executable)
index 0000000..620c32d
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/input_error.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/input_info.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/input_info.png
new file mode 100755 (executable)
index 0000000..8aefdca
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/input_info.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/input_question.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/input_question.png
new file mode 100755 (executable)
index 0000000..fad2b96
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/input_question.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/lock.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/lock.png
new file mode 100755 (executable)
index 0000000..05d2d81
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/lock.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/lock_error.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/lock_error.png
new file mode 100755 (executable)
index 0000000..152028a
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/lock_error.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/lock_off.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/lock_off.png
new file mode 100755 (executable)
index 0000000..6dd6298
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/lock_off.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/lock_on.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/lock_on.png
new file mode 100755 (executable)
index 0000000..6daf601
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/lock_on.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/marker.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/marker.png
new file mode 100755 (executable)
index 0000000..82c21b5
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/marker.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/mp_buttons.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/mp_buttons.png
new file mode 100755 (executable)
index 0000000..42ad320
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/mp_buttons.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/plugin.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/plugin.png
new file mode 100755 (executable)
index 0000000..f75cde0
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/plugin.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_logo.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_logo.png
new file mode 100755 (executable)
index 0000000..c0a16cf
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_logo.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_page1.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_page1.png
new file mode 100755 (executable)
index 0000000..ca690b2
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_page1.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_page2.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_page2.png
new file mode 100755 (executable)
index 0000000..84f7f8c
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_page2.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_page3.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_page3.png
new file mode 100755 (executable)
index 0000000..8e6a38f
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_page3.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_page4.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_page4.png
new file mode 100755 (executable)
index 0000000..6916b60
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/rass_page4.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/record.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/record.png
new file mode 100755 (executable)
index 0000000..f71ca5c
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/record.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/redx.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/redx.png
new file mode 100755 (executable)
index 0000000..2bfbaac
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/redx.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/repeat_off.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/repeat_off.png
new file mode 100755 (executable)
index 0000000..3156255
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/repeat_off.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/repeat_on.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/repeat_on.png
new file mode 100755 (executable)
index 0000000..68daaec
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/repeat_on.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/scan-c.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/scan-c.png
new file mode 100755 (executable)
index 0000000..ca0c45d
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/scan-c.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/scan-s.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/scan-s.png
new file mode 100755 (executable)
index 0000000..875bd45
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/scan-s.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/scan-t.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/scan-t.png
new file mode 100755 (executable)
index 0000000..19a80c5
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/scan-t.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/selectioncross.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/selectioncross.png
new file mode 100755 (executable)
index 0000000..63fe6b5
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/icons/selectioncross.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/info-bg.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/info-bg.png
new file mode 100755 (executable)
index 0000000..9818251
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/info-bg.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/info-bg_mp.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/info-bg_mp.png
new file mode 100755 (executable)
index 0000000..594afdb
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/info-bg_mp.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/mediaplayer_bg.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/mediaplayer_bg.png
new file mode 100755 (executable)
index 0000000..7746cc8
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/mediaplayer_bg.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/Thumbs.db b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/Thumbs.db
new file mode 100755 (executable)
index 0000000..aae3914
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/Thumbs.db differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/dvd_player.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/dvd_player.png
new file mode 100755 (executable)
index 0000000..a03c015
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/dvd_player.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/information.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/information.png
new file mode 100755 (executable)
index 0000000..d596493
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/information.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/media_player.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/media_player.png
new file mode 100755 (executable)
index 0000000..0d16cf3
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/media_player.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/plugins.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/plugins.png
new file mode 100755 (executable)
index 0000000..31348a9
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/plugins.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/scart.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/scart.png
new file mode 100755 (executable)
index 0000000..cf4c8ef
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/scart.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/setup.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/setup.png
new file mode 100755 (executable)
index 0000000..adb19ec
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/setup.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/shutdown.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/shutdown.png
new file mode 100755 (executable)
index 0000000..1786590
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/shutdown.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/subtitles.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/subtitles.png
new file mode 100755 (executable)
index 0000000..aeba0a7
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/subtitles.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/timer.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/timer.png
new file mode 100755 (executable)
index 0000000..b69a6fb
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/menu/timer.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/mute.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/mute.png
new file mode 100755 (executable)
index 0000000..c535f43
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/mute.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/nim_active.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/nim_active.png
new file mode 100755 (executable)
index 0000000..a61de30
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/nim_active.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/no_coverArt.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/no_coverArt.png
new file mode 100755 (executable)
index 0000000..7ec2eca
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/no_coverArt.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/output.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/output.png
new file mode 100755 (executable)
index 0000000..e8bac98
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/output.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/pal.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/pal.png
new file mode 100755 (executable)
index 0000000..1d83395
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/pal.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/picon_default.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/picon_default.png
new file mode 100755 (executable)
index 0000000..61ec818
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/picon_default.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/position_arrow.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/position_arrow.png
new file mode 100755 (executable)
index 0000000..267c2da
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/position_arrow.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/position_pointer.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/position_pointer.png
new file mode 100755 (executable)
index 0000000..8fd3929
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/position_pointer.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/position_pointer_580.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/position_pointer_580.png
new file mode 100755 (executable)
index 0000000..aa49953
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/position_pointer_580.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/prev.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/prev.png
new file mode 100755 (executable)
index 0000000..a367774
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/prev.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/progress_bg.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/progress_bg.png
new file mode 100755 (executable)
index 0000000..ad8c315
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/progress_bg.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/progress_big.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/progress_big.png
new file mode 100755 (executable)
index 0000000..ebe66a4
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/progress_big.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/progress_medium.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/progress_medium.png
new file mode 100755 (executable)
index 0000000..be0cf11
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/progress_medium.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/progress_recording.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/progress_recording.png
new file mode 100755 (executable)
index 0000000..91ee430
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/progress_recording.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/progress_small.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/progress_small.png
new file mode 100755 (executable)
index 0000000..05e5a14
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/progress_small.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/rc.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/rc.png
new file mode 100755 (executable)
index 0000000..52ae3fe
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/rc.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/rcold.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/rcold.png
new file mode 100755 (executable)
index 0000000..77e06f1
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/rcold.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/screws.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/screws.png
new file mode 100755 (executable)
index 0000000..25a4a3e
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/screws.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/screws_mp.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/screws_mp.png
new file mode 100755 (executable)
index 0000000..625e331
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/screws_mp.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/scroll.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/scroll.png
new file mode 100755 (executable)
index 0000000..c2d456f
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/scroll.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/singlelineList_selected_23p.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/singlelineList_selected_23p.png
new file mode 100755 (executable)
index 0000000..4823e66
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/singlelineList_selected_23p.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/sleeptimer.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/sleeptimer.png
new file mode 100755 (executable)
index 0000000..0334865
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/sleeptimer.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/spinner/Thumbs.db b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/spinner/Thumbs.db
new file mode 100755 (executable)
index 0000000..5b547ce
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/spinner/Thumbs.db differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/spinner/wait1.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/spinner/wait1.png
new file mode 100755 (executable)
index 0000000..49ffcc2
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/spinner/wait1.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/spinner/wait2.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/spinner/wait2.png
new file mode 100755 (executable)
index 0000000..d19f3d3
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/spinner/wait2.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/spinner/wait3.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/spinner/wait3.png
new file mode 100755 (executable)
index 0000000..229a91c
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/spinner/wait3.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/spinner/wait4.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/spinner/wait4.png
new file mode 100755 (executable)
index 0000000..b96ad21
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/spinner/wait4.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/timeline-now.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/timeline-now.png
new file mode 100755 (executable)
index 0000000..1220616
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/timeline-now.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/timeline.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/timeline.png
new file mode 100755 (executable)
index 0000000..9fb0823
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/timeline.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/unhandled-key.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/unhandled-key.png
new file mode 100755 (executable)
index 0000000..8e54349
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/unhandled-key.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/verticalline-plugins.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/verticalline-plugins.png
new file mode 100755 (executable)
index 0000000..bf2575f
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/verticalline-plugins.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_backspace.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_backspace.png
new file mode 100755 (executable)
index 0000000..ed49159
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_backspace.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_bg.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_bg.png
new file mode 100755 (executable)
index 0000000..5151da4
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_bg.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_clr.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_clr.png
new file mode 100755 (executable)
index 0000000..0c7734b
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_clr.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_esc.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_esc.png
new file mode 100755 (executable)
index 0000000..56c52d3
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_esc.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_icon.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_icon.png
new file mode 100755 (executable)
index 0000000..f27b7f8
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_icon.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_left.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_left.png
new file mode 100755 (executable)
index 0000000..2e77e71
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_left.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_ok.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_ok.png
new file mode 100755 (executable)
index 0000000..2c0c7e8
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_ok.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_right.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_right.png
new file mode 100755 (executable)
index 0000000..fefb17c
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_right.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_sel.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_sel.png
new file mode 100755 (executable)
index 0000000..b612b94
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_sel.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_shift.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_shift.png
new file mode 100755 (executable)
index 0000000..477f8db
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_shift.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_shift_sel.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_shift_sel.png
new file mode 100755 (executable)
index 0000000..339ddb4
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_shift_sel.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_space.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_space.png
new file mode 100755 (executable)
index 0000000..5151da4
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_space.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_text.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_text.png
new file mode 100755 (executable)
index 0000000..6bdb8c8
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/vkey_text.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/volume.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/volume.png
new file mode 100755 (executable)
index 0000000..aa60fab
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/volume.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/volume_box.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/volume_box.png
new file mode 100755 (executable)
index 0000000..f7c4df2
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/volume_box.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/wizard.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/wizard.png
new file mode 100755 (executable)
index 0000000..4a5df40
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/750S/wizard.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/MyriadPro-Regular.otf b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/MyriadPro-Regular.otf
new file mode 100755 (executable)
index 0000000..c9454bb
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/MyriadPro-Regular.otf differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/MyriadPro-Semibold.otf b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/MyriadPro-Semibold.otf
new file mode 100755 (executable)
index 0000000..1b33d74
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/MyriadPro-Semibold.otf differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/MyriadPro-SemiboldIt.otf b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/MyriadPro-SemiboldIt.otf
new file mode 100755 (executable)
index 0000000..e92ba39
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/MyriadPro-SemiboldIt.otf differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_EPG_list.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_EPG_list.png
new file mode 100755 (executable)
index 0000000..c43abc2
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_EPG_list.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_EPG_view.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_EPG_view.png
new file mode 100755 (executable)
index 0000000..3033e4a
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_EPG_view.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_List.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_List.png
new file mode 100755 (executable)
index 0000000..4acf507
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_List.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_Media.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_Media.png
new file mode 100755 (executable)
index 0000000..553bd75
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_Media.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_Media_info.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_Media_info.png
new file mode 100755 (executable)
index 0000000..397f037
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_Media_info.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_Subtitle.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_Subtitle.png
new file mode 100755 (executable)
index 0000000..4b953c4
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_Subtitle.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_divideline.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_divideline.png
new file mode 100755 (executable)
index 0000000..77c34d1
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Bg_divideline.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Solo_Menu_bg520.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Solo_Menu_bg520.png
new file mode 100755 (executable)
index 0000000..c7037b4
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Solo_Menu_bg520.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Statusbar_white.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Statusbar_white.png
new file mode 100755 (executable)
index 0000000..6e716ea
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/Statusbar_white.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/arrowdown.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/arrowdown.png
new file mode 100755 (executable)
index 0000000..2a1553a
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/arrowdown.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/arrowleft.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/arrowleft.png
new file mode 100755 (executable)
index 0000000..dafacee
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/arrowleft.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/arrowright.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/arrowright.png
new file mode 100755 (executable)
index 0000000..92f6164
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/arrowright.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/arrowup.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/arrowup.png
new file mode 100755 (executable)
index 0000000..47d8fd5
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/arrowup.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_b.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_b.png
new file mode 100755 (executable)
index 0000000..97bfb9a
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_b.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_bl.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_bl.png
new file mode 100755 (executable)
index 0000000..a1d9cb9
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_bl.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_br.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_br.png
new file mode 100755 (executable)
index 0000000..efe9531
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_br.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_l.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_l.png
new file mode 100755 (executable)
index 0000000..7095bb9
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_l.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_r.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_r.png
new file mode 100755 (executable)
index 0000000..5b28fed
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_r.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_t.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_t.png
new file mode 100755 (executable)
index 0000000..6130b08
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_t.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_tl.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_tl.png
new file mode 100755 (executable)
index 0000000..df2ad7c
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_tl.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_tr.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_tr.png
new file mode 100755 (executable)
index 0000000..b3482cf
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/b_tr.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/bar_ber.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/bar_ber.png
new file mode 100755 (executable)
index 0000000..8be0563
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/bar_ber.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/bar_snr.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/bar_snr.png
new file mode 100755 (executable)
index 0000000..973ae3a
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/bar_snr.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/bg.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/bg.png
new file mode 100755 (executable)
index 0000000..de085ba
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/bg.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/border_eventinfo.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/border_eventinfo.png
new file mode 100755 (executable)
index 0000000..5108758
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/border_eventinfo.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/border_info.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/border_info.png
new file mode 100755 (executable)
index 0000000..8393a9e
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/border_info.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/border_menu.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/border_menu.png
new file mode 100755 (executable)
index 0000000..6a64838
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/border_menu.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/FocusBar_H36.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/FocusBar_H36.png
new file mode 100755 (executable)
index 0000000..d2def92
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/FocusBar_H36.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/FocusBar_H42.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/FocusBar_H42.png
new file mode 100755 (executable)
index 0000000..ab58440
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/FocusBar_H42.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/FocusBar_H45.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/FocusBar_H45.png
new file mode 100755 (executable)
index 0000000..cab02ec
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/FocusBar_H45.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/blue.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/blue.png
new file mode 100755 (executable)
index 0000000..c2dcd16
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/blue.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/button_bluekey.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/button_bluekey.png
new file mode 100755 (executable)
index 0000000..077bd14
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/button_bluekey.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/button_off.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/button_off.png
new file mode 100755 (executable)
index 0000000..c2561a4
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/button_off.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/green.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/green.png
new file mode 100755 (executable)
index 0000000..8a149b6
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/green.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_0.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_0.png
new file mode 100755 (executable)
index 0000000..64ad839
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_0.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_1.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_1.png
new file mode 100755 (executable)
index 0000000..32255d7
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_1.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_2.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_2.png
new file mode 100755 (executable)
index 0000000..0293c8c
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_2.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_3.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_3.png
new file mode 100755 (executable)
index 0000000..b18fd0e
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_3.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_4.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_4.png
new file mode 100755 (executable)
index 0000000..cf160e7
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_4.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_5.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_5.png
new file mode 100755 (executable)
index 0000000..9eba495
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_5.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_6.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_6.png
new file mode 100755 (executable)
index 0000000..88ccfae
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_6.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_7.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_7.png
new file mode 100755 (executable)
index 0000000..05e146a
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_7.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_8.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_8.png
new file mode 100755 (executable)
index 0000000..09924f0
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_8.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_9.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_9.png
new file mode 100755 (executable)
index 0000000..be9b368
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_9.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_text.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_text.png
new file mode 100755 (executable)
index 0000000..8e91a12
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/key_text.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/red.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/red.png
new file mode 100755 (executable)
index 0000000..19d678d
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/red.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/yellow.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/yellow.png
new file mode 100755 (executable)
index 0000000..e5d8d84
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/buttons/yellow.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ad.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ad.png
new file mode 100755 (executable)
index 0000000..c80c0a2
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ad.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ae.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ae.png
new file mode 100755 (executable)
index 0000000..e69242c
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ae.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/cz.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/cz.png
new file mode 100755 (executable)
index 0000000..27ea03b
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/cz.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/de.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/de.png
new file mode 100755 (executable)
index 0000000..933e27a
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/de.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/dk.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/dk.png
new file mode 100755 (executable)
index 0000000..8e0c06b
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/dk.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ee.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ee.png
new file mode 100755 (executable)
index 0000000..73d266a
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ee.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/en.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/en.png
new file mode 100755 (executable)
index 0000000..77d931d
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/en.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/es.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/es.png
new file mode 100755 (executable)
index 0000000..2b1d44b
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/es.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/fi.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/fi.png
new file mode 100755 (executable)
index 0000000..a6a24af
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/fi.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/fr.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/fr.png
new file mode 100755 (executable)
index 0000000..03b8ce9
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/fr.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/gr.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/gr.png
new file mode 100755 (executable)
index 0000000..e89b873
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/gr.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/hr.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/hr.png
new file mode 100755 (executable)
index 0000000..e289da3
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/hr.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/hu.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/hu.png
new file mode 100755 (executable)
index 0000000..fb17f3b
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/hu.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/is.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/is.png
new file mode 100755 (executable)
index 0000000..af66e5d
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/is.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/it.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/it.png
new file mode 100755 (executable)
index 0000000..8fd6217
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/it.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/lt.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/lt.png
new file mode 100755 (executable)
index 0000000..5d61532
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/lt.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/lv.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/lv.png
new file mode 100755 (executable)
index 0000000..360b658
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/lv.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/missing.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/missing.png
new file mode 100755 (executable)
index 0000000..3fbd23c
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/missing.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/nl.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/nl.png
new file mode 100755 (executable)
index 0000000..7419c69
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/nl.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/no.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/no.png
new file mode 100755 (executable)
index 0000000..f679af1
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/no.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/pl.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/pl.png
new file mode 100755 (executable)
index 0000000..13ab5f2
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/pl.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/pt.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/pt.png
new file mode 100755 (executable)
index 0000000..81131ca
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/pt.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ro.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ro.png
new file mode 100755 (executable)
index 0000000..8f21363
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ro.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ru.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ru.png
new file mode 100755 (executable)
index 0000000..45ab022
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ru.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/se.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/se.png
new file mode 100755 (executable)
index 0000000..5d416e8
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/se.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/si.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/si.png
new file mode 100755 (executable)
index 0000000..8dc690c
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/si.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/sk.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/sk.png
new file mode 100755 (executable)
index 0000000..d6d212e
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/sk.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/tr.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/tr.png
new file mode 100755 (executable)
index 0000000..d1b648d
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/tr.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ua.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ua.png
new file mode 100755 (executable)
index 0000000..a2c12a4
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/ua.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/x-fy.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/x-fy.png
new file mode 100755 (executable)
index 0000000..2b2c7e6
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/x-fy.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/yu.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/yu.png
new file mode 100755 (executable)
index 0000000..00c2819
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/countries/yu.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/div-h.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/div-h.png
new file mode 100755 (executable)
index 0000000..d6fcc7f
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/div-h.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/div-v.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/div-v.png
new file mode 100755 (executable)
index 0000000..e97cab9
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/div-v.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/epg_more.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/epg_more.png
new file mode 100755 (executable)
index 0000000..28a3077
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/epg_more.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/epg_next.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/epg_next.png
new file mode 100755 (executable)
index 0000000..7b349de
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/epg_next.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/epg_now.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/epg_now.png
new file mode 100755 (executable)
index 0000000..cec38f6
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/epg_now.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/Mediaplayerbar_gray.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/Mediaplayerbar_gray.png
new file mode 100755 (executable)
index 0000000..dcc157f
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/Mediaplayerbar_gray.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/Mediaplayerbar_purple.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/Mediaplayerbar_purple.png
new file mode 100755 (executable)
index 0000000..7ad44f5
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/Mediaplayerbar_purple.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/clock.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/clock.png
new file mode 100755 (executable)
index 0000000..430bd04
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/clock.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/dish.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/dish.png
new file mode 100755 (executable)
index 0000000..cde6be1
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/dish.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/dish_scan.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/dish_scan.png
new file mode 100755 (executable)
index 0000000..f9cbeaa
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/dish_scan.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_Chlist_title.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_Chlist_title.png
new file mode 100755 (executable)
index 0000000..8ad2570
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_Chlist_title.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_Radio_title.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_Radio_title.png
new file mode 100755 (executable)
index 0000000..641ccd2
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_Radio_title.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_folder.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_folder.png
new file mode 100755 (executable)
index 0000000..82dae56
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_folder.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_noreplay.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_noreplay.png
new file mode 100755 (executable)
index 0000000..54ec7c0
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_noreplay.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_player.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_player.png
new file mode 100755 (executable)
index 0000000..dac8ff3
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_player.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_replay.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_replay.png
new file mode 100755 (executable)
index 0000000..b2baf0b
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/ico_replay.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_crypt.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_crypt.png
new file mode 100755 (executable)
index 0000000..745a645
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_crypt.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_crypt_off.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_crypt_off.png
new file mode 100755 (executable)
index 0000000..7d429d9
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_crypt_off.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_dolby.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_dolby.png
new file mode 100755 (executable)
index 0000000..403b34a
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_dolby.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_dolby_off.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_dolby_off.png
new file mode 100755 (executable)
index 0000000..d68c5c1
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_dolby_off.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_event.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_event.png
new file mode 100755 (executable)
index 0000000..1b7daf5
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_event.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_format.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_format.png
new file mode 100755 (executable)
index 0000000..5d2c39a
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_format.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_format_off.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_format_off.png
new file mode 100755 (executable)
index 0000000..b1424e1
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_format_off.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_rec.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_rec.png
new file mode 100755 (executable)
index 0000000..b7bf2e7
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_rec.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_rec_off.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_rec_off.png
new file mode 100755 (executable)
index 0000000..815d6e4
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_rec_off.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_txt.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_txt.png
new file mode 100755 (executable)
index 0000000..dded3a2
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_txt.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_txt_off.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_txt_off.png
new file mode 100755 (executable)
index 0000000..8267f55
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_txt_off.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_view.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_view.png
new file mode 100755 (executable)
index 0000000..988b419
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icon_view.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icons_off.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icons_off.png
new file mode 100755 (executable)
index 0000000..8cc9d2a
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/icons_off.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/input_error.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/input_error.png
new file mode 100755 (executable)
index 0000000..e1a6def
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/input_error.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/input_info.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/input_info.png
new file mode 100755 (executable)
index 0000000..96f4d94
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/input_info.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/input_question.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/input_question.png
new file mode 100755 (executable)
index 0000000..9517b86
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/input_question.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/lock.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/lock.png
new file mode 100755 (executable)
index 0000000..05d2d81
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/lock.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/lock_error.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/lock_error.png
new file mode 100755 (executable)
index 0000000..4f33190
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/lock_error.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/lock_off.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/lock_off.png
new file mode 100755 (executable)
index 0000000..8f215c7
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/lock_off.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/lock_on.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/lock_on.png
new file mode 100755 (executable)
index 0000000..0b11a00
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/lock_on.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/mp_buttons.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/mp_buttons.png
new file mode 100755 (executable)
index 0000000..b0be794
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/mp_buttons.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/mp_wb_buttons.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/mp_wb_buttons.png
new file mode 100755 (executable)
index 0000000..bfa1e61
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/mp_wb_buttons.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/plugin.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/plugin.png
new file mode 100755 (executable)
index 0000000..f75cde0
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/plugin.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/rass_logo.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/rass_logo.png
new file mode 100755 (executable)
index 0000000..c0a16cf
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/rass_logo.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/record.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/record.png
new file mode 100755 (executable)
index 0000000..f71ca5c
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/record.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/redx.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/redx.png
new file mode 100755 (executable)
index 0000000..246f6ba
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/redx.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/scan-c.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/scan-c.png
new file mode 100755 (executable)
index 0000000..ca0c45d
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/scan-c.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/scan-s.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/scan-s.png
new file mode 100755 (executable)
index 0000000..ae77c1a
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/scan-s.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/scan-t.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/scan-t.png
new file mode 100755 (executable)
index 0000000..19a80c5
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/icons/scan-t.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/info-bg.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/info-bg.png
new file mode 100755 (executable)
index 0000000..6544b44
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/info-bg.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_EPG_title.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_EPG_title.png
new file mode 100755 (executable)
index 0000000..f7a7736
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_EPG_title.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_Plugin_All_title.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_Plugin_All_title.png
new file mode 100755 (executable)
index 0000000..386c56c
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_Plugin_All_title.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Info.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Info.png
new file mode 100755 (executable)
index 0000000..3727f0b
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Info.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Media.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Media.png
new file mode 100755 (executable)
index 0000000..3b14a83
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Media.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Plugin.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Plugin.png
new file mode 100755 (executable)
index 0000000..e40aec1
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Plugin.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Setup.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Setup.png
new file mode 100755 (executable)
index 0000000..e597023
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Setup.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Standby.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Standby.png
new file mode 100755 (executable)
index 0000000..ee40b97
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Standby.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Subtitles.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Subtitles.png
new file mode 100755 (executable)
index 0000000..a9071bb
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Subtitles.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Timer.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Timer.png
new file mode 100755 (executable)
index 0000000..4035dbb
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_menu_Timer.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Info.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Info.png
new file mode 100755 (executable)
index 0000000..5236668
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Info.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_MENU.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_MENU.png
new file mode 100755 (executable)
index 0000000..b46b985
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_MENU.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Media.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Media.png
new file mode 100755 (executable)
index 0000000..2370e1e
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Media.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Plugin.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Plugin.png
new file mode 100755 (executable)
index 0000000..46d5c37
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Plugin.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Pluginall.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Pluginall.png
new file mode 100755 (executable)
index 0000000..6d74bd5
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Pluginall.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Setup.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Setup.png
new file mode 100755 (executable)
index 0000000..0f9fa3c
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Setup.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Standby.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Standby.png
new file mode 100755 (executable)
index 0000000..d2f468c
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Standby.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Subtitles.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Subtitles.png
new file mode 100755 (executable)
index 0000000..ccdfc8f
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Subtitles.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Timer.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Timer.png
new file mode 100755 (executable)
index 0000000..31879f8
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_Timer.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_media-info.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_media-info.png
new file mode 100755 (executable)
index 0000000..41ba0e5
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/menu/ico_title_media-info.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/mp_wb_background.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/mp_wb_background.png
new file mode 100755 (executable)
index 0000000..890c118
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/mp_wb_background.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/mute.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/mute.png
new file mode 100755 (executable)
index 0000000..a760869
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/mute.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/no_coverArt.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/no_coverArt.png
new file mode 100755 (executable)
index 0000000..352a1d5
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/no_coverArt.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/position_arrow.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/position_arrow.png
new file mode 100755 (executable)
index 0000000..267c2da
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/position_arrow.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/prev.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/prev.png
new file mode 100755 (executable)
index 0000000..17c5213
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/prev.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/progress_bg.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/progress_bg.png
new file mode 100755 (executable)
index 0000000..ad8c315
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/progress_bg.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/progress_big.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/progress_big.png
new file mode 100755 (executable)
index 0000000..2186259
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/progress_big.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/progress_medium.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/progress_medium.png
new file mode 100755 (executable)
index 0000000..0644f80
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/progress_medium.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/progress_small.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/progress_small.png
new file mode 100755 (executable)
index 0000000..2186259
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/progress_small.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/rc.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/rc.png
new file mode 100755 (executable)
index 0000000..59fdae4
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/rc.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/rc_wb_desc.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/rc_wb_desc.png
new file mode 100755 (executable)
index 0000000..921bf12
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/rc_wb_desc.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/rcold.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/rcold.png
new file mode 100755 (executable)
index 0000000..62d579d
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/rcold.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/sleeptimer.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/sleeptimer.png
new file mode 100755 (executable)
index 0000000..5637c29
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/sleeptimer.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/timeline-now.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/timeline-now.png
new file mode 100755 (executable)
index 0000000..edc022e
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/timeline-now.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/timeline.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/timeline.png
new file mode 100755 (executable)
index 0000000..9fb0823
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/timeline.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/unhandled-key.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/unhandled-key.png
new file mode 100755 (executable)
index 0000000..51d6e6c
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/unhandled-key.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_backspace.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_backspace.png
new file mode 100755 (executable)
index 0000000..ed49159
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_backspace.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_bg.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_bg.png
new file mode 100755 (executable)
index 0000000..5151da4
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_bg.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_clr.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_clr.png
new file mode 100755 (executable)
index 0000000..0c7734b
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_clr.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_esc.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_esc.png
new file mode 100755 (executable)
index 0000000..56c52d3
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_esc.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_icon.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_icon.png
new file mode 100755 (executable)
index 0000000..f27b7f8
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_icon.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_left.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_left.png
new file mode 100755 (executable)
index 0000000..2e77e71
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_left.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_ok.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_ok.png
new file mode 100755 (executable)
index 0000000..2c0c7e8
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_ok.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_right.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_right.png
new file mode 100755 (executable)
index 0000000..fefb17c
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_right.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_sel.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_sel.png
new file mode 100755 (executable)
index 0000000..b612b94
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_sel.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_shift.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_shift.png
new file mode 100755 (executable)
index 0000000..477f8db
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_shift.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_shift_sel.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_shift_sel.png
new file mode 100755 (executable)
index 0000000..339ddb4
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_shift_sel.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_space.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_space.png
new file mode 100755 (executable)
index 0000000..5151da4
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_space.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_text.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_text.png
new file mode 100755 (executable)
index 0000000..6bdb8c8
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/vkey_text.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/volume_background.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/volume_background.png
new file mode 100755 (executable)
index 0000000..9bfdbae
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/volume_background.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/volume_up.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/volume_up.png
new file mode 100755 (executable)
index 0000000..8ee1439
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/volume_up.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/wizard.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/wizard.png
new file mode 100755 (executable)
index 0000000..4a5df40
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/Vu_HD/wizard.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/analog.ttf b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/analog.ttf
new file mode 100755 (executable)
index 0000000..ed50ae9
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/analog.ttf differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_addlibpythondeps.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_addlibpythondeps.patch
new file mode 100644 (file)
index 0000000..71a7c86
--- /dev/null
@@ -0,0 +1,28 @@
+diff --git a/lib/python/.deps/connections.Po b/lib/python/.deps/connections.Po
+new file mode 100644
+index 0000000..9ce06a8
+--- /dev/null
++++ b/lib/python/.deps/connections.Po
+@@ -0,0 +1 @@
++# dummy
+diff --git a/lib/python/.deps/enigma_python.Pcpp b/lib/python/.deps/enigma_python.Pcpp
+new file mode 100644
+index 0000000..9ce06a8
+--- /dev/null
++++ b/lib/python/.deps/enigma_python.Pcpp
+@@ -0,0 +1 @@
++# dummy
+diff --git a/lib/python/.deps/enigma_python.Po b/lib/python/.deps/enigma_python.Po
+new file mode 100644
+index 0000000..9ce06a8
+--- /dev/null
++++ b/lib/python/.deps/enigma_python.Po
+@@ -0,0 +1 @@
++# dummy
+diff --git a/lib/python/.deps/python.Po b/lib/python/.deps/python.Po
+new file mode 100644
+index 0000000..9ce06a8
+--- /dev/null
++++ b/lib/python/.deps/python.Po
+@@ -0,0 +1 @@
++# dummy
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_mediaplayer.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_mediaplayer.patch
new file mode 100644 (file)
index 0000000..0c401a7
--- /dev/null
@@ -0,0 +1,218 @@
+diff --git a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py
+index 75fba2d..da5ebd4 100644
+--- a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py
++++ b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py
+@@ -7,7 +7,7 @@ from Screens.HelpMenu import HelpableScreen
+ from Screens.MessageBox import MessageBox
+ from Screens.InputBox import InputBox
+ from Screens.ChoiceBox import ChoiceBox
+-from Screens.InfoBarGenerics import InfoBarSeek, InfoBarAudioSelection, InfoBarCueSheetSupport, InfoBarNotifications, InfoBarSubtitleSupport
++from Screens.InfoBarGenerics import InfoBarSeek, InfoBarAudioSelection, InfoBarCueSheetSupport, InfoBarNotifications, InfoBarSubtitleSupport, InfoBarPVRState
+ from Components.ActionMap import NumberActionMap, HelpableActionMap
+ from Components.Label import Label
+ from Components.Pixmap import Pixmap,MultiPixmap
+@@ -87,7 +87,7 @@ class MediaPixmap(Pixmap):
+               self.coverArtFileName = "/tmp/.id3coverart"
+               self.picload.startDecode(self.coverArtFileName)
+-class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoBarCueSheetSupport, InfoBarNotifications, InfoBarSubtitleSupport, HelpableScreen):
++class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoBarCueSheetSupport, InfoBarNotifications, InfoBarSubtitleSupport, InfoBarPVRState, HelpableScreen):
+       ALLOW_SUSPEND = True
+       ENABLE_RESUME_SUPPORT = True
+@@ -201,6 +201,10 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB
+               InfoBarSeek.__init__(self, actionmap = "MediaPlayerSeekActions")
++              InfoBarPVRState.__init__(self)
++              self.__hideTimer = eTimer()
++              self.__hideTimer.callback.append(self.__hideMediaPlayerState)
++
+               self.onClose.append(self.delMPTimer)
+               self.onClose.append(self.__onClose)
+@@ -234,6 +238,14 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB
+                               iPlayableService.evUser+13: self["coverArt"].embeddedCoverArt
+                       })
++      def _mayShow(self):
++              self.pvrStateDialog.show()
++              if self.seekstate == self.SEEK_STATE_PLAY and not self.shown:
++                      self.__hideTimer.start(5*1000, True)
++
++      def __hideMediaPlayerState(self):
++              self.pvrStateDialog.hide()
++
+       def doNothing(self):
+               pass
+@@ -762,6 +774,7 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB
+                       self.playlist.updateList()
+                       if len(self.playlist) == 1:
+                               self.changeEntry(0)
++                              self.switchToPlayList()
+       def addPlaylistParser(self, parser, extension):
+               self.playlistparsers[extension] = parser
+diff --git a/lib/python/Screens/InfoBarGenerics.py b/lib/python/Screens/InfoBarGenerics.py
+index 07fbac8..6ca65e3 100755
+--- a/lib/python/Screens/InfoBarGenerics.py
++++ b/lib/python/Screens/InfoBarGenerics.py
+@@ -957,14 +957,17 @@ class InfoBarSeek:
+       def seekFwd(self):
+               seek = self.getSeek()
+               if seek and not (seek.isCurrentlySeekable() & 2):
+-                      if not self.fast_winding_hint_message_showed and (seek.isCurrentlySeekable() & 1):
+-                              self.session.open(MessageBox, _("No fast winding possible yet.. but you can use the number buttons to skip forward/backward!"), MessageBox.TYPE_INFO, timeout=10)
+-                              self.fast_winding_hint_message_showed = True
+-                              return
+-                      return 0 # trade as unhandled action
++                      media = 1
++              else:
++                      media = 0
++#                     if not self.fast_winding_hint_message_showed and (seek.isCurrentlySeekable() & 1):
++#                             self.session.open(MessageBox, _("No fast winding possible yet.. but you can use the number buttons to skip forward/backward!"), MessageBox.TYPE_INFO, timeout=10)
++#                             self.fast_winding_hint_message_showed = True
++#                             return
++#                     return 0 # trade as unhandled action
+               if self.seekstate == self.SEEK_STATE_PLAY:
+                       self.setSeekState(self.makeStateForward(int(config.seek.enter_forward.value)))
+-              elif self.seekstate == self.SEEK_STATE_PAUSE:
++              elif self.seekstate == self.SEEK_STATE_PAUSE and media==0:
+                       if len(config.seek.speeds_slowmotion.value):
+                               self.setSeekState(self.makeStateSlowMotion(config.seek.speeds_slowmotion.value[-1]))
+                       else:
+@@ -975,7 +978,11 @@ class InfoBarSeek:
+                       speed = self.seekstate[1]
+                       if self.seekstate[2]:
+                               speed /= self.seekstate[2]
+-                      speed = self.getHigher(speed, config.seek.speeds_forward.value) or config.seek.speeds_forward.value[-1]
++                      if media==1 and speed == 8:
++                              speed = 8
++                              return 0 # trade as unhandled action
++                      else:
++                              speed = self.getHigher(speed, config.seek.speeds_forward.value) or config.seek.speeds_forward.value[-1]
+                       self.setSeekState(self.makeStateForward(speed))
+               elif self.isStateBackward(self.seekstate):
+                       speed = -self.seekstate[1]
+@@ -993,18 +1000,27 @@ class InfoBarSeek:
+       def seekBack(self):
+               seek = self.getSeek()
+               if seek and not (seek.isCurrentlySeekable() & 2):
+-                      if not self.fast_winding_hint_message_showed and (seek.isCurrentlySeekable() & 1):
+-                              self.session.open(MessageBox, _("No fast winding possible yet.. but you can use the number buttons to skip forward/backward!"), MessageBox.TYPE_INFO, timeout=10)
++                      media = 1
++              else:
++                      media = 0
++#                     if not self.fast_winding_hint_message_showed and (seek.isCurrentlySeekable() & 1):
++#                             self.session.open(MessageBox, _("No fast winding possible yet.. but you can use the number buttons to skip forward/backward!"), MessageBox.TYPE_INFO, timeout=10)
++#                             self.fast_winding_hint_message_showed = True
++#                             return
++#                     return 0 # trade as unhandled action
++              seekstate = self.seekstate
++              if seekstate == self.SEEK_STATE_PLAY and media==0:
++                      self.setSeekState(self.makeStateBackward(int(config.seek.enter_backward.value)))
++              elif seekstate == self.SEEK_STATE_PLAY and media ==1:
++                      if not self.fast_winding_hint_message_showed:
++                              self.session.open(MessageBox, _("No rewinding possible yet.. but you can use the number buttons to skip forward/backward!"), MessageBox.TYPE_INFO, timeout=10)
+                               self.fast_winding_hint_message_showed = True
+                               return
+                       return 0 # trade as unhandled action
+-              seekstate = self.seekstate
+-              if seekstate == self.SEEK_STATE_PLAY:
+-                      self.setSeekState(self.makeStateBackward(int(config.seek.enter_backward.value)))
+               elif seekstate == self.SEEK_STATE_EOF:
+                       self.setSeekState(self.makeStateBackward(int(config.seek.enter_backward.value)))
+                       self.doSeekRelative(-6)
+-              elif seekstate == self.SEEK_STATE_PAUSE:
++              elif seekstate == self.SEEK_STATE_PAUSE and media==0:
+                       self.doSeekRelative(-1)
+               elif self.isStateForward(seekstate):
+                       speed = seekstate[1]
+diff --git a/lib/service/servicemp3.cpp b/lib/service/servicemp3.cpp
+old mode 100644
+new mode 100755
+index be55d0c..7ce34c1
+--- a/lib/service/servicemp3.cpp
++++ b/lib/service/servicemp3.cpp
+@@ -235,6 +235,7 @@ eServiceMP3::eServiceMP3(eServiceReference ref)
+       CONNECT(m_pump.recv_msg, eServiceMP3::gstPoll);
+       m_aspect = m_width = m_height = m_framerate = m_progressive = -1;
++      m_cur_rate=1.0;
+       m_state = stIdle;
+       eDebug("eServiceMP3::construct!");
+@@ -517,6 +518,9 @@ RESULT eServiceMP3::unpause()
+       if (!m_gst_playbin || m_state != stRunning)
+               return -1;
++      if(m_cur_rate!=1.0)
++              trickSeek(1);
++
+       gst_element_set_state(m_gst_playbin, GST_STATE_PLAYING);
+       return 0;
+@@ -552,7 +556,7 @@ RESULT eServiceMP3::seekToImpl(pts_t to)
+ {
+               /* convert pts to nanoseconds */
+       gint64 time_nanoseconds = to * 11111LL;
+-      if (!gst_element_seek (m_gst_playbin, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH,
++      if (!gst_element_seek (m_gst_playbin, m_cur_rate, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH,
+               GST_SEEK_TYPE_SET, time_nanoseconds,
+               GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE))
+       {
+@@ -589,19 +593,23 @@ RESULT eServiceMP3::trickSeek(gdouble ratio)
+       if (!ratio)
+               return seekRelative(0, 0);
++      eSingleLocker l(m_subs_to_pull_lock);
++
+       GstEvent *s_event;
+       int flags;
+       flags = GST_SEEK_FLAG_NONE;
+       flags |= GST_SEEK_FLAG_FLUSH;
+ //    flags |= GstSeekFlags (GST_SEEK_FLAG_ACCURATE);
+-      flags |= GST_SEEK_FLAG_KEY_UNIT;
++//    flags |= GST_SEEK_FLAG_KEY_UNIT;
+ //    flags |= GstSeekFlags (GST_SEEK_FLAG_SEGMENT);
+ //    flags |= GstSeekFlags (GST_SEEK_FLAG_SKIP);
+       GstFormat fmt = GST_FORMAT_TIME;
+-      gint64 pos, len;
++      pts_t pos;
++      gint64 len;
+       gst_element_query_duration(m_gst_playbin, &fmt, &len);
+-      gst_element_query_position(m_gst_playbin, &fmt, &pos);
++      getPlayPosition(pos);
++      pos=pos*11111;
+       if ( ratio >= 0 )
+       {
+@@ -619,7 +627,11 @@ RESULT eServiceMP3::trickSeek(gdouble ratio)
+               eDebug("eServiceMP3::trickSeek failed");
+               return -1;
+       }
+-
++      m_subtitle_pages.clear();
++      m_prev_decoder_time = -1;
++      m_decoder_time_valid_state = 0;
++      m_subs_to_pull = 0;
++      m_cur_rate=ratio;
+       return 0;
+ }
+diff --git a/lib/service/servicemp3.h b/lib/service/servicemp3.h
+old mode 100644
+new mode 100755
+index f3cc6dd..07eb321
+--- a/lib/service/servicemp3.h
++++ b/lib/service/servicemp3.h
+@@ -265,6 +265,7 @@ private:
+       gint m_aspect, m_width, m_height, m_framerate, m_progressive;
+       std::string m_useragent;
+       RESULT trickSeek(gdouble ratio);
++      double m_cur_rate;
+ };
+ #endif
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_mediaplayer_subtitle.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_mediaplayer_subtitle.patch
new file mode 100644 (file)
index 0000000..60e8f1a
--- /dev/null
@@ -0,0 +1,104 @@
+diff --git a/lib/service/servicemp3.cpp b/lib/service/servicemp3.cpp
+index 7ce34c1..e620225 100755
+--- a/lib/service/servicemp3.cpp
++++ b/lib/service/servicemp3.cpp
+@@ -235,6 +235,8 @@ eServiceMP3::eServiceMP3(eServiceReference ref)
+       CONNECT(m_pump.recv_msg, eServiceMP3::gstPoll);
+       m_aspect = m_width = m_height = m_framerate = m_progressive = -1;
++      m_subs_behind_seek = 0;
++      m_block_sub = FALSE;
+       m_cur_rate=1.0;
+       m_state = stIdle;
+       eDebug("eServiceMP3::construct!");
+@@ -572,6 +574,7 @@ RESULT eServiceMP3::seekTo(pts_t to)
+       RESULT ret = -1;
+       if (m_gst_playbin) {
++              m_block_sub = TRUE;
+               eSingleLocker l(m_subs_to_pull_lock); // this is needed to dont handle incomming subtitles during seek!
+               if (!(ret = seekToImpl(to)))
+               {
+@@ -580,6 +583,13 @@ RESULT eServiceMP3::seekTo(pts_t to)
+                       m_decoder_time_valid_state = 0;
+                       m_subs_to_pull = 0;
+               }
++              m_block_sub = FALSE;
++      }
++      m_subs_to_pull+=m_subs_behind_seek;
++      while(m_subs_behind_seek)
++      {
++              m_pump.send(Message(2));
++              m_subs_behind_seek--;
+       }
+       return ret;
+@@ -593,6 +603,7 @@ RESULT eServiceMP3::trickSeek(gdouble ratio)
+       if (!ratio)
+               return seekRelative(0, 0);
++      m_block_sub = TRUE;
+       eSingleLocker l(m_subs_to_pull_lock);
+       GstEvent *s_event;
+@@ -632,6 +643,13 @@ RESULT eServiceMP3::trickSeek(gdouble ratio)
+       m_decoder_time_valid_state = 0;
+       m_subs_to_pull = 0;
+       m_cur_rate=ratio;
++      m_block_sub = FALSE;
++      m_subs_to_pull+=m_subs_behind_seek;
++      while(m_subs_behind_seek)
++      {
++              m_pump.send(Message(2));
++              m_subs_behind_seek--;
++      }
+       return 0;
+ }
+@@ -1572,10 +1590,17 @@ eAutoInitPtr<eServiceFactoryMP3> init_eServiceFactoryMP3(eAutoInitNumbers::servi
+ void eServiceMP3::gstCBsubtitleAvail(GstElement *appsink, gpointer user_data)
+ {
+-      eServiceMP3 *_this = (eServiceMP3*)user_data;   
+-      eSingleLocker l(_this->m_subs_to_pull_lock);
+-      ++_this->m_subs_to_pull;
+-      _this->m_pump.send(Message(2));
++      eServiceMP3 *_this = (eServiceMP3*)user_data;
++      if(_this->m_block_sub != TRUE)
++      {
++              eSingleLocker l(_this->m_subs_to_pull_lock);
++              ++_this->m_subs_to_pull;
++              _this->m_pump.send(Message(2));
++      }
++      else
++      {
++              _this->m_subs_behind_seek++;
++      }
+ }
+ void eServiceMP3::gstTextpadHasCAPS(GstPad *pad, GParamSpec * unused, gpointer user_data)
+@@ -1651,6 +1676,11 @@ void eServiceMP3::pullSubtitle()
+               {
+                       GstBuffer *buffer;
+                       {
++                              if(m_block_sub == TRUE)
++                              {
++                                      g_signal_emit_by_name (sink, "pull-buffer", &buffer);
++                                      return;
++                              }
+                               eSingleLocker l(m_subs_to_pull_lock);
+                               --m_subs_to_pull;
+                               g_signal_emit_by_name (sink, "pull-buffer", &buffer);
+diff --git a/lib/service/servicemp3.h b/lib/service/servicemp3.h
+index 07eb321..f6282bf 100755
+--- a/lib/service/servicemp3.h
++++ b/lib/service/servicemp3.h
+@@ -266,6 +266,8 @@ private:
+       std::string m_useragent;
+       RESULT trickSeek(gdouble ratio);
+       double m_cur_rate;
++      bool m_block_sub;
++      int m_subs_behind_seek;
+ };
+ #endif
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_mediaplayer_unpause.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_mediaplayer_unpause.patch
new file mode 100644 (file)
index 0000000..9c89ee6
--- /dev/null
@@ -0,0 +1,20 @@
+diff --git a/lib/service/servicemp3.cpp b/lib/service/servicemp3.cpp
+index ba21d0c..88eb16e 100644
+--- a/lib/service/servicemp3.cpp
++++ b/lib/service/servicemp3.cpp
+@@ -568,9 +568,13 @@ RESULT eServiceMP3::unpause()
+               return -1;
+       if(m_cur_rate!=1.0)
++      {
+               trickSeek(1);
+-
+-      gst_element_set_state(m_gst_playbin, GST_STATE_PLAYING);
++              gst_element_set_state(m_gst_playbin, GST_STATE_PLAYING);
++      }else if (gst_element_set_state(m_gst_playbin, GST_STATE_PLAYING)==2){
++              eDebug("eServiceMP3::unpause : the state change will happen asunchronously");
++              trickSeek(1);
++      }
+       return 0;
+ }
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_misc.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_misc.patch
new file mode 100644 (file)
index 0000000..6e5a722
--- /dev/null
@@ -0,0 +1,12 @@
+diff --git a/lib/base/filepush.cpp b/lib/base/filepush.cpp
+index 91f24ba..13dac01 100644
+--- a/lib/base/filepush.cpp
++++ b/lib/base/filepush.cpp
+@@ -263,6 +263,7 @@ void eFilePushThread::stop()
+       m_stop = 1;
++      usleep(100000); //Fix problem of blocking I/O read 
+       eDebug("stopping thread."); /* just do it ONCE. it won't help to do this more than once. */
+       sendSignal(SIGUSR1);
+       kill(0);
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_networksetup.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_networksetup.patch
new file mode 100644 (file)
index 0000000..54bdfe3
--- /dev/null
@@ -0,0 +1,45 @@
+diff --git a/lib/python/Screens/NetworkSetup.py b/lib/python/Screens/NetworkSetup.py
+index 32b9f54..b31ba3a 100755
+--- a/lib/python/Screens/NetworkSetup.py
++++ b/lib/python/Screens/NetworkSetup.py
+@@ -60,7 +60,11 @@ class NetworkAdapterSelection(Screen,HelpableScreen):
+                       "yellow": (self.setDefaultInterface, [_("Set interface as default Interface"),_("* Only available if more than one interface is active.")] ),
+                       })
+-              self.adapters = [(iNetwork.getFriendlyAdapterName(x),x) for x in iNetwork.getAdapterList()]
++              self.adapters = []
++              self.adapterList = [(iNetwork.getFriendlyAdapterName(x),x) for x in iNetwork.getAdapterList()]
++              for x in self.adapterList:
++                      if x[1].startswith('eth'):
++                              self.adapters.append(x)
+               if not self.adapters:
+                       self.adapters = [(iNetwork.getFriendlyAdapterName(x),x) for x in iNetwork.getConfiguredAdapters()]
+@@ -98,7 +102,12 @@ class NetworkAdapterSelection(Screen,HelpableScreen):
+                       else:
+                               interfacepng = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/network_wireless.png"))
+-              num_configured_if = len(iNetwork.getConfiguredAdapters())
++#             num_configured_if = len(iNetwork.getConfiguredAdapters())
++              num_configured_if=0
++              for x in iNetwork.getConfiguredAdapters():
++                      if x.startswith('eth'):
++                              num_configured_if+=1
++
+               if num_configured_if >= 2:
+                       if default is True:
+                               defaultpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/buttons/button_blue.png"))
+@@ -116,7 +125,12 @@ class NetworkAdapterSelection(Screen,HelpableScreen):
+       def updateList(self):
+               self.list = []
+               default_gw = None
+-              num_configured_if = len(iNetwork.getConfiguredAdapters())
++#             num_configured_if = len(iNetwork.getConfiguredAdapters())
++              num_configured_if=0
++              for x in iNetwork.getConfiguredAdapters():
++                      if x.startswith('eth'):
++                              num_configured_if+=1
++
+               if num_configured_if >= 2:
+                       self["key_yellow"].setText(_("Default"))
+                       self["introduction"].setText(self.defaulttext)
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_remove_dreambox_enigma.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_remove_dreambox_enigma.patch
new file mode 100644 (file)
index 0000000..dd18695
--- /dev/null
@@ -0,0 +1,40 @@
+diff --git a/lib/gdi/font.cpp b/lib/gdi/font.cpp
+index 9e17547..840b1eb 100644
+--- a/lib/gdi/font.cpp
++++ b/lib/gdi/font.cpp
+@@ -487,6 +487,35 @@ int eTextPara::renderString(const char *string, int rflags)
+ {
+       singleLock s(ftlock);
+       
++      if(string && string[0]){
++              char *ptr;
++              ptr = string;  
++              while(1)
++              {
++                      char *enigma = strcasestr(ptr, "enigma");
++                      if(enigma)
++                      {
++                              strncpy(enigma,"dvbapp",6); 
++                              ptr = enigma;
++                      }
++                      else
++                              break;
++              }
++      
++              ptr = string;  
++              while(1)
++              {
++                      char *dreambox = strcasestr(ptr, "dreambox");
++                      if(dreambox)
++                      {
++                              strncpy(dreambox,"setopbox",8); 
++                              ptr = dreambox;
++                      }
++                      else
++                              break;
++              }
++      }
++
+       if (!current_font)
+               return -1;
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_skin.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_skin.patch
new file mode 100644 (file)
index 0000000..78c5f8e
--- /dev/null
@@ -0,0 +1,6753 @@
+diff --git a/configure.ac b/configure.ac
+index f11245a..87be088 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -134,6 +134,16 @@ data/skin_default/menu/Makefile
+ data/skin_default/icons/Makefile
+ data/skin_default/buttons/Makefile
+ data/skin_default/spinner/Makefile
++data/750S/Makefile
++data/750S/menu/Makefile
++data/750S/icons/Makefile
++data/750S/buttons/Makefile
++data/750S/countries/Makefile
++data/Vu_HD/Makefile
++data/Vu_HD/menu/Makefile
++data/Vu_HD/icons/Makefile
++data/Vu_HD/buttons/Makefile
++data/Vu_HD/countries/Makefile
+ include/Makefile
+ lib/Makefile
+ lib/actions/Makefile
+diff --git a/data/750S/Makefile.am b/data/750S/Makefile.am
+new file mode 100644
+index 0000000..7ac9481
+--- /dev/null
++++ b/data/750S/Makefile.am
+@@ -0,0 +1,6 @@
++SUBDIRS = menu icons buttons countries
++
++installdir = $(pkgdatadir)/750S
++
++install_DATA = \
++      *.xml *.png
+diff --git a/data/750S/buttons/Makefile.am b/data/750S/buttons/Makefile.am
+new file mode 100644
+index 0000000..db2e817
+--- /dev/null
++++ b/data/750S/buttons/Makefile.am
+@@ -0,0 +1,6 @@
++AUTOMAKE_OPTIONS = gnu
++
++installdir = $(pkgdatadir)/750S/buttons
++
++install_DATA = \
++      *.png
+diff --git a/data/750S/countries/Makefile.am b/data/750S/countries/Makefile.am
+new file mode 100644
+index 0000000..9c4bf9a
+--- /dev/null
++++ b/data/750S/countries/Makefile.am
+@@ -0,0 +1,6 @@
++AUTOMAKE_OPTIONS = gnu
++
++installdir = $(pkgdatadir)/750S/countries
++
++install_DATA = \
++      *.png
+diff --git a/data/750S/icons/Makefile.am b/data/750S/icons/Makefile.am
+new file mode 100644
+index 0000000..4686688
+--- /dev/null
++++ b/data/750S/icons/Makefile.am
+@@ -0,0 +1,6 @@
++AUTOMAKE_OPTIONS = gnu
++
++installdir = $(pkgdatadir)/750S/icons
++
++install_DATA = \
++      *.png
+diff --git a/data/750S/menu/Makefile.am b/data/750S/menu/Makefile.am
+new file mode 100644
+index 0000000..20f24d9
+--- /dev/null
++++ b/data/750S/menu/Makefile.am
+@@ -0,0 +1,6 @@
++AUTOMAKE_OPTIONS = gnu
++
++installdir = $(pkgdatadir)/750S/menu
++
++install_DATA = \
++      *.png
+diff --git a/data/750S/skin.xml b/data/750S/skin.xml
+new file mode 100644
+index 0000000..356191e
+--- /dev/null
++++ b/data/750S/skin.xml
+@@ -0,0 +1,2841 @@
++<skin>
++      <!-- VU+ skin (skin.xml)  -->
++      <output id="0">
++              <resolution xres="720" yres="576" bpp="32" />
++      </output>
++      <!-- Colors (#AARRGGBB) -->
++      <colors>
++              <color name="white" value="#ffffff" />
++              <color name="black" value="#000000" />
++              <color name="dark" value="#25062748" />
++              <color name="menu" value="#25062748" />
++              <color name="red" value="#f23d21" />
++              <color name="green" value="#389416" />
++              <color name="blue" value="#0064c7" />
++              <color name="yellow" value="#bab329" />
++              <color name="transparent" value="#ffffffff" />
++              <color name="transpBlack" value="#80000000" />
++              <color name="transpWhite" value="#80ffffff" />
++              <color name="background" value="#25e6e6e6" />
++              <color name="foreground" value="#ffffff" />
++      </colors>
++      <!-- Main screen colors (id=0 Framebuffer) -->
++      <windowstyle type="skinned" id="0">
++              <title offset="33,14" font="Regular;20" />
++              <color name="Background" color="#371e1c1a" /> 
++              <color name="LabelForeground" color="#ffffff" />
++              <color name="ListboxBackground" color="#371e1c1a" />
++              <color name="ListboxForeground" color="#ffffff" />
++<!--          <color name="ListboxSelectedBackground" color="#11252525" />    -->
++              <color name="ListboxSelectedBackground" color="#336c5f38" />
++              <color name="ListboxSelectedForeground" color="#ffffff" />
++              <color name="ListboxMarkedBackground" color="#ff0000" />
++              <color name="ListboxMarkedForeground" color="#ffffff" />
++              <color name="ListboxMarkedAndSelectedBackground" color="#800000" />
++              <color name="ListboxMarkedAndSelectedForeground" color="#ffffff" />
++              <color name="WindowTitleForeground" color="#ffffff" />
++              <color name="WindowTitleBackground" color="#25062748" />
++              <!-- Main screen border png's -->
++              <borderset name="bsWindow">
++                      <pixmap pos="bpTopLeft" filename="750S/b_tl.png" />
++                      <pixmap pos="bpTop" filename="750S/b_t.png"  />
++                      <pixmap pos="bpTopRight" filename="750S/b_tr.png" />
++                      <pixmap pos="bpLeft" filename="750S/b_l.png"  />
++                      <pixmap pos="bpRight" filename="750S/b_r.png"  />
++                      <pixmap pos="bpBottomLeft" filename="750S/b_bl.png" />
++                      <pixmap pos="bpBottom" filename="750S/b_b.png"  />
++                      <pixmap pos="bpBottomRight" filename="750S/b_br.png" />
++              </borderset>
++      </windowstyle>
++      <!-- Main screen colors (id=1 LCD) -->
++      <windowstyle type="skinned" id="1">
++              <color name="Background" color="#000000" />
++              <color name="LabelForeground" color="#ffffff" />
++              <color name="ListboxBackground" color="#000000" />
++              <color name="ListboxForeground" color="#ffffff" />
++              <color name="ListboxSelectedBackground" color="#000000" />
++              <color name="ListboxSelectedForeground" color="#ffffff" />
++              <color name="ListboxMarkedBackground" color="#000000" />
++              <color name="ListboxMarkedForeground" color="#ffffff" />
++              <color name="ListboxMarkedAndSelectedBackground" color="#000000" />
++              <color name="ListboxMarkedAndSelectedForeground" color="#ffffff" />
++              <color name="WindowTitleForeground" color="#ffffff" />
++              <color name="WindowTitleBackground" color="#000000" />
++      </windowstyle>
++      <!-- Fonts -->
++      <fonts>
++              <font filename="MyriadPro-Regular.otf" name="Regular" scale="90" />
++              <font filename="lcd.ttf" name="LCD" scale="100" />
++              <font filename="ae_AlMateen.ttf" name="Replacement" scale="90" replacement="1" />
++              <font filename="tuxtxt.ttf" name="Console" scale="100" />
++              <font filename="nmsbd.ttf" name="Subtitlefont" scale="90" />
++      </fonts>
++      <subtitles>
++              <sub name="Subtitle_TTX" font="Subtitlefont;30" shadowColor="#40101010" shadowOffset="3,3" />
++              <sub name="Subtitle_Regular" font="Subtitlefont;30" foregroundColor="#DCDCDC" shadowColor="#40101010" shadowOffset="3,3" />
++              <sub name="Subtitle_Bold" font="Replacement;30" foregroundColor="#DCDCDC" shadowColor="#40101010" shadowOffset="3,3" />
++              <sub name="Subtitle_Italic" font="Subtitlefont;30" foregroundColor="#DCAAAA" shadowColor="#40101010" shadowOffset="3,3" />
++              <!-- omitting foregroundColor attribute will enable auto-assignment of color -->
++      </subtitles>
++      <!-- Main infobar -->
++      <screen name="InfoBar" flags="wfNoBorder" position="0,380" size="720,164" title="InfoBar" backgroundColor="transparent">
++              <!-- Background -->
++              <ePixmap position="40,0" zPosition="-1" size="640,164" pixmap="750S/info-bg.png" />
++              <!-- Signal Quality -->
++              <eLabel text="SNR" position="320,6" size="40,22" font="Regular;18" backgroundColor="#102e59" foregroundColor="#cccccc" shadowColor="#27384f" shadowOffset="-1,-1" transparent="1" />
++              <widget source="session.FrontendStatus" render="Label" position="360,6" size="80,22" font="Regular;18" backgroundColor="#102e59" foregroundColor="#e7e7e7" shadowColor="#27384f" shadowOffset="-1,-1" transparent="1">
++                      <convert type="FrontendInfo">SNRdB</convert>
++              </widget>
++              <!-- Signal Strength -->
++              <eLabel text="AGC" position="440,6" size="40,22" font="Regular;18" backgroundColor="#102e59" foregroundColor="#cccccc" shadowColor="#27384f" shadowOffset="-1,-1" transparent="1" />
++              <widget source="session.FrontendStatus" render="Label" position="485,6" size="40,22" font="Regular;18" backgroundColor="#102e59" foregroundColor="#e7e7e7" shadowColor="#27384f" shadowOffset="-1,-1" transparent="1">
++                      <convert type="FrontendInfo">AGC</convert>
++              </widget>
++              <!-- Bit error rate -->
++<!--          <eLabel text="BER" position="595,6" size="40,22" font="Regular;18" backgroundColor="#102e59" foregroundColor="#cccccc" shadowColor="#27384f" shadowOffset="-1,-1" transparent="1" />
++              <widget source="session.FrontendStatus" render="Label" position="640,6" size="35,22" font="Regular;18" backgroundColor="#102e59" foregroundColor="#e7e7e7" shadowColor="#27384f" shadowOffset="-1,-1" transparent="1">
++                      <convert type="FrontendInfo">BER</convert>
++              </widget>       -->
++              <!-- Service name -->
++              <widget source="session.CurrentService" render="Label" position="130,30" size="360,27" font="Regular;21" valign="center" halign="left" noWrap="1" backgroundColor="#263c59" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1">
++                      <convert type="ServiceName">Name</convert>
++              </widget>
++              <!-- tuners in use? -->
++              <widget source="session.FrontendInfo" render="Pixmap" position="290,9" size="8,9" pixmap="750S/nim_active.png" alphatest="on">
++                      <convert type="FrontendInfo">NUMBER</convert>
++                      <convert type="ValueRange">0,0</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="session.FrontendInfo" render="Pixmap" position="290,9" size="8,9" pixmap="750S/nim_active.png" alphatest="on">
++                      <convert type="FrontendInfo">NUMBER</convert>
++                      <convert type="ValueRange">1,1</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="session.FrontendInfo" render="Pixmap" position="350,32" size="8,9" pixmap="750S/nim_active.png" alphatest="on">
++                      <convert type="FrontendInfo">NUMBER</convert>
++                      <convert type="ValueRange">2,2</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="session.FrontendInfo" render="Pixmap" position="350,45" size="8,9" pixmap="750S/nim_active.png" alphatest="on">
++                      <convert type="FrontendInfo">NUMBER</convert>
++                      <convert type="ValueRange">3,3</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="session.TunerInfo" render="FixedLabel" text="A" position="265,6" size="20,13" font="Regular;18" backgroundColor="#4e5a74" transparent="1">
++                      <convert type="TunerInfo">TunerUseMask</convert>
++                      <convert type="ValueBitTest">1</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="session.TunerInfo" render="FixedLabel" text="B" position="277,6" size="20,13" font="Regular;18" backgroundColor="#4e5a74" transparent="1">
++                      <convert type="TunerInfo">TunerUseMask</convert>
++                      <convert type="ValueBitTest">2</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="session.TunerInfo" render="FixedLabel" text="C" position="265,30" size="20,13" font="Regular;18" backgroundColor="#4e5a74" transparent="1">
++                      <convert type="TunerInfo">TunerUseMask</convert>
++                      <convert type="ValueBitTest">4</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="session.TunerInfo" render="FixedLabel" text="D" position="265,43" size="20,13" font="Regular;18" backgroundColor="#4e5a74" transparent="1">
++                      <convert type="TunerInfo">TunerUseMask</convert>
++                      <convert type="ValueBitTest">8</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <ePixmap pixmap="750S/icons/clock.png" position="568,4" zPosition="1" size="16,16" alphatest="on" />
++              <widget source="global.CurrentTime" render="Label" position="580,5" zPosition="1" size="50,20" font="Regular;19" halign="right">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <!--
++              <widget source="global.CurrentTime" render="Label" position="633,6" zPosition="1" size="26,18" font="Regular;16" valign="top">
++                      <convert type="ClockToText">Format:%S</convert>
++              </widget>       -->
++              <!-- Crypt icon (encrypted service?) -->
++              <ePixmap position="559,36" zPosition="0" size="70,15" pixmap="750S/icons/icons_off.png"  alphatest="on" />
++              <widget source="session.CurrentService" render="Pixmap" pixmap="750S/icons/icon_crypt.png" position="559,36" zPosition="1" size="11,15" alphatest="on">
++                      <convert type="ServiceInfo">IsCrypted</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <!-- Teletext icon (is teletext available?) -->
++              <widget source="session.CurrentService" render="Pixmap" pixmap="750S/icons/icon_txt.png" position="576,36" zPosition="1" size="18,15" alphatest="on">
++                      <convert type="ServiceInfo">HasTelext</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <!-- Videoformat icon (16:9?) -->
++              <widget source="session.CurrentService" render="Pixmap" pixmap="750S/icons/icon_format.png" position="600,36" zPosition="1" size="28,15" alphatest="on">
++                      <convert type="ServiceInfo">IsWidescreen</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <!-- Audio icon (is there multichannel audio?) -->
++              <widget source="session.CurrentService" render="Pixmap" pixmap="750S/icons/icon_dolby.png" position="634,36" zPosition="1" size="25,15" alphatest="on">
++                      <convert type="ServiceInfo">IsMultichannel</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <!-- Progressbar (current event duration)-->
++              <ePixmap pixmap="750S/progress_bg.png" position="60,77" size="84,7" transparent="1" alphatest="on" />
++              <widget source="session.Event_Now" render="Progress" pixmap="750S/progress_small.png" position="62,78" zPosition="1" size="80,5" transparent="1">
++                      <convert type="EventTime">Progress</convert>
++              </widget>
++              <!-- Blinking pixmap (recording in progress?) -->
++              <ePixmap pixmap="750S/icons/icon_rec_off.png" position="525,36" size="34,21" alphatest="on" />
++              <widget source="session.RecordState" render="Pixmap" pixmap="750S/icons/icon_rec.png" position="525,36" zPosition="1" size="34,21" alphatest="on" >
++                      <convert type="ConditionalShowHide">Blink</convert>
++              </widget>
++              <!-- Event (now) -->
++              <ePixmap pixmap="750S/nim_active.png" position="182,78" size="15,10" alphatest="on" />
++              <widget source="session.Event_Now" render="Label" position="205,73" size="60,24" font="Regular;20" backgroundColor="#34406f" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1">
++                      <convert type="EventTime">StartTime</convert>
++                      <convert type="ClockToText">Default</convert>
++              </widget>
++              <widget source="session.Event_Now" render="Label" position="265,73" size="310,24" font="Regular;20" noWrap="1" backgroundColor="#34406f" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1">
++                      <convert type="EventName">Name</convert>
++              </widget>
++              <widget source="session.Event_Now" render="Label" position="575,73" size="85,24" font="Regular;20" backgroundColor="#34406f" shadowColor="#1d354c" shadowOffset="-1,-1" halign="right" transparent="1">
++                      <convert type="EventTime">Remaining</convert>
++                      <convert type="RemainingToText">InMinutes</convert>
++              </widget>
++              <!-- Event (next) -->
++              <widget source="session.Event_Next" render="Label" position="205,97" size="60,24" font="Regular;20" backgroundColor="#071f38" foregroundColor="#c3c3c9" transparent="1">
++                      <convert type="EventTime">StartTime</convert>
++                      <convert type="ClockToText">Default</convert>
++              </widget>
++              <widget source="session.Event_Next" render="Label" position="265,97" size="310,24" font="Regular;20" noWrap="1" backgroundColor="#071f38" foregroundColor="#c3c3c9" transparent="1">
++                      <convert type="EventName">Name</convert>
++              </widget>
++              <widget source="session.Event_Next" render="Label" position="575,97" size="85,24" font="Regular;20" backgroundColor="#071f38" foregroundColor="#c3c3c9" halign="right" transparent="1">
++                      <convert type="EventTime">Duration</convert>
++                      <convert type="ClockToText">InMinutes</convert>
++              </widget>
++              <!-- Red button (is recording possible?) -->
++              <ePixmap pixmap="750S/buttons/button_red_off.png" position="60,132" size="22,22" alphatest="on" />
++              <widget source="RecordingPossible" render="Pixmap" pixmap="750S/buttons/button_red.png" position="60,132" zPosition="1" size="22,22" alphatest="on">
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="ShowRecordOnRed" render="FixedLabel" text="Record" position="90,132" zPosition="1" size="80,22" font="Regular;20" foregroundColor="#7f848d" backgroundColor="#182946" transparent="1">
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="RecordingPossible" render="FixedLabel" text="Record" position="90,132" zPosition="1" size="80,22" font="Regular;20" backgroundColor="#182946" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1">
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <!-- Green button (is subservices available?) -->
++              <ePixmap pixmap="750S/buttons/button_green_off.png" position="220,132" size="22,22" alphatest="on" />
++              <widget source="session.CurrentService" render="Pixmap" pixmap="750S/buttons/button_green.png" position="220,132" zPosition="1" size="22,22" alphatest="on">
++                      <convert type="ServiceInfo">SubservicesAvailable</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <eLabel text="Subservices" position="260,132" size="100,22" font="Regular;20" foregroundColor="#7f848d" backgroundColor="#182946" transparent="1" />
++              <widget source="session.CurrentService" render="FixedLabel" text="Subservices" position="250,132" zPosition="1" size="100,22" font="Regular;20" backgroundColor="#182946" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1">
++                      <convert type="ServiceInfo">SubservicesAvailable</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <!-- Yellow button (is timeshift possible?) -->
++              <ePixmap pixmap="750S/buttons/button_yellow_off.png" position="380,132" size="22,22" alphatest="on" />
++              <widget source="TimeshiftPossible" render="Pixmap" pixmap="750S/buttons/button_yellow.png" position="380,132" zPosition="1" size="22,22" alphatest="on">
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="ShowTimeshiftOnYellow" render="FixedLabel" text="Timeshift" position="410,132" zPosition="1" size="85,22" font="Regular;20" foregroundColor="#7f848d" backgroundColor="#182946" shadowOffset="-1,-1" transparent="1">
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="TimeshiftPossible" render="FixedLabel" text="Timeshift" position="410,132" zPosition="1" size="85,22" font="Regular;20" backgroundColor="#182946" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1">
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              
++              <!-- Yellow button (used for audio on boxes with new rc?) -->
++              <widget source="ShowAudioOnYellow" render="Pixmap" pixmap="750S/buttons/button_yellow.png" position="380,132" zPosition="1" size="22,22" alphatest="on">
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="ShowAudioOnYellow" render="FixedLabel" text="Audio" position="410,132" zPosition="1" size="85,22" font="Regular;20" backgroundColor="#182946" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1">
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <!-- Blue button (is extensions available?) -->
++              <ePixmap pixmap="750S/buttons/button_blue_off.png" position="540,132" size="22,22" alphatest="on" />
++              <widget source="ExtensionsAvailable" render="Pixmap" pixmap="750S/buttons/button_blue.png" position="540,132" zPosition="1" size="22,22" alphatest="on">
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <eLabel text="Extensions" position="570,132" size="110,22" font="Regular;20" foregroundColor="#7f848d" backgroundColor="#182946" transparent="1" />
++              <widget source="ExtensionsAvailable" render="FixedLabel" text="Extensions" position="570,132" zPosition="1" size="110,22" font="Regular;20" backgroundColor="#182946" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1">
++                      <convert type="ConditionalShowHide" />
++              </widget>
++      </screen>
++      <!-- Main menu -->
++      <screen name="menu_mainmenu" position="0,0" size="720,576" title="Main menu" flags="wfNoBorder" backgroundColor="transparent"> 
++              <ePixmap pixmap="750S/bg_main.png" zPosition="-1" position="94,85" size="530,415" alphatest="on"  transparent="1" />
++              <ePixmap pixmap="750S/icons/icon_mainmenu.png" position="110,100" size="44,44" alphatest="blend"  transparent="1" />
++              <eLabel text="Main menu" position="170,113" size="200,30" font="Regular;30" foregroundColor="#e1e1e1" backgroundColor="#371e1c1a" transparent="1" />
++              <widget source="menu" render="Listbox" selectionPixmap="750S/buttons/Selected_bar_250x32px.png" backgroundColorSelected="#371e1c1a" position="130,176" size="250,315"  transparent="1" backgroundColor="#371e1c1a" scrollbarMode="showNever">
++                      <convert type="TemplatedMultiContent">
++                              {"template": [  MultiContentEntryText(pos = (20, 5), size = (230, 30), flags = RT_HALIGN_LEFT, text = 0) ],
++                               "fonts": [gFont("Regular", 25)],
++                               "itemHeight": 39
++                              }
++                      </convert>
++              </widget>
++              <eLabel text=" " position="130,210" zPosition="-1" size="250,3" backgroundColor="#021a1816" />
++              <eLabel text=" " position="130,249" zPosition="-1" size="250,3" backgroundColor="#021a1816" />
++              <eLabel text=" " position="130,288" zPosition="-1" size="250,3" backgroundColor="#021a1816" />
++              <eLabel text=" " position="130,327" zPosition="-1" size="250,3" backgroundColor="#021a1816" />
++              <eLabel text=" " position="130,366" zPosition="-1" size="250,3" backgroundColor="#021a1816" />
++              <eLabel text=" " position="130,405" zPosition="-1" size="250,3" backgroundColor="#021a1816" />
++              <eLabel text=" " position="130,444" zPosition="-1" size="250,3" backgroundColor="#021a1816" />
++              <eLabel text=" " position="130,483" zPosition="-1" size="250,3" backgroundColor="#021a1816" />
++
++              <widget source="menu" render="Pixmap" pixmap="750S/menu/subtitles.png" position="400,190" size="155,140" alphatest="blend">
++                      <convert type="MenuEntryCompare">subtitle_selection</convert>
++                      <convert type="ConditionalShowHide"/>
++              </widget>
++              <widget source="menu" render="Pixmap" pixmap="750S/menu/setup.png" position="400,190" size="155,140" alphatest="blend">
++                      <convert type="MenuEntryCompare">setup_selection</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="menu" render="Pixmap" pixmap="750S/menu/shutdown.png" position="400,190" size="155,140" alphatest="blend">
++                      <convert type="MenuEntryCompare">standby_restart_list</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="menu" render="Pixmap" pixmap="750S/menu/plugins.png" position="400,190" size="155,140" alphatest="blend">
++                      <convert type="MenuEntryCompare">plugin_selection</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="menu" render="Pixmap" pixmap="750S/menu/information.png" position="400,190" size="155,140" alphatest="blend">
++                      <convert type="MenuEntryCompare">info_screen</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="menu" render="Pixmap" pixmap="750S/menu/scart.png" position="400,190" size="155,140" alphatest="blend">
++                      <convert type="MenuEntryCompare">scart_switch</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="menu" render="Pixmap" pixmap="750S/menu/timer.png" position="400,190" size="155,140" alphatest="blend">
++                      <convert type="MenuEntryCompare">timer_edit</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="menu" render="Pixmap" pixmap="750S/menu/media_player.png" position="400,190" size="155,140" alphatest="blend">
++                      <convert type="MenuEntryCompare">media_player</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="menu" render="FixedLabel" text="You can view available subtitles from current event." position="410,324" zPosition="1" size="190,130" font="Regular;19" backgroundColor="#182946" foregroundColor="#998462" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1">
++                      <convert type="MenuEntryCompare">subtitle_selection</convert>
++                      <convert type="ConditionalShowHide"/>
++              </widget>
++              <widget source="menu" render="FixedLabel" text="-Service Searching" position="410,324" zPosition="1" size="195,22" font="Regular;19" backgroundColor="#182946" foregroundColor="#998462" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1">
++                      <convert type="MenuEntryCompare">setup_selection</convert>
++                      <convert type="ConditionalShowHide"/>
++              </widget> 
++              <widget source="menu" render="FixedLabel" text="-System" position="410,349" zPosition="1" size="195,22" font="Regular;19" backgroundColor="#182946" foregroundColor="#998462" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1">
++                      <convert type="MenuEntryCompare">setup_selection</convert>
++                      <convert type="ConditionalShowHide"/>
++              </widget> 
++              <widget source="menu" render="FixedLabel" text="-Parental control" position="410,374" zPosition="1" size="195,22" font="Regular;19" backgroundColor="#182946" foregroundColor="#998462" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1">
++                      <convert type="MenuEntryCompare">setup_selection</convert>
++                      <convert type="ConditionalShowHide"/>
++              </widget> 
++              <widget source="menu" render="FixedLabel" text="-Factory reset" position="410,399" zPosition="1" size="195,22" font="Regular;19" backgroundColor="#182946" foregroundColor="#998462" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1">
++                      <convert type="MenuEntryCompare">setup_selection</convert>
++                      <convert type="ConditionalShowHide"/>
++              </widget> 
++              <widget source="menu" render="FixedLabel" text="-Standby" position="410,324" zPosition="1" size="195,22" font="Regular;19" backgroundColor="#182946" foregroundColor="#998462" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1">
++                      <convert type="MenuEntryCompare">standby_restart_list</convert>
++                      <convert type="ConditionalShowHide"/>
++              </widget>
++              <widget source="menu" render="FixedLabel" text="-Restart" position="410,349" zPosition="1" size="195,22" font="Regular;19" backgroundColor="#182946" foregroundColor="#998462" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1">
++                      <convert type="MenuEntryCompare">standby_restart_list</convert>
++                      <convert type="ConditionalShowHide"/>
++              </widget>
++              <widget source="menu" render="FixedLabel" text="-Deep Standby" position="410,374" zPosition="1" size="195,22" font="Regular;19" backgroundColor="#182946" foregroundColor="#998462" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1">
++                      <convert type="MenuEntryCompare">standby_restart_list</convert>
++                      <convert type="ConditionalShowHide"/>
++              </widget>
++              <widget source="menu" render="FixedLabel" text="This show the list of plug-ins you have installed." position="410,324" zPosition="1" size="200,120" font="Regular;19" backgroundColor="#182946" foregroundColor="#998462" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1">
++                      <convert type="MenuEntryCompare">plugin_selection</convert>
++                      <convert type="ConditionalShowHide"/>
++              </widget> 
++              <widget source="menu" render="FixedLabel" text="Your software version, memory usages and other Box information can be found from here." position="410,324" zPosition="1" size="200,120" font="Regular;19" backgroundColor="#182946" foregroundColor="#998462" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1">
++                      <convert type="MenuEntryCompare">info_screen</convert>
++                      <convert type="ConditionalShowHide"/>
++              </widget>
++              <widget source="menu" render="FixedLabel" text="-Switch to VCR scart" position="410,324" zPosition="1" size="195,22" font="Regular;19" backgroundColor="#182946" foregroundColor="#998462" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1">
++                      <convert type="MenuEntryCompare">scart_switch</convert>
++                      <convert type="ConditionalShowHide"/>
++              </widget>
++              <widget source="menu" render="FixedLabel" text="You can record or schedule to watch an event with this Timer function." position="410,324" zPosition="1" size="200,130" font="Regular;19" backgroundColor="#182946" foregroundColor="#998462" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1">
++                      <convert type="MenuEntryCompare">timer_edit</convert>
++                      <convert type="ConditionalShowHide"/>
++              </widget>
++              <widget source="menu" render="FixedLabel" text="This box can play various of multimedia file formats." position="410,324" zPosition="1" size="200,130" font="Regular;19" backgroundColor="#182946" foregroundColor="#998462" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1">
++                      <convert type="MenuEntryCompare">media_player</convert>
++                      <convert type="ConditionalShowHide"/>
++              </widget>
++<!--          
++              <widget source="menu" render="Pixmap" pixmap="750S/menu/dvd_player.png" position="400,190" size="218,202" alphatest="blend">
++                      <convert type="MenuEntryCompare">dvd_player</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++-->           
++      </screen>
++      <!-- Movieplayer infobar -->
++      <screen name="MoviePlayer" flags="wfNoBorder" position="0,380" size="720,164" title="InfoBar" backgroundColor="transparent">
++              <!-- Background -->
++              <ePixmap position="40,0" pixmap="750S/info-bg_mp.png" zPosition="-1" size="640,164" />
++              <!-- colorbuttons -->
++              <ePixmap position="275,120" pixmap="750S/icons/mp_buttons.png" size="169,30" alphatest="blend" />
++              <!-- Servicename -->
++              <widget source="session.CurrentService" render="Label" position="65,30" size="475,30" font="Regular;28" backgroundColor="#263c59" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1">
++                      <convert type="ServiceName">Name</convert>
++              </widget>
++              <!-- movie length -->
++              <widget source="session.CurrentService" render="Label" position="565,30" size="90,24" font="Regular;20" halign="right" backgroundColor="#4e5a74" transparent="1">
++                      <convert type="ServicePosition">Length</convert>
++              </widget>
++              <!-- Elapsed time -->
++              <widget source="session.CurrentService" render="Label" position="35,75" size="100,24" font="Regular;20" halign="center" valign="center" backgroundColor="#06224f" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1">
++                      <convert type="ServicePosition">Position</convert>
++              </widget>
++              <!-- Progressbar (movie position)-->
++              <widget source="session.CurrentService" render="PositionGauge" position="130,80" size="460,20" zPosition="2" pointer="750S/position_pointer.png:460,0" transparent="1">
++                      <convert type="ServicePosition">Gauge</convert>
++              </widget>
++              <!-- Remaining time -->
++              <widget source="session.CurrentService" render="Label" position="580,75" size="100,20" font="Regular;20" halign="center" valign="center" backgroundColor="#06224f" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1">
++                      <convert type="ServicePosition">Remaining</convert>
++              </widget>
++      </screen>
++
++      <!-- 750S skin (750S.xml)  -->
++      <!-- About screen -->
++      <screen name="About" position="0,0" size="720,576" title="Serviceinfo" flags="wfNoBorder" backgroundColor="transparent">
++              <ePixmap pixmap="750S/bg_main.png" zPosition="-1" position="90,70" size="530,415" alphatest="on"  transparent="1" />
++              <ePixmap pixmap="750S/icons/icon_mainmenu.png" position="110,85" size="44,44" alphatest="blend"  transparent="1" />
++              <eLabel text="Main menu > Information > " position="160,105" size="230,30" font="Regular;20" foregroundColor="#676767" backgroundColor="#371e1c1a" transparent="1" />
++              <eLabel text="About" position="380,100" size="200,30" font="Regular;30" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" />
++              <widget source="EnigmaVersion" render="Label" position="110,150" size="380,20" font="Regular;20" />
++              <widget source="ImageVersion" render="Label" position="110,180" size="380,20" font="Regular;20" />
++              <widget source="FPVersion" render="Label" position="110,210" size="380,20" font="Regular;20" />
++              <widget source="TunerHeader" render="Label" position="110,240" size="380,20" font="Regular;20" />
++              <widget source="Tuner0" render="Label" position="110,265" size="400,20" font="Regular;20" />
++              <widget source="Tuner1" render="Label" position="110,285" size="400,20" font="Regular;20" />
++              <widget source="Tuner2" render="Label" position="110,305" size="400,20" font="Regular;20" />
++              <widget source="Tuner3" render="Label" position="110,325" size="400,20" font="Regular;20" />
++              <widget source="HDDHeader" render="Label" position="110,355" size="380,20" font="Regular;20" />
++              <widget source="hddA" render="Label" position="110,380" size="380,40" font="Regular;20" />
++      </screen>
++      <!-- Adapter setup -->
++      <screen name="AdapterSetup" position="110,115" size="500,415" title="Network Setup" >
++              <ePixmap pixmap="750S/buttons/red.png" position="0,375" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/blue.png" position="360,375" size="140,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="20,375" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_blue" render="Label" position="380,375" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
++
++              <widget name="config" position="10,10" transparent="1" backgroundColor="#371e1c1a" size="480,125" scrollbarMode="showOnDemand" />       
++              <ePixmap pixmap="750S/div-h.png" position="0,140" zPosition="1" size="550,2" />
++              <widget source="DNS1text" render="Label" position="10,145" size="190,21" zPosition="1" font="Regular;19" />
++              <widget source="DNS2text" render="Label" position="10,175" size="190,21" zPosition="1" font="Regular;19" />
++              <widget source="DNS1" render="Label" position="380,145" size="120,21" zPosition="1" font="Regular;17" />
++              <widget source="DNS2" render="Label" position="380,175" size="120,21" zPosition="1" font="Regular;17" />
++              <ePixmap pixmap="750S/div-h.png" position="0,200" zPosition="1" size="550,2" />         
++              
++              <widget source="introduction" render="Label" position="10,205" size="440,20" font="Regular;19" halign="center" />
++              <widget source="IPtext" render="Label" position="100,240" size="190,21" zPosition="1" font="Regular;19" />
++              <widget source="Netmasktext" render="Label" position="100,265" size="190,21" zPosition="1" font="Regular;19" />
++              <widget source="Gatewaytext" render="Label" position="100,290" size="190,21" zPosition="1" font="Regular;19" />
++              <widget source="IP" render="Label" position="300,240" size="440,21" zPosition="1" font="Regular;19" />
++              <widget source="Mask" render="Label" position="300,265" size="440,21" zPosition="1" font="Regular;19" />
++              <widget source="Gateway" render="Label" position="300,290" size="440,21" zPosition="1" font="Regular;19" />
++              
++              <widget source="Adaptertext" render="Label" position="20,325" size="100,21" zPosition="10" font="Regular;19" transparent="1" />
++              <widget source="Adapter" render="Label" position="110,325" size="300,21" zPosition="10" font="Regular;19" transparent="1" />
++              <widget source="introduction2" render="Label" position="110,355" size="300,20" zPosition="10" font="Regular;21" halign="center" transparent="1" />
++              <widget name="VKeyIcon" pixmap="750S/buttons/key_text.png" position="10,380" zPosition="10" size="35,25" transparent="1" alphatest="on" />
++              <widget name="HelpWindow" pixmap="750S/vkey_icon.png" position="160,315" zPosition="1" size="1,1" transparent="1" alphatest="on" />
++      </screen>
++      <screen name="AdapterSetupConfiguration" position="110,120" size="500,400" title="Network Configuration..." >
++              <ePixmap pixmap="750S/buttons/red.png" position="10,360" size="140,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="30,360" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <ePixmap pixmap="750S/div-h.png" position="0,350" zPosition="1" size="560,2" />
++              <ePixmap pixmap="750S/border_menu_a.png" position="10,10" zPosition="1" size="250,300" transparent="1" alphatest="on" />
++              <widget name="menulist" position="20,20" size="230,260" selectionPixmap="750S/buttons/Selected_bar_230x23px.png" transparent="1" backgroundColor="#371e1c1a" zPosition="10" scrollbarMode="showOnDemand" />
++              <widget source="description" render="Label" position="305,10" size="195,300" font="Regular;19" halign="center" valign="center" />
++              <widget source="IFtext" render="Label" position="20,325" size="100,21" zPosition="10" font="Regular;19" transparent="1" />
++              <widget source="IF" render="Label" position="110,325" size="300,21" zPosition="10" font="Regular;19" transparent="1" />
++              <widget source="Statustext" render="Label" position="340,325" size="115,21" zPosition="10" font="Regular;19" transparent="1"/>
++              <widget name="statuspic" pixmaps="750S/buttons/button_green.png,750S/buttons/button_green_off.png" position="460,322" zPosition="10" size="22,22" transparent="1" alphatest="on"/>
++      </screen>
++      <!-- Audio selection -->
++      <screen name="AudioSelection" position="center,center" size="560,330" title="Audio">
++              <widget name="config" position="50,10" size="500,110" scrollbarMode="showOnDemand" />
++              
++              <widget source="key_red" render="Pixmap" pixmap="750S/buttons/button_red.png" position="10,10" size="22,22" alphatest="on">
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="key_green" render="Pixmap" pixmap="750S/buttons/button_green.png" position="10,35" size="22,22" alphatest="on">
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="key_yellow" render="Pixmap" pixmap="750S/buttons/button_yellow.png" position="10,60" size="22,22" alphatest="on">
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="key_blue" render="Pixmap" pixmap="750S/buttons/button_blue.png" position="10,85" size="22,22" alphatest="on">
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              
++              <ePixmap pixmap="skin_default/div-h.png" position="10,112" zPosition="10" size="540,2" />
++
++              <widget source="streams" render="Listbox" scrollbarMode="showOnDemand" position="10,120" size="540,200" zPosition="3" transparent="1" >
++                      <convert type="TemplatedMultiContent">
++                              {"templates":
++                                      {"default": (25, [ 
++                                              MultiContentEntryText(pos = (0, 0),   size = (35, 25),  font = 0, flags = RT_HALIGN_LEFT,  text = 1), # key,
++                                              MultiContentEntryText(pos = (40, 0),  size = (60, 25),  font = 0, flags = RT_HALIGN_LEFT,  text = 2), # number,
++                                              MultiContentEntryText(pos = (110, 0), size = (120, 25), font = 0, flags = RT_HALIGN_LEFT,  text = 3), # description,
++                                              MultiContentEntryText(pos = (240, 0), size = (200, 25), font = 0, flags = RT_HALIGN_LEFT,  text = 4), # language,
++                                              MultiContentEntryText(pos = (450, 4), size = (90, 25),  font = 1, flags = RT_HALIGN_RIGHT, text = 5), # selection,
++                                      ], True, "showNever"),
++                                      "notselected": (25, [ 
++                                              MultiContentEntryText(pos = (0, 0),   size = (35, 25),  font = 0, flags = RT_HALIGN_LEFT,  text = 1), # key,
++                                              MultiContentEntryText(pos = (40, 0),  size = (60, 25),  font = 0, flags = RT_HALIGN_LEFT,  text = 2), # number,
++                                              MultiContentEntryText(pos = (110, 0), size = (120, 25), font = 0, flags = RT_HALIGN_LEFT,  text = 3), # description,
++                                              MultiContentEntryText(pos = (240, 0), size = (200, 25), font = 0, flags = RT_HALIGN_LEFT,  text = 4), # language,
++                                              MultiContentEntryText(pos = (450, 4), size = (90, 25),  font = 1, flags = RT_HALIGN_RIGHT, text = 5), # selection,
++                                      ], False, "showNever")
++                                      },
++                              "fonts": [gFont("Regular", 20), gFont("Regular", 16)],
++                              "itemHeight": 25
++                              }
++                      </convert>
++              </widget>
++      </screen>
++      <!-- Bouquet selector -->
++      <screen name="BouquetSelector" position="210,160" size="300,240" title="Choose bouquet">
++              <widget name="menu" position="10,10" transparent="1" size="290,225" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Channel context menu -->
++      <screen name="ChannelContextMenu" position="210,163" size="300,255" title="Channellist menu">
++              <widget name="menu" position="10,10" transparent="1" size="290,230" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Channel selection - TV -->
++      <screen name="ChannelSelection" position="0, 0" size="720,576" flags="wfNoBorder" backgroundColor="transparent">
++              <ePixmap pixmap="750S/bg_list.png" position="60,25" size="600,520" zPosition="-1" alphatest="on"  transparent="1" />
++              <ePixmap pixmap="750S/icons/icon_channelselection_tv.png" position="90,35" size="44,44" alphatest="blend"  transparent="1" />
++              <widget name="etitle" position="140,50" size="450,30" font="Regular;30" halign="left" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" />
++              <ePixmap pixmap="750S/buttons/red.png" position="80,125" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="220,125" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/yellow.png" position="360,125" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/blue.png" position="500,125" size="136,40" alphatest="on" />
++              <widget name="key_red" position="100,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget name="key_green" position="240,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget name="key_yellow" position="380,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
++              <widget name="key_blue" position="520,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
++              <widget name="list" position="80,185" size="555,228"  scrollbarMode="showOnDemand" transparent="1" />
++              <widget source="ServiceEvent" render="Label" position="95,422" zPosition="1" size="460,20" font="Regular;19" noWrap="1">
++                      <convert type="EventName">Name</convert>
++              </widget>
++              <ePixmap pixmap="750S/icons/clock.png" position="565,422" zPosition="1" size="16,16" alphatest="on" />
++              <widget source="global.CurrentTime" render="Label" position="585,422" zPosition="1" size="50,20" font="Regular;19" halign="right">
++                      <convert type="ClockToText"></convert>
++              </widget>
++              <widget source="ServiceEvent" render="Label" position="295,442" zPosition="1" size="340,20" font="Regular;19" halign="right" noWrap="1">
++                      <convert type="ServiceName">Name</convert>
++              </widget>
++              <widget source="ServiceEvent" render="Label" position="95,442" zPosition="1" size="50,22" font="Regular;19">
++                      <convert type="EventTime">StartTime</convert>
++                      <convert type="ClockToText"></convert>
++              </widget>
++              <widget source="ServiceEvent" render="Label" position="145,442" zPosition="1" size="70,22" font="Regular;19">
++                      <convert type="EventTime">EndTime</convert>
++                      <convert type="ClockToText">Format:- %H:%M</convert>
++              </widget>
++              <widget source="ServiceEvent" render="Progress" position="210,445" zPosition="1" pixmap="750S/progress_medium.png" size="80,11" borderWidth="2" borderColor="#cccccc">
++                      <convert type="EventTime">Progress</convert>
++              </widget>
++              <widget source="ServiceEvent" render="Label" position="95,463" zPosition="1" size="540,56" font="Regular;18" foregroundColor="#cccccc">
++                      <convert type="EventName">ExtendedDescription</convert>
++              </widget>
++      </screen>
++      <!-- Channel selection - Radio -->
++      <screen name="ChannelSelectionRadio" position="0,0" size="720,576" flags="wfNoBorder" backgroundColor="transparent">    
++              <ePixmap pixmap="750S/bg_list.png" position="60,25" size="600,520" zPosition="-1" alphatest="on" />
++              <ePixmap pixmap="750S/icons/icon_channelselection_radio.png" position="90,35" size="44,44" alphatest="blend"  transparent="1" />
++              <widget name="etitle" position="140,50" size="450,30" font="Regular;30" halign="left" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" />
++              <ePixmap pixmap="750S/buttons/red.png" position="80,125" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="220,125" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/yellow.png" position="360,125" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/blue.png" position="500,125" size="136,40" alphatest="on" />
++              <widget name="key_red" position="100,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget name="key_green" position="240,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget name="key_yellow" position="380,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
++              <widget name="key_blue" position="520,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
++              <widget name="list" position="80,185" size="555,200" transparent="1" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Choice box -->
++      <screen name="ChoiceBox" position="150,120" size="550,400" title="Input">
++              <widget name="text" position="10,10" size="550,25" font="Regular;20" />
++              <widget name="list" position="0,50" size="550,335" transparent="1" scrollbarMode="showOnDemand" />
++              <applet type="onLayoutFinish">
++# this should be factored out into some helper code, but currently demonstrates applets.
++from enigma import eSize, ePoint
++
++orgwidth = self.instance.size().width()
++orgpos = self.instance.position()
++textsize = self[&quot;text&quot;].getSize()
++
++# y size still must be fixed in font stuff...
++textsize = (textsize[0] + 50, textsize[1] + 50)
++count = len(self.list)
++if count &gt; 10:
++      count = 10
++offset = 25 * count
++wsizex = textsize[0] + 60
++wsizey = textsize[1] + offset
++
++if (520 &gt; wsizex):
++      wsizex = 520
++wsize = (wsizex, wsizey)
++
++# resize
++self.instance.resize(eSize(*wsize))
++
++# resize label
++self[&quot;text&quot;].instance.resize(eSize(*textsize))
++
++# move list
++listsize = (wsizex, 25 * count)
++self[&quot;list&quot;].instance.move(ePoint(0, textsize[1]))
++self[&quot;list&quot;].instance.resize(eSize(*listsize))
++
++# center window
++newwidth = wsize[0]
++self.instance.move(ePoint((720-wsizex)/2, (576-wsizey)/(count &gt; 7 and 2 or 3)))
++
++              </applet>
++      </screen>
++      <!-- Common interface -->
++      <screen name="MMIDialog" position="135,153" size="450,270">
++              <widget name="title" position="10,10" size="430,25" font="Regular;23" />
++              <widget name="subtitle" position="10,35" size="430,25" font="Regular;23" />
++              <widget name="entries" position="10,70" size="430,150" scrollbarMode="showOnDemand" />
++              <widget name="bottom" position="10,230" size="430,25" font="Regular;23" />
++      </screen>
++      <!-- Common interface - selection -->
++      <screen name="CiSelection" position="140,226" size="440,160" title="Common Interface">
++              <widget name="text" position="10,10" size="430,25" font="Regular;23" />
++              <widget name="entries" position="10,55" size="420,100" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Console -->
++      <screen name="Console" position="110,120" size="500,400" title="Command execution...">
++              <widget name="text" position="10,10" size="480,380" font="Console;14" />
++      </screen>
++      <!-- Clock display -->
++      <screen name="clockDisplay" position="300,120" size="300,300">
++              <widget name="okbutton" position="10,10" size="280,40" />
++              <widget name="title" position="10,120" size="280,50" />
++              <widget name="theClock" position="10,60" size="280,50" />
++      </screen>
++      <!-- Config OSD -->
++      <screen name="configOSD" position="130,120" size="460,350" title="OSD Settings">
++              <widget name="okbutton" position="20,270" size="205,40" />
++              <widget name="txt_alpha" position="20,20" size="110,20" />
++              <widget name="sld_alpha" position="150,20" size="290,20" />
++              <widget name="txt_brightness" position="20,60" size="120,20" />
++              <widget name="sld_brightness" position="150,20" size="290,20" />
++              <widget name="txt_gamma" position="20,100" size="120,20" />
++              <widget name="sld_gamma" position="150,100" size="290,20" />
++      </screen>
++      <!-- Config test -->
++      <screen name="configTest" position="300,100" size="300,300" title="config menu">
++              <widget name="config" position="10,30" size="420,220" />
++      </screen>
++      <!-- Default wizard -->
++      <screen name="DefaultWizard" position="0,0" size="720,576" title="Welcome..." flags="wfNoBorder" >
++                      <widget name="text" position="153,50" size="340,270" font="Regular;23" />
++                      <widget source="list" render="Listbox" selectionPixmap="750S/buttons/Selected_bar_440x23px.png" backgroundColor="#371e1c1a" position="50,300" size="440,200" scrollbarMode="showOnDemand" >
++                              <convert type="StringList" />
++                      </widget>
++                      <ePixmap pixmap="750S/buttons/button_red.png" position="40,227" size="22,22" alphatest="on" />
++                      <widget name="languagetext" position="66,230" size="95,30" font="Regular;18" />
++                      <widget name="config" backgroundColor="#371e1c1a" position="50,300" zPosition="1" size="440,200" transparent="1" scrollbarMode="showOnDemand" />            
++                      <widget name="rc" pixmap="750S/rc.png" position="520,600" zPosition="10" size="154,471" transparent="1" alphatest="blend"/>
++                      <widget name="arrowdown" pixmap="750S/arrowdown.png" position="-100,-150" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++                      <widget name="arrowup" pixmap="750S/arrowup.png" position="-100,-150" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++                      <widget name="arrowup2" pixmap="750S/arrowup.png" position="-100,-150" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++      </screen>
++      <screen name="DefaultSatLists" position="0,0" size="720,576" title="Welcome..." flags="wfNoBorder" >
++                      <widget name="text" position="153,50" size="340,270" font="Regular;23" />
++                      <widget source="list" render="Listbox" transparent="1" position="50,300" size="440,200" scrollbarMode="showOnDemand" >
++                              <convert type="StringList" />
++                      </widget>
++                      <ePixmap pixmap="750S/buttons/button_red.png" position="40,227" size="22,22" alphatest="on" />
++                      <widget name="languagetext" position="66,230" size="95,30" font="Regular;18" />
++                      <widget name="config" position="50,300" zPosition="1" size="440,200" transparent="1" scrollbarMode="showOnDemand" />            
++                      <widget name="rc" pixmap="750S/rc.png" position="520,600" zPosition="10" size="154,471" transparent="1" alphatest="blend"/>
++                      <widget name="arrowdown" pixmap="750S/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++                      <widget name="arrowup" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++                      <widget name="arrowup2" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++      </screen>
++      <screen name="DreamPackageWizard" position="0,0" size="720,576" title="Welcome..." flags="wfNoBorder" >
++                      <widget name="text" position="153,50" size="340,270" font="Regular;23" />
++                      <widget source="list" render="Listbox" position="50,300" size="440,200" scrollbarMode="showOnDemand" >
++                              <convert type="StringList" />
++                      </widget>
++                      <ePixmap pixmap="750S/buttons/button_red.png" position="40,227" size="22,22" alphatest="on" />
++                      <widget name="languagetext" position="66,230" size="95,30" font="Regular;18" />
++                      <widget name="config" position="50,300" zPosition="1" size="440,200" transparent="1" scrollbarMode="showOnDemand" />            
++                      <widget name="rc" pixmap="750S/rc.png" position="520,600" zPosition="10" size="154,471" transparent="1" alphatest="blend"/>
++                      <widget name="arrowdown" pixmap="750S/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++                      <widget name="arrowup" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++                      <widget name="arrowup2" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++      </screen>
++      <!-- Dish -->
++      <screen name="Dish" flags="wfNoBorder" position="300,110" size="130,160" title="Dish" zPosition="-1" backgroundColor="transparent">
++              <widget name="Dishpixmap" pixmap="750S/icons/dish.png" position="0,0" size="130,160" alphatest="off" />
++      </screen>
++      <!-- unhandled key pressed -->
++      <screen name="UnhandledKey" flags="wfNoBorder" position="620,50" size="34,45" title="UnhandledKey" zPosition="100" backgroundColor="transparent">
++              <widget name="UnhandledKeyPixmap" pixmap="750S/unhandled-key.png" position="0,0" size="34,45" alphatest="off" />
++      </screen>
++      <!-- EPG Selection - Single -->
++      <screen name="EPGSelection" position="0,0" size="720,576" title="EPG Selection" flags="wfNoBorder" backgroundColor="transparent">       
++              <ePixmap pixmap="750S/bg_list.png" position="60,25" size="600,520" zPosition="-1" alphatest="on" />
++              <ePixmap pixmap="750S/icons/icon_epg.png" position="90,35" size="44,44" alphatest="blend"  transparent="1" />
++              <eLabel text="EPG Selection" position="140,45" size="220,30" font="Regular;30" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" />
++              <ePixmap pixmap="750S/buttons/red.png" position="80,125" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="220,125" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/yellow.png" position="360,125" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/blue.png" position="500,125" size="136,40" alphatest="on" />
++              <widget name="key_red" position="100,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget name="key_green" position="240,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget name="key_yellow" position="380,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
++              <widget name="key_blue" position="520,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
++              <widget name="list" position="80,180" size="555,350" transparent="1" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- EPG Selection - Multi -->
++      <screen name="EPGSelectionMulti" position="0,0" size="720,576" title="EPG Selection" flags="wfNoBorder" backgroundColor="transparent">  
++              <ePixmap pixmap="750S/bg_list.png" zPosition="-1" position="60,25" size="600,520" alphatest="on" />
++              <ePixmap pixmap="750S/icons/icon_epg.png" position="90,35" size="44,44" alphatest="blend"  transparent="1" />
++              <eLabel text="EPG Selection Multi" position="140,45" size="250,30" font="Regular;30" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" />
++              <ePixmap pixmap="750S/buttons/red.png" position="80,125" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="220,125" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/yellow.png" position="360,125" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/blue.png" position="500,125" size="136,40" alphatest="on" />
++              <widget name="key_red" position="100,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget name="key_green" position="240,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget name="key_yellow" position="380,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
++              <widget name="key_blue" position="520,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
++              <widget name="now_button_sel" pixmap="750S/epg_now.png" position="90,175" zPosition="1" size="320,25" alphatest="on" />
++              <widget name="next_button_sel" pixmap="750S/epg_next.png" position="90,175" zPosition="1" size="320,25" alphatest="on" />
++              <widget name="more_button_sel" pixmap="750S/epg_more.png" position="90,175" zPosition="1" size="320,25" alphatest="on" />
++              <widget name="now_text" position="90,175" zPosition="2" size="108,22" text="NOW" font="Regular;16" halign="center" valign="center" backgroundColor="#371e1c1a" transparent="1" />
++              <widget name="next_text" position="196,175" zPosition="2" size="108,22" text="NEXT" font="Regular;16" halign="center" valign="center" backgroundColor="#371e1c1a" transparent="1" />
++              <widget name="more_text" position="301,175" zPosition="2" size="108,22" text="MORE" font="Regular;16" halign="center" valign="center" backgroundColor="#371e1c1a" transparent="1" />
++              <widget name="date" position="495,160" size="110,45" font="Regular;18" valign="center" halign="right" />
++              <widget name="list" position="96,203" size="520,320" transparent="1" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Eventview -->
++      <screen name="EventView" position="0,0" size="720,576" title="Eventview" flags="wfNoBorder" backgroundColor="transparent">      
++              <ePixmap pixmap="750S/bg_list.png" zPosition="-1" position="60,25" size="600,520" alphatest="on" />
++              <ePixmap pixmap="750S/icons/icon_epg.png" position="90,35" size="44,44" alphatest="blend"  transparent="1" />
++              <eLabel text="Eventview" position="140,45" size="250,30" font="Regular;30" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" />
++              <ePixmap pixmap="750S/buttons/red.png" position="80,125" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="220,125" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/yellow.png" position="360,125" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/blue.png" position="500,125" size="136,40" alphatest="on" />
++              <widget name="key_red" position="100,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget name="key_green" position="240,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget name="key_yellow" position="380,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
++              <widget name="key_blue" position="520,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
++              <widget name="epg_description" position="95,175" size="530,325" font="Regular;22" />
++              <widget name="datetime" position="95,500" size="120,25" font="Regular;22" />
++              <widget name="duration" position="215,500" size="90,25" font="Regular;22" />
++              <widget name="channel" position="335,500" size="280,25" font="Regular;22" halign="right" />
++      </screen>
++      <!-- Graphical Multi EPG -->
++      <screen name="GraphMultiEPG" position="0,0" size="720,576" title="Electronic Program Guide" flags="wfNoBorder" backgroundColor="transparent">   
++              <ePixmap pixmap="750S/bg_list.png" zPosition="-1" position="60,25" size="600,520" alphatest="on" />
++              <ePixmap pixmap="750S/icons/icon_epg.png" position="90,35" size="44,44" alphatest="blend"  transparent="1" />
++              <eLabel text="Electronic Program Guide" position="140,45" size="300,30" font="Regular;30" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" />
++              <ePixmap pixmap="750S/buttons/red.png" position="80,125" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="220,125" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/yellow.png" position="360,125" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/blue.png" position="500,125" size="136,40" alphatest="on" />
++              <widget name="key_red" position="100,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget name="key_green" position="240,125" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget name="timeline_text" position="85,166" size="520,20" />
++              <widget name="list" position="80,190" size="550,270" transparent="1" backgroundColor="#371e1c1a" EntryBorderColor="#071930" EntryBackgroundColor="#2f4964" EntryBackgroundColorSelected="#25688caf" scrollbarMode="showOnDemand" />
++              <widget name="timeline0" position="85,190" zPosition="1" size="1,270" pixmap="750S/timeline.png" />
++              <widget name="timeline1" position="85,190" zPosition="1" size="1,270" pixmap="750S/timeline.png" />
++              <widget name="timeline2" position="85,190" zPosition="1" size="1,270" pixmap="750S/timeline.png" />
++              <widget name="timeline3" position="85,190" zPosition="1" size="1,270" pixmap="750S/timeline.png" />
++              <widget name="timeline4" position="85,190" zPosition="1" size="1,270" pixmap="750S/timeline.png" />
++              <widget name="timeline5" position="85,190" zPosition="1" size="1,270" pixmap="750S/timeline.png" />
++              <widget name="timeline_now" position="80,189" zPosition="2" size="19,273" pixmap="750S/timeline-now.png" alphatest="on" />
++              <ePixmap pixmap="750S/border_multiepg.png" position="80,167" zPosition="1" size="520,358" transparent="1" alphatest="on" />
++              <widget source="Event" render="Label" position="90,462" zPosition="1" size="450,20" font="Regular;19" noWrap="1">
++                      <convert type="EventName">Name</convert>
++              </widget>
++              <ePixmap pixmap="750S/icons/clock.png" position="550,462" zPosition="1" size="16,16" alphatest="on" />
++              <widget source="global.CurrentTime" render="Label" position="566,462" zPosition="1" size="50,20" font="Regular;18" halign="right">
++                      <convert type="ClockToText"></convert>
++              </widget>
++              <widget source="Event" render="Label" position="90,482" zPosition="1" size="50,22" font="Regular;18">
++                      <convert type="EventTime">StartTime</convert>
++                      <convert type="ClockToText"></convert>
++              </widget>
++              <widget source="Event" render="Label" position="140,482" zPosition="1" size="70,22" font="Regular;18">
++                      <convert type="EventTime">EndTime</convert>
++                      <convert type="ClockToText">Format:- %H:%M</convert>
++              </widget>
++              <widget source="Event" render="Progress" position="200,485" zPosition="1" pixmap="750S/progress_medium.png" size="65,11" borderWidth="2" borderColor="#cccccc">
++                      <convert type="EventTime">Progress</convert>
++              </widget>
++              <widget source="Event" render="Label" position="280,482" zPosition="1" size="320,20" font="Regular;18" noWrap="1">
++                      <convert type="EventTime">StartTime</convert>
++                      <convert type="ClockToText">Format:(%A)</convert>
++              </widget>
++              <widget source="Event" render="Label" position="90,502" zPosition="1" size="500,40" font="Regular;18" foregroundColor="#cccccc">
++                      <convert type="EventName">ExtendedDescription</convert>
++              </widget>
++      </screen>
++      <!-- Harddisk selection -->
++      <screen name="HarddiskSelection" position="100,150" size="540,285" title="Select HDD">
++              <widget name="hddlist" position="10,10" size="520,275" />
++      </screen>
++      <!-- Harddisk setup -->
++      <screen name="HarddiskSetup" position="140,200" size="420,160" title="Harddisk">
++              <widget name="model" position="20,10" size="380,25" font="Regular;23" />
++              <widget name="capacity" position="20,40" size="380,25" font="Regular;23" />
++              <widget name="bus" position="20,70" size="380,25" font="Regular;23" />
++              <widget name="initialize" pixmap="750S/buttons/red.png" position="140,110" size="136,40" alphatest="on" />
++              <widget name="initializetext" position="160,110" size="115,40" zPosition="1" font="Regular;20" halign="center" valign="center" transparent="1" />
++      </screen>
++      <!-- Harddisk wait -->
++      <screen name="HarddiskWait" position="100,150" size="540,60">
++              <widget name="wait" position="20,10" size="500,25" font="Regular;23" />
++      </screen>
++      <!-- Help menu -->
++      <screen name="HelpMenu" position="0,0" size="720,576" title="Menu" flags="wfNoBorder">
++              <eLabel text="help..." position="400,40" size="220,60" font="Regular;40" />
++              <widget name="list" position="50,100" size="440,380" transparent="1" scrollbarMode="showOnDemand" />
++              <widget name="rc" pixmaps="750S/rc.png,750S/rcold.png" position="550,40" zPosition="10" size="154,500" alphatest="blend" />
++              <widget name="arrowdown" pixmap="750S/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++              <widget name="arrowdown2" pixmap="750S/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++              <widget name="arrowup" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++              <widget name="arrowup2" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++              <widget name="long_key" position="320,520" size="350,50" font="Regular;25" halign="right" foregroundColor="yellow" />
++      </screen>
++      <!-- Image Wizard -->
++      <screen name="ImageWizard" position="0,0" size="720,576" title="Welcome..." flags="wfNoBorder">
++              <widget name="text" position="50,100" size="440,250" font="Regular;22" />
++              <widget name="list" position="50,350" zPosition="1" size="440,200" />
++              <widget name="config" position="50,350" zPosition="1" size="440,200" transparent="1" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Inputbox -->
++      <screen name="InputBox" position="80,250" size="550,90" title="Input">
++              <widget name="text" position="10,20" size="550,25" font="Regular;23" />
++              <widget name="input" position="10,55" size="550,25" font="Regular;20" />
++      </screen>
++      <!-- IPKG -->
++      <screen name="Ipkg" position="100,120" size="550,200" title="Installing Software...">
++              <widget name="activityslider" position="0,0" size="550,5" pixmap="750S/progress_small.png" />
++              <widget name="package" position="10,30" size="550,20" font="Regular;18" />
++              <widget name="status" position="10,60" size="550,45" font="Regular;18" />
++              <widget name="slider" position="10,100" size="530,15" pixmap="750S/progress_big.png" borderWidth="2" borderColor="#cccccc" />
++      </screen>
++      <!-- Language selection -->
++      <screen name="LanguageSelection" position="170,143" size="380,300" title="Language selection">
++              <widget source="languages" render="Listbox" position="0,0" size="380,300" scrollbarMode="showOnDemand">
++                      <convert type="TemplatedMultiContent">
++                              {"template": [
++                                              MultiContentEntryText(pos = (80, 10), size = (200, 50), flags = RT_HALIGN_LEFT, text = 1), # index 1 is the language name,
++#                                             MultiContentEntryPixmap(pos = (10, 5), size = (53, 35), png = 2), # index 2 is the pixmap
++                                              MultiContentEntryPixmap(pos = (7, 5), size = (60, 40), png = 2), # index 2 is the pixmap
++                                      ],
++                               "fonts": [gFont("Regular", 20)],
++                               "itemHeight": 50
++                              }
++                      </convert>
++              </widget>
++      </screen>
++      <screen name="LanguageWizard" position="0,0" size="720,576" title="Welcome..." flags="wfNoBorder">
++              <widget name="text" position="153,50" size="340,240" font="Regular;23" />
++              <widget source="languages" render="Listbox" position="50,300" size="440,200" scrollbarMode="showOnDemand">
++                      <convert type="TemplatedMultiContent">
++                              {"template": [
++                                              MultiContentEntryText(pos = (80, 10), size = (200, 50), flags = RT_HALIGN_LEFT, text = 1), # index 1 is the language name,
++#                                             MultiContentEntryPixmap(pos = (10, 5), size = (53, 35), png = 2), # index 2 is the pixmap
++                                              MultiContentEntryPixmap(pos = (7, 5), size = (60, 40), png = 2), # index 2 is the pixmap
++                                      ],
++                               "fonts": [gFont("Regular", 20)],
++                               "itemHeight": 50
++                              }
++                      </convert>
++              </widget>
++              <widget name="rc" pixmaps="750S/rc.png,750S/rcold.png" position="520,50" zPosition="10" size="154,500" alphatest="blend" />
++              <widget name="arrowdown" pixmap="750S/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++              <widget name="arrowdown2" pixmap="750S/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++              <widget name="arrowup" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++              <widget name="arrowup2" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++      </screen>
++      <!-- Location Box -->
++      <screen name="LocationBox" position="100,120" size="540,460" >
++              <widget name="text" position="0,2" size="540,22" font="Regular;22" />
++              <widget name="target" position="0,23" size="540,22" valign="center" font="Regular;22" />
++              <widget name="filelist" position="0,55" zPosition="1" size="540,210" scrollbarMode="showOnDemand" selectionDisabled="1" />
++              <widget name="textbook" position="0,272" size="540,22" font="Regular;22" />
++              <widget name="booklist" position="5,302" zPosition="2" size="535,100" scrollbarMode="showOnDemand" />
++              <widget name="red" position="0,415" zPosition="1" size="136,40" pixmap="750S/buttons/red.png" transparent="1" alphatest="on" />
++              <widget name="key_red" position="20,415" zPosition="2" size="115,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />      
++              <widget name="green" position="135,415" zPosition="1" size="136,40" pixmap="750S/buttons/green.png" transparent="1" alphatest="on" />
++              <widget name="key_green" position="155,415" zPosition="2" size="115,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
++              <widget name="yellow" position="270,415" zPosition="1" size="136,40" pixmap="750S/buttons/yellow.png" transparent="1" alphatest="on" />
++              <widget name="key_yellow" position="290,415" zPosition="2" size="115,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
++              <widget name="blue" position="405,415" zPosition="1" size="136,40" pixmap="750S/buttons/blue.png" transparent="1" alphatest="on" />
++              <widget name="key_blue" position="425,415" zPosition="2" size="115,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />                    
++      </screen>
++      <!-- Mediaplayer -->
++      <screen name="MediaPlayer" position="0,0" size="720,576" title="MediaPlayer" flags="wfNoBorder" backgroundColor="transparent">
++              <ePixmap pixmap="750S/bg_setup_650.png" zPosition="-1" position="48,20" size="630,525" alphatest="on"  transparent="1" />
++              <ePixmap pixmap="750S/icons/icon_media.png" position="80,35" size="44,44" alphatest="blend"  transparent="1" />
++              <ePixmap pixmap="750S/mediaplayer_bg.png" position="70,100" zPosition="-1" size="594,390" alphatest="on" />
++              <eLabel name="thistory" position="140,55" size="300,30" text = "Main menu > " font="Regular;20" foregroundColor="#676767" backgroundColor="#371e1c1a" transparent="1" />
++              <eLabel name="title1" position="245,50" size="200,30" text="Media player" font="Regular;30" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" />
++              <widget name="artisttext" position="85,105" size="74,22" font="Regular;20" valign="top" foregroundColor="#cccccc" backgroundColor="#371e1c1a"  transparent="1" />
++              <widget name="artist" position="160,105" size="339,22" font="Regular;20" valign="top" backgroundColor="#371e1c1a" transparent="1" /> 
++              <widget name="albumtext" position="85,138" size="74,22" font="Regular;20" valign="top" foregroundColor="#cccccc" backgroundColor="#371e1c1a" transparent="1" />
++              <widget name="album" position="160,138" size="339,22" font="Regular;20" valign="top" backgroundColor="#371e1c1a" transparent="1" />
++              <widget name="yeartext" position="85,170" size="74,22" font="Regular;20" valign="top" foregroundColor="#cccccc" backgroundColor="#371e1c1a" transparent="1" />
++              <widget name="year" position="160,170" size="150,22" font="Regular;20" valign="top" backgroundColor="#371e1c1a" transparent="1" />
++              <widget name="genretext" position="315,170" size="74,22" font="Regular;20" valign="top" foregroundColor="#cccccc" backgroundColor="#371e1c1a" transparent="1" />
++              <widget name="genre" position="390,170" size="150,22" font="Regular;20" valign="top" backgroundColor="#371e1c1a" transparent="1" />
++              <eLabel name="nowPlaying" position="84,210" size="130,22" text="Now Playing :" font="Regular;22" foregroundColor="#ffc435" backgroundColor="#371e1c1a" transparent="1" />
++              <widget name="title" position="200,210" size="430,24" font="Regular;22" valign="top" backgroundColor="#371e1c1a" transparent="1" />
++              <widget name="coverArt" pixmap="750S/no_coverArt.png" position="553,100" size="111,96" transparent="1" alphatest="blend" />
++              <ePixmap pixmap="750S/icons/mp_buttons.png" position="275,510" size="169,30" alphatest="blend" />
++<!--          <widget name="PositionGauge" position="120,493" size="500,10" pointer="750S/position_pointer.png:660,0" seek_pointer="750S/position_pointer.png:660,0" transparent="1" />-->
++              <widget name="PositionGauge" position="77,493" size="580,10" pointer="750S/position_pointer_580.png:580,0" seek_pointer="750S/position_pointer_580.png:580,0" transparent="1" />
++              <widget name="filelist" position="115,245" transparent="1" size="545,117" scrollbarMode="showOnDemand" />
++              <widget name="playlist" position="115,370" transparent="1" size="545,117" scrollbarMode="showOnDemand" selectionDisabled="1" />
++              <widget name="currenttext" position="65,80" size="0,0" />
++              <widget name="titletext" position="65,80" size="0,0" />
++      </screen>
++      <!-- Menu screens -->
++      <screen name="Menu" position="0,0" size="720,576" title="Main menu" flags="wfNoBorder" backgroundColor="transparent">
++              <ePixmap pixmap="750S/bg_main.png" zPosition="-1" position="94,85" size="530,415" alphatest="on"  transparent="1" />
++              <ePixmap pixmap="750S/icons/icon_mainmenu.png" position="110,100" size="44,44" alphatest="blend"  transparent="1" />
++              <widget source="thistory" render="Label" position="170,120" size="300,30" font="Regular;20" foregroundColor="#676767" backgroundColor="#371e1c1a" transparent="1" />
++              <widget source="title1" render="Label" position="340,113" size="200,30" font="Regular;30" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" />
++              <widget source="title2" render="Label" position="410,113" size="200,30" font="Regular;30" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" />
++              <widget source="title0" render="Label" position="275,113" size="200,30" font="Regular;30" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" />
++              <widget source="menu" render="Listbox" selectionPixmap="750S/buttons/Selected_bar_450x32px.png" backgroundColorSelected="#371e1c1a" backgroundColor="#371e1c1a" transparent="1" position="125, 176" size="480,315" scrollbarMode="showOnDemand">
++                      <convert type="TemplatedMultiContent">
++                              {"template": [  MultiContentEntryText(pos = (20, 5), size = (450, 25), flags = RT_HALIGN_LEFT, text = 0) ],
++                               "fonts": [gFont("Regular", 25)],
++                               "itemHeight": 35
++                              }
++                      </convert>
++              </widget>
++              <eLabel text=" " position="130,207" zPosition="-1" size="440,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" />
++              <eLabel text=" " position="130,242" zPosition="-1" size="440,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" />
++              <eLabel text=" " position="130,277" zPosition="-1" size="440,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" />
++              <eLabel text=" " position="130,312" zPosition="-1" size="440,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" />
++              <eLabel text=" " position="130,347" zPosition="-1" size="440,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" />
++              <eLabel text=" " position="130,382" zPosition="-1" size="440,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" />
++              <eLabel text=" " position="130,417" zPosition="-1" size="440,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" />
++              <eLabel text=" " position="130,452" zPosition="-1" size="440,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" />
++              <eLabel text=" " position="130,487" zPosition="-1" size="440,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" />
++      </screen>               
++      <!-- Messagebox -->
++      <screen name="MessageBox" position="110,245" size="500,10" title="Message">
++              <widget name="text" position="65,8" size="420,0" font="Regular;22" />
++              <widget name="ErrorPixmap" pixmap="750S/icons/input_error.png" position="5,5" size="53,53" alphatest="blend" />
++              <widget name="QuestionPixmap" pixmap="750S/icons/input_question.png" position="5,5" size="53,53" alphatest="blend" />
++              <widget name="InfoPixmap" pixmap="750S/icons/input_info.png" position="5,5" size="53,53" alphatest="blend" />
++              <widget name="list" position="100,100" size="380,375" transparent="1" backgroundColor="#371e1c1a" />
++              <applet type="onLayoutFinish">
++# this should be factored out into some helper code, but currently demonstrates applets.
++from enigma import eSize, ePoint
++
++orgwidth = self.instance.size().width()
++orgpos = self.instance.position()
++textsize = self[&quot;text&quot;].getSize()
++
++# y size still must be fixed in font stuff...
++textsize = (textsize[0] + 50, textsize[1] + 50)
++offset = 0
++if self.type == self.TYPE_YESNO:
++      offset = 60
++wsizex = textsize[0] + 60
++wsizey = textsize[1] + offset
++if (280 &gt; wsizex):
++      wsizex = 280
++wsize = (wsizex, wsizey)
++
++
++# resize
++self.instance.resize(eSize(*wsize))
++
++# resize label
++self[&quot;text&quot;].instance.resize(eSize(*textsize))
++
++# move list
++listsize = (wsizex, 50)
++self[&quot;list&quot;].instance.move(ePoint(0, textsize[1]))
++self[&quot;list&quot;].instance.resize(eSize(*listsize))
++
++# center window
++newwidth = wsize[0]
++self.instance.move(ePoint(orgpos.x() + (orgwidth - newwidth)/2, orgpos.y()))
++              </applet>
++      </screen>
++      <!-- Minute input -->
++      <screen name="MinuteInput" position="200,140" size="280,60" title="Seek">
++              <widget name="minutes" position="80,15" size="160,25" halign="right" font="Regular;23" />
++      </screen>
++      <!-- Movie context menu -->
++      <screen name="MovieContextMenu" position="150,160" size="400,260" title="Movielist menu">
++              <widget name="menu" position="10,10" size="380,250" transparent="1" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Movieselection -->
++      <screen name="MovieSelection" position="0, 0" size="720,576" title="Channel Selection" flags="wfNoBorder" backgroundColor="transparent">
++              <ePixmap pixmap="750S/bg_list.png" position="60,25" size="600,520" zPosition="-1" alphatest="on"  transparent="1" />
++              <ePixmap pixmap="750S/icons/icon_recorded.png" position="90,35" size="44,44" alphatest="blend"  transparent="1" />
++              <eLabel text="Recorded files..." position="140,45" size="220,30" font="Regular;30" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" />
++              <ePixmap pixmap="750S/buttons/red.png" position="80,110" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="220,110" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/yellow.png" position="360,110" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/blue.png" position="500,110" size="136,40" alphatest="on" />
++              <widget name="key_red" position="100,110" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget name="key_green" position="240,110" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget name="key_yellow" position="380,110" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
++              <widget name="key_blue" position="520,110" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
++              <widget name="waitingtext" position="80,160" size="555,328" zPosition="4" font="Regular;22" halign="center" valign="center" />
++              <widget name="list" position="80,160" size="555,328" zPosition="2" scrollbarMode="showOnDemand" transparent="1" />
++              <widget name="DescriptionBorder" pixmap="750S/border_eventinfo.png" position="75,388" zPosition="1" size="560,103" transparent="1" alphatest="on" />
++              <widget source="Service" render="Label" position="80,390" zPosition="1" size="480,35" font="Regular;17" foregroundColor="#cccccc">
++                      <convert type="MovieInfo">ShortDescription</convert>
++              </widget>
++              <widget source="Service" render="Label" position="570,390" zPosition="1" size="60,22" font="Regular;17" halign="right">
++                      <convert type="ServiceTime">Duration</convert>
++                      <convert type="ClockToText">AsLength</convert>
++              </widget>
++              <widget source="Service" render="Label" position="455,410" zPosition="2" size="175,22" font="Regular;17" halign="right">
++                      <convert type="MovieInfo">RecordServiceName</convert>
++              </widget>
++              <widget source="Service" render="Label" position="80,430" zPosition="1" size="550,58" font="Regular;19">
++                      <convert type="EventName">ExtendedDescription</convert>
++              </widget>
++              <widget name="freeDiskSpace" position="75,500" size="540,20" font="Regular;19" valign="center" halign="right" />
++      </screen>
++      <!-- Mute -->
++      <screen name="Mute" position="50,50" zPosition="10" size="40,24" backgroundColor="transparent" title="Mute" flags="wfNoBorder">
++              <ePixmap position="0,0" size="40,24" pixmap="750S/mute.png" transparent="1" alphatest="on" />
++      </screen>
++      <!-- Nameserver -->
++      <screen name="NameserverSetup" position="110,120" size="500,400" title="Nameserver Setup" >
++              <widget name="config" position="10,10" transparent="1" backgroundColor="#371e1c1a" size="480,175" scrollbarMode="showOnDemand" />
++              <widget source="key_red" render="Label" position="430,330" size="120,21" zPosition="10" font="Regular;21" transparent="1" />
++              <widget source="key_green" render="Label" position="60,330" size="150,21" zPosition="10" font="Regular;21" transparent="1" />
++              <widget source="key_yellow" render="Label" position="60,360" size="150,21" zPosition="10" font="Regular;21" transparent="1" />
++              <ePixmap pixmap="750S/buttons/button_red.png" position="400,328" zPosition="10" size="22,22" transparent="1" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/button_green.png" position="20,328" zPosition="10" size="22,22" transparent="1" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/button_yellow.png" position="20,358" zPosition="10" size="22,22" transparent="1" alphatest="on" />
++              <widget name="introduction" position="140,360" size="300,20" zPosition="10" font="Regular;21" halign="center" transparent="1" />
++      </screen>
++      <!-- Network adapter selection -->
++      <screen name="NetworkAdapterSelection" position="110,120" size="500,400" title="Select Network Adapter">
++              <widget source="key_red" render="Label" position="430,330" size="120,21" zPosition="10" font="Regular;21" transparent="1" />
++              <widget source="key_green" render="Label" position="60,330" size="150,21" zPosition="10" font="Regular;21" transparent="1" />
++              <widget source="key_yellow" render="Label" position="60,360" size="150,21" zPosition="10" font="Regular;21" transparent="1" />
++              <ePixmap pixmap="750S/buttons/button_red.png" position="400,328" zPosition="10" size="22,22" transparent="1" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/button_green.png" position="20,328" zPosition="10" size="22,22" transparent="1" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/button_yellow.png" position="20,358" zPosition="10" size="22,22" transparent="1" alphatest="on" />
++              <widget source="list" render="Listbox" position="10,10" size="550,280" zPosition="10" scrollbarMode="showOnDemand">
++                      <convert type="TemplatedMultiContent"> <!--  iface, name, description, interfacepng, defaultpng, activepng, divpng  -->
++                              {"template": [
++                                              MultiContentEntryText(pos = (85, 6), size = (440, 28), font=0, flags = RT_HALIGN_LEFT|RT_VALIGN_TOP, text = 1), # index 1 is the interfacename
++                                              MultiContentEntryText(pos = (85, 43), size = (440, 20), font=1, flags = RT_HALIGN_LEFT|RT_VALIGN_BOTTOM, text = 2), # index 2 is the description
++                                              MultiContentEntryPixmapAlphaTest(pos = (2, 8), size = (54, 54), png = 3), # index 3 is the interface pixmap
++                                              MultiContentEntryPixmapAlphaTest(pos = (63, 46), size = (15, 16), png = 4), # index 4 is the default pixmap
++                                      ],
++                              "fonts": [gFont("Regular", 28),gFont("Regular", 20)],
++                              "itemHeight": 70
++                              }
++                      </convert>
++              </widget>
++              <widget source="introduction" render="Label" position="140,360" size="300,21" zPosition="10" font="Regular;21" halign="center" transparent="1" />
++      </screen>       
++      <!-- Network adapter test Black = "#000000" Grey = "#8c8c93" Green = "#1cff1c" Red = #f23d21-->
++      <screen name="NetworkAdapterTest" position="110,120" size="520,400" title="Network test..." >
++              <ePixmap pixmap="750S/buttons/button_red.png" position="380,328" zPosition="10" size="22,22" transparent="1" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/button_green.png" position="30,328" zPosition="10" size="22,22" transparent="1" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/button_yellow.png" position="30,358" zPosition="10" size="22,22" transparent="1" alphatest="on" />
++              <widget source="key_red" render="Label" position="420,330" size="120,21" zPosition="10" font="Regular;21" transparent="1" />
++              <widget source="key_green" render="Label" position="70,330" size="250,21" zPosition="10" font="Regular;21" transparent="1" />
++              <widget source="key_yellow" render="Label" position="70,360" size="250,21" zPosition="10" font="Regular;21" transparent="1" />
++              <widget name="Adaptertext" position="10,20" size="120,21" zPosition="1" font="Regular;19" foregroundColors="#8c8c93,#1cff1c" />                 
++              <widget name="Adapter" position="120,20" size="270,21" zPosition="1" font="Regular;19" halign="center" foregroundColors="#8c8c93,#f23d21,#1cff1c" />
++              <widget name="AdapterInfo" pixmaps="750S/buttons/blue.png,750S/buttons/blue_pressed.png" position="370,10" zPosition="1" size="140,40" transparent="1" alphatest="on" />
++              <widget name="AdapterInfo_Text" position="410,20" size="110,21" zPosition="2" font="Regular;19" transparent="1" foregroundColors="#8c8c93,#7fafaf,#1cff1c" />
++              <widget name="AdapterInfo_OK" pixmap="750S/icons/lock_on.png" position="345,15" size="38,31" alphatest="on" zPosition="2" />
++              <widget name="Networktext" position="10,70" size="120,21" zPosition="1" font="Regular;19" foregroundColors="#8c8c93,#1cff1c" />                 
++              <widget name="Network" position="150,70" size="240,21" zPosition="1" font="Regular;19" halign="center" foregroundColors="#8c8c93,#f23d21,#1cff1c" />
++              <widget name="NetworkInfo" pixmaps="750S/buttons/blue.png,750S/buttons/blue_pressed.png" position="370,60" zPosition="1" size="140,40" transparent="1" alphatest="on" />
++              <widget name="NetworkInfo_Text" position="410,70" size="110,21" zPosition="2" font="Regular;19" transparent="1" foregroundColors="#8c8c93,#7fafaf,#1cff1c" />
++              <widget name="NetworkInfo_Check" pixmaps="750S/icons/lock_on.png,750S/icons/lock_error.png" position="345,65" size="38,31" alphatest="on" zPosition="2" />
++              <widget name="Dhcptext" position="10,120" size="120,21" zPosition="1" font="Regular;19" foregroundColors="#8c8c93,#1cff1c" />                   
++              <widget name="Dhcp" position="150,120" size="240,21" zPosition="1" font="Regular;19" halign="center" foregroundColors="#8c8c93,#f23d21,#1cff1c" />
++              <widget name="DhcpInfo" pixmaps="750S/buttons/blue.png,750S/buttons/blue_pressed.png" position="370,110" zPosition="1" size="140,40" transparent="1" alphatest="on" />
++              <widget name="DhcpInfo_Text" position="410,120" size="110,21" zPosition="2" font="Regular;19" transparent="1" foregroundColors="#8c8c93,#7fafaf,#1cff1c" />
++              <widget name="DhcpInfo_Check" pixmaps="750S/icons/lock_on.png,750S/icons/lock_error.png" position="345,115" size="38,31" alphatest="on" zPosition="2" />
++              <widget name="IPtext" position="10,170" size="120,21" zPosition="1" font="Regular;19" foregroundColors="#8c8c93,#1cff1c" />                     
++              <widget name="IP" position="150,170" size="210,21" zPosition="1" font="Regular;19" halign="center" foregroundColors="#8c8c93,#f23d21,#1cff1c" />
++              <widget name="IPInfo" pixmaps="750S/buttons/blue.png,750S/buttons/blue_pressed.png" position="370,160" zPosition="1" size="140,40" transparent="1" alphatest="on" />
++              <widget name="IPInfo_Text" position="410,170" size="110,21" zPosition="2" font="Regular;19" transparent="1" foregroundColors="#8c8c93,#7fafaf,#1cff1c" />
++              <widget name="IPInfo_Check" pixmaps="750S/icons/lock_on.png,750S/icons/lock_error.png" position="345,165" size="38,31" alphatest="on" zPosition="2" />
++              <widget name="DNStext" position="10,220" size="120,21" zPosition="1" font="Regular;19" foregroundColors="#8c8c93,#1cff1c" />                    
++              <widget name="DNS" position="150,220" size="210,21" zPosition="1" font="Regular;19" halign="center" foregroundColors="#8c8c93,#f23d21,#1cff1c" />
++              <widget name="DNSInfo" pixmaps="750S/buttons/blue.png,750S/buttons/blue_pressed.png" position="370,210" zPosition="1" size="140,40" transparent="1" alphatest="on" />
++              <widget name="DNSInfo_Text" position="410,220" size="110,21" zPosition="2" font="Regular;19" transparent="1" foregroundColors="#8c8c93,#7fafaf,#1cff1c" />
++              <widget name="DNSInfo_Check" pixmaps="750S/icons/lock_on.png,750S/icons/lock_error.png" position="345,215" size="38,31" alphatest="on" zPosition="2" />
++              <widget name="EditSettingsButton" pixmaps="750S/buttons/blue.png,750S/buttons/blue_pressed.png" position="350,260" zPosition="1" size="130,40" transparent="1" alphatest="on" />
++              <widget name="EditSettings_Text" position="370,270" size="110,21" zPosition="2" font="Regular;17" halign="center" transparent="1" foregroundColors="#7fafaf,#8c8c93,#1cff1c" />
++
++              <widget name="InfoText" position="5,5" size="515,290" zPosition="25" font="Regular;21" />
++      </screen>
++      <!-- Network setup -->
++      <screen name="NetworkSetup" position="130,140" size="510,330" title="Network Setup">
++              <widget name="menu" position="10,10" selectionPixmap="750S/buttons/Selected_bar_440x23px.png" transparent="1" backgroundColor="#371e1c1a" size="440,310" />
++      </screen>
++      <!-- Nim selection -->
++      <screen name="NimSelection" position="150,123" size="420,330" title="Choose Tuner">
++              <widget source="nimlist" render="Listbox" transparent="1" position="0,0" size="420,300" scrollbarMode="showOnDemand">
++                      <convert type="TemplatedMultiContent">
++                              {"template": [
++                                              MultiContentEntryText(pos = (10, 5), size = (400, 30), flags = RT_HALIGN_LEFT, text = 1), # index 1 is the nim name,
++                                              MultiContentEntryText(pos = (50, 30), size = (320, 30), font = 1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is a description of the nim settings,
++                                      ],
++                               "fonts": [gFont("Regular", 20), gFont("Regular", 15)],
++                               "itemHeight": 70
++                              }
++                      </convert>
++              </widget>
++      </screen>
++      <!-- Nim setup -->
++      <screen name="NimSetup" position="110,120" size="500,412" title="Reception Settings">
++              <widget name="config" position="10,10" transparent="1" size="480,402" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Numberzap -->
++      <screen name="NumberZap" position="235,255" size="250,60" title="Channel">
++              <widget name="channel" position="35,15" size="110,25" font="Regular;23" />
++              <widget name="number" position="145,15" size="80,25" halign="right" font="Regular;23" />
++      </screen>
++      <!-- Numerical help dialog -->
++      <screen name="NumericalTextInputHelpDialog" position="170,420" zPosition="2" size="394,124" backgroundColor="#202020" flags="wfNoBorder">
++              <eLabel position="0,0" size="392,122" backgroundColor="#c0c0c0" zPosition="-1" />
++              <widget name="key1" position="2,2" size="130,30" font="Console;16" halign="center" valign="center" />
++              <widget name="key2" position="132,2" size="130,30" font="Console;16" halign="center" valign="center" />
++              <widget name="key3" position="262,2" size="130,30" font="Console;16" halign="center" valign="center" />
++              <widget name="key4" position="2,32" size="130,30" font="Console;16" halign="center" valign="center" />
++              <widget name="key5" position="132,32" size="130,30" font="Console;16" halign="center" valign="center" />
++              <widget name="key6" position="262,32" size="130,30" font="Console;16" halign="center" valign="center" />
++              <widget name="key7" position="2,62" size="130,30" font="Console;16" halign="center" valign="center" />
++              <widget name="key8" position="132,62" size="130,30" font="Console;16" halign="center" valign="center" />
++              <widget name="key9" position="262,62" size="130,30" font="Console;16" halign="center" valign="center" />
++              <widget name="help1" position="2,92" size="130,30" font="Regular;16" halign="center" valign="center" />
++              <widget name="key0" position="132,92" size="130,30" font="Regular;16" halign="center" valign="center" />
++              <widget name="help2" position="262,92" size="130,30" font="Regular;16" halign="center" valign="center" />
++      </screen>
++      <!-- Parental control - change pin -->
++      <screen name="ParentalControlChangePin" position="100,200" size="520,160" title="Change pin code">
++              <widget name="config" position="10,10" size="500,350" transparent="1" backgroundColor="#371e1c1a" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Parental control - editor -->
++      <screen name="ParentalControlEditor" position="100,120" size="520,400" title="Parental control services Editor">
++              <widget name="servicelist" position="10,10" size="500,350" selectionPixmap="750S/buttons/Selected_bar_500x23px.png" transparent="1" backgroundColorSelected="#371e1c1a" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Parental control - setup -->
++      <screen name="ParentalControlSetup" position="100,120" size="520,400" title="Parental control setup">
++              <widget name="config" position="10,10" transparent="1" backgroundColor="#371e1c1a" size="500,350" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Picture in picture -->
++      <screen name="PictureInPicture" position="400,60" zPosition="-1" size="240,192" flags="wfNoBorder">
++              <widget name="video" position="0,0" size="240,192" backgroundColor="transparent" />
++      </screen>
++      <!-- Pin input -->
++      <screen name="PinInput" position="110,205" size="500,170" title="Pin code needed">
++              <widget name="service" position="10,10" size="480,25" font="Regular;20" />
++              <widget name="text" position="10,40" size="480,25" font="Regular;20" halign="center" />
++              <widget name="tries" position="10,70" size="480,25" font="Regular;20" halign="center" />
++              <widget name="input" position="10,110" size="480,40" font="Regular;50" halign="center" />
++      </screen>
++      <!-- Picture in picture setup -->
++      <screen name="PiPSetup" position="70,400" size="600,150" backgroundColor="transparent" flags="wfNoBorder" title="PiPSetup">
++              <widget name="text" position="0,0" size="600,150" font="Regular;23" />
++      </screen>
++      <!-- Plugin browser -->
++      <screen name="PluginBrowser" position="150,120" size="410,410" title="Plugin browser">
++              <ePixmap pixmap="750S/buttons/red-big.png" position="0,0" size="200,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green-big.png" position="210,0" size="200,40" alphatest="on" />
++              <widget name="red" position="30,0" zPosition="1" size="170,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget name="green" position="240,0" zPosition="1" size="170,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget name="list" position="0,45" size="410,355" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Plugin downloads -->
++      <screen name="PluginDownloadBrowser" position="110,120" size="500,420" title="Downloadable plugins">
++              <widget name="text" position="0,0" zPosition="1" size="500,430" font="Regular;20" halign="center" valign="center" />
++              <widget name="list" position="10,10" zPosition="2" size="480,405" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- PVR state -->
++      <screen name="PVRState" position="70,70" zPosition="2" size="150,30" backgroundColor="transpBlack" flags="wfNoBorder">
++              <widget name="state" position="0,0" size="150,30" font="Regular;25" halign="center" backgroundColor="transpBlack" foregroundColor="white" />
++      </screen>
++      <!-- Radio infobar -->
++      <screen name="RadioInfoBar" position="75,408" size="560,120" zPosition="1" flags="wfNoBorder" title="Radio">
++              <widget source="session.CurrentService" render="Label" position="5,1" size="325,26" font="Regular;20" noWrap="1" transparent="1">
++                      <convert type="ServiceName">Name</convert>
++              </widget>
++              <widget source="RdsDecoder" render="Pixmap" pixmap="750S/icons/rass_logo.png" position="330,1" size="50,21" alphatest="on">
++                      <convert type="RdsInfo">RasInteractiveAvailable</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="session.RecordState" render="Pixmap" pixmap="750S/icons/record.png" position="480,3" zPosition="2" size="14,14" alphatest="on" >
++                      <convert type="ConditionalShowHide">Blink</convert>
++              </widget>
++              <ePixmap pixmap="750S/icons/clock.png" position="478,0" zPosition="1" size="16,16" alphatest="on" />
++              <widget source="session.Event_Now" render="Progress" pixmap="750S/progress_medium.png" position="395,5" zPosition="2" size="71,11" borderWidth="2" borderColor="#cccccc" transparent="1">
++                      <convert type="EventTime">Progress</convert>
++              </widget>
++              <widget source="global.CurrentTime" render="Label" position="500,1" size="55,28" font="Regular;20" halign="right" transparent="1">
++                      <convert type="ClockToText">Default</convert>
++              </widget>
++              <widget source="session.Event_Now" render="Label" position="5,25" size="60,22" font="Regular;20" transparent="1">
++                      <convert type="EventTime">StartTime</convert>
++                      <convert type="ClockToText">Default</convert>
++              </widget>
++              <widget source="session.Event_Now" render="Label" position="73,25" size="390,22" font="Regular;20" valign="top" noWrap="1" transparent="1">
++                      <convert type="EventName">Name</convert>
++              </widget>
++              <widget source="session.Event_Now" render="Label" position="465,25" size="90,22" font="Regular;20" halign="right" transparent="1">
++                      <convert type="EventTime">Remaining</convert>
++                      <convert type="RemainingToText">InMinutes</convert>
++              </widget>
++              <widget source="session.Event_Next" render="Label" position="5,47" size="60,22" font="Regular;20" transparent="1">
++                      <convert type="EventTime">StartTime</convert>
++                      <convert type="ClockToText">Default</convert>
++              </widget>
++              <widget source="session.Event_Next" render="Label" position="73,47" size="390,22" font="Regular;20" valign="top" noWrap="1" transparent="1">
++                      <convert type="EventName">Name</convert>
++              </widget>
++              <widget source="session.Event_Next" render="Label" position="465,47" size="90,22" font="Regular;20" halign="right" transparent="1">
++                      <convert type="EventTime">Duration</convert>
++                      <convert type="ClockToText">InMinutes</convert>
++              </widget>
++              <eLabel position="5,68" size="550,1" backgroundColor="#384472" />
++              <eLabel position="5,69" size="550,1" backgroundColor="#04060a" />
++              <widget source="RdsDecoder" render="Label" position="5,71" size="550,50" font="LCD;20" foregroundColor="#80ffff">
++                      <convert type="RdsInfo">RadioText</convert>
++              </widget>
++      </screen>
++      <!-- RASS -->
++      <screen name="RassInteractive" position="50,180" size="100,275" backgroundColor="transpWhite" flags="wfNoBorder">
++              <ePixmap pixmap="750S/icons/rass_logo.png" position="25,0" size="50,21" transparent="1" alphatest="on" />
++              <eLabel text="Index" position="36,25" size="60,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" />
++              <eLabel text="0" position="5,25" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" />
++              <widget name="Marker" position="21,25" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" />
++              <eLabel text="1" position="5,50" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" />
++              <widget name="subpages_1" position="35,50" size="36,20" alphatest="on" />
++              <eLabel text="2" position="5,75" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" />
++              <widget name="subpages_2" position="35,75" size="36,20" alphatest="on" />
++              <eLabel text="3" position="5,100" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" />
++              <widget name="subpages_3" position="35,100" size="36,20" alphatest="on" />
++              <eLabel text="4" position="5,125" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" />
++              <widget name="subpages_4" position="35,125" size="36,20" alphatest="on" />
++              <eLabel text="5" position="5,150" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" />
++              <widget name="subpages_5" position="35,150" size="36,20" alphatest="on" />
++              <eLabel text="6" position="5,175" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" />
++              <widget name="subpages_6" position="35,175" size="36,20" alphatest="on" />
++              <eLabel text="7" position="5,200" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" />
++              <widget name="subpages_7" position="35,200" size="36,20" alphatest="on" />
++              <eLabel text="8" position="5,225" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" />
++              <widget name="subpages_8" position="35,225" size="36,20" alphatest="on" />
++              <eLabel text="9" position="5,250" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" />
++              <widget name="subpages_9" position="35,250" size="36,20" alphatest="on" />
++      </screen>
++      <!-- RDS info -->
++      <screen name="RdsInfoDisplay" position="0,0" zPosition="-2" size="720,576" backgroundColor="transparent" flags="wfNoBorder">
++              <widget name="RadioText" position="50,481" size="620,29" font="Regular;21" noWrap="1" backgroundColor="#003258" shadowOffset="-2,-2" shadowColor="transpBlack" />
++              <widget name="RtpText" position="50,510" size="620,29" font="Regular;21" halign="right" noWrap="1" backgroundColor="#003258" shadowOffset="-2,-2" shadowColor="transpBlack" />
++              <widget name="RassLogo" pixmap="750S/icons/rass_logo.png" position="50,445" size="50,21" />
++      </screen>
++      <!-- Satfinder -->
++      <screen name="Satfinder" position="90,120" size="520,400" title="Satfinder">
++              <widget name="introduction" position="0,0" size="0,0" font="Regular;23" />
++              <ePixmap pixmap="750S/icons/dish_scan.png" position="5,25" zPosition="0" size="119,110" transparent="1" alphatest="on" />
++              <widget source="Frontend" render="Label" position="190,10" zPosition="2" size="260,20" font="Regular;19" halign="center" valign="center" transparent="1">
++                      <convert type="FrontendInfo">SNRdB</convert>
++              </widget>
++              <eLabel name="snr" text="SNR:" position="120,35" size="60,22" font="Regular;21" halign="right" transparent="1" />
++              <widget source="Frontend" render="Progress" position="190,35" size="260,20" pixmap="750S/bar_snr.png" borderWidth="2" borderColor="#cccccc">
++                      <convert type="FrontendInfo">SNR</convert>
++              </widget>
++              <widget source="Frontend" render="Label" position="460,35" size="60,22" font="Regular;21">
++                      <convert type="FrontendInfo">SNR</convert>
++              </widget>
++              <eLabel name="agc" text="AGC:" position="120,60" size="60,22" font="Regular;21" halign="right" transparent="1" />
++              <widget source="Frontend" render="Progress" position="190,60" size="260,20" pixmap="750S/bar_snr.png" borderWidth="2" borderColor="#cccccc">
++                      <convert type="FrontendInfo">AGC</convert>
++              </widget>
++              <widget source="Frontend" render="Label" position="460,60" size="60,22" font="Regular;21">
++                      <convert type="FrontendInfo">AGC</convert>
++              </widget>
++              <eLabel name="ber" text="BER:" position="120,85" size="60,22" font="Regular;21" halign="right" transparent="1" />
++              <widget source="Frontend" render="Progress" position="190,85" size="260,20" pixmap="750S/bar_ber.png" borderWidth="2" borderColor="#cccccc">
++                      <convert type="FrontendInfo">BER</convert>
++              </widget>
++              <widget source="Frontend" render="Label" position="460,85" size="60,22" font="Regular;21">
++                      <convert type="FrontendInfo">BER</convert>
++              </widget>
++              <eLabel name="lock" text="Lock:" position="120,115" size="60,22" font="Regular;21" halign="right" />
++              <widget source="Frontend" render="Pixmap" pixmap="750S/icons/lock_on.png" position="190,110" zPosition="1" size="38,31" alphatest="on">
++                      <convert type="FrontendInfo">LOCK</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="Frontend" render="Pixmap" pixmap="750S/icons/lock_off.png" position="190,110" zPosition="1" size="38,31" alphatest="on">
++                      <convert type="FrontendInfo">LOCK</convert>
++                      <convert type="ConditionalShowHide">Invert</convert>
++              </widget>
++              <ePixmap pixmap="750S/div-h.png" position="10,152" zPosition="1" size="500,2" />
++              <widget name="config" position="10,165" transparent="1" backgroundColor="#371e1c1a" size="500,240" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Scan setup -->
++      <screen name="ScanSetup" position="100,120" size="520,405" title="Service scan">
++              <widget name="config" position="10,10" transparent="1" backgroundColor="#371e1c1a" size="500,350" scrollbarMode="showOnDemand" />
++              <widget name="introduction" position="10,365" size="500,40" font="Regular;20" halign="center" />
++      </screen>
++      <!-- Scan simple -->
++      <screen name="ScanSimple" position="150,130" size="420,350" title="Service scan">
++              <widget name="header" position="10,10" size="400,25" font="Regular;23" />
++              <widget name="config" position="10,55" transparent="1" backgroundColor="#371e1c1a" size="400,250" scrollbarMode="showOnDemand" />
++              <widget name="footer" position="10,310" size="400,20" font="Regular;20" halign="center" />
++      </screen>
++      <!-- Scart -->
++      <screen name="Scart" position="0,0" size="720,576" backgroundColor="transparent" />
++      <!-- Service info -->
++      <screen name="ServiceInfo" position="0,0" size="720,576" title="Serviceinfo" flags="wfNoBorder" backgroundColor="transparent">
++              <ePixmap pixmap="750S/bg_setup_600.png" zPosition="-1" position="65,35" size="600,500" alphatest="on"  transparent="1" />
++              <ePixmap pixmap="750S/icons/icon_mainmenu.png" position="95,50" size="44,44" alphatest="blend"  transparent="1" />
++              <eLabel text="Main menu > Information > " position="150,70" size="230,30" font="Regular;20" foregroundColor="#676767" backgroundColor="#371e1c1a" transparent="1" />
++              <eLabel text="Serviceinfo" position="370,65" size="200,30" font="Regular;30" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" />
++              <ePixmap pixmap="750S/buttons/red.png" position="80,130" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="220,130" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/yellow.png" position="360,130" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/blue.png" position="500,130" size="136,40" alphatest="on" />
++              <widget name="red" position="100,130" zPosition="1" size="115,40" font="Regular;17" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget name="green" position="240,130" zPosition="1" size="115,40" font="Regular;17" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget name="yellow" position="380,130" zPosition="1" size="115,40" font="Regular;17" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
++              <widget name="blue" position="520,130" zPosition="1" size="115,40" font="Regular;17" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
++              <widget name="infolist" position="110,175" size="510,340" selectionDisabled="1" />
++      </screen>
++      <!-- Service scan -->
++      <screen name="ServiceScan" position="150,120" size="420,390" title="Service Scan">
++              <widget source="FrontendInfo" render="Pixmap" pixmap="750S/icons/scan-s.png" position="5,5" size="64,64" transparent="1" alphatest="blend">
++                      <convert type="FrontendInfo">TYPE</convert>
++                      <convert type="ValueRange">0,0</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="FrontendInfo" render="Pixmap" pixmap="750S/icons/scan-c.png" position="5,5" size="64,64" transparent="1" alphatest="on">
++                      <convert type="FrontendInfo">TYPE</convert>
++                      <convert type="ValueRange">1,1</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="FrontendInfo" render="Pixmap" pixmap="750S/icons/scan-t.png" position="5,5" size="64,64" transparent="1" alphatest="on">
++                      <convert type="FrontendInfo">TYPE</convert>
++                      <convert type="ValueRange">2,2</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget name="network" position="80,15" size="330,20" font="Regular;20" />
++              <widget name="transponder" position="80,40" size="330,20" font="Regular;20" />
++              <widget name="scan_state" position="10,80" zPosition="2" size="400,20" font="Regular;18" />
++              <widget name="pass" position="10,80" size="400,20" font="Regular;18" />
++              <widget name="scan_progress" position="10,105" size="400,15" pixmap="750S/progress_big.png" borderWidth="2" borderColor="#cccccc" />
++              <widget name="servicelist" position="10,135" size="400,265" selectionDisabled="1" />
++      </screen>
++      <!-- Setup -->
++      <screen name="Setup" position="0,0" size="720,576" title="Setup" flags="wfNoBorder" backgroundColor="transparent">
++              <ePixmap pixmap="750S/bg_setup_650.png" zPosition="-1" position="40,25" size="630,525" alphatest="on"  transparent="1" />
++              <ePixmap pixmap="750S/icons/icon_mainmenu.png" position="80,40" size="44,44" alphatest="blend"  transparent="1" />
++              <eLabel text="Main menu > Setup > System > " position="130,60" size="300,30" font="Regular;20" foregroundColor="#676767" backgroundColor="#371e1c1a" transparent="1" />
++              <widget source="Title" render="Label" position="380,55" size="220,35" font="Regular;30" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" />
++              <ePixmap pixmap="750S/buttons/red.png" position="70,110" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="210,110" size="136,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="90,110" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="230,110" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <ePixmap pixmap="750S/buttons/yellow.png" position="350,110" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/blue.png" position="490,110" size="136,40" alphatest="on" />
++              <widget name="config" position="80,165" itemHeight="30" backgroundColor="#371e1c1a" transparent="1" size="520,360" scrollbarMode="showNever" />
++              <eLabel text=" " position="80,192" zPosition="-1" size="520,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" />
++              <eLabel text=" " position="80,222" zPosition="-1" size="520,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" />
++              <eLabel text=" " position="80,252" zPosition="-1" size="520,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" />
++              <eLabel text=" " position="80,282" zPosition="-1" size="520,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" />
++              <eLabel text=" " position="80,312" zPosition="-1" size="520,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" />
++              <eLabel text=" " position="80,342" zPosition="-1" size="520,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" />
++              <eLabel text=" " position="80,372" zPosition="-1" size="520,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" />
++              <eLabel text=" " position="80,402" zPosition="-1" size="520,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" />
++              <eLabel text=" " position="80,432" zPosition="-1" size="520,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" />
++              <eLabel text=" " position="80,462" zPosition="-1" size="520,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" />
++              <eLabel text=" " position="80,492" zPosition="-1" size="520,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" />
++              <eLabel text=" " position="80,522" zPosition="-1" size="520,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" />
++      </screen>
++      <!-- Simple channelselection -->
++      <screen name="SimpleChannelSelection" position="90,120" size="550,430" title="Channel Selection">
++              <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/yellow.png" position="280,0" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/blue.png" position="420,0" size="136,40" alphatest="on" />
++              <widget name="key_red" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget name="key_green" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget name="key_yellow" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
++              <widget name="key_blue" position="440,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
++              <widget name="list" position="00,45" size="555,364" transparent="1" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Skin Selector -->
++      <screen name="SkinSelector" position="0,0" size="720,576" title="Choose your Skin" flags="wfNoBorder" backgroundColor="transparent">
++              <ePixmap pixmap="750S/bg_main.png" zPosition="-1" position="90,70" size="530,415" alphatest="on"  transparent="1" />
++              <ePixmap pixmap="750S/icons/icon_mainmenu.png" position="110,80" size="44,44" alphatest="blend"  transparent="1" />
++              <eLabel text="Main menu > Setup > System > " position="160,105" size="300,30" font="Regular;20" foregroundColor="#676767" backgroundColor="#371e1c1a" transparent="1" />
++              <eLabel text="Choose your Skin" position="405,100" size="200,35" font="Regular;30" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" />
++              <ePixmap pixmap="750S/buttons/red.png" position="480,435" size="140,40" zPosition="1" alphatest="on" />
++              <widget source="key_red" render="Label" position="500,435" zPosition="2" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="introduction" render="Label" position="90,435" size="380,30" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
++              <widget name="SkinList" position="98,160" size="230,250" selectionPixmap="750S/buttons/Selected_bar_230x23px.png" backgroundColor="#371e1c1a" transparent="1" scrollbarMode="showOnDemand" />
++              <widget name="Preview" position="332,210" size="280,210" alphatest="on" />
++      </screen>
++      <!-- Sleeptimer edit -->
++      <screen name="SleepTimerEdit" position="110,215" size="520,200" title="Sleep Timer">
++              <widget name="current_status" position="40,40" size="400,30" valign="center" font="Regular;20" />
++              <widget name="red" pixmap="750S/buttons/button_red.png" position="2,84" size="22,22" alphatest="on" />
++              <widget name="green" pixmap="750S/buttons/button_green.png" position="2,123" size="22,22" alphatest="on" />
++              <widget name="yellow" pixmap="750S/buttons/button_yellow.png" position="2,163" size="22,22" alphatest="on" />
++              <widget name="blue" pixmap="750S/buttons/button_blue.png" position="2,163" size="22,22" alphatest="on" />
++              <widget name="red_text" position="40,80" size="400,30" valign="center" font="Regular;20" />
++              <widget name="green_text" position="40,120" size="400,30" valign="center" font="Regular;20" />
++              <widget name="yellow_text" position="40,160" size="400,30" valign="center" font="Regular;20" />
++              <widget name="blue_text" position="40,200" size="400,30" valign="center" font="Regular;20" />
++              <widget name="pretext" position="15,10" size="235,25" font="Regular;19" />
++              <widget name="input" position="260,10" size="40,25" font="Regular;19" />
++              <widget name="aftertext" position="305,10" size="100,25" font="Regular;19" />
++              <ePixmap pixmap="750S/sleeptimer.png" position="390,17" size="116,142" alphatest="blend" />
++      </screen>
++      <!-- Standby mode -->
++      <screen name="Standby" flags="wfNoBorder" position="0,0" size="720,576" title="Standby" />
++      <!-- Start Wizard -->
++      <screen name="StartWizard" position="0,0" size="720,576" title="Welcome..." flags="wfNoBorder">
++              <widget name="text" position="153,50" size="340,270" font="Regular;23" />
++              <widget source="list" render="Listbox" transparent="1" position="50,300" size="440,200" scrollbarMode="showOnDemand" >
++                      <convert type="StringList" />
++              </widget>
++              <widget name="config" position="50,300" size="440,200" scrollbarMode="showOnDemand" zPosition="1" transparent="1" />
++              <ePixmap pixmap="750S/buttons/button_red.png" position="40,227" size="22,22" alphatest="on" />
++              <widget name="languagetext" position="66,230" size="95,30" font="Regular;18" />
++              <widget name="rc" pixmaps="750S/rc.png,750S/rcold.png" position="520,50" zPosition="10" size="154,500" alphatest="blend" />
++              <widget name="arrowdown" pixmap="750S/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++              <widget name="arrowdown2" pixmap="750S/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++              <widget name="arrowup" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++              <widget name="arrowup2" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++      </screen>
++      <!-- Network Wizard -->
++      <screen name="NetworkWizard" position="0,0" size="720,576" title="Welcome..." flags="wfNoBorder" >
++              <widget name="text" position="153,40" size="340,300" font="Regular;22" />
++              <widget source="list" render="Listbox" position="53,340" size="440,180" scrollbarMode="showOnDemand" >
++                      <convert type="StringList" />
++              </widget>
++              <widget name="config" position="53,340" zPosition="1" size="440,180" transparent="1" scrollbarMode="showOnDemand" />
++              <ePixmap pixmap="750S/buttons/button_red.png" position="40,222" zPosition="0" size="22,22" transparent="1" alphatest="on" />
++              <widget name="languagetext" position="66,225" size="95,30" font="Regular;18" />
++              <widget name="rc" pixmaps="750S/rc.png,skin_default/rcold.png" position="530,50" zPosition="10" size="154,500" alphatest="blend" />
++              <widget name="arrowdown" pixmap="750S/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++              <widget name="arrowdown2" pixmap="750S/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++              <widget name="arrowup" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++              <widget name="arrowup2" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++              <widget source="VKeyIcon" render="Pixmap" pixmap="750S/buttons/key_text.png" position="40,260" zPosition="0" size="35,25" transparent="1" alphatest="on" >
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget name="HelpWindow" pixmap="750S/buttons/key_text.png" position="125,170" zPosition="1" size="1,1" transparent="1" alphatest="on" />      
++      </screen>"""    
++      <!-- Subservice quickzap -->
++      <screen name="SubservicesQuickzap" position="124,470" size="512,200" title="Subservices" backgroundColor="transparent" flags="wfNoBorder">
++              <widget source="session.RecordState" render="Pixmap" pixmap="750S/icons/record.png" position="450,0" zPosition="2" size="14,14" alphatest="on" >
++                      <convert type="ConditionalShowHide">Blink</convert>
++              </widget>
++              <eLabel text="Subservices" position="0,0" size="470,20" font="Regular;13" backgroundColor="#33294a6b" />
++              <widget name="CurrentSubserviceNumber" position="0,20" size="50,34" font="Regular;22" backgroundColor="#33294a6b" shadowColor="black" shadowOffset="-1,-1" />
++              <widget source="session.CurrentService" render="Label" position="50,20" size="420,34" font="Regular;22" backgroundColor="#33294a6b" shadowColor="black" shadowOffset="-1,-1">
++                      <convert type="ServiceName">Name</convert>
++              </widget>
++      </screen>
++      <!-- Subtitle selection -->
++      <screen name="Subtitles" position="170,150" size="380,285" title="Subtitle selection">
++              <widget name="config" position="10,10" backgroundColor="#371e1c1a" transparent="1" zPosition="1" size="360,275" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Subtitle area -->
++      <screen name="SubtitleDisplay" position="0,0" size="720,576" zPosition="-1" flags="wfNoBorder" backgroundColor="transparent" />
++      <!-- Time & date input -->
++      <screen name="TimeDateInput" position="160,150" size="400,200" title="Time/Date Input">
++              <widget name="cancel" pixmap="750S/buttons/red.png" position="10,0" size="136,40" alphatest="on" />
++              <widget name="ok" pixmap="750S/buttons/green.png" position="260,0" size="136,40" alphatest="on" />
++              <widget name="canceltext" position="30,0" zPosition="1" size="115,40" font="Regular;19" halign="center" valign="center" transparent="1" />
++              <widget name="oktext" position="280,0" zPosition="1" size="115,40" font="Regular;19" halign="center" valign="center" transparent="1" />
++              <widget name="config" position="10,40" transparent="1" size="380,150" />
++      </screen>
++      <!-- Timer edit -->
++      <screen name="TimerEdit" position="70,130" size="590,335" title="Timer Edit">
++              <widget name="description" position="10,10" size="580,40" font="Regular;25" />
++              <widget name="lbegin" position="405,102" size="103,30" font="Regular;25" foregroundColor="red" />
++              <widget name="lend" position="405,158" size="103,30" font="Regular;25" foregroundColor="green" />
++              <widget name="begin" position="508,105" size="72,35" font="Regular;25" />
++              <widget name="end" position="508,150" size="72,35" font="Regular;25" />
++              <widget name="apply" position="10,240" size="250,35" />
++      </screen>
++      <!-- Timer edit list -->
++      <screen name="TimerEditList" position="0,0" size="720,576" title="Timer Editor" flags="wfNoBorder" backgroundColor="transparent">
++              <ePixmap pixmap="750S/bg_setup_650.png" zPosition="-1" position="48,20" size="630,525" alphatest="on"  transparent="1" />
++              <ePixmap pixmap="750S/icons/icon_timerlist.png" position="80,35" size="44,44" alphatest="blend"  transparent="1" />
++              <eLabel name="title1" position="140,45" size="200,30" text="Timer List" font="Regular;30" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" />
++              <ePixmap pixmap="750S/buttons/red.png" position="80,100" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="220,100" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/yellow.png" position="360,100" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/blue.png" position="500,100" size="136,40" alphatest="on" />
++              <widget name="key_red" position="100,100" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget name="key_green" position="240,100" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget name="key_yellow" position="380,100" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
++              <widget name="key_blue" position="520,100" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
++              <widget name="timerlist" position="80,160" transparent="1" size="555,350" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Timer entry -->
++      <screen name="TimerEntry" position="0,0" size="720,576" title="Timer entry" flags="wfNoBorder" backgroundColor="transparent">
++              <ePixmap pixmap="750S/bg_setup_650.png" zPosition="-1" position="48,20" size="630,525" alphatest="on"  transparent="1" />
++              <ePixmap pixmap="750S/icons/icon_timerlist.png" position="80,35" size="44,44" alphatest="blend"  transparent="1" />
++              <eLabel name="title1" position="130,50" size="200,30" text="Timer entry" font="Regular;30" foregroundColor="#d1a256" backgroundColor="#371e1c1a" transparent="1" />
++              <widget name="cancel" pixmap="750S/buttons/red.png" position="80,100" size="136,40" alphatest="on" />
++              <widget name="ok" pixmap="750S/buttons/green.png" position="220,100" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/yellow.png" position="360,100" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/blue.png" position="500,100" size="136,40" alphatest="on" />
++              <widget name="canceltext" position="100,100" zPosition="2" size="115,40" halign="center" valign="center" font="Regular;21" backgroundColor="#9f1313" transparent="1" />
++              <widget name="oktext" position="240,100" zPosition="2" size="115,40" halign="center" valign="center" font="Regular;21" backgroundColor="#1f771f" transparent="1" />
++              <widget name="config" position="90,145" transparent="1" backgroundColor="#371e1c1a" size="520,385" scrollbarMode="showOnDemand" />
++              <eLabel text=" " position="80,382" zPosition="-1" size="540,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#021a1816" />
++      </screen>
++      <!-- Timer log -->
++      <screen name="TimerLog" position="90,120" size="550,380" title="Timer log">
++              <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/yellow.png" position="280,0" size="136,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/blue.png" position="420,0" size="136,40" alphatest="on" />
++              <widget name="key_red" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget name="key_green" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget name="key_yellow" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
++              <widget name="key_blue" position="440,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
++              <widget name="loglist" position="0,45" size="555,250" scrollbarMode="showOnDemand" />
++              <widget name="logentry" position="0,300" size="555,130" font="Regular;20" />
++      </screen>
++      <!-- Timer sanity conflict -->
++      <screen name="TimerSanityConflict" position="90,120" size="550,430" title="Timer sanity error">
++              <ePixmap pixmap="750S/buttons/red.png" position="0,0" zPosition="0" size="136,40" transparent="1" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="140,0" zPosition="0" size="136,40" transparent="1" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/yellow.png" position="0,120" zPosition="0" size="136,40" transparent="1" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/blue.png" position="140,120" zPosition="0" size="136,40" transparent="1" alphatest="on" />
++              <widget name="key_red" position="20,0" zPosition="1" size="115,40" font="Regular;20" valign="center" halign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget name="key_green" position="160,0" zPosition="1" size="115,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget name="key_yellow" position="20,120" zPosition="1" size="115,40" font="Regular;20" valign="center" halign="center" backgroundColor="#a08500" transparent="1" />
++              <widget name="key_blue" position="160,120" zPosition="1" size="115,40" font="Regular;20" valign="center" halign="center" backgroundColor="#18188b" transparent="1" />
++              <widget name="timer1" position="0,45" size="555,75" scrollbarMode="showNever" />
++              <widget name="timer2" position="0,165" size="555,75" scrollbarMode="showNever" />
++              <widget name="list" position="0,260" size="555,144" transparent="1" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Timer Selection -->
++      <screen name="TimerSelection" position="90,120" size="550,430" title="Timer selection">
++              <widget name="timerlist" position="0,45" size="550,350" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Timeshift state -->
++      <screen name="TimeshiftState" position="70,70" zPosition="2" size="150,60" backgroundColor="transpBlack" flags="wfNoBorder">
++              <widget name="state" position="0,0" size="150,30" font="Regular;25" halign="center" backgroundColor="transpBlack" />
++              <widget source="session.CurrentService" render="Label" position="0,30" size="150,30" font="Regular;25" halign="center" foregroundColor="white" backgroundColor="transpBlack">
++                      <convert type="ServicePosition">Remaining</convert>
++              </widget>
++      </screen>
++      <!-- Translator Info -->
++      <screen name="TranslationInfo" position="150,130" size="420,350" title="Translation">
++              <eLabel position="10,20" size="380,23" font="Regular;23" text="Translation:" />
++              <widget source="TranslatorName" render="Label" position="10,55" size="380,20" font="Regular;20" />
++              <widget source="TranslationInfo" render="Label" position="10,100" size="380,250" font="Regular;20" />
++      </screen>
++      <!-- Tutorial Wizard -->
++      <screen name="TutorialWizard" position="0,0" size="720,576" title="Welcome..." flags="wfNoBorder">
++              <widget name="text" position="50,100" size="440,200" font="Regular;23" />
++              <widget name="list" position="50,300" zPosition="1" size="440,200"  />
++              <widget name="rc" pixmap="750S/rc.png" position="520,600" zPosition="10" size="154,475" alphatest="blend"/>
++              <widget name="arrowdown" pixmap="750S/arrowdown.png" position="0,0" zPosition="11" size="37,70" alphatest="blend"/>
++              <widget name="arrowup" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend"/>
++              <widget name="arrowup2" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend"/>
++      </screen>
++      <!-- Volumebar -->
++      <screen name="Volume" position="92,40" zPosition="1" size="539,44" title="Volume" flags="wfNoBorder" >
++              <ePixmap pixmap="750S/volume.png" position="0,0" size="539,44" />
++              <widget name="Volume" pixmap="750S/volume_box.png" position="70,16" zPosition="1" size="452,12" transparent="1" />
++      </screen>
++      <screen name="JobView" position="84,122" size="520,350" title="Job View">
++              <widget source="job_name" render="Label" position="20,12" size="480,60" font="Regular;28" />
++              <widget source="job_task" render="Label" position="20,90" size="480,50" font="Regular;23" />
++              <widget source="job_progress" render="Progress" position="20,162" size="480,36" borderWidth="2" backgroundColor="#254f7497" />
++              <widget source="job_progress" render="Label" position="120,166" size="280,32" font="Regular;28" foregroundColor="#000000" zPosition="2" halign="center" transparent="1"  >
++                      <convert type="ProgressToText" />
++              </widget>
++              <widget source="job_status" render="Label" position="20,212" size="480,26" font="Regular;23" />
++              <widget name="config" position="20,254" size="480,20" />
++              <widget source="cancelable" render="Pixmap" pixmap="750S/buttons/red.png" position="20,300" size="136,40" alphatest="on" >
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="cancelable" render="FixedLabel" text="Cancel" position="40,300" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" >
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="finished" render="Pixmap" pixmap="750S/buttons/green.png" position="190,300" size="136,40" alphatest="on" >
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="finished" render="FixedLabel" text="OK" font="Regular;20" halign="center" valign="center" position="210,300" size="115,40" transparent="1" backgroundColor="#1f771f" >
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="backgroundable" render="Pixmap" pixmap="750S/buttons/blue.png" position="360,300" size="136,40" alphatest="on" >
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="backgroundable" render="FixedLabel" text="Continue in background" font="Regular;20" halign="center" valign="center" position="380,300" size="115,40" transparent="1" backgroundColor="#18188b" >
++                      <convert type="ConditionalShowHide" />
++              </widget>
++      </screen>
++      <!-- VirtualKeyBoard -->
++      <screen name="VirtualKeyBoard" position="center,center" size="560,350" zPosition="99" title="Virtual KeyBoard">
++              <ePixmap pixmap="skin_default/vkey_text.png" position="9,35" zPosition="-4" size="542,52" alphatest="on" />
++              <widget name="header" position="10,10" size="500,20" font="Regular;20" transparent="1" noWrap="1" />
++              <widget name="text" position="12,35" size="536,46" font="Regular;46" transparent="1" noWrap="1" halign="right" />
++              <widget name="list" position="10,100" size="540,225" selectionDisabled="1" transparent="1" />
++      </screen>
++      <!-- FileBrowser -->
++      <screen name="FileBrowser" position="center,120" size="520,420" title="DVD File Browser" >
++              <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget name="filelist" position="5,50" size="510,370" scrollbarMode="showOnDemand" />
++      </screen>
++      <screen name="CutListEditor" position="0,0" size="720,576" title="Cutlist editor" flags="wfNoBorder">
++              <eLabel text="Cutlist editor" position="65,60" size="300,25" font="Regular;20" />
++              <widget source="global.CurrentTime" render="Label" position="268,60" size="394,20" font="Regular;20" halign="right">
++                      <convert type="ClockToText">Format:%A %B %d, %H:%M</convert>
++              </widget>
++              <eLabel position="268,98" size="394,304" backgroundColor="#505555" />
++              <widget name="Video" position="270,100" zPosition="1" size="390,300" backgroundColor="transparent" />
++              <widget source="session.CurrentService" render="Label" position="135,405" size="450,50" font="Regular;22" halign="center" valign="center">
++                      <convert type="ServiceName">Name</convert>
++              </widget>
++              <widget source="session.CurrentService" render="Label" position="320,450" zPosition="1" size="420,25" font="Regular;20" halign="left" valign="center">
++                      <convert type="ServicePosition">Position,Detailed</convert>
++              </widget>
++              <widget name="SeekState" position="210,450" zPosition="1" size="100,25" halign="right" font="Regular;20" valign="center" />
++              <eLabel position="48,98" size="204,274" backgroundColor="#505555" />
++              <eLabel position="50,100" size="200,270" backgroundColor="#000000" />
++              <widget source="cutlist" position="50,100" zPosition="1" size="200,270" scrollbarMode="showOnDemand" transparent="1" render="Listbox" >
++                      <convert type="TemplatedMultiContent">
++                              {"template": [
++                                              MultiContentEntryText(size=(125, 20), text = 1, backcolor = MultiContentTemplateColor(3)),
++                                              MultiContentEntryText(pos=(125,0), size=(50, 20), text = 2, flags = RT_HALIGN_RIGHT, backcolor = MultiContentTemplateColor(3))
++                                      ],
++                               "fonts": [gFont("Regular", 18)],
++                               "itemHeight": 20
++                              }
++                      </convert>
++              </widget>
++              <widget name="Timeline" position="50,485" size="615,20" backgroundColor="#505555" pointer="750S/position_arrow.png:3,5" foregroundColor="black" />
++              <ePixmap pixmap="750S/icons/mp_buttons.png" position="275,515" size="169,30" alphatest="blend" />
++      </screen>       
++      <screen name="DVDToolbox" position="center,120"  size="560,420" title="DVD media toolbox" >
++              <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
++              <widget source="info" render="Label" position="20,50" size="520,100" font="Regular;20" />
++              <widget name="details" position="20,180" size="520,200" font="Regular;16" />
++              <widget source="space_bar" render="Progress" position="10,390" size="540,26" borderWidth="1" backgroundColor="#254f7497" />
++              <widget source="space_label" render="Label" position="20,394" size="520,22" zPosition="2" font="Regular;18" halign="center" transparent="1" foregroundColor="#000000" />
++      </screen>
++      <screen name="ProjectSettings" position="center,120" size="560,420" title="Collection settings" >
++              <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/blue.png" position="420,0" size="140,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
++              <widget source="key_blue" render="Label" position="440,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
++              <widget name="config" position="5,50" size="550,276" scrollbarMode="showOnDemand" />
++              <ePixmap pixmap="750S/div-h.png" position="0,330" zPosition="1" size="560,2" />
++              <widget source="info" render="Label" position="10,340" size="550,80" font="Regular;18" halign="center" valign="center" />
++      </screen>       
++      <screen name="TitleList" position="center,120" size="560,425" title="DVD Tool" >
++              <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/blue.png" position="420,0" size="140,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="15,0" zPosition="1" size="120,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="155,0" zPosition="1" size="120,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
++              <widget source="key_blue" render="Label" position="435,0" zPosition="1" size="120,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
++              <widget source="title_label" render="Label" position="10,48" size="540,38" font="Regular;18" transparent="1" />
++              <widget source="error_label" render="Label" position="10,48" size="540,340" zPosition="3" font="Regular;20" transparent="1" />
++              <widget source="titles" render="Listbox" scrollbarMode="showOnDemand" position="10,86" size="540,277" zPosition="3" transparent="1" >
++                      <convert type="TemplatedMultiContent">
++                              {"template": [
++                                              MultiContentEntryText(pos = (0, 0), size = (420, 20), font = 0, flags = RT_HALIGN_LEFT, text = 1), # index 1 Title,
++                                              MultiContentEntryText(pos = (0, 20), size = (328, 17), font = 1, flags = RT_HALIGN_LEFT, text = 2), # index 2 description,
++                                              MultiContentEntryText(pos = (420, 6), size = (120, 20), font = 1, flags = RT_HALIGN_RIGHT, text = 3), # index 3 begin time,
++                                              MultiContentEntryText(pos = (328, 20), size = (154, 17), font = 1, flags = RT_HALIGN_RIGHT, text = 4), # index 4 channel,
++                                              MultiContentEntryText(pos = (482, 20), size = (58, 20), font = 1, flags = RT_HALIGN_RIGHT, text = 5), # index 4 channel,
++                                      ],
++                                      "fonts": [gFont("Regular", 20), gFont("Regular", 14)],
++                                      "itemHeight": 37
++                              }
++                      </convert>
++              </widget>
++              <widget source="space_bar" render="Progress" position="10,390" size="540,26" borderWidth="1" backgroundColor="#254f7497" />
++              <widget source="space_label" render="Label" position="40,394" size="480,22" zPosition="2" font="Regular;18" halign="center" transparent="1" foregroundColor="#000000" />
++      </screen>
++      <screen name="DVDMovieSelection" position="center,120" size="560,425" title="Select a movie">
++              <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
++              <widget name="waitingtext" position="0,45" size="560,375" zPosition="4" font="Regular;22" halign="center" valign="center" />
++              <widget name="list" position="5,40" size="550,355" zPosition="2" scrollbarMode="showOnDemand" />
++              <widget name="DescriptionBorder" pixmap="750S/border_eventinfo.png" position="0,296" zPosition="1" size="560,103" transparent="1" alphatest="on" />
++              <widget source="Service" render="Label" position="5,298" zPosition="1" size="480,35" font="Regular;17" foregroundColor="#cccccc">
++                      <convert type="MovieInfo">ShortDescription</convert>
++              </widget>
++              <widget source="Service" render="Label" position="495,298" zPosition="1" size="60,22" font="Regular;17" halign="right">
++                      <convert type="ServiceTime">Duration</convert>
++                      <convert type="ClockToText">AsLength</convert>
++              </widget>
++              <widget source="Service" render="Label" position="380,317" zPosition="2" size="175,22" font="Regular;17" halign="right">
++                      <convert type="MovieInfo">RecordServiceName</convert>
++              </widget>
++              <widget source="Service" render="Label" position="5,337" zPosition="1" size="550,58" font="Regular;19">
++                      <convert type="EventName">ExtendedDescription</convert>
++              </widget>
++              <widget name="freeDiskSpace" position="10,405" size="540,20" font="Regular;19" valign="center" halign="right" />
++      </screen>       
++      <screen name="TitleProperties" position="center,120" size="560,425" title="Properties of current title" >
++              <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/blue.png" position="420,0" size="140,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget source="key_blue" render="Label" position="440,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
++              <widget source="serviceinfo" render="Label" position="10,46" size="350,144" font="Regular;18" />
++              <widget name="thumbnail" position="370,46" size="180,144" alphatest="on" />
++              <widget name="config" position="10,196" size="540,228" scrollbarMode="showOnDemand" />
++      </screen>
++      <screen name="DVDPlayer" flags="wfNoBorder" position="0,380" size="720,165" title="InfoBar" backgroundColor="transparent" >
++              <!-- Background -->
++              <ePixmap position="40,0" pixmap="750S/info-bg_mp.png" zPosition="-1" size="640,164" />
++              <!-- colorbuttons -->
++              <ePixmap position="275,125" pixmap="750S/icons/mp_buttons.png" size="169,30" alphatest="blend" />
++              <!-- Servicename -->
++              <ePixmap pixmap="750S/icons/icon_event.png" position="65,30" zPosition="1" size="15,10" alphatest="on" />
++              <widget source="session.CurrentService" render="Label" position="95,25" size="300,22" font="Regular;20" backgroundColor="#263c59" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1" noWrap="1">
++                      <convert type="ServiceName">Name</convert>
++              </widget>
++              <!-- Chapter info -->
++              <widget name="chapterLabel" position="95,50" size="360,22" font="Regular;20" foregroundColor="#c3c3c9" backgroundColor="#263c59" transparent="1" />
++              <!-- Audio track info -->
++              <ePixmap pixmap="750S/icons/icon_dolby.png" position="540,25" zPosition="1" size="26,16" alphatest="on"/>
++              <widget name="audioLabel" position="570,25" size="130,22" font="Regular;18" backgroundColor="#263c59" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1" />
++              <!-- Subtitle track info -->
++              <widget source="session.CurrentService" render="Pixmap" pixmap="750S/icons/icon_txt.png" position="540,45" zPosition="1" size="26,16" alphatest="on" >
++                      <convert type="ServiceInfo">HasTelext</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget name="subtitleLabel" position="570,45" size="130,22" font="Regular;18" backgroundColor="#263c59" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1" />
++              <!-- Angle info -->
++              <widget name="anglePix" pixmap="750S/icons/icon_view.png" position="540,70" size="26,16" alphatest="on" />
++              <widget name="angleLabel" position="570,70" size="130,22" font="Regular;18" backgroundColor="#263c59" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1" />
++              <!-- Elapsed time -->
++              <widget source="session.CurrentService" render="Label" position="40,100" size="90,20" font="Regular;18" halign="center" valign="center" backgroundColor="#06224f" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1" >
++                      <convert type="ServicePosition">Position,ShowHours</convert>
++              </widget>
++              <!-- Progressbar (movie position)-->
++              <widget source="session.CurrentService" render="PositionGauge" position="130,105" size="460,10" zPosition="2" pointer="750S/position_pointer.png:460,0" transparent="1" >
++                      <convert type="ServicePosition">Gauge</convert>
++              </widget>
++              <!-- Remaining time -->
++              <widget source="session.CurrentService" render="Label" position="590,100" size="90,20" font="Regular;18" halign="center" valign="center" backgroundColor="#06224f" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1" >
++                      <convert type="ServicePosition">Remaining,Negate,ShowHours</convert>
++              </widget>
++      </screen>       
++      <screen name="ModemSetup" position="180,100" size="320,300" title="Modem" >
++              <ePixmap pixmap="750S/buttons/green.png" position="10,10" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/red.png" position="160,10" size="140,40" alphatest="on" />
++              <widget name="key_green" position="30,10" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget name="key_red" position="180,10" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget name="list" position="10,60" size="300,120" />
++              <widget name="state" position="10,210" size="300,80" font="Regular;20" />
++      </screen>
++      <screen name="picshow" position="center,120" size="560,420" title="PicturePlayer" >
++              <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/blue.png" position="420,0" size="140,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
++              <widget source="key_blue" render="Label" position="440,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
++              <widget source="label" render="Label" position="5,55" size="350,140" font="Regular;19" backgroundColor="#25062748" transparent="1"  />
++              <widget name="thn" position="360,40" size="180,160" alphatest="on" />
++              <widget name="filelist" position="5,205" zPosition="2" size="550,210" scrollbarMode="showOnDemand" />
++      </screen>       
++      <screen name="Pic_Exif" position="center,center" size="560,360" title="Info" >
++              <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="menu" render="Listbox" position="5,50" size="550,310" scrollbarMode="showOnDemand" selectionDisabled="1" >
++                      <convert type="TemplatedMultiContent">
++                      {
++                              "template": [  MultiContentEntryText(pos = (5, 5), size = (250, 30), flags = RT_HALIGN_LEFT, text = 0), MultiContentEntryText(pos = (260, 5), size = (290, 30), flags = RT_HALIGN_LEFT, text = 1)],
++                              "fonts": [gFont("Regular", 20)],
++                              "itemHeight": 30
++                      }
++                      </convert>
++              </widget>
++      </screen>
++      <screen name="CleanupWizard" position="0,0" size="720,576" title="Welcome..." flags="wfNoBorder" >
++              <widget name="text" position="153,40" size="380,330" font="Regular;22" />
++              <widget source="list" render="Listbox" position="43,300" size="460,220" scrollbarMode="showOnDemand" >
++                      <convert type="StringList" />
++              </widget>
++              <widget name="config" position="53,340" zPosition="1" size="440,180" transparent="1" scrollbarMode="showOnDemand" />
++              <ePixmap pixmap="750S/buttons/button_red.png" position="40,222" zPosition="0" size="22,22" transparent="1" alphatest="on" />
++              <widget name="languagetext" position="66,225" size="95,30" font="Regular;18" />
++              <widget name="rc" pixmaps="750S/rc.png,750S/rcold.png" position="530,50" zPosition="10" size="154,500" alphatest="on" />
++              <widget name="arrowdown" pixmap="750S/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="on" />
++              <widget name="arrowdown2" pixmap="750S/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="on" />
++              <widget name="arrowup" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="on" />
++              <widget name="arrowup2" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="on" />
++      </screen>       
++      <screen name="CleanupWizardConfiguration" position="center,120" size="560,420" title="CleanupWizard settings" >
++              <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget name="config" zPosition="2" position="5,50" size="550,300" scrollbarMode="showOnDemand" transparent="1" />
++              <ePixmap pixmap="750S/div-h.png" position="0,370" zPosition="10" size="560,2" transparent="1" alphatest="on" />
++              <widget source="status" render="Label" position="10,380" size="540,40" zPosition="10" font="Regular;20" halign="center" valign="center" backgroundColor="#25062748" transparent="1"/>
++      </screen>
++      <screen name="CIselectMainMenu" position="center,center" size="500,250" title="CI assignment" >
++              <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget name="CiList" position="5,50" size="490,200" scrollbarMode="showOnDemand" />
++      </screen>       
++      <screen name="CIconfigMenu" position="center,120" size="560,420" title="CI assignment" >
++              <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/blue.png" position="420,0" size="140,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
++              <widget source="key_blue" render="Label" position="440,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
++              <widget source="CAidList_desc" render="Label" position="5,50" size="550,22" font="Regular;20"  backgroundColor="#25062748" transparent="1" />
++              <widget source="CAidList" render="Label" position="5,80" size="550,45" font="Regular;20"  backgroundColor="#25062748" transparent="1" />
++              <ePixmap pixmap="750S/div-h.png" position="0,125" zPosition="1" size="560,2" />
++              <widget source="ServiceList_desc" render="Label" position="5,130" size="550,22" font="Regular;20" backgroundColor="#25062748" transparent="1"  />
++              <widget name="ServiceList" position="5,160" size="550,250" zPosition="1" scrollbarMode="showOnDemand" />
++              <widget source="ServiceList_info" render="Label" position="5,160" size="550,250" zPosition="2" font="Regular;20" backgroundColor="#25062748" transparent="1"  />
++      </screen>
++      <screen name="easyCIconfigMenu" position="center,120" size="560,420" title="CI assignment" >
++              <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
++              <widget source="ServiceList_desc" render="Label" position="5,50" size="550,22" font="Regular;20" backgroundColor="#25062748" transparent="1"  />
++              <widget name="ServiceList" position="5,80" size="550,300" zPosition="1" scrollbarMode="showOnDemand" />
++              <widget source="ServiceList_info" render="Label" position="5,80" size="550,300" zPosition="2" font="Regular;20" backgroundColor="#25062748" transparent="1"  />
++      </screen>       
++      <screen name="CAidSelect" position="center,120" size="450,420" title="select CAId's" >
++              <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget name="list" position="5,50" size="440,310" scrollbarMode="showOnDemand" />
++              <ePixmap pixmap="750S/div-h.png" position="0,370" zPosition="1" size="450,2" />
++              <widget source="introduction" render="Label" position="0,380" size="450,40" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
++      </screen>
++      <screen name="myProviderSelection" position="center,120" size="560,420" title="Select provider to add...">
++              <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
++              <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
++              <widget name="list" position="5,50" size="550,310" scrollbarMode="showOnDemand" />
++              <ePixmap pixmap="750S/div-h.png" position="0,370" zPosition="1" size="560,2" />
++              <widget source="introduction" render="Label" position="0,380" size="560,40" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
++      </screen>
++      <screen name="myChannelSelection" position="center,120" size="560,420" title="Select service to add...">
++              <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/blue.png" position="420,0" size="140,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
++              <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
++              <widget name="list" position="5,50" size="550,310" scrollbarMode="showOnDemand" />
++              <ePixmap pixmap="750S/div-h.png" position="0,370" zPosition="1" size="560,2" />
++              <widget source="introduction" render="Label" position="0,380" size="560,40" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
++      </screen>
++      <screen name="CrashlogAutoSubmitConfiguration" position="center,120" size="560,420" title="CrashlogAutoSubmit settings" >
++              <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget name="config" zPosition="2" position="5,50" size="550,300" scrollbarMode="showOnDemand" transparent="1" />
++              <ePixmap pixmap="750S/div-h.png" position="0,360" zPosition="10" size="560,2" transparent="1" alphatest="on" />
++              <widget source="status" render="Label" position="10,370" size="540,40" zPosition="10" font="Regular;20" halign="center" valign="center" backgroundColor="#25062748" transparent="1"/>
++              <widget name="VKeyIcon" pixmap="750S/buttons/key_text.png" position="10,390" zPosition="10" size="35,25" transparent="1" alphatest="on" />
++              <widget name="HelpWindow" pixmap="750S/vkey_icon.png" position="160,300" zPosition="1" size="1,1" transparent="1" alphatest="on" />
++      </screen>
++      <screen name="DefaultServiceScan" position="150,115" size="420,390" title="Service Scan">
++              <widget source="FrontendInfo" render="Pixmap" pixmap="750S/icons/scan-s.png" position="5,5" size="64,64" transparent="1" alphatest="blend">
++                      <convert type="FrontendInfo">TYPE</convert>
++                      <convert type="ValueRange">0,0</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="FrontendInfo" render="Pixmap" pixmap="750S/icons/scan-c.png" position="5,5" size="64,64" transparent="1" alphatest="on">
++                      <convert type="FrontendInfo">TYPE</convert>
++                      <convert type="ValueRange">1,1</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="FrontendInfo" render="Pixmap" pixmap="750S/icons/scan-t.png" position="5,5" size="64,64" transparent="1" alphatest="on">
++                      <convert type="FrontendInfo">TYPE</convert>
++                      <convert type="ValueRange">2,2</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget name="network" position="80,15" size="330,20" font="Regular;20" />
++              <widget name="transponder" position="80,40" size="330,20" font="Regular;20" />
++              <widget name="scan_state" position="10,80" zPosition="2" size="400,20" font="Regular;18" />
++              <widget name="pass" position="10,80" size="400,20" font="Regular;18" />
++              <widget name="scan_progress" position="10,105" size="400,15" pixmap="750S/progress_big.png" borderWidth="2" borderColor="#cccccc" />
++              <widget name="servicelist" position="10,135" size="400,265" selectionDisabled="1" />
++      </screen>
++      <screen name="DiseqcTester" position="90,100" size="520,400" title="DiSEqC Tester" >
++              <!--ePixmap pixmap="750S/icons/dish_scan.png" position="5,25" zPosition="0" size="119,110" transparent="1" alphatest="on" />
++              <widget source="Frontend" render="Label" position="190,10" zPosition="2" size="260,20" font="Regular;19" halign="center" valign="center" transparent="1">
++                      <convert type="FrontendInfo">SNRdB</convert>
++              </widget>
++              <eLabel name="snr" text="SNR:" position="120,35" size="60,22" font="Regular;21" halign="right" transparent="1" />
++              <widget source="Frontend" render="Progress" position="190,35" size="260,20" pixmap="750S/bar_snr.png" borderWidth="2" borderColor="#cccccc">
++                      <convert type="FrontendInfo">SNR</convert>
++              </widget>
++              <widget source="Frontend" render="Label" position="460,35" size="60,22" font="Regular;21">
++                      <convert type="FrontendInfo">SNR</convert>
++              </widget>
++              <eLabel name="agc" text="AGC:" position="120,60" size="60,22" font="Regular;21" halign="right" transparent="1" />
++              <widget source="Frontend" render="Progress" position="190,60" size="260,20" pixmap="750S/bar_snr.png" borderWidth="2" borderColor="#cccccc">
++                      <convert type="FrontendInfo">AGC</convert>
++              </widget>
++              <widget source="Frontend" render="Label" position="460,60" size="60,22" font="Regular;21">
++                      <convert type="FrontendInfo">AGC</convert>
++              </widget>
++              <eLabel name="ber" text="BER:" position="120,85" size="60,22" font="Regular;21" halign="right" transparent="1" />
++              <widget source="Frontend" render="Progress" position="190,85" size="260,20" pixmap="750S/bar_ber.png" borderWidth="2" borderColor="#cccccc">
++                      <convert type="FrontendInfo">BER</convert>
++              </widget>
++              <widget source="Frontend" render="Label" position="460,85" size="60,22" font="Regular;21">
++                      <convert type="FrontendInfo">BER</convert>
++              </widget>
++              <eLabel name="lock" text="Lock:" position="120,115" size="60,22" font="Regular;21" halign="right" />
++              <widget source="Frontend" render="Pixmap" pixmap="750S/icons/lock_on.png" position="190,110" zPosition="1" size="38,31" alphatest="on">
++                      <convert type="FrontendInfo">LOCK</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="Frontend" render="Pixmap" pixmap="skin_default/icons/lock_off.png" position="190,110" zPosition="1" size="38,31" alphatest="on">
++                      <convert type="FrontendInfo">LOCK</convert>
++                      <convert type="ConditionalShowHide">Invert</convert>
++              </widget-->
++              <widget source="progress_list" render="Listbox" position="0,0" size="510,150" scrollbarMode="showOnDemand">
++                      <convert type="TemplatedMultiContent">
++                              {"template": [
++                                              MultiContentEntryText(pos = (10, 0), size = (330, 25), flags = RT_HALIGN_LEFT, text = 1), # index 1 is the index name,
++                                              MultiContentEntryText(pos = (330, 0), size = (150, 25), flags = RT_HALIGN_RIGHT, text = 2) # index 2 is the status,
++                                      ],
++                               "fonts": [gFont("Regular", 20)],
++                               "itemHeight": 25
++                              }
++                      </convert>
++              </widget>
++              <eLabel name="overall_progress" text="Overall progress:" position="20,162" size="480,22" font="Regular;21" halign="center" transparent="1" />
++              <widget source="overall_progress" render="Progress" position="20,192" size="480,20" borderWidth="2" backgroundColor="#254f7497" />
++              <eLabel name="overall_progress" text="Progress:" position="20,222" size="480,22" font="Regular;21" halign="center" transparent="1" />
++              <widget source="sub_progress" render="Progress" position="20,252" size="480,20" borderWidth="2" backgroundColor="#254f7497" />
++              
++              <eLabel name="" text="Failed:" position="20,282" size="140,22" font="Regular;21" halign="left" transparent="1" />
++              <widget source="failed_counter" render="Label" position="160,282" size="100,20" font="Regular;21" />
++              
++              <eLabel name="" text="Succeeded:" position="20,312" size="140,22" font="Regular;21" halign="left" transparent="1" />
++              <widget source="succeeded_counter" render="Label" position="160,312" size="100,20" font="Regular;21" />
++              
++              <eLabel name="" text="With errors:" position="20,342" size="140,22" font="Regular;21" halign="left" transparent="1" />
++              <widget source="witherrors_counter" render="Label" position="160,342" size="100,20" font="Regular;21" />
++              
++              <eLabel name="" text="Not tested:" position="20,372" size="140,22" font="Regular;21" halign="left" transparent="1" />
++              <widget source="untestable_counter" render="Label" position="160,372" size="100,20" font="Regular;21" />
++              
++              <widget source="CmdText" render="Label" position="300,282" size="180,200" font="Regular;21" />
++      </screen>
++      <screen name="DiseqcTesterNimSelection" position="160,123" size="400,330" title="Choose Tuner">
++              <widget source="nimlist" render="Listbox" position="0,0" size="380,300" scrollbarMode="showOnDemand">
++                      <convert type="TemplatedMultiContent">
++                              {"template": [
++                                              MultiContentEntryText(pos = (10, 5), size = (360, 30), flags = RT_HALIGN_LEFT, text = 1), # index 1 is the nim name,
++                                              MultiContentEntryText(pos = (50, 30), size = (320, 30), font = 1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is a description of the nim settings,
++                                      ],
++                               "fonts": [gFont("Regular", 20), gFont("Regular", 15)],
++                               "itemHeight": 70
++                              }
++                      </convert>
++              </widget>
++      </screen>       
++      <screen name="FPUpgrade" position="150,200" size="450,200" title="FP upgrade required" >
++              <widget name="text" position="0,0" size="550,50" font="Regular;20" />
++              <widget name="oldversion_label" position="10,100" size="290,25" font="Regular;20" />
++              <widget name="newversion_label" position="10,125" size="290,25" font="Regular;20" />
++              <widget name="oldversion" position="300,100" size="50,25" font="Regular;20" />
++              <widget name="newversion" position="300,125" size="50,25" font="Regular;20" />
++      </screen>
++      <screen name="SystemMessage" position="150,200" size="450,200" title="System Message" >
++              <widget source="text" position="0,0" size="450,200" font="Regular;20" halign="center" valign="center" render="Label" />
++              <ePixmap pixmap="750S/icons/input_error.png" position="5,5" size="53,53" alphatest="on" />
++      </screen>
++      <screen name="NFIDownload" position="90,95" size="560,420" title="Image download utility">
++              <ePixmap pixmap="750S/buttons/red.png" position="0,0" zPosition="0" size="140,40" transparent="1" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="140,0" zPosition="0" size="140,40" transparent="1" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/yellow.png" position="280,0" zPosition="0" size="140,40" transparent="1" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/blue.png" position="420,0" zPosition="0" size="140,40" transparent="1" alphatest="on" />
++              <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;19" valign="center" halign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;19" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;19" valign="center" halign="center" backgroundColor="#a08500" transparent="1" />
++              <widget source="key_blue" render="Label" position="440,0" zPosition="1" size="115,40" font="Regular;19" valign="center" halign="center" backgroundColor="#18188b" transparent="1" />
++              
++              <widget source="label_top" render="Label" position="10,44" size="240,20" font="Regular;16" />
++              <widget name="feedlist" position="10,66" size="250,222" scrollbarMode="showOnDemand" />
++              <widget name="destlist" position="0,66" size="260,222" scrollbarMode="showOnDemand" />
++
++              <widget source="label_bottom" render="Label" position="10,312" size="240,18" font="Regular;16"/>
++              <widget source="path_bottom" render="Label" position="10,330" size="250,42" font="Regular;18" />
++              
++              <widget source="infolabel" render="Label" position="270,44" size="280,284" font="Regular;16" />
++              <widget source="job_progressbar" render="Progress" position="10,374" size="540,26" borderWidth="1" backgroundColor="#254f7497" />
++              <widget source="job_progresslabel" render="Label" position="130,378" zPosition="2" font="Regular;18" halign="center" transparent="1" size="300,22" foregroundColor="#000000" />
++              <widget source="statusbar" render="Label" position="10,404" size="540,16" font="Regular;16" foregroundColor="#cccccc" />
++      </screen>
++      <screen name="NFIFlash" position="90,95" size="560,420" title="Image flash utility">
++              <ePixmap pixmap="750S/buttons/green.png" position="140,0" zPosition="0" size="140,40" transparent="1" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/yellow.png" position="280,0" zPosition="0" size="140,40" transparent="1" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/blue.png" position="420,0" zPosition="0" size="140,40" transparent="1" alphatest="on" />
++              <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#a08500" transparent="1" />
++              <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#18188b" transparent="1" />
++              <widget source="listlabel" render="Label" position="16,44" size="200,21" valign="center" font="Regular;18" />
++              <widget name="filelist" position="0,68" size="260,260" scrollbarMode="showOnDemand" />
++              <widget source="infolabel" render="Label" position="270,44" size="280,284" font="Regular;16" />
++              <widget source="job_progressbar" render="Progress" position="10,374" size="540,26" borderWidth="1" backgroundColor="#254f7497" />
++              <widget source="job_progresslabel" render="Label" position="180,378" zPosition="2" font="Regular;18" halign="center" transparent="1" size="200,22" foregroundColor="#000000" />
++              <widget source="statusbar" render="Label" position="10,404" size="540,16" font="Regular;16" foregroundColor="#cccccc" />
++      </screen>
++      <screen name="BackupSelection" position="center,130" size="560,400" title="Select files/folders to backup">
++              <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
++              <widget name="checkList" position="5,50" size="550,250" transparent="1" scrollbarMode="showOnDemand" />
++      </screen>
++      <screen name="RestoreMenu" position="center,130" size="560,400" title="Restore backups" >
++              <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
++              <widget name="filelist" position="5,50" size="550,230" scrollbarMode="showOnDemand" />
++      </screen>
++      <screen name="ImageWizard" position="0,0" size="720,576" title="Welcome..." flags="wfNoBorder" >
++              <widget name="text" position="153,40" size="340,330" font="Regular;22" />
++              <widget source="list" render="Listbox" position="43,340" size="490,180" scrollbarMode="showOnDemand" >
++                      <convert type="StringList" />
++              </widget>
++              <widget name="config" position="53,340" zPosition="1" size="440,180" transparent="1" scrollbarMode="showOnDemand" />
++              <ePixmap pixmap="750S/buttons/button_red.png" position="33,222" zPosition="0" size="22,22" transparent="1" alphatest="on" />
++              <widget name="languagetext" position="55,225" size="95,30" font="Regular;18" />
++<!--                  <widget name="wizard" pixmap="skin_default/wizard.png" position="40,50" zPosition="10" size="110,174" alphatest="on" />         -->
++              <widget name="rc" pixmaps="750S/rc.png,750S/rcold.png" position="530,50" zPosition="10" size="154,500" alphatest="blend" />
++              <widget name="arrowdown" pixmap="750S/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++              <widget name="arrowdown2" pixmap="750S/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++              <widget name="arrowup" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++              <widget name="arrowup2" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++      </screen>
++      <screen name="UpdatePluginMenu" position="center,120" size="610,410" title="Software management" >
++              <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <ePixmap pixmap="750S/border_menu_350.png" position="5,50" zPosition="1" size="350,300" transparent="1" alphatest="on" />
++              <widget source="menu" render="Listbox" position="15,60" size="330,290" scrollbarMode="showOnDemand">
++                      <convert type="TemplatedMultiContent">
++                              {"template": [
++                                              MultiContentEntryText(pos = (2, 2), size = (330, 24), flags = RT_HALIGN_LEFT, text = 1), # index 0 is the MenuText,
++                                      ],
++                              "fonts": [gFont("Regular", 22)],
++                              "itemHeight": 25
++                              }
++                      </convert>
++              </widget>
++              <widget source="menu" render="Listbox" position="360,50" size="240,300" scrollbarMode="showNever" selectionDisabled="1">
++                      <convert type="TemplatedMultiContent">
++                              {"template": [
++                                              MultiContentEntryText(pos = (2, 2), size = (240, 300), flags = RT_HALIGN_CENTER|RT_VALIGN_CENTER|RT_WRAP, text = 2), # index 2 is the Description,
++                                      ],
++                              "fonts": [gFont("Regular", 22)],
++                              "itemHeight": 300
++                              }
++                      </convert>
++              </widget>
++              <widget source="status" render="Label" position="5,360" zPosition="10" size="600,50" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
++      </screen>
++      <screen name="PluginManager" position="center,120" size="560,420" title="Extensions management" >
++              <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/blue.png" position="420,0" size="140,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
++              <widget source="key_blue" render="Label" position="440,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
++              <widget source="list" render="Listbox" position="5,50" size="550,340" scrollbarMode="showOnDemand">
++                      <convert type="TemplatedMultiContent">
++                      {"templates":
++                              {"default": (51,[
++                                              MultiContentEntryText(pos = (30, 1), size = (470, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
++                                              MultiContentEntryText(pos = (30, 25), size = (470, 24), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description
++                                              MultiContentEntryPixmapAlphaTest(pos = (475, 0), size = (48, 48), png = 5), # index 5 is the status pixmap
++                                              MultiContentEntryPixmapAlphaTest(pos = (0, 49), size = (550, 2), png = 6), # index 6 is the div pixmap
++                                      ]),
++                              "category": (40,[
++                                              MultiContentEntryText(pos = (30, 0), size = (500, 22), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
++                                              MultiContentEntryText(pos = (30, 22), size = (500, 16), font=2, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the description
++                                              MultiContentEntryPixmapAlphaTest(pos = (0, 38), size = (550, 2), png = 3), # index 3 is the div pixmap
++                                      ])
++                              },
++                              "fonts": [gFont("Regular", 22),gFont("Regular", 20),gFont("Regular", 16)],
++                              "itemHeight": 52
++                      }
++                      </convert>
++              </widget>
++              <widget source="status" render="Label" position="5,390" zPosition="10" size="540,30" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
++      </screen>
++      <screen name="PluginManagerInfo" position="center,120" size="560,420" title="Plugin manager activity information" >
++              <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget source="list" render="Listbox" position="5,60" size="550,300" scrollbarMode="showOnDemand" selectionDisabled="1">
++                      <convert type="TemplatedMultiContent">
++                              {"template": [
++                                              MultiContentEntryText(pos = (50, 0), size = (150, 26), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
++                                              MultiContentEntryText(pos = (50, 27), size = (540, 23), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the state
++                                              MultiContentEntryPixmapAlphaTest(pos = (0, 1), size = (48, 48), png = 2), # index 2 is the status pixmap
++                                              MultiContentEntryPixmapAlphaTest(pos = (0, 48), size = (550, 2), png = 3), # index 3 is the div pixmap
++                                      ],
++                              "fonts": [gFont("Regular", 24),gFont("Regular", 22)],
++                              "itemHeight": 50
++                              }
++                      </convert>
++              </widget>
++              <ePixmap pixmap="750S/div-h.png" position="0,370" zPosition="10" size="560,2" transparent="1" alphatest="on" />
++              <widget source="status" render="Label" position="5,375" zPosition="10" size="550,44" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
++      </screen>
++      <screen name="PluginManagerHelp" position="center,120" size="560,420" title="Plugin manager help" >
++              <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="list" render="Listbox" position="5,60" size="550,300" scrollbarMode="showOnDemand" selectionDisabled="1">
++                      <convert type="TemplatedMultiContent">
++                              {"template": [
++                                              MultiContentEntryText(pos = (50, 0), size = (540, 26), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
++                                              MultiContentEntryText(pos = (50, 27), size = (540, 23), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the state
++                                              MultiContentEntryPixmapAlphaTest(pos = (0, 1), size = (48, 48), png = 2), # index 2 is the status pixmap
++                                              MultiContentEntryPixmapAlphaTest(pos = (0, 48), size = (550, 2), png = 3), # index 3 is the div pixmap
++                                      ],
++                              "fonts": [gFont("Regular", 24),gFont("Regular", 22)],
++                              "itemHeight": 50
++                              }
++                      </convert>
++              </widget>
++              <ePixmap pixmap="750S/div-h.png" position="0,370" zPosition="10" size="560,2" transparent="1" alphatest="on" />
++              <widget source="status" render="Label" position="5,375" zPosition="10" size="550,44" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
++      </screen>
++      <screen name="PluginDetails" position="center,120" size="600,420" title="Plugin details" >
++              <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget source="author" render="Label" position="10,50" size="500,25" zPosition="10" font="Regular;21" transparent="1" />
++              <widget name="statuspic" position="550,40" size="48,48" alphatest="on"/>
++              <widget name="divpic" position="0,80" size="600,2" alphatest="on"/>
++              <widget name="detailtext" position="10,90" size="270,330" zPosition="10" font="Regular;21" transparent="1" halign="left" valign="top"/>
++              <widget name="screenshot" position="290,90" size="300,330" alphatest="on"/>
++      </screen>
++      <screen name="UpdatePlugin" position="center,center" size="550,200" title="Software update" >
++              <widget name="activityslider" position="0,0" size="550,5"  />
++              <widget name="slider" position="0,150" size="550,30"  />
++              <widget source="package" render="Label" position="10,30" size="540,20" font="Regular;18" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
++              <widget source="status" render="Label" position="10,60" size="540,45" font="Regular;20" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
++      </screen>
++      <screen name="IPKGMenu" position="center,130" size="560,400" title="Select upgrade source to edit." >
++              <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget name="filelist" position="5,50" size="550,340" scrollbarMode="showOnDemand" />
++      </screen>
++      <screen name="IPKGSource" position="center,center" size="560,80" title="Edit upgrade source url." >
++              <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget name="text" position="5,50" size="550,25" font="Regular;20" backgroundColor="background" foregroundColor="#cccccc" />
++      </screen>
++      <screen name="PacketManager" position="center,120" size="530,420" title="Packet manager" >
++              <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget source="list" render="Listbox" position="5,50" size="520,365" scrollbarMode="showOnDemand">
++                      <convert type="TemplatedMultiContent">
++                              {"template": [
++                                              MultiContentEntryText(pos = (5, 1), size = (440, 28), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
++                                              MultiContentEntryText(pos = (5, 26), size = (440, 20), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description
++                                              MultiContentEntryPixmapAlphaTest(pos = (445, 2), size = (48, 48), png = 4), # index 4 is the status pixmap
++                                              MultiContentEntryPixmapAlphaTest(pos = (5, 50), size = (510, 2), png = 5), # index 4 is the div pixmap
++                                      ],
++                              "fonts": [gFont("Regular", 22),gFont("Regular", 14)],
++                              "itemHeight": 52
++                              }
++                      </convert>
++              </widget>
++      </screen>
++      <screen name="IpkgInstaller" position="center,120" size="550,420" title="Install extensions" >
++              <ePixmap pixmap="750S/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget name="list" position="5,50" size="540,330" />
++              <ePixmap pixmap="750S/div-h.png" position="0,380" zPosition="10" size="560,2" transparent="1" alphatest="on" />
++              <widget source="introduction" render="Label" position="5,390" zPosition="10" size="550,30" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
++      </screen>
++      <screen name="VideoWizard" position="0,0" size="720,576" title="Welcome..." flags="wfNoBorder" >
++              <widget name="text" position="153,50" size="340,270" font="Regular;23" />
++              <widget source="list" render="Listbox" position="200,300" size="290,200" scrollbarMode="showOnDemand" >
++                      <convert type="StringList" />
++              </widget>
++              <widget name="config" position="50,300" zPosition="1" size="440,200" transparent="1" scrollbarMode="showOnDemand" />
++<!--                  <widget name="wizard" pixmap="skin_default/wizard.png" position="40,50" zPosition="10" size="110,174" transparent="1" alphatest="on"/>  -->
++              <ePixmap pixmap="750S/buttons/button_red.png" position="33,222" zPosition="0" size="22,22" transparent="1" alphatest="on" />
++              <widget name="languagetext" position="55,225" size="95,30" font="Regular;18" />
++              <widget name="portpic" position="50,300" zPosition="10" size="150,150" transparent="1" alphatest="on"/>
++              <widget name="rc" pixmaps="750S/rc.png,750S/rcold.png" position="500,50" zPosition="10" size="154,500" transparent="1" alphatest="blend"/>
++              <widget name="arrowdown" pixmap="750S/arrowdown.png" position="0,0" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++              <widget name="arrowdown2" pixmap="750S/arrowdown.png" position="0,0" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++              <widget name="arrowup" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++              <widget name="arrowup2" pixmap="750S/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++      </screen>
++      <screen name="LocationBox" position="100,75" size="540,460" >
++              <widget name="text" position="0,2" size="540,22" font="Regular;22" />
++              <widget name="target" position="0,23" size="540,22" valign="center" font="Regular;22" />
++              <widget name="filelist" position="0,55" zPosition="1" size="540,210" scrollbarMode="showOnDemand" selectionDisabled="1" />
++              <widget name="textbook" position="0,272" size="540,22" font="Regular;22" />
++              <widget name="booklist" position="5,302" zPosition="2" size="535,100" scrollbarMode="showOnDemand" />
++              <widget name="red" position="0,415" zPosition="1" size="135,40" pixmap="750S/buttons/red.png" transparent="1" alphatest="on" />
++              <widget name="key_red" position="20,415" zPosition="2" size="115,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />   
++              <widget name="green" position="135,415" zPosition="1" size="135,40" pixmap="750S/buttons/green.png" transparent="1" alphatest="on" />
++              <widget name="key_green" position="155,415" zPosition="2" size="115,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
++              <widget name="yellow" position="270,415" zPosition="1" size="135,40" pixmap="750S/buttons/yellow.png" transparent="1" alphatest="on" />
++              <widget name="key_yellow" position="290,415" zPosition="2" size="115,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
++              <widget name="blue" position="405,415" zPosition="1" size="135,40" pixmap="750S/buttons/blue.png" transparent="1" alphatest="on" />
++              <widget name="key_blue" position="425,415" zPosition="2" size="115,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />            
++      </screen>
++      <!-- LCD/OLED Screens -->
++      
++      <!-- LCD screen (channelselection) -->
++      <screen name="ChannelSelection_summary" position="0,0" size="132,64" id="1">
++              <widget source="parent.ServiceEvent" render="Label" position="6,0" size="120,25" font="Regular;14" halign="center" valign="center" >
++                      <convert type="ServiceName">Name</convert>
++              </widget>
++              <widget source="parent.ServiceEvent" render="Progress" position="16,27" size="100,5" borderWidth="1">
++                      <convert type="EventTime">Progress</convert>
++              </widget>
++              <widget source="global.CurrentTime" render="Label" position="6,32" size="90,32" font="Regular;32" halign="right" valign="top">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <widget source="global.CurrentTime" render="Label" position="100,34" zPosition="1" size="26,30" font="Regular;16" valign="top">
++                      <convert type="ClockToText">Format:%S</convert>
++              </widget>
++      </screen> 
++      <!-- Color OLED screen (ChannelSelection) -->
++      <screen name="ChannelSelection_summary" position="0,0" size="96,64" id="2">
++              <widget source="parent.ServiceEvent" render="Label" position="0,0" size="96,25" font="Regular;14" halign="center" valign="center" >
++                      <convert type="ServiceName">Name</convert>
++              </widget>
++              <widget source="parent.ServiceEvent" render="Progress" position="0,27" size="96,5" borderWidth="1" >
++                      <convert type="EventTime">Progress</convert>
++              </widget>
++              <widget source="global.CurrentTime" render="Label" position="0,32" size="96,32" font="Regular;32" halign="center" valign="center" foregroundColor="#FFFFFF" backgroundColor="#000000" >
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++      </screen>
++      <!-- LCD screen (main) -->
++      <screen name="InfoBarSummary" position="0,0" size="132,64" id="1">
++              <widget source="session.CurrentService" render="Label" position="6,0" size="120,25" font="Regular;14" halign="center" valign="center" >
++                      <convert type="ServiceName">Name</convert>
++              </widget>
++              <widget source="session.Event_Now" render="Progress" position="16,27" size="100,5" borderWidth="1">
++                      <convert type="EventTime">Progress</convert>
++              </widget>
++              <widget source="global.CurrentTime" render="Label" position="6,32" size="90,32" font="Regular;32" halign="right" valign="top">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <widget source="global.CurrentTime" render="Label" position="100,34" zPosition="1" size="26,30" font="Regular;16" valign="top">
++                      <convert type="ClockToText">Format:%S</convert>
++              </widget>
++              <widget source="session.RecordState" render="FixedLabel" text=" " position="6,30" zPosition="1" size="120,34">
++                      <convert type="ConfigEntryTest">config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean</convert>
++                      <convert type="ConditionalShowHide">Blink</convert>
++              </widget>
++      </screen>
++      <!-- Color OLED screen (main) -->
++      <screen name="InfoBarSummary" position="0,0" size="96,64" id="2">
++              <widget source="session.CurrentService" render="Label" position="0,0" size="96,25" font="Regular;14" halign="center" valign="center" >
++                      <convert type="ServiceName">Name</convert>
++              </widget>
++              <widget source="session.Event_Now" render="Progress" position="0,27" size="96,5" borderWidth="1" >
++                      <convert type="EventTime">Progress</convert>
++              </widget>
++              <widget source="global.CurrentTime" render="Label" position="0,32" size="96,32" font="Regular;32" halign="center" valign="center" foregroundColor="#FFFFFF" backgroundColor="#000000" >
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <widget source="session.RecordState" render="FixedLabel" text=" " position="0,32" zPosition="1" size="96,32">
++                      <convert type="ConfigEntryTest">config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean</convert>
++                      <convert type="ConditionalShowHide">Blink</convert>
++              </widget>
++      </screen>
++      <!-- LCD screen (movieplayer) -->
++      <screen name="InfoBarMoviePlayerSummary" position="0,0" size="132,64" id="1">
++              <widget source="session.CurrentService" render="Label" position="6,0" size="120,25" font="Regular;14" halign="center" valign="center" >
++                      <convert type="ServiceName">Name</convert>
++              </widget>
++              <widget source="session.CurrentService" render="Progress" position="16,27" size="100,5" borderWidth="1">
++                      <convert type="ServicePosition">Position</convert>
++              </widget>
++              <widget source="global.CurrentTime" render="Label" position="6,32" size="120,32" font="Regular;32" halign="center" valign="center">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <widget source="session.RecordState" render="FixedLabel" text=" " position="6,32" zPosition="1" size="120,32">
++                      <convert type="ConfigEntryTest">config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean</convert>
++                      <convert type="ConditionalShowHide">Blink</convert>
++              </widget>
++      </screen>
++      <!-- Color OLED screen (movieplayer) -->
++      <screen name="InfoBarMoviePlayerSummary" position="0,0" size="96,64" id="2">
++              <widget source="session.CurrentService" render="Label" position="0,0" size="96,25" font="Regular;14" halign="center" valign="center" >
++                      <convert type="ServiceName">Name</convert>
++              </widget>
++              <widget source="session.CurrentService" render="Progress" position="0,27" size="96,5" borderWidth="1" >
++                      <convert type="ServicePosition">Position</convert>
++              </widget>
++              <widget source="global.CurrentTime" render="Label" position="0,32" size="96,32" font="Regular;32" halign="center" valign="center" foregroundColor="#FFFFFF" backgroundColor="#000000" >
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <widget source="session.RecordState" render="FixedLabel" text=" " position="0,32" zPosition="1" size="96,32">
++                      <convert type="ConfigEntryTest">config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean</convert>
++                      <convert type="ConditionalShowHide">Blink</convert>
++              </widget>
++      </screen>
++      <!-- LCD screen (ChoiceBox) -->
++      <screen name="ChoiceBox_summary" position="0,0" size="132,64" id="1">
++              <widget source="parent.summary_list" render="Label" position="6,0" size="126,64" font="Regular;11" />
++      </screen>
++      <!-- Color OLED screen (ChoiceBox) -->
++      <screen name="ChoiceBox_summary" position="0,0" size="96,64" id="2">
++              <widget source="parent.summary_list" render="Label" position="0,0" size="96,64" font="Regular;10" />
++      </screen>       
++      <!-- LCD screen (MessageBox) -->
++      <screen name="MessageBox_summary" position="0,0" size="132,64" id="1">
++              <widget source="parent.Text" render="Label" position="0,0" size="132,52" font="Regular;11" halign="center" valign="center" />
++              <widget source="parent.selectedChoice" render="Label" position="6,50" size="120,14" font="Regular;14" halign="center" valign="center" />
++      </screen>
++      <!-- Color OLED screen (MessageBox) -->
++      <screen name="MessageBox_summary" position="0,0" size="96,64" id="2">
++              <widget source="parent.Text" render="Label" position="0,0" size="96,52" font="Regular;10" halign="center" valign="center" />
++              <widget source="parent.selectedChoice" render="Label" position="0,50" size="96,14" font="Regular;12" halign="center" valign="center" />
++      </screen>
++
++      <!-- LCD screen (menus) -->
++      <screen name="MenuSummary" position="0,0" size="132,64" id="1">
++              <widget source="parent.title" render="Label" position="6,0" size="120,32" font="Regular;14" halign="center" valign="center"/>
++              <widget source="parent.menu" render="Label" position="6,32" size="120,32" font="Regular;16" halign="center" valign="center">
++                      <convert type="StringListSelection" />
++              </widget>
++      </screen> 
++      <!-- Color OLED screen (menus) -->
++      <screen name="MenuSummary" position="0,0" size="96,64" id="2">
++              <widget source="parent.title" render="Label" position="0,0" size="96,32" font="Regular;14" halign="center" valign="center"/>
++              <widget source="parent.menu" render="Label" position="0,32" size="96,32" font="Regular;14" halign="center" valign="center">
++                      <convert type="StringListSelection" />
++              </widget>
++      </screen>       
++      <!-- LCD screen (ServiceScan) -->
++      <screen name="ServiceScanSummary" position="0,0" size="132,64" id="1">
++              <widget name="Title" position="6,4" size="120,42" font="Regular;16" transparent="1" />
++              <widget name="Service" position="6,22" size="120,26" font="Regular;12" transparent="1" />
++              <widget name="scan_progress" position="6,50" zPosition="1" borderWidth="1" size="56,12" backgroundColor="dark" />
++      </screen>
++      <!-- Color OLED screen (ServiceScan) -->
++      <screen name="ServiceScanSummary" position="0,0" size="96,64" id="2">
++              <widget name="Title" position="0,0" size="96,30" font="Regular;14" transparent="1" />
++              <widget name="Service" position="0,30" size="96,20" font="Regular;10" transparent="1" />
++              <widget name="scan_progress" position="0,50" zPosition="1" borderWidth="1" size="96,12" backgroundColor="dark" />
++      </screen>
++      <!-- LCD screen (setup) -->
++      <screen name="SetupSummary" position="0,0" size="132,64" id="1">
++              <widget source="SetupTitle" render="Label" position="6,0" size="120,16" font="Regular;12" />
++              <widget source="SetupEntry" render="Label" position="6,16" size="120,32" font="Regular;12" />
++              <widget source="SetupValue" render="Label" position="6,48" size="120,16" font="Regular;12" />
++      </screen>
++      <!-- Color OLED screen (setup) -->
++      <screen name="SetupSummary" position="0,0" size="96,64" id="2">
++              <widget source="SetupTitle" render="Label" position="0,0" size="96,16" font="Regular;10" />
++              <widget source="SetupEntry" render="Label" position="0,16" size="96,32" font="Regular;10" />
++              <widget source="SetupValue" render="Label" position="0,48" size="96,16" font="Regular;10" />
++      </screen>
++      <!-- LCD screen (misc) -->
++      <screen name="SimpleSummary" position="0,0" size="132,64" id="1">
++              <widget source="parent.Title" render="Label" position="6,0" size="120,64" font="Regular;16" halign="center" valign="center" />
++      </screen>
++      <!-- Color OLED screen (misc) -->
++      <screen name="SimpleSummary" position="0,0" size="96,64" id="2">
++              <widget source="parent.Title" render="Label" position="0,0" size="96,64" font="Regular;14" halign="center" valign="center" />
++      </screen>
++      <!-- LCD screen (standby) -->
++      <screen name="StandbySummary" position="0,0" size="132,64" id="1">
++              <widget source="global.CurrentTime" render="Label" position="6,0" size="120,64" font="Regular;40" halign="center" valign="center">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <widget source="session.RecordState" render="FixedLabel" position="6,0" zPosition="1" size="120,64" text=" ">
++                      <convert type="ConfigEntryTest">config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean</convert>
++                      <convert type="ConditionalShowHide">Blink</convert>
++              </widget>
++      </screen>
++      <!-- Color OLED screen (standby) -->
++      <screen name="StandbySummary" position="0,0" size="96,64" id="2">
++              <widget source="global.CurrentTime" render="Label" position="0,0" size="96,64" font="Regular;40" halign="center" valign="center">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <widget source="session.RecordState" render="FixedLabel" position="0,0" zPosition="1" size="96,64" text=" ">
++                      <convert type="ConfigEntryTest">config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean</convert>
++                      <convert type="ConditionalShowHide">Blink</convert>
++              </widget>
++      </screen>
++      <!-- LCD screen (JobView) -->
++      <screen name="JobView_summary" position="0,0" size="132,64" id="1">
++              <widget source="parent.summary_job_name" render="Label" position="6,4" size="120,42" font="Regular;16" />
++              <widget source="parent.summary_job_task" render="Label" position="6,22" size="120,26" font="Regular;12" />
++              <widget source="parent.summary_job_progress" render="Progress" position="6,50" size="60,12" borderWidth="1" zPosition="1" />
++              <widget source="parent.summary_job_progress" render="Label" position="66,50" size="50,12" font="Regular;12" zPosition="2" halign="center" transparent="1"  >
++                      <convert type="ProgressToText" />
++              </widget>
++      </screen>
++      <!-- Color OLED screen (JobView) -->
++      <screen name="JobView_summary" position="0,0" size="96,64" id="2">
++              <widget source="parent.summary_job_name" render="Label" position="0,4" size="96,42" font="Regular;14" />
++              <widget source="parent.summary_job_task" render="Label" position="0,22" size="96,26" font="Regular;10" />
++              <widget source="parent.summary_job_progress" render="Progress" position="0,50" size="60,12" borderWidth="1" zPosition="1" />
++              <widget source="parent.summary_job_progress" render="Label" position="60,50" size="36,12" font="Regular;10" zPosition="2" halign="center" transparent="1"  >
++                      <convert type="ProgressToText" />
++              </widget>
++      </screen>
++      <!-- LCD screen (Wizard) -->
++      <screen name="WizardSummary" position="0,0" size="132,64" id="1">
++              <widget source="text" render="Label" position="6,0" size="120,16" font="Regular;16" transparent="1" />
++              <widget source="parent.list" render="Label" position="6,18" size="120,46" font="Regular;12">
++                      <convert type="StringListSelection" />
++              </widget>
++      </screen>
++      <!-- Color OLED screen (Wizard) -->
++      <screen name="WizardSummary" position="0,0" size="96,64" id="2">
++              <widget source="text" render="Label" position="0,0" size="96,16" font="Regular;14" transparent="1" />
++              <widget source="parent.list" render="Label" position="0,18" size="96,46" font="Regular;12">
++                      <convert type="StringListSelection" />
++              </widget>
++      </screen>
++      
++      <!-- Genuine Vuplus Plugin -->
++      <screen name="VuplusAuthenticity" position="center,center" size="600,320" title="Return the Love Event (only for genuine box)">
++              <ePixmap pixmap="750S/buttons/red.png" position="140,15" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="320,15" size="140,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="145,15" zPosition="1" size="135,40" font="Regular;24" halign="center" valign="center" transparent="1" />
++              <widget source="key_green" render="Label" position="325,15" zPosition="1" size="135,40" font="Regular;24" halign="center" valign="center" transparent="1" />
++              <widget name="config" zPosition="2" position="10,70" size="580,80" scrollbarMode="showOnDemand" transparent="1" />
++              <widget name="text1" position="10,160" size="580,50" font="Regular;32" halign="center" valign="center"/>
++              <widget name="text2" position="10,220" size="580,100" font="Regular;18" halign="center" valign="center"/>
++      </screen>
++      <screen name="MessageBoxGenuine" position="center,center" size="600,10" title="Message">
++              <widget name="text" position="65,8" size="420,0" font="Regular;22" />
++              <widget name="ErrorPixmap" pixmap="750S/icons/input_error.png" position="5,5" size="53,53" alphatest="blend" />
++              <widget name="QuestionPixmap" pixmap="750S/icons/input_question.png" position="5,5" size="53,53" alphatest="blend" />
++              <widget name="InfoPixmap" pixmap="750S/icons/input_info.png" position="5,5" size="53,53" alphatest="blend" />
++              <widget name="list" position="100,100" size="380,375" transparent="1" />
++              <applet type="onLayoutFinish">
++# this should be factored out into some helper code, but currently demonstrates applets.
++from enigma import eSize, ePoint
++
++orgwidth = self.instance.size().width()
++orgpos = self.instance.position()
++textsize = self[&quot;text&quot;].getSize()
++
++# y size still must be fixed in font stuff...
++textsize = (textsize[0] + 50, textsize[1] + 50)
++offset = 0
++if self.type == self.TYPE_YESNO:
++      offset = 60
++wsizex = textsize[0] + 60
++wsizey = textsize[1] + offset
++if (280 &gt; wsizex):
++      wsizex = 280
++wsize = (wsizex, wsizey)
++
++
++# resize
++self.instance.resize(eSize(*wsize))
++
++# resize label
++self[&quot;text&quot;].instance.resize(eSize(*textsize))
++
++# move list
++listsize = (wsizex, 50)
++self[&quot;list&quot;].instance.move(ePoint(0, textsize[1]))
++self[&quot;list&quot;].instance.resize(eSize(*listsize))
++
++# center window
++newwidth = wsize[0]
++self.instance.move(ePoint(orgpos.x() + (orgwidth - newwidth)/2, orgpos.y()))
++              </applet>
++      </screen>
++
++      <!-- HDMI CEC Plugin -->
++      <screen name="HdmiCecPlugin" position="center,center" size="590,320" title="HDMI-CEC Plugin" >
++              <ePixmap pixmap="750S/buttons/red.png" position="20,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="160,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/yellow.png" position="300,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/blue.png" position="440,0" size="140,40" alphatest="on" />
++
++              <widget source="key_red" render="Label" position="25,0" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget source="key_green" render="Label" position="165,0" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget source="key_yellow" render="Label" position="305,0" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget source="key_blue" render="Label" position="445,0" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++
++              <widget name="config" zPosition="2" position="10,50" size="580,270" scrollbarMode="showOnDemand" transparent="1" />
++      </screen>
++
++      <!-- LED Brightness Setup Plugin -->
++      <screen name="LEDBrightnessSetup" position="center,center" size="560,300" title="LED Brightness Setup">
++              <ePixmap pixmap="750S/buttons/red.png" position="40,10" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="210,10" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/yellow.png" position="380,10" size="140,40" alphatest="on" />
++
++              <widget source="key_red" render="Label" position="45,10" zPosition="1" size="130,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget source="key_green" render="Label" position="215,10" zPosition="1" size="130,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget source="key_yellow" render="Label" position="385,10" zPosition="1" size="130,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++
++              <widget name="config" zPosition="2" position="5,70" size="550,200" scrollbarMode="showOnDemand" transparent="1"/>
++              <widget name="current_entry" position="130,240" size="300,30" font="Regular;18" halign="center" valign="center"/>
++      </screen>
++
++      <!-- Fancontrol Plugin -->
++      <screen name="FancontrolConfiguration" position="center,center" size="560,300" title="Standbymode Fancontrol settings" >
++              <ePixmap pixmap="750S/buttons/red.png" position="110,10" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="310,10" size="140,40" alphatest="on" />
++
++              <widget source="key_red" render="Label" position="115,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget source="key_green" render="Label" position="315,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++
++              <widget name="config" zPosition="2" position="5,70" size="550,200" scrollbarMode="showOnDemand" transparent="1" />
++      </screen>
++
++      <!-- RC Code Plugin -->
++      <screen name="RemoteControlCode" position="center,center" size="560,250" title="Remote Control System Code Setting" >
++              <ePixmap pixmap="750S/buttons/red.png" position="110,10" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="310,10" size="140,40" alphatest="on" />
++
++              <widget source="key_red" render="Label" position="115,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget source="key_green" render="Label" position="315,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++
++              <widget name="config" zPosition="2" position="5,70" size="550,200" scrollbarMode="showOnDemand" transparent="1" />
++      </screen>
++
++      <screen name="MessageBoxConfirmCode" position="center,320" size="620,10" title="Message">
++              <widget name="text" position="65,8" size="420,0" font="Regular;20" />
++              <widget name="ErrorPixmap" pixmap="750S/icons/input_error.png" position="5,5" size="53,53" alphatest="blend" />
++              <widget name="QuestionPixmap" pixmap="750S/icons/input_question.png" position="5,5" size="53,53" alphatest="blend" />
++              <widget name="InfoPixmap" pixmap="750S/icons/input_info.png" position="5,5" size="53,53" alphatest="blend" />
++              <widget name="list" position="100,100" size="380,375" transparent="1" />
++              <applet type="onLayoutFinish">
++# this should be factored out into some helper code, but currently demonstrates applets.
++from enigma import eSize, ePoint
++
++orgwidth  = self.instance.size().width()
++orgheight = self.instance.size().height()
++orgpos    = self.instance.position()
++textsize  = self[&quot;text&quot;].getSize()
++
++# y size still must be fixed in font stuff...
++textsize = (textsize[0] + 50, textsize[1] + 50)
++offset = 0
++if self.type == self.TYPE_YESNO:
++      offset = 60
++wsizex = textsize[0] + 60
++wsizey = textsize[1] + offset
++if (280 &gt; wsizex):
++      wsizex = 280
++wsize = (wsizex, wsizey)
++
++# resize
++self.instance.resize(eSize(*wsize))
++
++# resize label
++self[&quot;text&quot;].instance.resize(eSize(*textsize))
++
++# move list
++listsize = (wsizex, 50)
++self[&quot;list&quot;].instance.move(ePoint(0, textsize[1]))
++self[&quot;list&quot;].instance.resize(eSize(*listsize))
++
++# center window
++newwidth = wsize[0]
++newheight = wsize[1]
++self.instance.move(ePoint(orgpos.x() + (orgwidth - newwidth)/2, orgpos.y() + (orgheight - newheight)/2))
++              </applet>
++      </screen>
++
++      <!-- Manual Fancontrol Plugin -->
++      <screen name="ManualFancontrol" position="center,center" size="560,300" title="Fancontrol Settings in Standby mode" >
++              <ePixmap pixmap="750S/buttons/red.png" position="110,10" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="310,10" size="140,40" alphatest="on" />
++
++              <widget source="key_red" render="Label" position="115,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget source="key_green" render="Label" position="315,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++
++              <widget name="config" zPosition="2" position="5,70" size="550,200" scrollbarMode="showOnDemand" transparent="1" />
++              <widget source="current" render="Label" position="150,270" zPosition="1" size="280,30" font="Regular;20" halign="center" valign="center" />
++      </screen>
++
++      <!-- UI 3D Setup Plugin -->
++      <screen name="UI3DSetupScreen" position="center,center" size="560,300" title="UI 3D setup" >
++              <ePixmap pixmap="750S/buttons/red.png" position="110,10" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="310,10" size="140,40" alphatest="on" />
++
++              <widget source="key_red" render="Label" position="115,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget source="key_green" render="Label" position="315,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++
++              <widget name="config" zPosition="2" position="5,70" size="550,200" scrollbarMode="showOnDemand" transparent="1" />
++      </screen>
++
++      <!-- Blindscan Plugin -->
++      <screen name="Blindscan" position="center,130" size="560,390" title="Blindscan">
++              <ePixmap pixmap="750S/buttons/red.png" position="40,10" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="210,10" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/blue.png" position="380,10" size="140,40" alphatest="on" />
++
++              <widget source="key_red" render="Label" position="45,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1"/>
++              <widget source="key_green" render="Label" position="215,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1"/>
++              <widget source="key_blue" render="Label" position="385,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1"/>
++
++              <widget name="config" position="5,70" size="550,280" scrollbarMode="showOnDemand" />
++              <widget name="introduction" position="0,365" size="560,20" font="Regular;20" halign="center" />
++      </screen>
++
++      <!-- Web Browser Plugin -->
++      <screen name="BrowserLauncher" position="center,center" size="620,310" title="Web Browser">
++              <ePixmap pixmap="750S/buttons/red.png" position="10,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="158,0" size="140,40" alphatest="on" />
++
++              <widget source="key_red" render="Label" position="15,0" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget source="key_green" render="Label" position="163,0" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++
++              <widget name="config" position="0,50" size="309,100" scrollbarMode="showOnDemand" />
++              <ePixmap pixmap="rc_wb_desc.png" position="312,5" size="309,296" alphatest="on" />
++              <widget name="info" position="0,180" size="309,50" font="Regular;18" halign="center" foregroundColor="#a08500" transparent="1" />
++      </screen>
++
++      <!-- Crash Report Plugin -->
++      <screen name="CrashlogReportConfiguration" position="center,120" size="560,420" title="CrashlogReport Settings" >
++              <ePixmap pixmap="750S/buttons/red.png" position="110,10" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="310,10" size="140,40" alphatest="on" />
++
++              <widget source="key_red" render="Label" position="115,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget source="key_green" render="Label" position="315,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++
++              <widget name="config" zPosition="2" position="5,70" size="550,300" scrollbarMode="showOnDemand" transparent="1" />
++              <ePixmap pixmap="750S/div-h.png" position="0,360" zPosition="10" size="560,2" transparent="1" alphatest="on" />
++              <widget source="status" render="Label" position="10,370" size="540,40" zPosition="10" font="Regular;20" halign="center" valign="center" backgroundColor="#25062748" transparent="1"/>
++              <widget name="VKeyIcon" pixmap="750S/buttons/key_text.png" position="10,390" zPosition="10" size="35,25" transparent="1" alphatest="on" />
++              <widget name="HelpWindow" pixmap="750S/vkey_icon.png" position="160,350" zPosition="1" size="1,1" transparent="1" alphatest="on" />
++      </screen>
++
++      <!-- FPGA Upgrade Plugin -->
++      <screen name="FPGAUpgrade" position="center,120" size="560,420" title="FPGA Upgrade" >
++              <ePixmap pixmap="750S/buttons/red.png" position="40,10" size="140,40" alphatest="blend" />
++              <ePixmap pixmap="750S/buttons/green.png" position="210,10" size="140,40" alphatest="blend" />
++              <ePixmap pixmap="750S/buttons/blue.png" position="380,10" size="140,40" alphatest="blend" />
++
++              <widget source="key_red" render="Label" position="45,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1"/>
++              <widget source="key_green" render="Label" position="215,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1"/>
++              <widget source="key_blue" render="Label" position="385,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1"/>
++
++              <widget source="status" render="Label" position="15,60" zPosition="1" size="540,40" font="Regular;18" halign="left" valign="center" transparent="1" />
++              <widget name="file_list" position="0,100" size="555,320" scrollbarMode="showOnDemand" />
++        </screen>
++
++      <screen name="UpgradeStatus" position="center,center" size="450,130" title=" ">
++              <widget name="name" position="10,0" size="430,20" font="Regular;18" halign="left" valign="bottom"/>
++              <widget name="slider" position="10,25" size="430,30" borderWidth="2" borderColor="#cccccc"/>
++              <widget name="status" position="10,25" zPosition="1" size="430,30" font="Regular;18" halign="center" valign="center" foregroundColor="#9f1313" transparent="1"/>
++              <widget source="info" render="Label" position="10,70" zPosition="1" size="430,60" font="Regular;22" halign="center" valign="center" transparent="1"/>
++      </screen>
++
++      <!-- Firmware Upgrade Plugin -->
++      <screen name="FirmwareUpgrade" position="center,center" size="560,175" title="Firmware Upgrade" >
++              <ePixmap pixmap="750S/buttons/red.png" position="110,10" size="140,40" alphatest="blend" />
++              <ePixmap pixmap="750S/buttons/green.png" position="310,10" size="140,40" alphatest="blend" />
++
++              <widget source="key_red" render="Label" position="115,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget source="key_green" render="Label" position="315,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++
++              <widget name="config" zPosition="2" position="0,70" itemHeight="36" size="540,40" scrollbarMode="showOnDemand" transparent="1" />
++              <widget source="status" render="Label" position="0,100" zPosition="1" size="540,75" font="Regular;20" halign="center" valign="center" />
++        </screen>
++
++      <screen name="FUFilebrowser" position="center,center" size="500,290" title="File Browser" >
++              <ePixmap pixmap="750S/buttons/blue.png" position="5,10" size="140,40" alphatest="blend" />
++
++              <widget source="key_blue" render="Label" position="10,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1"/>
++
++              <widget name="file_list" position="0,70" size="495,160" scrollbarMode="showOnDemand" />
++              <widget source="status" render="Label" position="0,230" zPosition="1" size="490,60" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
++        </screen>
++
++      <!-- WLan Setup Plugin -->
++      <screen name="WlanSelection" position="center,120" size="510,400" title="Wireless Network Adapter Selection..." >
++              <ePixmap pixmap="750S/div-h.png" position="0,350" zPosition="1" size="560,2" />
++              <ePixmap pixmap="750S/border_menu_a.png" position="10,10" zPosition="1" size="250,300" transparent="1" alphatest="on" />
++
++              <ePixmap pixmap="750S/buttons/red.png" position="10,360" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="360,360" size="140,40" alphatest="on" />
++
++              <widget source="key_red" render="Label" position="15,360" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget source="key_green" render="Label" position="365,360" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++
++              <widget name="menulist" position="20,20" size="230,260" transparent="1" backgroundColor="#371e1c1a" zPosition="10" scrollbarMode="showOnDemand" />
++              <widget source="description" render="Label" position="305,10" size="195,300" font="Regular;19" halign="center" valign="center" />
++      </screen>
++
++      <screen name="WlanSetup" position="center,120" size="510,400" title="Wireless Network Setup Menu..." >
++              <ePixmap pixmap="750S/div-h.png" position="0,350" zPosition="1" size="560,2" />
++              <ePixmap pixmap="750S/border_menu_a.png" position="10,10" zPosition="1" size="250,300" transparent="1" alphatest="on" />
++
++              <ePixmap pixmap="750S/buttons/red.png" position="10,360" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="360,360" size="140,40" alphatest="on" />
++
++              <widget source="key_red" render="Label" position="15,360" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget source="key_green" render="Label" position="365,360" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++
++              <widget name="menulist" position="20,20" size="230,260" transparent="1" backgroundColor="#371e1c1a" zPosition="10" scrollbarMode="showOnDemand" />
++              <widget source="description" render="Label" position="305,10" size="195,300" font="Regular;19" halign="center" valign="center" />
++      </screen>
++
++      <screen name="WlanConfig" position="center,120" size="510,400" title="Wireless Network Configuration..." >
++              <ePixmap pixmap="750S/buttons/red.png" position="10,360" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="360,360" size="140,40" alphatest="on" />
++
++              <widget source="key_red" render="Label" position="15,360" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget source="key_green" render="Label" position="365,360" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++
++              <widget name="config" position="10,10" backgroundColor="#371e1c1a" transparent="1" size="480,210" scrollbarMode="showOnDemand" />
++              <ePixmap pixmap="750S/div-h.png" position="0,225" zPosition="1" size="550,2" />
++
++              <eLabel text="IP Address : " position="100,250" size="190,21" font="Regular;19" />
++              <widget source="ipaddress" render="Label" position="300,250" zPosition="1" size="150,26" font="Regular;20" halign="center" valign="center" />
++              <eLabel text="NetMask : " position="100,275" size="190,21" font="Regular;19" />
++              <widget source="netmask" render="Label" position="300,275" zPosition="1" size="150,26" font="Regular;20" halign="center" valign="center" />     
++              <eLabel text="Gateway : " position="100,300" size="190,21" font="Regular;19" />
++              <widget source="gateway" render="Label" position="300,300" zPosition="1" size="150,26" font="Regular;20" halign="center" valign="center" />
++              <widget name="VKeyIcon" pixmap="750S/buttons/key_text.png" position="460,245" zPosition="10" size="35,25" transparent="1" alphatest="on" />                  
++                <widget name="HelpWindow" pixmap="750S/vkey_icon.png" position="160,350" zPosition="1" size="1,1" transparent="1" alphatest="on" />
++      </screen>
++
++      <screen name="WlanScanAp" position="center,120" size="510,400" title="Wireless Network AP Scan..." >
++              <ePixmap pixmap="750S/div-h.png" position="0,350" zPosition="1" size="560,2" />
++              <ePixmap pixmap="750S/border_menu_a.png" position="10,10" zPosition="1" size="250,300" transparent="1" alphatest="on" />
++
++              <ePixmap pixmap="750S/buttons/red.png" position="10,360" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="185,360" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/blue.png" position="360,360" size="140,40" alphatest="on" />
++
++              <widget source="key_red" render="Label" position="15,360" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget source="key_green" render="Label" position="190,360" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget source="key_blue" render="Label" position="365,360" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++
++              <widget name="menulist" position="20,20" size="230,260" backgroundColor="#371e1c1a" transparent="1" zPosition="10" scrollbarMode="showOnDemand" />
++
++              <widget source="Address" render="Label" position="265,70" zPosition="1" size="240,30" font="Regular;18" halign="center" valign="center" />
++              <widget source="ESSID" render="Label" position="265,100" zPosition="1" size="240,30" font="Regular;18" halign="center" valign="center" />
++              <widget source="Protocol" render="Label" position="265,130" zPosition="1" size="240,30" font="Regular;18" halign="center" valign="center" />
++              <widget source="Frequency" render="Label" position="265,160" zPosition="1" size="240,40" font="Regular;18" halign="center" valign="center" />
++              <widget source="Encryption key" render="Label" position="265,200" zPosition="1" size="240,30" font="Regular;18" halign="center" valign="center" />
++              <widget source="BitRate" render="Label" position="265,220" zPosition="1" size="240,60" font="Regular;18" halign="center" valign="center" />
++      </screen>
++
++      <screen name="Wlanstatus" position="center,120" size="510,400" title="Wireless Network Status..." >
++              <widget source="status" render="Label" position="5,15" size="500,350" font="Regular;18" zPosition="1" />
++
++              <ePixmap pixmap="750S/buttons/red.png" position="190,360" size="135,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="185,360" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++      </screen>
++
++      <!-- Wireless Access Point plugin-->
++      <screen name="WirelessAccessPoint" position="center,center" size="560,450" title="Wireless Access Point Setup" >
++              <ePixmap pixmap="750S/buttons/red.png" position="110,10" size="140,40" alphatest="on" />
++              <ePixmap pixmap="750S/buttons/green.png" position="310,10" size="140,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="115,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget source="key_green" render="Label" position="315,10" zPosition="1" size="135,40" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget name="config" zPosition="2" position="5,70" size="550,270" scrollbarMode="showOnDemand" transparent="1" />
++              <widget source="current_settings" render="Label" position="10,340" size="570,20" font="Regular;19" halign="center" valign="center" transparent="1" />
++              <widget source="IPAddress_text" render="Label" position="130,370" size="190,21" font="Regular;19" transparent="1" />
++              <widget source="Netmask_text" render="Label" position="130,395" size="190,21" font="Regular;19" transparent="1" />
++              <widget source="Gateway_text" render="Label" position="130,420" size="190,21" font="Regular;19" transparent="1" />
++              <widget source="IPAddress" render="Label" position="340,370" size="240,21" font="Regular;19" transparent="1" />
++              <widget source="Netmask" render="Label" position="340,395" size="240,21" font="Regular;19" transparent="1" />
++              <widget source="Gateway" render="Label" position="340,420" size="240,21" font="Regular;19" transparent="1" />
++      </screen>"""
++</skin>
+diff --git a/data/Makefile.am b/data/Makefile.am
+index 0eaa082..869a16e 100644
+--- a/data/Makefile.am
++++ b/data/Makefile.am
+@@ -1,4 +1,4 @@
+-SUBDIRS = countries fonts defaults extensions keymaps skin_default
++SUBDIRS = countries fonts defaults extensions keymaps skin_default 750S Vu_HD
+ dist_pkgdata_DATA = \
+       defaultsatlists.xml \
+diff --git a/data/Vu_HD/Makefile.am b/data/Vu_HD/Makefile.am
+new file mode 100644
+index 0000000..dcdab6d
+--- /dev/null
++++ b/data/Vu_HD/Makefile.am
+@@ -0,0 +1,6 @@
++SUBDIRS = menu icons buttons countries
++
++installdir = $(pkgdatadir)/Vu_HD
++
++install_DATA = \
++      *.xml *.png
+diff --git a/data/Vu_HD/buttons/Makefile.am b/data/Vu_HD/buttons/Makefile.am
+new file mode 100644
+index 0000000..3da6ab8
+--- /dev/null
++++ b/data/Vu_HD/buttons/Makefile.am
+@@ -0,0 +1,6 @@
++AUTOMAKE_OPTIONS = gnu
++
++installdir = $(pkgdatadir)/Vu_HD/buttons
++
++install_DATA = \
++      *.png
+diff --git a/data/Vu_HD/countries/Makefile.am b/data/Vu_HD/countries/Makefile.am
+new file mode 100644
+index 0000000..68c6dc7
+--- /dev/null
++++ b/data/Vu_HD/countries/Makefile.am
+@@ -0,0 +1,6 @@
++AUTOMAKE_OPTIONS = gnu
++
++installdir = $(pkgdatadir)/Vu_HD/countries
++
++install_DATA = \
++      *.png
+diff --git a/data/Vu_HD/icons/Makefile.am b/data/Vu_HD/icons/Makefile.am
+new file mode 100644
+index 0000000..650c1e5
+--- /dev/null
++++ b/data/Vu_HD/icons/Makefile.am
+@@ -0,0 +1,6 @@
++AUTOMAKE_OPTIONS = gnu
++
++installdir = $(pkgdatadir)/Vu_HD/icons
++
++install_DATA = \
++      *.png
+diff --git a/data/Vu_HD/menu/Makefile.am b/data/Vu_HD/menu/Makefile.am
+new file mode 100644
+index 0000000..9d4f458
+--- /dev/null
++++ b/data/Vu_HD/menu/Makefile.am
+@@ -0,0 +1,6 @@
++AUTOMAKE_OPTIONS = gnu
++
++installdir = $(pkgdatadir)/Vu_HD/menu
++
++install_DATA = \
++      *.png
+diff --git a/data/Vu_HD/skin.xml b/data/Vu_HD/skin.xml
+new file mode 100644
+index 0000000..ccf3ae3
+--- /dev/null
++++ b/data/Vu_HD/skin.xml
+@@ -0,0 +1,3377 @@
++<skin>
++      <!-- VU+ skin (skin.xml)  -->
++      <output id="0">
++              <resolution xres="1280" yres="720" bpp="32" />
++      </output>
++      <!-- Colors (#AARRGGBB) -->
++      <colors>
++              <color name="white" value="#ffffff" />
++              <color name="black" value="#000000" />
++              <color name="dark" value="#25062748" />
++              <color name="menu" value="#25062748" />
++              <color name="red" value="#f23d21" />
++              <color name="green" value="#389416" />
++              <color name="blue" value="#0064c7" />
++              <color name="yellow" value="#bab329" />
++              <color name="transparent" value="#ffffffff" />
++              <color name="transpBlack" value="#80000000" />
++              <color name="transpWhite" value="#80ffffff" />
++              <color name="background" value="#27d8dee2" />
++              <color name="foreground" value="#1c1c1c" />
++              <color name="darkgrey" value="#279e9fa4" />             
++      </colors>
++      <!-- Main screen colors (id=0 Framebuffer) -->
++      <windowstyle type="skinned" id="0">
++              <title offset="33,14" font="Regular;20" />
++              <color name="Background" color="#279e9fa4" /> 
++              <color name="LabelForeground" color="#3c3c3c" />
++              <color name="ListboxBackground" color="#279e9fa4" />
++              <color name="ListboxForeground" color="#1c1c1c" />
++<!--          <color name="ListboxSelectedBackground" color="#11252525" />    -->
++              <color name="ListboxSelectedBackground" color="#1a53bb" />
++              <color name="ListboxSelectedForeground" color="#ffffff" />
++              <color name="ListboxMarkedBackground" color="#ff0000" />
++              <color name="ListboxMarkedForeground" color="#ffffff" />
++              <color name="ListboxMarkedAndSelectedBackground" color="#800000" />
++              <color name="ListboxMarkedAndSelectedForeground" color="#ffffff" />
++              <color name="WindowTitleForeground" color="#1c1c1c" />
++              <color name="WindowTitleBackground" color="#27dddfe1" />
++              <!-- Main screen border png's -->
++              <borderset name="bsWindow">
++                      <pixmap pos="bpTopLeft" filename="Vu_HD/b_tl.png" />
++                      <pixmap pos="bpTop" filename="Vu_HD/b_t.png"  />
++                      <pixmap pos="bpTopRight" filename="Vu_HD/b_tr.png" />
++                      <pixmap pos="bpLeft" filename="Vu_HD/b_l.png"  />
++                      <pixmap pos="bpRight" filename="Vu_HD/b_r.png"  />
++                      <pixmap pos="bpBottomLeft" filename="Vu_HD/b_bl.png" />
++                      <pixmap pos="bpBottom" filename="Vu_HD/b_b.png"  />
++                      <pixmap pos="bpBottomRight" filename="Vu_HD/b_br.png" />
++              </borderset>
++      </windowstyle>
++      <!-- Main screen colors (id=1 LCD) -->
++      <windowstyle type="skinned" id="1">
++              <color name="Background" color="#000000" />
++              <color name="LabelForeground" color="#ffffff" />
++              <color name="ListboxBackground" color="#000000" />
++              <color name="ListboxForeground" color="#ffffff" />
++              <color name="ListboxSelectedBackground" color="#000000" />
++              <color name="ListboxSelectedForeground" color="#ffffff" />
++              <color name="ListboxMarkedBackground" color="#000000" />
++              <color name="ListboxMarkedForeground" color="#ffffff" />
++              <color name="ListboxMarkedAndSelectedBackground" color="#000000" />
++              <color name="ListboxMarkedAndSelectedForeground" color="#ffffff" />
++              <color name="WindowTitleForeground" color="#ffffff" />
++              <color name="WindowTitleBackground" color="#000000" />
++      </windowstyle>
++      <!-- Fonts -->
++      <fonts>
++              <font filename="MyriadPro-Regular.otf" name="Regular" scale="100" />
++              <font filename="MyriadPro-Semibold.otf" name="Semibold" scale="100" />
++              <font filename="MyriadPro-SemiboldIt.otf" name="Semiboldit" scale="100" />
++              <font filename="lcd.ttf" name="LCD" scale="100" />
++              <font filename="ae_AlMateen.ttf" name="Replacement" scale="90" replacement="1" />
++              <font filename="tuxtxt.ttf" name="Console" scale="100" />
++              <font filename="nmsbd.ttf" name="Subtitlefont" scale="90" />
++      </fonts>
++      <subtitles>
++              <sub name="Subtitle_TTX" font="Subtitlefont;30" shadowColor="#40101010" shadowOffset="3,3" />
++              <sub name="Subtitle_Regular" font="Subtitlefont;30" foregroundColor="#DCDCDC" shadowColor="#40101010" shadowOffset="3,3" />
++              <sub name="Subtitle_Bold" font="Replacement;30" foregroundColor="#DCDCDC" shadowColor="#40101010" shadowOffset="3,3" />
++              <sub name="Subtitle_Italic" font="Subtitlefont;30" foregroundColor="#DCAAAA" shadowColor="#40101010" shadowOffset="3,3" />
++              <!-- omitting foregroundColor attribute will enable auto-assignment of color -->
++      </subtitles>
++      <!-- Main infobar -->
++      <screen name="InfoBar" flags="wfNoBorder" position="145,498" size="990,162" title="InfoBar" backgroundColor="transparent">
++              <!-- Background -->
++              <ePixmap position="0,0" zPosition="-1" size="990,162" pixmap="Vu_HD/info-bg.png" />
++              <!-- Signal Quality -->
++              <eLabel text="SNR" position="850,60" size="40,22" font="Regular;20" backgroundColor="#aeaeae" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="session.FrontendStatus" render="Label" position="890,60" size="80,22" font="Regular;20" backgroundColor="#aeaeae" foregroundColor="#1e1e1e" transparent="1">
++                      <convert type="FrontendInfo">SNRdB</convert>
++              </widget>
++              <!-- Signal Strength -->
++              <eLabel text="AGC" position="850,90" size="40,22" font="Regular;20" backgroundColor="#aeaeae" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="session.FrontendStatus" render="Label" position="890,90" size="40,22" font="Regular;20" backgroundColor="#aeaeae" foregroundColor="#1e1e1e" transparent="1">
++                      <convert type="FrontendInfo">AGC</convert>
++              </widget>
++              <!-- Bit error rate -->
++<!--          <eLabel text="BER" position="595,6" size="40,22" font="Regular;18" backgroundColor="#102e59" foregroundColor="#cccccc" shadowColor="#27384f" shadowOffset="-1,-1" transparent="1" />
++              <widget source="session.FrontendStatus" render="Label" position="640,6" size="35,22" font="Regular;18" backgroundColor="#102e59" foregroundColor="#e7e7e7" shadowColor="#27384f" shadowOffset="-1,-1" transparent="1">
++                      <convert type="FrontendInfo">BER</convert>
++              </widget>       -->
++              <!-- Service name -->
++              <widget source="session.CurrentService" render="Label" position="60,15" size="400,30" font="Semiboldit;28" valign="center" halign="left" noWrap="1" foregroundColor="#07255d" backgroundColor="#d9dee2" transparent="1">
++                      <convert type="ServiceName">Name</convert>
++              </widget>
++              <!--
++              <widget source="session.FrontendInfo" render="Pixmap" position="350,32" size="8,9" pixmap="Vu_HD/nim_active.png" alphatest="on">
++                      <convert type="FrontendInfo">NUMBER</convert>
++                      <convert type="ValueRange">2,2</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="session.FrontendInfo" render="Pixmap" position="350,45" size="8,9" pixmap="Vu_HD/nim_active.png" alphatest="on">
++                      <convert type="FrontendInfo">NUMBER</convert>
++                      <convert type="ValueRange">3,3</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              -->
++              <eLabel text="Tuner" position="845,125" size="60,20" font="Regular;20" backgroundColor="#d9dee2" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="session.TunerInfo" render="FixedLabel" text="A" position="905,125" size="30,20" font="Semibold;20" foregroundColor="#5c5c5c" backgroundColor="#d9dee2" transparent="1">
++                      <convert type="TunerInfo">TunerUseMask</convert>
++                      <convert type="ValueBitTest">1</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="session.TunerInfo" render="FixedLabel" text="B" position="917,125" size="30,20" font="Semibold;20" foregroundColor="#5c5c5c" backgroundColor="#d9dee2" transparent="1">
++                      <convert type="TunerInfo">TunerUseMask</convert>
++                      <convert type="ValueBitTest">2</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="session.TunerInfo" render="FixedLabel" text="C" position="929,125" size="30,20" font="Semibold;20" foregroundColor="#1c1c1c" backgroundColor="#d9dee2" transparent="1">
++                      <convert type="TunerInfo">TunerUseMask</convert>
++                      <convert type="ValueBitTest">4</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="session.TunerInfo" render="FixedLabel" text="D" position="941,125" size="30,20" font="Semibold;20" foregroundColor="#1c1c1c" backgroundColor="#d9dee2" transparent="1">
++                      <convert type="TunerInfo">TunerUseMask</convert>
++                      <convert type="ValueBitTest">8</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="862,18" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="882,20" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" halign="right" backgroundColor="#acacac" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <!-- tuners in use? -->
++              <widget source="session.FrontendInfo" render="FixedLabel" position="905,125" size="30,20" text="A" font="Semibold;20" foregroundColor="#1c1c1c" backgroundColor="#d9dee2" transparent="1">
++                      <convert type="FrontendInfo">NUMBER</convert>
++                      <convert type="ValueRange">0,0</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="session.FrontendInfo" render="FixedLabel" position="917,125" size="30,20" text="B" font="Semibold;20" foregroundColor="#1c1c1c" backgroundColor="#d9dee2" transparent="1">
++                      <convert type="FrontendInfo">NUMBER</convert>
++                      <convert type="ValueRange">1,1</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <!--
++              <widget source="global.CurrentTime" render="Label" position="633,6" zPosition="1" size="26,18" font="Regular;16" valign="top">
++                      <convert type="ClockToText">Format:%S</convert>
++              </widget>       -->
++              <ePixmap position="720,20" zPosition="0" size="70,20" pixmap="Vu_HD/icons/icon_crypt_off.png"  alphatest="blend" />
++              <ePixmap position="740,20" zPosition="0" size="70,20" pixmap="Vu_HD/icons/icon_txt_off.png"  alphatest="blend" />
++              <ePixmap position="770,20" zPosition="0" size="70,20" pixmap="Vu_HD/icons/icon_format_off.png"  alphatest="blend" />
++              <ePixmap position="804,20" zPosition="0" size="70,20" pixmap="Vu_HD/icons/icon_dolby_off.png"  alphatest="blend" />
++              <!-- Blinking pixmap (recording in progress?) -->
++              <ePixmap pixmap="Vu_HD/icons/icon_rec_off.png" position="680,18" size="31,20" alphatest="blend" />
++              <widget source="session.RecordState" render="Pixmap" pixmap="Vu_HD/icons/icon_rec.png" position="680,18" zPosition="1" size="31,20" alphatest="blend" >
++                      <convert type="ConditionalShowHide">Blink</convert>
++              </widget>
++              <!-- Crypt icon (encrypted service?) -->
++              <widget source="session.CurrentService" render="Pixmap" pixmap="Vu_HD/icons/icon_crypt.png" position="720,20" zPosition="1" size="11,15" alphatest="blend">
++                      <convert type="ServiceInfo">IsCrypted</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <!-- Teletext icon (is teletext available?) -->
++              <widget source="session.CurrentService" render="Pixmap" pixmap="Vu_HD/icons/icon_txt.png" position="740,20" zPosition="1" size="18,15" alphatest="blend">
++                      <convert type="ServiceInfo">HasTelext</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <!-- Videoformat icon (16:9?) -->
++              <widget source="session.CurrentService" render="Pixmap" pixmap="Vu_HD/icons/icon_format.png" position="770,20" zPosition="1" size="28,15" alphatest="blend">
++                      <convert type="ServiceInfo">IsWidescreen</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <!-- Audio icon (is there multichannel audio?) -->
++              <widget source="session.CurrentService" render="Pixmap" pixmap="Vu_HD/icons/icon_dolby.png" position="804,20" zPosition="1" size="43,15" alphatest="blend">
++                      <convert type="ServiceInfo">IsMultichannel</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <!-- Progressbar (current event duration)-->
++              <ePixmap pixmap="Vu_HD/Statusbar_white.png" position="60,65" size="100,10" transparent="1" alphatest="on" />
++              <widget source="session.Event_Now" render="Progress" pixmap="Vu_HD/progress_medium.png" position="60,65" zPosition="1" size="100,10" backgroundColor="#ffffff" transparent="1">
++                      <convert type="EventTime">Progress</convert>
++              </widget>
++              <!-- Event (now) -->
++<!--          
++              <ePixmap pixmap="Vu_HD/nim_active.png" position="182,78" size="15,10" alphatest="on" />
++-->           
++              <widget source="session.Event_Now" render="Label" position="190,60" size="70,24" font="Semibold;22" backgroundColor="#aeaeae" foregroundColor="#1c1c1c" transparent="1">
++                      <convert type="EventTime">StartTime</convert>
++                      <convert type="ClockToText">Default</convert>
++              </widget>
++              <widget source="session.Event_Now" render="Label" position="260,60" size="420,24" font="Semibold;22" noWrap="1" backgroundColor="#aeaeae" foregroundColor="#1c1c1c" transparent="1">
++                      <convert type="EventName">Name</convert>
++              </widget>
++              <widget source="session.Event_Now" render="Label" position="690,60" size="100,24" font="Semibold;22" backgroundColor="#aeaeae" foregroundColor="#1c1c1c" halign="right" transparent="1">
++                      <convert type="EventTime">Remaining</convert>
++                      <convert type="RemainingToText">InMinutes</convert>
++              </widget>
++              <!-- Event (next) -->
++              <widget source="session.Event_Next" render="Label" position="190,87" size="70,24" font="Regular;22" backgroundColor="#aeaeae" foregroundColor="#1c1c1c" transparent="1">
++                      <convert type="EventTime">StartTime</convert>
++                      <convert type="ClockToText">Default</convert>
++              </widget>
++              <widget source="session.Event_Next" render="Label" position="260,87" size="420,24" font="Regular;22" noWrap="1" backgroundColor="#aeaeae" foregroundColor="#1c1c1c" transparent="1">
++                      <convert type="EventName">Name</convert>
++              </widget>
++              <widget source="session.Event_Next" render="Label" position="690,87" size="100,24" font="Regular;22" backgroundColor="#aeaeae" foregroundColor="#1c1c1c" halign="right" transparent="1">
++                      <convert type="EventTime">Duration</convert>
++                      <convert type="ClockToText">InMinutes</convert>
++              </widget>
++              <!-- Red button (is recording possible?) -->
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="60,122" size="25,25" alphatest="blend" />
++              <widget source="RecordingPossible" render="Pixmap" pixmap="Vu_HD/buttons/red.png" position="60,122" zPosition="1" size="25,25" alphatest="blend">
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="ShowRecordOnRed" render="FixedLabel" text="Record" position="100,125" zPosition="1" size="130,22" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#d9dee2" transparent="1">
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="RecordingPossible" render="FixedLabel" text="Record" position="100,125" zPosition="1" size="130,22" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#d2dee2" transparent="1">
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <!-- Green button (is subservices available?) -->
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="250,122" size="25,25" alphatest="blend" />
++              <widget source="session.CurrentService" render="Pixmap" pixmap="Vu_HD/buttons/green.png" position="250,122" zPosition="1" size="25,25" alphatest="blend">
++                      <convert type="ServiceInfo">SubservicesAvailable</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <eLabel text="Subservices" position="290,125" size="130,22" font="Regular;20" backgroundColor="#d2dee2" transparent="1" />
++              <widget source="session.CurrentService" render="FixedLabel" text="Subservices" position="290,125" zPosition="1" size="130,22" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#d2dee2" transparent="1">
++                      <convert type="ServiceInfo">SubservicesAvailable</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <!-- Yellow button (is timeshift possible?) -->
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="440,122" size="25,25" alphatest="blend" />
++              <widget source="TimeshiftPossible" render="Pixmap" pixmap="Vu_HD/buttons/yellow.png" position="440,122" zPosition="1" size="25,25" alphatest="blend">
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="ShowTimeshiftOnYellow" render="FixedLabel" text="Timeshift" position="480,125" zPosition="1" size="130,22" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#d2dee2" transparent="1">
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="TimeshiftPossible" render="FixedLabel" text="Timeshift" position="480,125" zPosition="1" size="130,22" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#d2dee2" transparent="1">
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              
++              <!-- Yellow button (used for audio on boxes with new rc?) -->
++              <widget source="ShowAudioOnYellow" render="Pixmap" pixmap="Vu_HD/buttons/yellow.png" position="440,122" zPosition="1" size="25,25" alphatest="blend">
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="ShowAudioOnYellow" render="FixedLabel" text="Audio" position="480,125" zPosition="1" size="130,22" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#d2dee2" transparent="1">
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <!-- Blue button (is extensions available?) -->
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,122" size="25,25" alphatest="blend" />
++              <widget source="ExtensionsAvailable" render="Pixmap" pixmap="Vu_HD/buttons/blue.png" position="630,122" zPosition="1" size="25,25" alphatest="blend">
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <eLabel text="Extensions" position="670,125" size="130,22" font="Regular;20" backgroundColor="#d2dee2" transparent="1" />
++              <widget source="ExtensionsAvailable" render="FixedLabel" text="Extensions" position="670,125" zPosition="1" size="130,22" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#d2dee2" transparent="1">
++                      <convert type="ConditionalShowHide" />
++              </widget>
++      </screen>
++      <!-- Main menu -->
++      <!-- Menu screens -->
++      <screen name="menu_mainmenu" position="0,0" size="580,720" title="Main menu" flags="wfNoBorder" backgroundColor="transparent"> 
++              <ePixmap pixmap="Vu_HD/bg.png" zPosition="-1" position="60,0" size="520,720" alphatest="blend"  transparent="1" />
++<!--
++              <eLabel text=" " position="60,0" size="520,170" zPosition="-1" backgroundColor="#27cbd0d2"  />
++              <eLabel text=" " position="60,170" size="520,500" zPosition="-1" backgroundColor="#27b9bdc1" />         
++              <eLabel text=" " position="60,670" size="520,50" zPosition="-1" backgroundColor="#27cbd0d2"  />         
++-->           
++              <eLabel text="Main menu" position="110,120" size="350,38" font="Regular;38" foregroundColor="#5c5c5c" backgroundColor="#27d8dee2" transparent="1" />
++              <widget source="menu" render="Listbox" selectionPixmap="Vu_HD/buttons/FocusBar_H45.png" foregroundColor="#4c4c4c" foregroundColorSelected="#ececec" backgroundColorSelected="#271a53bb" backgroundColor="#27b9bdc1" transparent="1" position="84, 175" size="472,495" scrollbarMode="showOnDemand">
++<!--          <widget source="menu" render="Listbox" selectionPixmap="Vu_HD/FocusBar_menu01.png" foregroundColor="#4c4c4c" foregroundColorSelected="#ececec" backgroundColorSelected="#acacac" position="84,190" size="370,480" transparent="1" backgroundColor="#ececec" scrollbarMode="showNever"> -->
++                      <convert type="TemplatedMultiContent">
++                              {"template": [  MultiContentEntryText(pos = (30, 8), size = (410, 28), flags = RT_HALIGN_LEFT, text = 0  ) ],
++                               "fonts": [gFont("Regular", 28)],
++                               "itemHeight": 45
++                              }
++                      </convert>
++              </widget>
++              <widget source="menu" render="Pixmap" pixmap="Vu_HD/menu/ico_Plugin_All_title.png" position="475,70" size="88,88" alphatest="blend">
++                      <convert type="MenuEntryCompare">dvd_player</convert>
++                      <convert type="ConditionalShowHide"/>
++              </widget>
++              <widget source="menu" render="Pixmap" pixmap="Vu_HD/menu/ico_Plugin_All_title.png" position="475,70" size="88,88" alphatest="blend">
++                      <convert type="MenuEntryCompare">filecommand</convert>
++                      <convert type="ConditionalShowHide"/>
++              </widget>               
++              <widget source="menu" render="Pixmap" pixmap="Vu_HD/menu/ico_menu_Subtitles.png" position="475,70" size="88,88" alphatest="blend">
++                      <convert type="MenuEntryCompare">subtitle_selection</convert>
++                      <convert type="ConditionalShowHide"/>
++              </widget>
++              <widget source="menu" render="Pixmap" pixmap="Vu_HD/menu/ico_menu_Setup.png" position="475,70" size="88,88" alphatest="blend">
++                      <convert type="MenuEntryCompare">setup_selection</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="menu" render="Pixmap" pixmap="Vu_HD/menu/ico_menu_Standby.png" position="475,70" size="88,88" alphatest="blend">
++                      <convert type="MenuEntryCompare">standby_restart_list</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="menu" render="Pixmap" pixmap="Vu_HD/menu/ico_menu_Plugin.png" position="475,70" size="88,88" alphatest="blend">
++                      <convert type="MenuEntryCompare">plugin_selection</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="menu" render="Pixmap" pixmap="Vu_HD/menu/ico_menu_Info.png" position="475,70" size="88,88" alphatest="blend">
++                      <convert type="MenuEntryCompare">info_screen</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="menu" render="Pixmap" pixmap="Vu_HD/menu/ico_Plugin_All_title.png" position="475,70" size="88,88" alphatest="blend">
++                      <convert type="MenuEntryCompare">scart_switch</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="menu" render="Pixmap" pixmap="Vu_HD/menu/ico_menu_Timer.png" position="475,70" size="88,88" alphatest="blend">
++                      <convert type="MenuEntryCompare">timer_edit</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="menu" render="Pixmap" pixmap="Vu_HD/menu/ico_menu_Media.png" position="475,70" size="88,88" alphatest="blend">
++                      <convert type="MenuEntryCompare">media_player</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++      </screen>
++      <!-- Movieplayer infobar -->
++      <screen name="MoviePlayer" flags="wfNoBorder" position="200,516" size="880,162" title="InfoBar" backgroundColor="transparent">
++              <!-- Background -->
++              <ePixmap position="0,0" zPosition="-1" size="880,144" pixmap="Vu_HD/Bg_Media_info.png" />
++              <ePixmap position="35,18" size="37,28" pixmap="Vu_HD/menu/ico_title_media-info.png" alphatest="blend" />                
++              <!-- colorbuttons -->
++              <ePixmap position="50,75" pixmap="Vu_HD/icons/ico_player.png" size="152,18" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="770,15" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="790,17" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <!-- Servicename -->
++              <widget source="session.CurrentService" render="Label" position="85,18" size="475,30" font="Semiboldit;30" foregroundColor="#240256" backgroundColor="#27d9dee2" transparent="1">
++                      <convert type="ServiceName">Name</convert>
++              </widget>
++              <!-- movie length -->
++              <widget source="session.CurrentService" render="Label" position="700,55" size="95,24" font="Regular;18" halign="right" backgroundColor="#27aeaeae" transparent="1">
++                      <convert type="ServicePosition">Length</convert>
++              </widget>
++              <!-- Elapsed time -->
++              <widget source="session.CurrentService" render="Label" position="240,95" size="100,24" font="Semiboldit;18" halign="left" valign="center" foregroundColor="#3d0e82" backgroundColor="#27aeaeae" transparent="1">
++                      <convert type="ServicePosition">Position</convert>
++              </widget>
++              <!-- Progressbar (movie position)-->
++              <ePixmap position="240,75" size="563,18" pixmap="Vu_HD/icons/Mediaplayerbar_gray.png" alphatest="blend" />              
++              <ePixmap position="235,75" size="5,18" pixmap="Vu_HD/icons/Mediaplayerbar_purple.png" alphatest="blend" />              
++              <widget source="session.CurrentService" render="PositionGauge" position="239,68" size="563,25" zPosition="2" pointer="Vu_HD/icons/Mediaplayerbar_purple.png:563,0" transparent="1">
++                      <convert type="ServicePosition">Gauge</convert>
++              </widget>
++              <!-- Remaining time -->
++              <widget source="session.CurrentService" render="Label" position="700,95" size="95,20" font="Regular;18" halign="right" valign="center" foregroundColor="#3c3c3c" backgroundColor="#27aeaeae" transparent="1">
++                      <convert type="ServicePosition">Remaining</convert>
++              </widget>
++      </screen>
++
++      <!-- Vu_HD skin (Vu_HD.xml)  -->
++      <!-- About screen -->
++      <screen name="About" position="209,48" size="865,623" title="Serviceinfo" flags="wfNoBorder" backgroundColor="transparent">     
++              <ePixmap pixmap="Vu_HD/Bg_EPG_list.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Info.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="About" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <widget source="EnigmaVersion" render="Label" position="110,140" size="600,36" foregroundColor="#3c3c3c" backgroundColor="#27b5b9bd" font="Regular;22" transparent="1" />
++              <widget source="ImageVersion" render="Label" position="110,176" size="600,36" foregroundColor="#3c3c3c" backgroundColor="#27b5b9bd" font="Regular;22" transparent="1" />
++              <widget source="FPVersion" render="Label" position="110,212" size="600,36" foregroundColor="#3c3c3c" backgroundColor="#27b5b9bd" font="Regular;22" transparent="1" />
++              <widget source="TunerHeader" render="Label" position="110,248" size="600,36" foregroundColor="#3c3c3c" backgroundColor="#27b5b9bd" font="Regular;22" transparent="1" />
++              <widget source="Tuner0" render="Label" position="110,284" size="600,36" foregroundColor="#3c3c3c" backgroundColor="#27b5b9bd" font="Regular;22" transparent="1" />
++              <widget source="Tuner1" render="Label" position="110,320" size="600,36" foregroundColor="#3c3c3c" backgroundColor="#27b5b9bd" font="Regular;22" transparent="1" />
++              <widget source="Tuner2" render="Label" position="110,356" size="600,36" foregroundColor="#3c3c3c" backgroundColor="#27b5b9bd" font="Regular;22" transparent="1" />
++              <widget source="Tuner3" render="Label" position="110,392" size="600,36" foregroundColor="#3c3c3c" backgroundColor="#27b5b9bd" font="Regular;22" transparent="1" />
++              <widget source="HDDHeader" render="Label" position="110,428" size="600,36" foregroundColor="#3c3c3c" backgroundColor="#27b5b9bd" font="Regular;22" transparent="1" />
++              <widget source="hddA" render="Label" position="110,467" size="600,72" foregroundColor="#3c3c3c" backgroundColor="#27b5b9bd" font="Regular;22" transparent="1" />
++      </screen>
++      <!-- Adapter setup -->
++      <screen name="AdapterSetup" position="209,48" size="865,623" title="Network Setup" flags="wfNoBorder" backgroundColor="transparent">    
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Network Setup" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/blue.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_blue" render="Label" position="668,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="config" position="160,140" transparent="1" backgroundColor="#27d9dee2" size="500,125" scrollbarMode="showOnDemand" />     
++              <eLabel text=" " position="150,270" zPosition="1" size="550,2" backgroundColor="#8c8c8c"/>
++              <widget source="DNS1text" render="Label" position="160,275" size="190,21" zPosition="1" font="Regular;19" transparent="1" backgroundColor="#27d9dee2"/>
++              <widget source="DNS2text" render="Label" position="160,305" size="190,21" zPosition="1" font="Regular;19" transparent="1" backgroundColor="#27d9dee2"/>
++              <widget source="DNS1" render="Label" position="530,275" size="120,21" zPosition="1" font="Regular;17" transparent="1" backgroundColor="#27d9dee2"/>
++              <widget source="DNS2" render="Label" position="530,305" size="120,21" zPosition="1" font="Regular;17" transparent="1" backgroundColor="#27d9dee2"/>
++              <eLabel text=" " position="150,330" zPosition="1" size="550,2" backgroundColor="#8c8c8c"/>
++              
++              <widget source="introduction" render="Label" position="160,335" size="440,20" font="Regular;19" halign="center" transparent="1" backgroundColor="#27d9dee2"/>
++              <widget source="IPtext" render="Label" position="250,370" size="190,21" zPosition="1" font="Regular;19" transparent="1" backgroundColor="#27d9dee2"/>
++              <widget source="Netmasktext" render="Label" position="250,395" size="190,21" zPosition="1" font="Regular;19" transparent="1" backgroundColor="#27d9dee2"/>
++              <widget source="Gatewaytext" render="Label" position="250,420" size="190,21" zPosition="1" font="Regular;19" transparent="1" backgroundColor="#27d9dee2"/>
++              <widget source="IP" render="Label" position="450,370" size="240,21" zPosition="1" font="Regular;19" transparent="1" backgroundColor="#27d9dee2"/>
++              <widget source="Mask" render="Label" position="450,395" size="240,21" zPosition="1" font="Regular;19" transparent="1" backgroundColor="#27d9dee2"/>
++              <widget source="Gateway" render="Label" position="450,420" size="240,21" zPosition="1" font="Regular;19" transparent="1" backgroundColor="#27d9dee2"/>
++              
++              <widget source="Adaptertext" render="Label" position="200,460" size="100,21" zPosition="10" foregroundColor="#3c3c3c" backgroundColor="#27d9dee2" font="Regular;19" transparent="1" />
++              <widget source="Adapter" render="Label" position="290,460" size="300,21" zPosition="10" foregroundColor="#3c3c3c" backgroundColor="#27d9dee2" font="Regular;19" transparent="1" />
++              <widget source="introduction2" render="Label" position="260,500" size="300,20" zPosition="10" foregroundColor="#3c3c3c" backgroundColor="#27d9dee2" font="Regular;21" halign="center" transparent="1" />
++              <widget name="VKeyIcon" pixmap="Vu_HD/buttons/key_text.png" position="160,510" zPosition="10" size="35,25" transparent="1" alphatest="on" />
++              <widget name="HelpWindow" pixmap="Vu_HD/vkey_icon.png" position="310,445" zPosition="1" size="1,1" transparent="1" alphatest="on" />
++      </screen>
++      <screen name="AdapterSetupConfiguration" position="209,48" size="865,623" title="Network Configuration..." flags="wfNoBorder" backgroundColor="transparent">    
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Network Configuration..." position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <ePixmap pixmap="Vu_HD/border_menu.png" position="120,140" zPosition="-1" size="342,358" transparent="1" alphatest="blend" />
++              <widget name="menulist" position="130,150" size="322,338" transparent="1" backgroundColor="#27d9dee2" zPosition="10" scrollbarMode="showOnDemand" />
++              <widget source="description" render="Label" position="500,140" size="280,360" font="Regular;19" halign="center" valign="center" backgroundColor="#c5c9cc" transparent="1"/>
++              <widget source="IFtext" render="Label" position="170,520" size="100,22" zPosition="10" foregroundColor="#3c3c3c" backgroundColor="#27aeaeae" font="Regular;20" transparent="1" />
++              <widget source="IF" render="Label" position="280,520" size="300,22" zPosition="10" foregroundColor="#3c3c3c" backgroundColor="#27aeaeae" font="Regular;20" transparent="1" />
++              <widget source="Statustext" render="Label" position="500,100" size="150,25" zPosition="10" font="Regular;20" halign="center" valign="right" backgroundColor="#c5c9cc" foregroundColor="#1c1c1c" transparent="1"/>
++              <widget name="statuspic" pixmaps="Vu_HD/buttons/green.png,Vu_HD/buttons/button_off.png" position="630,98" zPosition="10" size="25,25" transparent="1" alphatest="blend"/>
++      </screen>
++      <!-- Audio selection -->
++      <screen name="AudioSelection" position="center,center" size="560,330" title="Audio">
++              <widget name="config" position="50,10" size="500,110" scrollbarMode="showOnDemand" />
++              
++              <widget source="key_red" render="Pixmap" pixmap="Vu_HD/buttons/red.png" position="10,10" size="25,25" alphatest="on">
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="key_green" render="Pixmap" pixmap="Vu_HD/buttons/green.png" position="10,35" size="25,25" alphatest="on">
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="key_yellow" render="Pixmap" pixmap="Vu_HD/buttons/yellow.png" position="10,60" size="25,25" alphatest="on">
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="key_blue" render="Pixmap" pixmap="Vu_HD/buttons/blue.png" position="10,85" size="25,25" alphatest="on">
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              
++              <widget source="streams" render="Listbox" scrollbarMode="showOnDemand" position="10,120" size="540,200" zPosition="3" transparent="1" >
++                      <convert type="TemplatedMultiContent">
++                              {"templates":
++                                      {"default": (25, [ 
++                                              MultiContentEntryText(pos = (0, 0),   size = (35, 25),  font = 0, flags = RT_HALIGN_LEFT,  text = 1), # key,
++                                              MultiContentEntryText(pos = (40, 0),  size = (60, 25),  font = 0, flags = RT_HALIGN_LEFT,  text = 2), # number,
++                                              MultiContentEntryText(pos = (110, 0), size = (120, 25), font = 0, flags = RT_HALIGN_LEFT,  text = 3), # description,
++                                              MultiContentEntryText(pos = (240, 0), size = (200, 25), font = 0, flags = RT_HALIGN_LEFT,  text = 4), # language,
++                                              MultiContentEntryText(pos = (450, 4), size = (90, 25),  font = 1, flags = RT_HALIGN_RIGHT, text = 5), # selection,
++                                      ], True, "showNever"),
++                                      "notselected": (25, [ 
++                                              MultiContentEntryText(pos = (0, 0),   size = (35, 25),  font = 0, flags = RT_HALIGN_LEFT,  text = 1), # key,
++                                              MultiContentEntryText(pos = (40, 0),  size = (60, 25),  font = 0, flags = RT_HALIGN_LEFT,  text = 2), # number,
++                                              MultiContentEntryText(pos = (110, 0), size = (120, 25), font = 0, flags = RT_HALIGN_LEFT,  text = 3), # description,
++                                              MultiContentEntryText(pos = (240, 0), size = (200, 25), font = 0, flags = RT_HALIGN_LEFT,  text = 4), # language,
++                                              MultiContentEntryText(pos = (450, 4), size = (90, 25),  font = 1, flags = RT_HALIGN_RIGHT, text = 5), # selection,
++                                      ], False, "showNever")
++                                      },
++                              "fonts": [gFont("Regular", 20), gFont("Regular", 16)],
++                              "itemHeight": 25
++                              }
++                      </convert>
++              </widget>
++      </screen>
++      <!-- Bouquet selector -->
++      <screen name="BouquetSelector" position="center,center" size="300,240" title="Choose bouquet">
++              <widget name="menu" position="10,10" transparent="1" size="290,225" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Channel context menu -->
++      <screen name="ChannelContextMenu" position="0,0" size="1280,720" zPosition="2" title="Channellist menu" flags="wfNoBorder" backgroundColor="transparent">
++              <ePixmap pixmap="Vu_HD/Bg_Subtitle.png" position="280,90" size="520,538" zPosition="-1" alphatest="on" />
++              <eLabel text="Channellist menu" position="349,135" size="400,32" font="Semiboldit;32" foregroundColor="#4c4c4c" backgroundColor="#27b5b9bd" transparent="1" />
++              <widget name="menu" position="295,173" itemHeight="42" selectionPixmap="Vu_HD/buttons/FocusBar_H42.png" transparent="1" zPosition="1" size="490,420" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Channel selection - TV -->
++      <screen name="ChannelSelection" position="145, 55" size="990,610" flags="wfNoBorder" backgroundColor="transparent">
++              <ePixmap pixmap="Vu_HD/Bg_List.png" position="0,0" size="990,610" zPosition="-1" alphatest="on"  transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/ico_Chlist_title.png" position="44,37" size="38,34" alphatest="blend"  transparent="1" />
++              <widget source="Title" render="Label" position="95,40" size="700,32" zPosition="3" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27d8dee2" transparent="1" />
++<!--          <widget name="etitle" position="95,43" size="450,32" font="Semiboldit;32" halign="left" foregroundColor="#5d5d5d" backgroundColor="#27d8dee2" transparent="1" />-->
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="44,82" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="271,82" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="498,82" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/blue.png" position="725,82" size="25,25" alphatest="blend" />
++              <widget name="key_red" position="89,84" zPosition="1" size="182,20" font="Regular;20" halign="left" valign="center" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" transparent="1" />
++              <widget name="key_green" position="316,84" zPosition="1" size="182,20" font="Regular;20" halign="left" valign="center" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" transparent="1" />
++              <widget name="key_yellow" position="543,84" zPosition="1" size="182,20" font="Regular;20" halign="left" valign="center" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" transparent="1" />
++              <widget name="key_blue" position="770,84" zPosition="1" size="182,20" font="Regular;20" halign="left" valign="center" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" transparent="1" />
++              <widget name="list" position="30,127" size="615,462" zPosition="3" scrollbarMode="showOnDemand" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" selectionPixmap="Vu_HD/buttons/FocusBar_H42.png" foregroundColorServiceNotAvail="#6c6c6c" serviceItemHeight="42" serviceNumberFont="Regular;24" serviceNameFont="Regular;24" serviceInfoFont="Semibold;21" transparent="1" />
++              <eLabel text=" " backgroundColor="#9c9c9c" position="655,127" size="2,450" />
++              <widget source="ServiceEvent" render="Label" position="670,130" zPosition="1" size="300,24" foregroundColor="#07255d" backgroundColor="#27d8dee2" font="Semibold;24" noWrap="1" transparent="1">
++                      <convert type="EventName">Name</convert>
++              </widget>
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="880,50" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="900,52" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d8dee2" halign="right" transparent="1">
++                      <convert type="ClockToText"></convert>
++              </widget>
++              <widget source="ServiceEvent" render="Label" position="670,160" zPosition="1" size="300,24" font="Regular;24" foregroundColor="#07255d" backgroundColor="#27d8dee2" halign="left" noWrap="1" transparent="1">
++                      <convert type="ServiceName">Name</convert>
++              </widget>
++              <widget source="ServiceEvent" render="Label" position="670,190" zPosition="1" size="50,22" font="Regular;20" foregroundColor="#07255d" backgroundColor="#27d8dee2"  transparent="1">
++                      <convert type="EventTime">StartTime</convert>
++                      <convert type="ClockToText"></convert>
++              </widget>
++              <widget source="ServiceEvent" render="Label" position="725,190" zPosition="1" size="70,22" font="Regular;20" foregroundColor="#07255d" backgroundColor="#27d8dee2"  transparent="1">
++                      <convert type="EventTime">EndTime</convert>
++                      <convert type="ClockToText">Format:- %H:%M</convert>
++              </widget>
++              <widget source="ServiceEvent" render="Progress" position="835,195" zPosition="1" pixmap="Vu_HD/progress_medium.png" size="124,10" backgroundColor="#ffffff" >
++                      <convert type="EventTime">Progress</convert>
++              </widget>
++              <widget source="ServiceEvent" render="Label" position="670,220" zPosition="1" size="300,360" font="Regular;20" foregroundColor="#273c3c3c" backgroundColor="#27d8dee2"  transparent="1">
++                      <convert type="EventName">ExtendedDescription</convert>
++              </widget>
++      </screen>
++      <!-- Channel selection - Radio -->
++      <screen name="ChannelSelectionRadio" position="145, 55" size="990,610" zPosition="-10" flags="wfNoBorder" backgroundColor="transparent">
++              <ePixmap pixmap="Vu_HD/Bg_List.png" position="0,0" size="990,610" zPosition="-10" alphatest="on"  transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/ico_Radio_title.png" position="44,37" size="38,34" alphatest="blend"  transparent="1" />
++              <widget source="Title" render="Label" position="95,40" size="700,32" zPosition="3" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27d8dee2" transparent="1" />
++<!--          <widget name="etitle" position="95,43" size="450,32" font="Semiboldit;32" halign="left" foregroundColor="#5d5d5d" backgroundColor="#27d8dee2" transparent="1" />-->
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="44,82" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="271,82" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="498,82" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/blue.png" position="725,82" size="25,25" alphatest="blend" />
++              <widget name="key_red" position="89,84" zPosition="1" size="182,20" font="Regular;20" halign="left" valign="center" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" transparent="1" />
++              <widget name="key_green" position="316,84" zPosition="1" size="182,20" font="Regular;20" halign="left" valign="center" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" transparent="1" />
++              <widget name="key_yellow" position="543,84" zPosition="1" size="182,20" font="Regular;20" halign="left" valign="center" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" transparent="1" />
++              <widget name="key_blue" position="770,84" zPosition="1" size="182,20" font="Regular;20" halign="left" valign="center" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" transparent="1" />
++              <widget name="list" position="30,127" size="615,462" zPosition="3" scrollbarMode="showOnDemand" foregroundColor="#271c1c1c" backgroundColor="#27ebebeb" selectionPixmap="Vu_HD/buttons/FocusBar_H42.png" foregroundColorServiceNotAvail="#6c6c6c" serviceItemHeight="42" serviceNumberFont="Semibold;24" serviceNameFont="Semibold;24" serviceInfoFont="Semibold;21" transparent="1" />
++              <eLabel text=" " backgroundColor="#9c9c9c" position="655,127" size="2,450" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="880,50" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="900,52" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d8dee2" halign="right" transparent="1">
++                      <convert type="ClockToText"></convert>
++              </widget>
++      </screen>
++      <!-- Choice box -->
++      <screen name="ChoiceBox" position="130,100" size="550,400" title="Input">
++              <widget name="text" position="10,10" size="550,25" font="Regular;22" transparent="1" />
++              <widget name="list" position="0,30" size="550,335" scrollbarMode="showOnDemand" transparent="1" />
++              <applet type="onLayoutFinish">
++# this should be factored out into some helper code, but currently demonstrates applets.
++from enigma import eSize, ePoint
++
++orgwidth = self.instance.size().width()
++orgpos = self.instance.position()
++textsize = self[&quot;text&quot;].getSize()
++
++# y size still must be fixed in font stuff...
++textsize = (textsize[0] + 80, textsize[1] + 80)
++count = len(self.list)
++if count &gt; 10:
++      count = 10
++offset = 25 * count
++wsizex = textsize[0] + 80
++wsizey = textsize[1] + offset + 10
++
++if (640 &gt; wsizex):
++      wsizex = 640
++wsize = (wsizex, wsizey)
++
++# resize
++self.instance.resize(eSize(*wsize))
++
++# resize label
++self[&quot;text&quot;].instance.resize(eSize(*textsize))
++
++# move list
++listsize = (wsizex - 20, 25 * count)
++self[&quot;list&quot;].instance.move(ePoint(10, textsize[1]))
++self[&quot;list&quot;].instance.resize(eSize(*listsize))
++
++# center window
++newwidth = wsize[0]
++self.instance.move(ePoint((1280-wsizex)/2, (720-wsizey)/(count &gt; 7 and 2 or 3)))
++
++              </applet>
++      </screen>
++
++      <!-- Common interface -->
++      <screen name="MMIDialog" position="center,center" size="450,270">
++              <widget name="title" position="10,10" size="430,25" font="Regular;23" />
++              <widget name="subtitle" position="10,35" size="430,25" font="Regular;23" />
++              <widget name="entries" position="10,70" size="430,150" scrollbarMode="showOnDemand" />
++              <widget name="bottom" position="10,230" size="430,25" font="Regular;23" />
++      </screen>
++      <!-- Common interface - selection -->
++      <screen name="CiSelection" position="center,center" size="440,160" title="Common Interface">
++              <widget name="text" position="10,10" size="430,25" font="Regular;23" />
++              <widget name="entries" position="10,55" size="420,100" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Console -->
++      <screen name="Console" position="center,center" size="900,500" title="Command execution...">
++              <widget name="text" position="10,10" size="880,480" foregroundColor="#3c3c3c" font="Console;14" />
++      </screen>
++      <!-- Clock display -->
++      <screen name="clockDisplay" position="300,120" size="300,300">
++              <widget name="okbutton" position="10,10" size="280,40" />
++              <widget name="title" position="10,120" size="280,50" />
++              <widget name="theClock" position="10,60" size="280,50" />
++      </screen>
++      <!-- Config OSD -->
++      <screen name="configOSD" position="130,120" size="460,350" title="OSD Settings">
++              <widget name="okbutton" position="20,270" size="205,40" />
++              <widget name="txt_alpha" position="20,20" size="110,20" />
++              <widget name="sld_alpha" position="150,20" size="290,20" />
++              <widget name="txt_brightness" position="20,60" size="120,20" />
++              <widget name="sld_brightness" position="150,20" size="290,20" />
++              <widget name="txt_gamma" position="20,100" size="120,20" />
++              <widget name="sld_gamma" position="150,100" size="290,20" />
++      </screen>
++      <!-- Config test -->
++      <screen name="configTest" position="center,center" size="300,300" title="config menu">
++              <widget name="config" position="10,30" size="420,220" />
++      </screen>
++      <!-- Default wizard -->
++      <screen name="DefaultWizard" position="0,0" size="1280,720" title="Welcome..." flags="wfNoBorder" >
++                      <widget name="text" position="400,100" size="550,270" font="Regular;23" />
++                      <widget source="list" render="Listbox" transparent="1" position="150,300" size="600,300" scrollbarMode="showOnDemand" >
++                              <convert type="StringList" />
++                      </widget>
++                      <ePixmap pixmap="Vu_HD/buttons/red.png" position="150,250" size="25,25" alphatest="blend" />
++                      <widget name="languagetext" position="200,253" size="120,30" font="Regular;18" />
++                      <widget name="config" position="300,300" zPosition="1" size="400,300" transparent="1" scrollbarMode="showOnDemand" />            
++                      <widget name="rc" pixmap="Vu_HD/rc.png" position="950,150" zPosition="10" size="154,500" transparent="1" alphatest="blend"/>
++                      <widget name="arrowdown" pixmap="Vu_HD/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++                      <widget name="arrowup" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++                      <widget name="arrowup2" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++      </screen>
++      <screen name="DefaultSatLists" position="0,0" size="1280,720" title="Welcome..." flags="wfNoBorder" >
++                      <widget name="text" position="300,100" size="650,270" font="Regular;23" />
++                      <widget source="list" render="Listbox" transparent="1" position="150,300" size="600,300" scrollbarMode="showOnDemand" >
++                              <convert type="StringList" />
++                      </widget>
++                      <ePixmap pixmap="Vu_HD/buttons/red.png" position="150,250" size="25,25" alphatest="blend" />
++                      <widget name="languagetext" position="200,253" size="120,30" font="Regular;18" />
++                      <widget name="config" position="150,300" zPosition="1" size="600,300" transparent="1" scrollbarMode="showOnDemand" />            
++                      <widget name="rc" pixmap="Vu_HD/rc.png" position="950,150" zPosition="10" size="154,500" transparent="1" alphatest="blend"/>
++                      <widget name="arrowdown" pixmap="Vu_HD/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++                      <widget name="arrowup" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++                      <widget name="arrowup2" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++      </screen>
++      <screen name="DreamPackageWizard" position="0,0" size="1280,720" title="Welcome..." flags="wfNoBorder" >
++                      <widget name="text" position="300,100" size="650,270" font="Regular;23" />
++                      <widget source="list" render="Listbox" transparent="1" position="150,300" size="600,300" scrollbarMode="showOnDemand" >
++                              <convert type="StringList" />
++                      </widget>
++                      <ePixmap pixmap="Vu_HD/buttons/red.png" position="150,250" size="25,25" alphatest="blend" />
++                      <widget name="languagetext" position="200,253" size="120,30" font="Regular;18" />
++                      <widget name="config" position="150,300" zPosition="1" size="600,300" transparent="1" scrollbarMode="showOnDemand" />            
++                      <widget name="rc" pixmap="Vu_HD/rc.png" position="950,150" zPosition="10" size="154,500" transparent="1" alphatest="blend"/>
++                      <widget name="arrowdown" pixmap="Vu_HD/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++                      <widget name="arrowup" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++                      <widget name="arrowup2" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++      </screen>
++      <!-- Dish -->
++      <screen name="Dish" flags="wfNoBorder" position="300,110" size="130,160" title="Dish" zPosition="-1" backgroundColor="transparent">
++              <widget name="Dishpixmap" pixmap="Vu_HD/icons/dish.png" position="0,0" size="130,160" alphatest="off" />
++      </screen>
++      <!-- unhandled key pressed -->
++      <screen name="UnhandledKey" flags="wfNoBorder" position="1110,50" size="90,80" title="UnhandledKey" zPosition="100" backgroundColor="transparent">
++              <widget name="UnhandledKeyPixmap" pixmap="Vu_HD/unhandled-key.png" position="0,0" size="90,80" alphatest="off" />
++      </screen>
++      <!-- EPG Selection - Single -->
++      <screen name="EPGSelection" position="209,48" size="865,624" title="EPG Selection" flags="wfNoBorder" backgroundColor="transparent">    
++              <ePixmap pixmap="Vu_HD/Bg_EPG_list.png" position="0,0" size="865,624" zPosition="-1" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_EPG_title.png" position="34,45" size="45,36" alphatest="blend"  transparent="1" />
++              <eLabel text="EPG Selection" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" halign="right" backgroundColor="#27b5b9bd" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/blue.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget name="key_red" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="key_green" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="key_yellow" position="463,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="key_blue" position="658,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="list" position="40,130" size="800,468" itemHeight="36" selectionPixmap="Vu_HD/buttons/FocusBar_H36.png" transparent="1" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- EPG Selection - Multi -->
++      <screen name="EPGSelectionMulti" position="209,48" size="865,624" title="EPG Selection" flags="wfNoBorder" backgroundColor="transparent">       
++              <ePixmap pixmap="Vu_HD/Bg_EPG_list.png" position="0,0" size="865,624" zPosition="-1" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_EPG_title.png" position="34,45" size="45,36" alphatest="blend"  transparent="1" />
++              <eLabel text="EPG Selection Multi" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27b5b9bd" halign="right" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/blue.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget name="key_red" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="key_green" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="key_yellow" position="463,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="key_blue" position="658,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="now_button_sel" pixmap="Vu_HD/epg_now.png" position="50,132" zPosition="1" size="463,34" alphatest="on" />
++              <widget name="next_button_sel" pixmap="Vu_HD/epg_next.png" position="50,132" zPosition="1" size="463,34" alphatest="on" />
++              <widget name="more_button_sel" pixmap="Vu_HD/epg_more.png" position="50,132" zPosition="1" size="463,34" alphatest="on" />
++              <widget name="now_text" position="50,132" zPosition="2" size="140,34" text="NOW" font="Regular;20" halign="center" valign="center" foregroundColor="#efefef" backgroundColor="#3c3c3c" transparent="1" />
++              <widget name="next_text" position="211,132" zPosition="2" size="140,34" text="NEXT" font="Regular;20" halign="center" valign="center" foregroundColor="#efefef" backgroundColor="#3c3c3c" transparent="1" />
++              <widget name="more_text" position="370,132" zPosition="2" size="140,34" text="MORE" font="Regular;20" halign="center" valign="center" foregroundColor="#efefef" backgroundColor="#3c3c3c" transparent="1" />
++              <widget name="date" position="600,130" size="110,35" font="Regular;18" foregroundColor="#3d3d3d" backgroundColor="#27d9dee2" valign="center" halign="right" transparent="1"/>
++              <widget name="list" position="46,166" size="779,396" itemHeight="36" selectionPixmap="Vu_HD/buttons/FocusBar_H36.png" transparent="1" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Eventview -->
++      <screen name="EventView" position="209,48" size="865,623" title="Eventview" flags="wfNoBorder" backgroundColor="transparent">   
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_EPG_title.png" position="34,45" size="45,36" alphatest="blend"  transparent="1" />
++              <eLabel text="Eventview" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" halign="right" backgroundColor="#27b5b9bd" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/blue.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget name="key_red" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="key_green" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="key_yellow" position="463,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="key_blue" position="658,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="epg_description" position="40,190" size="800,418" font="Regular;22" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" transparent="1"/>
++              <widget name="datetime" position="600,150" size="130,25" font="Regular;22" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" transparent="1"/>
++              <widget name="duration" position="740,150" size="100,25" font="Regular;22" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" transparent="1"/>
++              <widget name="channel" position="40,150" size="300,25" font="Semiboldit;24" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="left"  transparent="1"/>
++      </screen>
++      <!-- Graphical Multi EPG -->
++      <screen name="GraphMultiEPG" position="209,48" size="865,624" title="Electronic Program Guide" flags="wfNoBorder" backgroundColor="transparent">        
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" position="0,0" size="865,624" zPosition="-1" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_EPG_title.png" position="34,45" size="45,36" alphatest="blend"  transparent="1" />
++              <eLabel text="Electronic Program Guide" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/blue.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget name="key_red" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="key_green" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++
++              <eLabel position="30,160" zPosition="-1" size="152,324" backgroundColor="#278c8c8c" />
++              <widget name="timeline_text" position="0,135" size="830,25" backgroundColor="#27d9dee2" transparent="1"/>
++              <widget name="list" position="30,160" size="800,324" transparent="1" backgroundColor="#27d9dee2" backgroundColorSelected="#279c9c9c" EntryBorderColor="#27727f98" EntryBackgroundColor="#27727f98" EntryBackgroundColorSelected="#27366ee0" scrollbarMode="showOnDemand" />
++              <eLabel position="30,160" size="773,1" backgroundColor="#6c6c6c" />
++              <eLabel position="30,214" size="773,1" backgroundColor="#6c6c6c" />
++              <eLabel position="30,268" size="773,1" backgroundColor="#6c6c6c" />
++              <eLabel position="30,322" size="773,1" backgroundColor="#6c6c6c" />
++              <eLabel position="30,376" size="773,1" backgroundColor="#6c6c6c" />
++              <eLabel position="30,430" size="773,1" backgroundColor="#6c6c6c" />
++              <eLabel position="30,484" size="773,1" backgroundColor="#6c6c6c" />
++              <widget name="timeline0" position="85,160" zPosition="1" size="1,324" pixmap="Vu_HD/timeline.png" />
++              <widget name="timeline1" position="85,160" zPosition="1" size="1,324" pixmap="Vu_HD/timeline.png" />
++              <widget name="timeline2" position="85,160" zPosition="1" size="1,324" pixmap="Vu_HD/timeline.png" />
++              <widget name="timeline3" position="85,160" zPosition="1" size="1,324" pixmap="Vu_HD/timeline.png" />
++              <widget name="timeline4" position="85,160" zPosition="1" size="1,324" pixmap="Vu_HD/timeline.png" />
++              <widget name="timeline5" position="85,160" zPosition="1" size="1,324" pixmap="Vu_HD/timeline.png" />
++              <widget name="timeline_now" position="80,160" zPosition="2" size="19,324" pixmap="Vu_HD/timeline-now.png" alphatest="on" />
++<!--
++              <ePixmap pixmap="Vu_HD/border_multiepg.png" position="80,167" zPosition="1" size="560,393" transparent="1" alphatest="on" />
++-->           
++              <widget source="Event" render="Label" position="40,495" zPosition="1" size="500,24" font="Semibold;24" backgroundColor="#27d9dee2" foregroundColor="#07255d" noWrap="1" transparent="1">
++                      <convert type="EventName">Name</convert>
++              </widget>
++              <widget source="Event" render="Label" position="700,490" zPosition="1" size="50,18" font="Regular;18" backgroundColor="#27d9dee2" transparent="1">
++                      <convert type="EventTime">StartTime</convert>
++                      <convert type="ClockToText"></convert>
++              </widget>
++              <widget source="Event" render="Label" position="750,490" zPosition="1" size="70,18" font="Regular;18" backgroundColor="#27d9dee2" transparent="1">
++                      <convert type="EventTime">EndTime</convert>
++                      <convert type="ClockToText">Format:- %H:%M</convert>
++              </widget>
++              <widget source="Event" render="Progress" position="680,510" zPosition="1" pixmap="Vu_HD/progress_medium.png" size="120,11" borderWidth="2" backgroundColor="#ffffff" borderColor="#cccccc" >
++                      <convert type="EventTime">Progress</convert>
++              </widget>
++              <widget source="Event" render="Label" position="540,490" zPosition="1" size="150,20" halign="right" font="Regular;18" noWrap="1" backgroundColor="#27d9dee2" transparent="1">
++                      <convert type="EventTime">StartTime</convert>
++                      <convert type="ClockToText">Format:(%A)</convert>
++              </widget>
++              <widget source="Event" render="Label" position="40,525" zPosition="1" size="780,72" font="Regular;20" foregroundColor="#3c3c3c" backgroundColor="#27d9dee2" transparent="1">
++                      <convert type="EventName">ExtendedDescription</convert>
++              </widget>
++      </screen>
++      <!-- Harddisk selection -->
++      <screen name="HarddiskSelection" position="100,80" size="520,538" title="Select HDD" flags="wfNoBorder" backgroundColor="transparent">  
++              <ePixmap pixmap="Vu_HD/Bg_Subtitle.png" position="0,0" size="520,538" zPosition="-1" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="16,36" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Select HDD" position="69,45" size="400,32" font="Semiboldit;32" foregroundColor="#4c4c4c" backgroundColor="#b5b9bd" transparent="1" />
++              <widget name="hddlist" position="10,83" itemHeight="42" size="500,275" transparent="1" />
++      </screen>
++      <!-- Harddisk setup -->
++      <screen name="HarddiskSetup" position="center,center" size="420,160" title="Harddisk">
++              <widget name="model" position="20,10" size="380,25" font="Regular;23" />
++              <widget name="capacity" position="20,40" size="380,25" font="Regular;23" />
++              <widget name="bus" position="20,70" size="380,25" font="Regular;23" />
++              <widget name="initialize" pixmap="Vu_HD/buttons/red.png" position="140,110" size="25,25" alphatest="blend" />
++              <widget name="initializetext" position="165,112" size="120,20" zPosition="1" font="Regular;20" halign="center" valign="center" transparent="1" />
++      </screen>
++      <!-- Harddisk wait -->
++      <screen name="HarddiskWait" position="center,center" size="540,60">
++              <widget name="wait" position="20,10" size="500,25" font="Regular;23" />
++      </screen>
++      <!-- Help menu -->
++      <screen name="HelpMenu" position="0,0" size="1280,720" title="Menu" flags="wfNoBorder">
++              <eLabel text="help..." position="500,60" size="280,60" font="Regular;40" />
++              <widget name="list" position="100,150" size="700,456" transparent="1" scrollbarMode="showOnDemand" />
++              <widget name="rc" pixmaps="Vu_HD/rc.png,Vu_HD/rcold.png" position="950,150" zPosition="10" size="154,500" alphatest="blend" />
++              <widget name="arrowdown" pixmap="Vu_HD/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++              <widget name="arrowdown2" pixmap="Vu_HD/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++              <widget name="arrowup" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++              <widget name="arrowup2" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++              <widget name="long_key" position="760,660" size="250,50" font="Regular;25" halign="right" foregroundColor="yellow" />
++      </screen>
++      <!-- Image Wizard -->
++      <screen name="ImageWizard" position="0,0" size="1280,720" title="Welcome..." flags="wfNoBorder" >
++                      <widget name="text" position="400,100" size="550,270" font="Regular;23" />
++                      <widget source="list" render="Listbox" transparent="1" position="150,300" size="600,300" scrollbarMode="showOnDemand" >
++                              <convert type="StringList" />
++                      </widget>
++                      <ePixmap pixmap="Vu_HD/buttons/red.png" position="150,250" size="25,25" alphatest="blend" />
++                      <widget name="languagetext" position="200,253" size="120,30" font="Regular;18" />
++                      <widget name="config" position="300,300" zPosition="1" size="400,300" transparent="1" scrollbarMode="showOnDemand" />            
++                      <widget name="rc" pixmap="Vu_HD/rc.png" position="950,150" zPosition="10" size="154,500" transparent="1" alphatest="blend"/>
++                      <widget name="arrowdown" pixmap="Vu_HD/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++                      <widget name="arrowup" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++                      <widget name="arrowup2" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++      </screen>
++      <!-- Inputbox -->
++      <screen name="InputBox" position="center,center" size="550,90" title="Input">
++              <widget name="text" position="10,20" size="550,25" font="Regular;23" />
++              <widget name="input" position="10,55" size="550,25" font="Regular;20" />
++      </screen>
++      <!-- IPKG -->
++      <screen name="Ipkg" position="center,center" size="550,200" title="Installing Software...">
++              <widget name="activityslider" position="0,0" size="550,5" pixmap="Vu_HD/progress_small.png" />
++              <widget name="package" position="10,30" size="550,20" font="Regular;18" />
++              <widget name="status" position="10,60" size="550,45" font="Regular;18" />
++              <widget name="slider" position="10,100" size="530,15" pixmap="Vu_HD/progress_big.png" borderWidth="2" borderColor="#cccccc" />
++      </screen>
++      <!-- Language selection -->
++      <screen name="LanguageSelection" position="center,80" size="520,538" title="Language selection" flags="wfNoBorder" backgroundColor="transparent">       
++              <ePixmap pixmap="Vu_HD/Bg_Subtitle.png" position="0,0" size="520,538" zPosition="-1" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="16,36" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Language selection" position="69,45" size="400,32" font="Semiboldit;32" foregroundColor="#4c4c4c" backgroundColor="#27b5b9bd" transparent="1" />
++              <widget source="languages" render="Listbox" selectionPixmap="Vu_HD/buttons/FocusBar_H42.png" position="22,84" size="475,420" scrollbarMode="showOnDemand" transparent="1">
++                      <convert type="TemplatedMultiContent">
++                              {"template": [
++                                              MultiContentEntryText(pos = (80, 11), size = (360, 20), flags = RT_HALIGN_LEFT, text = 1), # index 1 is the language name,
++                                              MultiContentEntryPixmap(pos = (10, 6), size = (45, 30), png = 2), # index 2 is the pixmap
++                                      ],
++                               "fonts": [gFont("Regular", 20)],
++                               "itemHeight": 42
++                              }
++                      </convert>
++              </widget>
++      </screen>
++      <screen name="LanguageWizard" position="0,0" size="1280,720" title="Welcome..." flags="wfNoBorder" >
++                      <widget name="text" position="300,100" size="650,270" font="Regular;23" />
++                      <widget source="languages" render="Listbox" position="150,400" size="440,210" scrollbarMode="showOnDemand" transparent="1" >
++                              <convert type="TemplatedMultiContent">
++                              {"template": [
++                                              MultiContentEntryText(pos = (80, 11), size = (200, 20), flags = RT_HALIGN_LEFT, text = 1), # index 1 is the language name,
++                                              MultiContentEntryPixmap(pos = (10, 6), size = (45, 30), png = 2), # index 2 is the pixmap
++                                      ],
++                               "fonts": [gFont("Regular", 20)],
++                               "itemHeight": 42
++                              }
++                              </convert>
++                      </widget>
++                      <widget name="rc" pixmap="Vu_HD/rc.png" position="950,150" zPosition="10" size="154,500" transparent="1" alphatest="blend"/>
++                      <widget name="arrowdown" pixmap="Vu_HD/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++                      <widget name="arrowup" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++                      <widget name="arrowup2" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++      </screen>
++      <!-- Location Box -->
++      <screen name="LocationBox" position="100,120" size="540,460" >
++              <widget name="text" position="0,2" size="540,22" font="Regular;22" />
++              <widget name="target" position="0,23" size="540,22" valign="center" font="Regular;22" />
++              <widget name="filelist" position="0,55" zPosition="1" size="540,210" scrollbarMode="showOnDemand" selectionDisabled="1" />
++              <widget name="textbook" position="0,272" size="540,22" font="Regular;22" />
++              <widget name="booklist" position="5,302" zPosition="2" size="535,100" scrollbarMode="showOnDemand" />
++              <widget name="red" position="0,415" zPosition="1" size="136,40" pixmap="Vu_HD/buttons/red.png" transparent="1" alphatest="blend" />
++              <widget name="key_red" position="20,415" zPosition="2" size="115,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />      
++              <widget name="green" position="135,415" zPosition="1" size="136,40" pixmap="Vu_HD/buttons/green.png" transparent="1" alphatest="blend" />
++              <widget name="key_green" position="155,415" zPosition="2" size="115,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
++              <widget name="yellow" position="270,415" zPosition="1" size="136,40" pixmap="Vu_HD/buttons/yellow.png" transparent="1" alphatest="blend" />
++              <widget name="key_yellow" position="290,415" zPosition="2" size="115,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
++              <widget name="blue" position="405,415" zPosition="1" size="136,40" pixmap="Vu_HD/buttons/blue.png" transparent="1" alphatest="blend" />
++              <widget name="key_blue" position="425,415" zPosition="2" size="115,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />                    
++      </screen>
++      <!-- Mediaplayer -->
++      <screen name="MediaPlayer" position="209,48" size="864,623" title="MediaPlayer" flags="wfNoBorder" backgroundColor="transparent">       
++              <ePixmap pixmap="Vu_HD/Bg_Media.png" zPosition="-1" position="0,0" size="864,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Media.png" position="41,46" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Media Player" position="90,55" size="250,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27d9dee2" transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <widget name="title" position="65,108" size="600,30" font="Semiboldit;29" valign="top" foregroundColor="#ebebeb" backgroundColor="#8c8c8c" transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" />
++              <widget name="artisttext" position="70,150" size="74,22" font="Regular;20" valign="top" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2"  transparent="1" />
++              <widget name="artist" position="150,150" size="339,22" font="Regular;20" valign="top" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" transparent="1" /> 
++              <widget name="albumtext" position="70,185" size="74,22" font="Regular;20" valign="top" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" transparent="1" />
++              <widget name="album" position="150,185" size="339,22" font="Regular;20" valign="top" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" transparent="1" />
++              <widget name="yeartext" position="470,185" size="74,22" font="Regular;20" valign="top" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" transparent="1" />
++              <widget name="year" position="545,185" size="150,22" font="Regular;20" valign="top" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" transparent="1" />
++              <widget name="genretext" position="470,150" size="74,22" font="Regular;20" valign="top" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" transparent="1" />
++              <widget name="genre" position="545,150" size="150,22" font="Regular;20" valign="top" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" transparent="1" />
++              <widget name="coverArt" pixmap="Vu_HD/no_coverArt.png" position="690,103" size="102,102" transparent="1" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/icons/mp_buttons.png" position="40,235" size="152,18" alphatest="blend" />
++<!--          <widget name="PositionGauge" position="120,493" size="500,10" pointer="Vu_HD/position_pointer.png:660,0" seek_pointer="Vu_HD/position_pointer.png:660,0" transparent="1" />-->
++              <ePixmap pixmap="Vu_HD/icons/Mediaplayerbar_gray.png" zPosition="2" position="210,235" size="563,18" alphatest="blend" />
++              <widget name="PositionGauge" zPosition="3" position="210,233" size="563,18" pointer="Vu_HD/icons/Mediaplayerbar_purple.png:563,0" seek_pointer="Vu_HD/icons/Mediaplayerbar_purple.png:563,0" transparent="1" />
++              <widget source="session.CurrentService" render="Label" position="130,254" size="120,18" foregroundColor="#3d0e82" font="Semiboldit;18" halign="right" valign="center" backgroundColor="#27d9dee2" transparent="1">
++                      <convert type="ServicePosition">Position</convert>
++              </widget>
++              <widget source="session.CurrentService" render="Label" position="735,254" size="120,18" foregroundColor="#3c3c3c" font="Semiboldit;18" halign="left" valign="center" backgroundColor="#27d9dee2" transparent="1">
++                      <convert type="ServicePosition">Remaining</convert>
++              </widget>
++              <widget name="repeat" position="785,234" size="23,20" pixmaps="Vu_HD/icons/ico_noreplay.png,Vu_HD/icons/ico_replay.png" transparent="1" alphatest="blend" />
++              <eLabel name="Filelist" position="50,300" size="110,22" text="File List" font="Semiboldit;22" foregroundColor="#3c3c3c" backgroundColor="#d9dee2" transparent="1" />
++              <widget name="filelist" position="45,335" itemHeight="36" selectionPixmap="Vu_HD/buttons/FocusBar_H36.png" transparent="1" size="365,252" scrollbarMode="showOnDemand" />
++              <eLabel name="Playlist" position="450,300" size="110,22" text="Play List" font="Semiboldit;22" foregroundColor="#3c3c3c" backgroundColor="#d9dee2" transparent="1" />
++              <widget name="playlist" position="445,335" itemHeight="36" selectionPixmap="Vu_HD/buttons/FocusBar_H36.png" transparent="1" size="365,252" scrollbarMode="showOnDemand" selectionDisabled="1" />
++              <widget name="currenttext" position="65,80" size="0,0" />
++              <widget name="titletext" position="65,80" size="0,0" />
++      </screen>
++      <!-- Menu screens -->
++      <screen name="menu_information" position="0,0" size="580,720" title="Main menu" flags="wfNoBorder" backgroundColor="transparent"> 
++              <ePixmap pixmap="Vu_HD/bg.png" zPosition="-1" position="60,0" size="520,720" alphatest="blend"  transparent="1" />
++              <widget source="title" render="Label" position="110,120" size="400,38" font="Regular;38" foregroundColor="#5c5c5c" backgroundColor="#27d8dee2" transparent="1" />
++              <ePixmap pixmap="Vu_HD/menu/ico_menu_Info.png" position="475,70" size="88,88" alphatest="blend" transparent="1" />
++              <widget source="menu" render="Listbox" selectionPixmap="Vu_HD/buttons/FocusBar_H45.png" foregroundColor="#4c4c4c" foregroundColorSelected="#ececec" backgroundColorSelected="#271a53bb" backgroundColor="#27d9dee2" transparent="1" position="84, 175" size="472,495" scrollbarMode="showOnDemand">
++<!--          <widget source="menu" render="Listbox" selectionPixmap="Vu_HD/FocusBar_menu01.png" foregroundColor="#4c4c4c" foregroundColorSelected="#ececec" backgroundColorSelected="#acacac" position="84,190" size="370,480" transparent="1" backgroundColor="#ececec" scrollbarMode="showNever"> -->
++                      <convert type="TemplatedMultiContent">
++                              {"template": [  MultiContentEntryText(pos = (30, 8), size = (410, 28), flags = RT_HALIGN_LEFT, text = 0  ) ],
++                               "fonts": [gFont("Regular", 28)],
++                               "itemHeight": 45
++                              }
++                      </convert>
++              </widget>
++      </screen>               
++      <screen name="menu_shutdown" position="0,0" size="580,720" title="Main menu" flags="wfNoBorder" backgroundColor="transparent"> 
++              <ePixmap pixmap="Vu_HD/bg.png" zPosition="-1" position="60,0" size="520,720" alphatest="blend"  transparent="1" />
++              <widget source="title" render="Label" position="110,120" size="400,38" font="Regular;38" foregroundColor="#5c5c5c" backgroundColor="#27d8dee2" transparent="1" />
++              <ePixmap pixmap="Vu_HD/menu/ico_menu_Standby.png" position="475,70" size="88,88" alphatest="blend" transparent="1" />
++              <widget source="menu" render="Listbox" selectionPixmap="Vu_HD/buttons/FocusBar_H45.png" foregroundColor="#4c4c4c" foregroundColorSelected="#ececec" backgroundColorSelected="#271a53bb" backgroundColor="#27d9dee2" transparent="1" position="84, 175" size="472,495" scrollbarMode="showOnDemand">
++<!--          <widget source="menu" render="Listbox" selectionPixmap="Vu_HD/FocusBar_menu01.png" foregroundColor="#4c4c4c" foregroundColorSelected="#ececec" backgroundColorSelected="#acacac" position="84,190" size="370,480" transparent="1" backgroundColor="#ececec" scrollbarMode="showNever"> -->
++                      <convert type="TemplatedMultiContent">
++                              {"template": [  MultiContentEntryText(pos = (30, 8), size = (410, 28), flags = RT_HALIGN_LEFT, text = 0  ) ],
++                               "fonts": [gFont("Regular", 28)],
++                               "itemHeight": 45
++                              }
++                      </convert>
++              </widget>
++      </screen>
++      <screen name="menu_system" position="0,0" size="580,720" title="Main menu" flags="wfNoBorder" backgroundColor="transparent"> 
++              <ePixmap pixmap="Vu_HD/bg.png" zPosition="-1" position="60,0" size="520,720" alphatest="blend"  transparent="1" />
++              <widget source="title" render="Label" position="110,120" size="400,38" font="Regular;38" foregroundColor="#5c5c5c" backgroundColor="#27d8dee2" transparent="1" />
++              <ePixmap pixmap="Vu_HD/menu/ico_menu_Setup.png" position="475,70" size="88,88" alphatest="blend" transparent="1" />
++              <widget source="menu" render="Listbox" selectionPixmap="Vu_HD/buttons/FocusBar_H45.png" foregroundColor="#4c4c4c" foregroundColorSelected="#ececec" backgroundColorSelected="#271a53bb" backgroundColor="#27d9dee2" transparent="1" position="84, 175" size="472,495" scrollbarMode="showOnDemand">
++<!--          <widget source="menu" render="Listbox" selectionPixmap="Vu_HD/FocusBar_menu01.png" foregroundColor="#4c4c4c" foregroundColorSelected="#ececec" backgroundColorSelected="#acacac" position="84,190" size="370,480" transparent="1" backgroundColor="#ececec" scrollbarMode="showNever"> -->
++                      <convert type="TemplatedMultiContent">
++                              {"template": [  MultiContentEntryText(pos = (30, 8), size = (410, 28), flags = RT_HALIGN_LEFT, text = 0  ) ],
++                               "fonts": [gFont("Regular", 28)],
++                               "itemHeight": 45
++                              }
++                      </convert>
++              </widget>
++      </screen>               
++      <screen name="Menu" position="0,0" size="580,720" title="Main menu" flags="wfNoBorder" backgroundColor="transparent"> 
++              <ePixmap pixmap="Vu_HD/bg.png" zPosition="-1" position="60,0" size="520,720" alphatest="blend"  transparent="1" />
++              <ePixmap pixmap="Vu_HD/menu/ico_menu_Setup.png" position="475,70" size="88,88" alphatest="blend" transparent="1" />
++              <widget source="title" render="Label" position="110,120" size="400,38" font="Regular;38" foregroundColor="#5c5c5c" backgroundColor="#27d8dee2" transparent="1" />
++<!--          <eLabel text="" position="153,136" size="3,44" font="Regular;42" foregroundColor="#8c8c8c" backgroundColor="#ec1c1c" />         -->
++              <widget source="menu" render="Listbox" selectionPixmap="Vu_HD/buttons/FocusBar_H45.png" foregroundColor="#4c4c4c" foregroundColorSelected="#ececec" backgroundColorSelected="#271a53bb" backgroundColor="#27d9dee2" transparent="1" position="84, 175" size="472,495" scrollbarMode="showOnDemand">
++<!--          <widget source="menu" render="Listbox" selectionPixmap="Vu_HD/FocusBar_menu01.png" foregroundColor="#4c4c4c" foregroundColorSelected="#ececec" backgroundColorSelected="#acacac" position="84,190" size="370,480" transparent="1" backgroundColor="#ececec" scrollbarMode="showNever"> -->
++                      <convert type="TemplatedMultiContent">
++                              {"template": [  MultiContentEntryText(pos = (30, 8), size = (410, 28), flags = RT_HALIGN_LEFT, text = 0  ) ],
++                               "fonts": [gFont("Regular", 28)],
++                               "itemHeight": 45
++                              }
++                      </convert>
++              </widget>
++      </screen>               
++      <!-- Messagebox -->
++      <screen name="MessageBox" position="center,center" size="600,10" title="Message">
++              <widget name="text" position="65,8" size="420,0" font="Regular;22" />
++              <widget name="ErrorPixmap" pixmap="Vu_HD/icons/input_error.png" position="5,5" size="53,53" alphatest="blend" />
++              <widget name="QuestionPixmap" pixmap="Vu_HD/icons/input_question.png" position="5,5" size="53,53" alphatest="blend" />
++              <widget name="InfoPixmap" pixmap="Vu_HD/icons/input_info.png" position="5,5" size="53,53" alphatest="blend" />
++              <widget name="list" position="100,100" size="380,375" transparent="1" backgroundColor="darkgrey" />
++              <applet type="onLayoutFinish">
++# this should be factored out into some helper code, but currently demonstrates applets.
++from enigma import eSize, ePoint
++
++orgwidth = self.instance.size().width()
++orgpos = self.instance.position()
++textsize = self[&quot;text&quot;].getSize()
++
++# y size still must be fixed in font stuff...
++textsize = (textsize[0] + 50, textsize[1] + 50)
++offset = 0
++if self.type == self.TYPE_YESNO:
++      offset = 60
++wsizex = textsize[0] + 60
++wsizey = textsize[1] + offset
++if (280 &gt; wsizex):
++      wsizex = 280
++wsize = (wsizex, wsizey)
++
++
++# resize
++self.instance.resize(eSize(*wsize))
++
++# resize label
++self[&quot;text&quot;].instance.resize(eSize(*textsize))
++
++# move list
++listsize = (wsizex, 50)
++self[&quot;list&quot;].instance.move(ePoint(0, textsize[1]))
++self[&quot;list&quot;].instance.resize(eSize(*listsize))
++
++# center window
++newwidth = wsize[0]
++self.instance.move(ePoint(orgpos.x() + (orgwidth - newwidth)/2, orgpos.y()))
++              </applet>
++      </screen>
++      <!-- Minute input -->
++      <screen name="MinuteInput" position="center,center" size="280,60" title="Seek">
++              <widget name="minutes" position="80,15" size="160,25" halign="right" font="Regular;23" />
++      </screen>
++      <!-- Movie context menu -->
++      <screen name="MovieContextMenu" position="center,center" size="400,260" title="Movielist menu">
++              <widget name="menu" position="10,10" size="380,250" transparent="1" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Movieselection -->
++      <screen name="MovieSelection" position="145, 55" size="990,610" flags="wfNoBorder" backgroundColor="transparent">
++              <ePixmap pixmap="Vu_HD/Bg_List.png" position="0,0" size="990,610" zPosition="-1" alphatest="on"  transparent="1" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_media-info.png" position="44,40" size="37,28" alphatest="blend"  transparent="1" />
++              <eLabel text="Recorded files..." position="95,40" size="700,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27d8dee2" transparent="1" />
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="44,82" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="271,82" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="498,82" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/blue.png" position="725,82" size="25,25" alphatest="blend" />
++              <widget name="key_red" position="89,84" zPosition="1" size="182,20" font="Regular;20" halign="left" valign="center" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" transparent="1" />
++              <widget name="key_green" position="316,84" zPosition="1" size="182,20" font="Regular;20" halign="left" valign="center" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" transparent="1" />
++              <widget name="key_yellow" position="543,84" zPosition="1" size="182,20" font="Regular;20" halign="left" valign="center" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" transparent="1" />
++              <widget name="key_blue" position="770,84" zPosition="1" size="182,20" font="Regular;20" halign="left" valign="center" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" transparent="1" />
++              <widget name="waitingtext" position="60,150" size="860,375" zPosition="4" font="Regular;22" foregroundColor="#1c1c1c" backgroundColor="#27d8dee2" halign="center" valign="center" />
++              <widget name="list" position="60,150" size="860,375" zPosition="2" scrollbarMode="showOnDemand" transparent="1" />
++              <widget name="DescriptionBorder" position="80,430" size="800,150" zPosition="1" transparent="1" alphatest="on"/>
++              <widget source="Service" render="Label" position="80,430" zPosition="1" size="640,22" font="Regular;20" foregroundColor="#3c3c3c" backgroundColor="#27aeaeae" transparent="1">
++                      <convert type="MovieInfo">ShortDescription</convert>
++              </widget>
++              <widget source="Service" render="Label" position="840,430" zPosition="1" size="60,20" font="Regular;18" halign="right" backgroundColor="#27aeaeae" transparent="1">
++                      <convert type="ServiceTime">Duration</convert>
++                      <convert type="ClockToText">AsLength</convert>
++              </widget>
++              <widget source="Service" render="Label" position="725,450" zPosition="2" size="175,20" font="Regular;18" halign="right" backgroundColor="#27aeaeae" transparent="1">
++                      <convert type="MovieInfo">RecordServiceName</convert>
++              </widget>
++              <widget source="Service" render="Label" position="80,470" zPosition="1" size="800,84" font="Regular;18" backgroundColor="#27aeaeae" transparent="1">
++                      <convert type="EventName">ExtendedDescription</convert>
++              </widget>
++              <widget name="freeDiskSpace" position="80,560" size="830,20" font="Regular;19" backgroundColor="#27aeaeae" valign="center" halign="right" transparent="1" />
++      </screen>
++      <!-- Mute -->
++      <screen name="Mute" position="92,40" zPosition="10" size="90,80" backgroundColor="transparent" title="Mute" flags="wfNoBorder">
++              <ePixmap position="0,0" size="90,80" pixmap="Vu_HD/mute.png" transparent="1" alphatest="on" />
++      </screen>
++      <!-- Nameserver -->
++      <screen name="NameserverSetup" position="209,48" size="865,623" title="Nameserver Setup" flags="wfNoBorder" backgroundColor="transparent">      
++              <ePixmap pixmap="Vu_HD/Bg_EPG_list.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Nameserver Setup" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_green" render="Label" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_yellow" render="Label" position="463,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="config" position="130,166" itemHeight="36" size="600,250" zPosition="3" scrollbarMode="showOnDemand" transparent="1" />
++              <widget name="introduction" position="140,400" size="600,25" zPosition="10" font="Regular;21" foregroundColor="#3c3c3c" backgroundColor="#27d9dee2" halign="center" transparent="1" />
++      </screen>
++      <!-- Network adapter selection -->
++      <screen name="NetworkAdapterSelection" position="209,48" size="865,623" title="Select Network Adapter" flags="wfNoBorder" backgroundColor="transparent">        
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Select Network Adapter" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_green" render="Label" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_yellow" render="Label" position="463,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="list" position="10,140" size="480,250" transparent="1" scrollbarMode="showOnDemand" zPosition="10"/>    
++              <widget source="list" render="Listbox" position="10,140" size="550,280" zPosition="10" scrollbarMode="showOnDemand">
++                      <convert type="TemplatedMultiContent"> <!--  iface, name, description, interfacepng, defaultpng, activepng, divpng  -->
++                              {"template": [
++                                              MultiContentEntryText(pos = (85, 6), size = (440, 28), font=0, flags = RT_HALIGN_LEFT|RT_VALIGN_TOP, text = 1), # index 1 is the interfacename
++                                              MultiContentEntryText(pos = (85, 43), size = (440, 20), font=1, flags = RT_HALIGN_LEFT|RT_VALIGN_BOTTOM, text = 2), # index 2 is the description
++                                              MultiContentEntryPixmapAlphaTest(pos = (2, 8), size = (54, 54), png = 3), # index 3 is the interface pixmap
++                                              MultiContentEntryPixmapAlphaTest(pos = (63, 46), size = (15, 16), png = 4), # index 4 is the default pixmap
++                                      ],
++                              "fonts": [gFont("Regular", 28),gFont("Regular", 20)],
++                              "itemHeight": 70
++                              }
++                      </convert>
++              </widget>
++              
++              <widget name="introduction" position="140,490" size="300,21" zPosition="10" font="Regular;21" halign="center" transparent="1" />
++      </screen>
++      <!-- Network adapter test Black = "#000000" Grey = "#8c8c93" Green = "#1cff1c" Red = #f23d21-->
++      <screen name="NetworkAdapterTest" position="209,48" size="865,623" title="Network test..." flags="wfNoBorder" backgroundColor="transparent">    
++              <ePixmap pixmap="Vu_HD/Bg_EPG_list.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Network test..." position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_green" render="Label" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_yellow" render="Label" position="463,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="Adaptertext" position="60,176" size="140,26" zPosition="1" font="Semiboldit;24" backgroundColor="darkgrey" foregroundColors="#4c4c4c,#154901" transparent="1"/>
++              <widget name="Adapter" position="220,176" size="270,26" zPosition="1" font="Semiboldit;24" halign="right" foregroundColors="#4c4c4c,#aa0000,#154901" backgroundColor="darkgrey" transparent="1"/>
++              <widget name="AdapterInfo" pixmaps="Vu_HD/buttons/button_bluekey.png,Vu_HD/buttons/button_bluekey.png" position="600,169" zPosition="1" size="222,36" transparent="1" alphatest="blend" />
++              <widget name="AdapterInfo_Text" position="640,177" size="150,26" zPosition="2" font="Semibold;24" backgroundColor="#868686" transparent="1" foregroundColors="#5c5c5c,#1c1c1c,#07255d" />
++              <widget name="AdapterInfo_OK" pixmap="Vu_HD/icons/lock_on.png" position="550,171" size="38,31" alphatest="blend" zPosition="2" />
++              <widget name="Networktext" position="60,248" size="140,26" zPosition="1" font="Semiboldit;24" backgroundColor="darkgrey" foregroundColors="#4c4c4c,#154901" transparent="1"/>                   
++              <widget name="Network" position="220,248" size="270,26" zPosition="1" font="Semiboldit;24" halign="right" foregroundColors="#4c4c4c,#aa0000,#154901" backgroundColor="darkgrey" transparent="1"/>
++              <widget name="NetworkInfo" pixmaps="Vu_HD/buttons/button_bluekey.png,Vu_HD/buttons/button_bluekey.png" position="600,241" zPosition="1" size="222,36" transparent="1" alphatest="blend" />
++              <widget name="NetworkInfo_Text" position="640,249" size="150,26" zPosition="2" font="Semibold;24" backgroundColor="#868686" transparent="1" foregroundColors="#5c5c5c,#1c1c1c,#07255d" />
++              <widget name="NetworkInfo_Check" pixmaps="Vu_HD/icons/lock_on.png,Vu_HD/icons/lock_error.png" position="550,243" size="38,31" alphatest="blend" zPosition="2" />
++              <widget name="Dhcptext" position="60,320" size="140,26" zPosition="1" font="Semiboldit;24" backgroundColor="darkgrey" foregroundColors="#4c4c4c,#154901" transparent="1"/>                      
++              <widget name="Dhcp" position="220,320" size="270,26" zPosition="1" font="Semiboldit;24" halign="right" foregroundColors="#4c4c4c,#aa0000,#154901" backgroundColor="darkgrey" transparent="1"/>
++              <widget name="DhcpInfo" pixmaps="Vu_HD/buttons/button_bluekey.png,Vu_HD/buttons/button_bluekey.png" position="600,314" zPosition="1" size="222,36" transparent="1" alphatest="blend" />
++              <widget name="DhcpInfo_Text" position="640,321" size="150,26" zPosition="2" font="Semibold;24" backgroundColor="#868686" transparent="1" foregroundColors="#5c5c5c,#1c1c1c,#07255d" />
++              <widget name="DhcpInfo_Check" pixmaps="Vu_HD/icons/lock_on.png,Vu_HD/icons/lock_error.png" position="550,315" size="38,31" alphatest="blend" zPosition="2" />
++              <widget name="IPtext" position="60,392" size="140,26" zPosition="1" font="Semiboldit;24" backgroundColor="darkgrey" foregroundColors="#4c4c4c,#154901" transparent="1"/>                        
++              <widget name="IP" position="220,392" size="270,26" zPosition="1" font="Semiboldit;24" halign="right" foregroundColors="#4c4c4c,#aa0000,#154901" backgroundColor="darkgrey" transparent="1"/>
++              <widget name="IPInfo" pixmaps="Vu_HD/buttons/button_bluekey.png,Vu_HD/buttons/button_bluekey.png" position="600,386" zPosition="1" size="222,36" transparent="1" alphatest="blend" />
++              <widget name="IPInfo_Text" position="640,394" size="150,26" zPosition="2" font="Semibold;24" backgroundColor="#868686" transparent="1" foregroundColors="#5c5c5c,#1c1c1c,#07255d" />
++              <widget name="IPInfo_Check" pixmaps="Vu_HD/icons/lock_on.png,Vu_HD/icons/lock_error.png" position="550,387" size="38,31" alphatest="blend" zPosition="2" />
++              <widget name="DNStext" position="60,464" size="140,26" zPosition="1" font="Semiboldit;24" backgroundColor="darkgrey" foregroundColors="#4c4c4c,#154901" transparent="1"/>                       
++              <widget name="DNS" position="220,464" size="270,26" zPosition="1" font="Semiboldit;24" halign="right" foregroundColors="#4c4c4c,#aa0000,#154901" backgroundColor="darkgrey" transparent="1"/>
++              <widget name="DNSInfo" pixmaps="Vu_HD/buttons/button_bluekey.png,Vu_HD/buttons/button_bluekey.png" position="600,459" zPosition="1" size="222,36" transparent="1" alphatest="blend" />
++              <widget name="DNSInfo_Text" position="640,467" size="150,26" zPosition="2" font="Semibold;24" backgroundColor="#868686" transparent="1" foregroundColors="#5c5c5c,#1c1c1c,#07255d" />
++              <widget name="DNSInfo_Check" pixmaps="Vu_HD/icons/lock_on.png,Vu_HD/icons/lock_error.png" position="550,459" size="38,31" alphatest="blend" zPosition="2" />
++              <widget name="EditSettingsButton" pixmaps="Vu_HD/buttons/button_bluekey.png,Vu_HD/buttons/button_bluekey.png" position="500,531" zPosition="1" size="222,36" transparent="1" alphatest="blend" />
++              <widget name="EditSettings_Text" position="530,540" size="160,26" zPosition="2" font="Semibold;24" backgroundColor="#868686" halign="center" transparent="1" foregroundColors="#1c1c1c,#1c1c1c,#07255d" />
++              <widget name="InfoText" position="40,160" size="785,430" zPosition="25" foregroundColor="#3c3c3c" backgroundColor="#27c5c9cc" font="Regular;21" />
++      </screen>
++      <!-- Network setup -->
++      <screen name="NetworkSetup" position="130,140" size="510,330" title="Network Setup">
++              <widget name="menu" position="10,10" selectionPixmap="Vu_HD/buttons/Selected_bar_440x23px.png" transparent="1" backgroundColor="#371e1c1a" size="440,310" />
++      </screen>
++      <!-- Nim selection -->
++      <screen name="NimSelection" position="center,center" size="420,330" title="Choose Tuner">
++              <widget source="nimlist" render="Listbox" transparent="1" position="0,0" size="420,300" scrollbarMode="showOnDemand">
++                      <convert type="TemplatedMultiContent">
++                              {"template": [
++                                              MultiContentEntryText(pos = (10, 5), size = (400, 30), flags = RT_HALIGN_LEFT, text = 1), # index 1 is the nim name,
++                                              MultiContentEntryText(pos = (50, 30), size = (320, 30), font = 1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is a description of the nim settings,
++                                      ],
++                               "fonts": [gFont("Regular", 20), gFont("Regular", 15)],
++                               "itemHeight": 70
++                              }
++                      </convert>
++              </widget>
++      </screen>
++      <!-- Nim setup -->
++      <screen name="NimSetup" position="center,center" size="500,412" title="Reception Settings">
++              <widget name="config" position="10,10" transparent="1" size="480,402" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Numberzap -->
++      <screen name="NumberZap" position="center,center" size="250,60" title="Channel">
++              <widget name="channel" position="35,15" size="110,25" font="Regular;23" />
++              <widget name="number" position="145,15" size="80,25" halign="right" font="Regular;23" />
++      </screen>
++      <!-- Numerical help dialog -->
++      <screen name="NumericalTextInputHelpDialog" position="440,535" zPosition="2" size="394,124" backgroundColor="#27b5b9bd" flags="wfNoBorder">
++<!--
++              <eLabel position="0,0" size="392,92" backgroundColor="#c0c0c0" zPosition="-1" />
++-->           
++              <widget name="key1" position="2,2" size="130,30" font="Console;16" halign="center" valign="center" transparent="1"/>
++              <widget name="key2" position="132,2" size="130,30" font="Console;16" halign="center" valign="center" transparent="1"/>
++              <widget name="key3" position="262,2" size="130,30" font="Console;16" halign="center" valign="center" transparent="1"/>
++              <widget name="key4" position="2,32" size="130,30" font="Console;16" halign="center" valign="center" transparent="1"/>
++              <widget name="key5" position="132,32" size="130,30" font="Console;16" halign="center" valign="center" transparent="1"/>
++              <widget name="key6" position="262,32" size="130,30" font="Console;16" halign="center" valign="center" transparent="1"/>
++              <widget name="key7" position="2,62" size="130,30" font="Console;16" halign="center" valign="center" transparent="1"/>
++              <widget name="key8" position="132,62" size="130,30" font="Console;16" halign="center" valign="center" transparent="1"/>
++              <widget name="key9" position="262,62" size="130,30" font="Console;16" halign="center" valign="center" transparent="1"/>
++              <widget name="help1" position="2,92" size="130,30" font="Regular;16" halign="center" valign="center" transparent="1"/>
++              <widget name="key0" position="132,92" size="130,30" font="Regular;16" halign="center" valign="center" transparent="1"/>
++              <widget name="help2" position="262,92" size="130,30" font="Regular;16" halign="center" valign="center" transparent="1"/>
++      </screen>
++      <!-- Parental control - change pin -->
++      <screen name="ParentalControlChangePin" position="center,center" size="520,160" title="Change pin code">
++              <widget name="config" position="10,10" size="500,350" transparent="1" backgroundColor="#27d9dee2" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Parental control - editor -->
++      <screen name="ParentalControlEditor" position="center,center" size="520,400" title="Parental control services Editor">
++              <widget name="servicelist" position="10,10" size="500,350" transparent="1" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Parental control - setup -->
++      <screen name="ParentalControlSetup" position="209,48" size="865,623" title="Parental control setup" flags="wfNoBorder" backgroundColor="transparent">   
++              <ePixmap pixmap="Vu_HD/Bg_EPG_list.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Parental control setup" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <widget name="config" position="100,129" itemHeight="36" transparent="1" backgroundColor="#275c5c5c" size="650,350" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Picture in picture -->
++      <screen name="PictureInPicture" position="400,60" zPosition="-1" size="240,192" flags="wfNoBorder">
++              <widget name="video" position="0,0" size="240,192" backgroundColor="transparent" />
++      </screen>
++      <!-- Pin input -->
++      <screen name="PinInput" position="center,center" size="500,170" title="Pin code needed">
++              <widget name="service" position="10,10" size="480,25" font="Regular;20" />
++              <widget name="text" position="10,40" size="480,25" font="Regular;20" halign="center" />
++              <widget name="tries" position="10,70" size="480,25" font="Regular;20" halign="center" />
++              <widget name="input" position="10,110" size="480,40" font="Regular;50" halign="center" />
++      </screen>
++      <!-- Picture in picture setup -->
++      <screen name="PiPSetup" position="center,center" size="600,150" backgroundColor="transparent" flags="wfNoBorder" title="PiPSetup">
++              <widget name="text" position="0,0" size="600,150" font="Regular;23" />
++      </screen>
++      <!-- Plugin browser -->
++      <screen name="PluginBrowser" position="209,48" size="865,623" title="Plugin browser" flags="wfNoBorder" backgroundColor="transparent">  
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Plugin.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Plugin browser" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="435,98" size="25,25" alphatest="blend" />
++              <widget name="red" position="76,97" zPosition="1" size="300,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="green" position="466,97" zPosition="1" size="300,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="list" position="60,130" size="700,450" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Plugin downloads -->
++      <screen name="PluginDownloadBrowser" position="209,48" size="865,623" title="Downloadable plugins" flags="wfNoBorder" backgroundColor="transparent">    
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Plugin.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Downloadable plugins" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <widget name="text" position="60,130" zPosition="1" size="700,480" foregroundColor="#3c3c3c" font="Regular;20" halign="center" valign="center" />
++              <widget name="list" position="70,140" zPosition="2" size="680,460" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- PVR state -->
++      <screen name="PVRState" position="70,70" zPosition="2" size="150,30" backgroundColor="transpBlack" flags="wfNoBorder">
++              <widget name="state" position="0,0" size="150,30" font="Regular;25" halign="center" backgroundColor="transpBlack" foregroundColor="white" />
++      </screen>
++      <!-- Radio infobar -->
++      <screen name="RadioInfoBar" position="810, 173" size="320,470" zPosition="-1" flags="wfNoBorder" title="Radio"  backgroundColor="#27c8c8c8">
++              <widget source="session.CurrentService" render="Label" position="0,10" zPosition="1" size="270,24" font="Regular;24" foregroundColor="#07255d" backgroundColor="#27c8c8c8" halign="left" noWrap="1" transparent="1">
++                      <convert type="ServiceName">Name</convert>
++              </widget>
++              <widget source="RdsDecoder" render="Pixmap" pixmap="Vu_HD/icons/rass_logo.png" position="270,0" size="50,21" alphatest="on">
++                      <convert type="RdsInfo">RasInteractiveAvailable</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="session.RecordState" render="Pixmap" pixmap="Vu_HD/icons/record.png" position="288,22" zPosition="2" size="20,20" alphatest="on" >
++                      <convert type="ConditionalShowHide">Blink</convert>
++              </widget>
++              <widget source="session.Event_Now" render="Label" position="0,42" zPosition="1" size="300,24" foregroundColor="#07255d" backgroundColor="#27c8c8c8" font="Semibold;24" noWrap="1" transparent="1">
++                      <convert type="EventName">Name</convert>
++              </widget>
++              <widget source="session.Event_Now" render="Label" position="0,70" zPosition="1" size="50,22" font="Regular;20" foregroundColor="#07255d" backgroundColor="#27c8c8c8" transparent="1">
++                      <convert type="EventTime">StartTime</convert>
++                      <convert type="ClockToText">Default</convert>
++              </widget>
++              <widget source="session.Event_Now" render="Label" position="155,70" zPosition="1" size="70,22" font="Regular;20" foregroundColor="#07255d" backgroundColor="#27c8c8c8" transparent="1">
++                      <convert type="EventTime">EndTime</convert>
++                      <convert type="ClockToText">Default</convert>
++              </widget>
++              <widget source="session.Event_Now" render="Progress" position="165,75" zPosition="1" pixmap="Vu_HD/progress_medium.png" size="124,10" backgroundColor="#ffffff" >
++                      <convert type="EventTime">Progress</convert>
++              </widget>
++              <widget source="session.Event_Next" render="Label" position="0,90" zPosition="1" size="300,24" foregroundColor="#07255d" backgroundColor="#27c8c8c8" font="Semibold;24" noWrap="1" transparent="1">
++                      <convert type="EventName">Name</convert>
++              </widget>
++              <widget source="session.Event_Next" render="Label" position="0,120" zPosition="1" size="50,22" font="Regular;20" foregroundColor="#07255d" backgroundColor="#27c8c8c8" transparent="1">
++                      <convert type="EventTime">StartTime</convert>
++                      <convert type="ClockToText">Default</convert>
++              </widget>
++              <widget source="session.Event_Next" render="Label" position="55,120" zPosition="1" size="70,22" font="Regular;20" foregroundColor="#07255d" backgroundColor="#27c8c8c8" transparent="1">
++                      <convert type="EventTime">EndTime</convert>
++                      <convert type="ClockToText">Default</convert>
++              </widget>
++              <widget source="RdsDecoder" render="Label" position="0,150" size="300,300" font="LCD;20" foregroundColor="#80ffff"  backgroundColor="#27c8c8c8" transparent="1">
++                      <convert type="RdsInfo">RadioText</convert>
++              </widget>
++      </screen>
++      <!-- RASS -->
++      <screen name="RassInteractive" position="50,180" size="100,275" backgroundColor="transpWhite" flags="wfNoBorder">
++              <ePixmap pixmap="Vu_HD/icons/rass_logo.png" position="25,0" size="50,21" transparent="1" alphatest="on" />
++              <eLabel text="Index" position="36,25" size="60,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" />
++              <eLabel text="0" position="5,25" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" />
++              <widget name="Marker" position="21,25" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" />
++              <eLabel text="1" position="5,50" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" />
++              <widget name="subpages_1" position="35,50" size="36,20" alphatest="on" />
++              <eLabel text="2" position="5,75" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" />
++              <widget name="subpages_2" position="35,75" size="36,20" alphatest="on" />
++              <eLabel text="3" position="5,100" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" />
++              <widget name="subpages_3" position="35,100" size="36,20" alphatest="on" />
++              <eLabel text="4" position="5,125" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" />
++              <widget name="subpages_4" position="35,125" size="36,20" alphatest="on" />
++              <eLabel text="5" position="5,150" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" />
++              <widget name="subpages_5" position="35,150" size="36,20" alphatest="on" />
++              <eLabel text="6" position="5,175" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" />
++              <widget name="subpages_6" position="35,175" size="36,20" alphatest="on" />
++              <eLabel text="7" position="5,200" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" />
++              <widget name="subpages_7" position="35,200" size="36,20" alphatest="on" />
++              <eLabel text="8" position="5,225" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" />
++              <widget name="subpages_8" position="35,225" size="36,20" alphatest="on" />
++              <eLabel text="9" position="5,250" size="16,25" font="Regular;21" foregroundColor="black" backgroundColor="transpWhite" />
++              <widget name="subpages_9" position="35,250" size="36,20" alphatest="on" />
++      </screen>
++      <!-- RDS info -->
++      <screen name="RdsInfoDisplay" position="0,0" size="1280,720" zPosition="-2" backgroundColor="transparent" flags="wfNoBorder">
++              <widget name="RassLogo" pixmap="Vu_HD/icons/rass_logo.png" position="100,585" size="50,21" />
++              <widget name="RadioText" position="100,620" size="1080,30" font="Regular;24" noWrap="1" backgroundColor="transpBlack" />
++              <widget name="RtpText" position="100,650" size="1080,30" font="Regular;24" halign="right" noWrap="1" backgroundColor="transpBlack" />
++      </screen>
++      <!-- Satfinder -->
++      <screen name="Satfinder" position="209,48" size="865,623" title="Satfinder" flags="wfNoBorder" backgroundColor="transparent">   
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Satfinder" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <widget name="introduction" position="0,0" size="0,0" font="Regular;23" />
++              <ePixmap pixmap="Vu_HD/icons/dish_scan.png" position="150,150" zPosition="0" size="119,110" transparent="1" alphatest="on" />
++              <widget source="Frontend" render="Label" position="340,140" zPosition="2" size="260,20" font="Regular;19" backgroundColor="#27d9dee2" halign="center" valign="center" transparent="1">
++                      <convert type="FrontendInfo">SNRdB</convert>
++              </widget>
++              <eLabel name="snr" text="SNR:" position="270,165" size="60,22" font="Regular;21" halign="right" backgroundColor="#27d9dee2" transparent="1" />
++              <widget source="Frontend" render="Progress" position="340,165" size="260,20" pixmap="Vu_HD/bar_snr.png" borderWidth="2" borderColor="#cccccc">
++                      <convert type="FrontendInfo">SNR</convert>
++              </widget>
++              <widget source="Frontend" render="Label" position="610,165" size="60,22" font="Regular;21" backgroundColor="#27d9dee2" transparent="1">
++                      <convert type="FrontendInfo">SNR</convert>
++              </widget>
++              <eLabel name="agc" text="AGC:" position="270,190" size="60,22" font="Regular;21" halign="right" backgroundColor="#27d9dee2" transparent="1" />
++              <widget source="Frontend" render="Progress" position="340,190" size="260,20" pixmap="Vu_HD/bar_snr.png" borderWidth="2" borderColor="#cccccc">
++                      <convert type="FrontendInfo">AGC</convert>
++              </widget>
++              <widget source="Frontend" render="Label" position="610,190" size="60,22" font="Regular;21" backgroundColor="#27d9dee2" transparent="1">
++                      <convert type="FrontendInfo">AGC</convert>
++              </widget>
++              <eLabel name="ber" text="BER:" position="270,215" size="60,22" font="Regular;21" halign="right" backgroundColor="#27d9dee2" transparent="1" />
++              <widget source="Frontend" render="Progress" position="340,215" size="260,20" pixmap="Vu_HD/bar_ber.png" borderWidth="2" borderColor="#cccccc">
++                      <convert type="FrontendInfo">BER</convert>
++              </widget>
++              <widget source="Frontend" render="Label" position="610,215" size="60,22" font="Regular;21" backgroundColor="#27d9dee2" transparent="1">
++                      <convert type="FrontendInfo">BER</convert>
++              </widget>
++              <eLabel name="lock" text="Lock:" position="270,245" size="60,22" font="Regular;21" backgroundColor="#27d9dee2" halign="right" transparent="1"/>
++              <widget source="Frontend" render="Pixmap" pixmap="Vu_HD/icons/lock_on.png" position="340,245" zPosition="1" size="38,31" alphatest="on">
++                      <convert type="FrontendInfo">LOCK</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="Frontend" render="Pixmap" pixmap="Vu_HD/icons/lock_off.png" position="340,240" zPosition="1" size="38,31" alphatest="on">
++                      <convert type="FrontendInfo">LOCK</convert>
++                      <convert type="ConditionalShowHide">Invert</convert>
++              </widget>
++              <eLabel text=" " position="160,282" zPosition="1" size="500,2" backgroundColor="#8c8c8c" />
++              <widget name="config" position="160,295" transparent="1" backgroundColor="#27cccccc" size="500,288" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Scan setup -->
++      <screen name="ScanSetup" position="center,center" size="520,405" title="Service scan">
++              <widget name="config" position="10,10" transparent="1" size="500,350" scrollbarMode="showOnDemand" />
++              <widget name="introduction" position="10,365" size="500,40" font="Regular;20" halign="center" />
++      </screen>
++      <!-- Scan simple -->
++      <screen name="ScanSimple" position="center,center" size="420,350" title="Service scan">
++              <widget name="header" position="10,10" size="400,25" font="Regular;23" />
++              <widget name="config" position="10,55" transparent="1" size="400,250" scrollbarMode="showOnDemand" />
++              <widget name="footer" position="10,310" size="400,20" font="Regular;20" halign="center" />
++      </screen>
++      <!-- Scart -->
++      <screen name="Scart" position="0,0" size="1280,720" backgroundColor="transparent" />
++      <!-- Service info -->
++      <screen name="ServiceInfo" position="209,48" size="865,623" title="Serviceinfo" flags="wfNoBorder" backgroundColor="transparent">       
++              <ePixmap pixmap="Vu_HD/Bg_EPG_list.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Info.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Serviceinfo" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/blue.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget name="red" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="green" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="yellow" position="463,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="blue" position="658,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="infolist" position="60,140" size="700,460" itemHeight="36" foregroundColor="#3c3c3c" selectionDisabled="1" transparent="1"/>
++      </screen>
++      <!-- Service scan -->
++      <screen name="ServiceScan" position="center,center" size="420,390" title="Service Scan">
++              <widget source="FrontendInfo" render="Pixmap" pixmap="Vu_HD/icons/scan-s.png" position="5,5" size="64,64" transparent="1" alphatest="blend">
++                      <convert type="FrontendInfo">TYPE</convert>
++                      <convert type="ValueRange">0,0</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="FrontendInfo" render="Pixmap" pixmap="Vu_HD/icons/scan-c.png" position="5,5" size="64,64" transparent="1" alphatest="on">
++                      <convert type="FrontendInfo">TYPE</convert>
++                      <convert type="ValueRange">1,1</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="FrontendInfo" render="Pixmap" pixmap="Vu_HD/icons/scan-t.png" position="5,5" size="64,64" transparent="1" alphatest="on">
++                      <convert type="FrontendInfo">TYPE</convert>
++                      <convert type="ValueRange">2,2</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget name="network" position="80,15" size="330,20" font="Regular;20" />
++              <widget name="transponder" position="80,40" size="330,20" font="Regular;20" />
++              <widget name="scan_state" position="10,80" zPosition="2" size="400,20" font="Regular;18" />
++              <widget name="pass" position="10,80" size="400,20" font="Regular;18" />
++              <widget name="scan_progress" position="10,105" size="400,15" pixmap="Vu_HD/progress_big.png" borderWidth="2" borderColor="#cccccc" />
++              <widget name="servicelist" position="10,135" size="400,265" selectionDisabled="1" />
++      </screen>
++      <!-- Setup -->
++      <screen name="Setup" position="209,48" size="865,624" title="Setup" flags="wfNoBorder" backgroundColor="transparent">   
++              <ePixmap pixmap="Vu_HD/Bg_EPG_list.png" position="0,0" size="865,624" zPosition="-1" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="26,41" size="40,40" alphatest="blend"  transparent="1" />
++              <widget source="Title" render="Label" position="80,50" size="250,34" font="Semiboldit;34" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="83,97" zPosition="2" size="150,25" font="Regular;20" halign="left" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_green" render="Label" position="278,97" zPosition="2" size="150,25" font="Regular;20" halign="left" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="config" position="45,130" itemHeight="36" foregroundColorSelected="#ebebeb" foregroundColor="#1c1c1c" selectionPixmap="Vu_HD/buttons/FocusBar_H36.png" transparent="1" size="772,432" scrollbarMode="showNever" />
++      </screen>
++      <!-- Simple channelselection -->
++      <screen name="SimpleChannelSelection" position="145, 55" size="990,610" flags="wfNoBorder" backgroundColor="transparent">
++              <ePixmap pixmap="Vu_HD/Bg_List.png" position="0,0" size="990,610" zPosition="-1" alphatest="on"  transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/ico_Chlist_title.png" position="44,37" size="38,34" alphatest="blend"  transparent="1" />
++              <widget source="Title" render="Label" position="95,40" size="700,32" zPosition="3" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27d8dee2" transparent="1" />
++<!--          <widget name="etitle" position="95,43" size="450,32" font="Semiboldit;32" halign="left" foregroundColor="#5d5d5d" backgroundColor="#27d8dee2" transparent="1" />-->
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="44,82" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="271,82" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="498,82" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/blue.png" position="725,82" size="25,25" alphatest="blend" />
++              <widget name="key_red" position="89,84" zPosition="1" size="182,20" font="Regular;20" halign="left" valign="center" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" transparent="1" />
++              <widget name="key_green" position="316,84" zPosition="1" size="182,20" font="Regular;20" halign="left" valign="center" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" transparent="1" />
++              <widget name="key_yellow" position="543,84" zPosition="1" size="182,20" font="Regular;20" halign="left" valign="center" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" transparent="1" />
++              <widget name="key_blue" position="770,84" zPosition="1" size="182,20" font="Regular;20" halign="left" valign="center" foregroundColor="#1c1c1c" backgroundColor="#27ebebeb" transparent="1" />
++              <widget name="list" position="60,130" size="700,460" transparent="1" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Skin Selector -->
++      <screen name="SkinSelector" position="209,48" size="865,623" title="Choose your Skin" flags="wfNoBorder" backgroundColor="transparent"> 
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="26,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Choose your Skin" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" halign="right" backgroundColor="#27d9dee2" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="83,98" zPosition="2" size="150,25" foregroundColor="#1c1c1c" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" transparent="1" />
++              <widget source="introduction" render="Label" position="60,130" size="600,30" zPosition="10" foregroundColor="#3c3c3c" font="Regular;21" halign="left" valign="center" backgroundColor="#27d9dee2" transparent="1" />
++              <widget name="SkinList" position="60,170" size="420,440" itemHeight="30" backgroundColor="#27d9dee2" transparent="1" scrollbarMode="showOnDemand" />
++              <widget name="Preview" position="520,250" size="280,210" alphatest="on" />
++      </screen>
++      <!-- Sleeptimer edit -->
++      <screen name="SleepTimerEdit" position="center,center" size="520,200" title="Sleep Timer">
++              <widget name="current_status" position="40,40" size="400,30" valign="center" font="Regular;20" foregroundColor="#3c3c3c" />
++              <widget name="red" pixmap="Vu_HD/buttons/red.png" position="2,83" size="25,25" alphatest="blend" />
++              <widget name="green" pixmap="Vu_HD/buttons/green.png" position="2,122" size="25,25" alphatest="blend" />
++              <widget name="yellow" pixmap="Vu_HD/buttons/yellow.png" position="2,162" size="25,25" alphatest="blend"/>
++              <widget name="blue" pixmap="Vu_HD/buttons/blue.png" position="2,162" size="25,25" alphatest="blend" />
++              <widget name="red_text" position="40,80" size="400,30" valign="center" font="Regular;20" foregroundColor="#3c3c3c" />
++              <widget name="green_text" position="40,120" size="400,30" valign="center" font="Regular;20" foregroundColor="#3c3c3c" />
++              <widget name="yellow_text" position="40,160" size="400,30" valign="center" font="Regular;20" foregroundColor="#3c3c3c" />
++              <widget name="blue_text" position="40,200" size="400,30" valign="center" font="Regular;20" foregroundColor="#3c3c3c" />
++              <widget name="pretext" position="15,10" size="235,25" font="Regular;19" foregroundColor="#3c3c3c" />
++              <widget name="input" position="260,10" size="40,25" font="Regular;19" foregroundColor="#3c3c3c" />
++              <widget name="aftertext" position="305,10" size="100,25" font="Regular;19" foregroundColor="#3c3c3c" />
++              <ePixmap pixmap="Vu_HD/sleeptimer.png" position="390,17" size="116,142" alphatest="blend"  />
++      </screen>
++      <!-- Standby mode -->
++      <screen name="Standby" flags="wfNoBorder" position="0,0" size="720,576" title="Standby" />
++      <!-- Start Wizard -->
++      <screen name="StartWizard" position="0,0" size="1280,720" title="Welcome..." flags="wfNoBorder">
++              <widget name="text" position="303,140" size="340,300" font="Regular;22" />
++              <widget source="list" render="Listbox" position="253,440" size="440,180" scrollbarMode="showOnDemand" >
++                      <convert type="StringList" />
++              </widget>
++              <widget name="config" position="253,440" zPosition="1" size="440,180" transparent="1" scrollbarMode="showOnDemand" />
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="140,322" zPosition="0" size="25,25" transparent="1" alphatest="blend" />
++              <widget name="languagetext" position="178,325" size="95,30" font="Regular;18" />
++              <widget name="rc" pixmaps="Vu_HD/rc.png,Vu_HD/rcold.png" position="950,150" zPosition="10" size="154,500" alphatest="blend" />
++              <widget name="arrowdown" pixmap="Vu_HD/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++              <widget name="arrowdown2" pixmap="Vu_HD/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++              <widget name="arrowup" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++              <widget name="arrowup2" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++      </screen>
++      <!-- Network Wizard -->
++      <screen name="NetworkWizard" position="0,0" size="1280,720" title="Welcome..." flags="wfNoBorder" >
++              <widget name="text" position="303,140" size="340,300" font="Regular;22" />
++              <widget source="list" render="Listbox" position="253,440" size="440,180" scrollbarMode="showOnDemand" >
++                      <convert type="StringList" />
++              </widget>
++              <widget name="config" position="253,440" zPosition="1" size="440,180" transparent="1" scrollbarMode="showOnDemand" />
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="140,322" zPosition="0" size="25,25" transparent="1" alphatest="blend" />
++              <widget name="languagetext" position="178,325" size="95,30" font="Regular;18" />
++              <widget name="rc" pixmaps="Vu_HD/rc.png,Vu_HD/rcold.png" position="950,150" zPosition="10" size="154,500" alphatest="blend" />
++              <widget name="arrowdown" pixmap="Vu_HD/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++              <widget name="arrowdown2" pixmap="Vu_HD/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++              <widget name="arrowup" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++              <widget name="arrowup2" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++              <widget source="VKeyIcon" render="Pixmap" pixmap="Vu_HD/buttons/key_text.png" position="40,260" zPosition="0" size="35,25" transparent="1" alphatest="on" >
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget name="HelpWindow" pixmap="Vu_HD/buttons/key_text.png" position="125,170" zPosition="1" size="1,1" transparent="1" alphatest="on" />     
++      </screen>
++      <!-- Subservice quickzap -->
++      <screen name="SubservicesQuickzap" position="124,470" size="512,200" title="Subservices" backgroundColor="transparent" flags="wfNoBorder">
++              <widget source="session.RecordState" render="Pixmap" pixmap="Vu_HD/icons/record.png" position="450,0" zPosition="2" size="14,14" alphatest="on" >
++                      <convert type="ConditionalShowHide">Blink</convert>
++              </widget>
++              <eLabel text="Subservices" position="0,0" size="470,20" font="Regular;13" backgroundColor="#33294a6b" />
++              <widget name="CurrentSubserviceNumber" position="0,20" size="50,34" font="Regular;22" backgroundColor="#33294a6b" shadowColor="black" shadowOffset="-1,-1" />
++              <widget source="session.CurrentService" render="Label" position="50,20" size="420,34" font="Regular;22" backgroundColor="#33294a6b" shadowColor="black" shadowOffset="-1,-1">
++                      <convert type="ServiceName">Name</convert>
++              </widget>
++      </screen>
++      <!-- Subtitle selection -->
++      <screen name="Subtitles" position="center,80" size="520,538" title="Subtitle selection" flags="wfNoBorder" backgroundColor="transparent">       
++              <ePixmap pixmap="Vu_HD/Bg_Subtitle.png" position="0,0" size="520,538" zPosition="-1" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Subtitles.png" position="20,38" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Subtitle selection" position="69,45" size="400,32" font="Semiboldit;32" foregroundColor="#4c4c4c" backgroundColor="#27b5b9bd" transparent="1" />
++              <widget name="config" position="15,83" itemHeight="42" selectionPixmap="Vu_HD/buttons/FocusBar_H42.png" transparent="1" zPosition="1" size="490,420" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Subtitle area -->
++      <screen name="SubtitleDisplay" position="0,0" size="1280,720" zPosition="-1" flags="wfNoBorder" backgroundColor="transparent" />
++      <!-- Time & date input -->
++      <screen name="TimeDateInput" position="160,150" size="400,200" title="Time/Date Input">
++              <widget name="cancel" pixmap="Vu_HD/buttons/red.png" position="10,0" size="136,40" alphatest="blend" />
++              <widget name="ok" pixmap="Vu_HD/buttons/green.png" position="260,0" size="136,40" alphatest="blend" />
++              <widget name="canceltext" position="30,0" zPosition="1" size="115,40" font="Regular;19" halign="center" valign="center" transparent="1" />
++              <widget name="oktext" position="280,0" zPosition="1" size="115,40" font="Regular;19" halign="center" valign="center" transparent="1" />
++              <widget name="config" position="10,40" transparent="1" size="380,150" />
++      </screen>
++      <!-- Timer edit -->
++      <screen name="TimerEdit" position="70,130" size="590,335" title="Timer Edit">
++              <widget name="description" position="10,10" size="580,40" font="Regular;25" />
++              <widget name="lbegin" position="405,102" size="103,30" font="Regular;25" foregroundColor="red" />
++              <widget name="lend" position="405,158" size="103,30" font="Regular;25" foregroundColor="green" />
++              <widget name="begin" position="508,105" size="72,35" font="Regular;25" />
++              <widget name="end" position="508,150" size="72,35" font="Regular;25" />
++              <widget name="apply" position="10,240" size="250,35" />
++      </screen>
++      <!-- Timer edit list -->
++      <screen name="TimerEditList" position="209,48" size="865,623" title="Eventview" flags="wfNoBorder" backgroundColor="transparent">       
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Timer.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Timer List" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/blue.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget name="key_red" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="key_green" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="key_yellow" position="463,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="key_blue" position="658,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="timerlist" position="60,130" transparent="1" size="740,420" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Timer entry -->
++      <screen name="TimerEntry" position="209,48" size="865,623" title="Eventview" flags="wfNoBorder" backgroundColor="transparent">  
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Timer.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Timer entry" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <widget name="cancel" pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" backgroundColor="#27c5c9cc" />
++              <widget name="ok" pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" backgroundColor="#27c5c9cc" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget name="canceltext" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="oktext" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="config" position="60,140" transparent="1" backgroundColor="#27d9dee2" size="740,325" scrollbarMode="showOnDemand" />
++              <eLabel text=" " position="50,470" zPosition="-1" size="760,3" font="Regular;10" foregroundColor="#1e1e1e" backgroundColor="#8c8c8c" />
++      </screen>
++      <!-- Timer log -->
++      <screen name="TimerLog" position="209,48" size="865,623" title="Eventview" flags="wfNoBorder" backgroundColor="transparent">    
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Timer.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Timer log" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/blue.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget name="key_red" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="key_green" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="key_yellow" position="463,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="key_blue" position="658,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="loglist" position="50,130" size="760,300" scrollbarMode="showOnDemand" />
++              <widget name="logentry" position="50,450" size="760,150" font="Regular;20" foregroundColor="#3c3c3c" backgroundColor="#27aeaeae" transparent="1"/>
++      </screen>
++      <!-- Timer sanity conflict -->
++      <screen name="TimerSanityConflict" position="209,48" size="865,623" title="Eventview" flags="wfNoBorder" backgroundColor="transparent"> 
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Timer.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Timer sanity error" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/blue.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget name="key_red" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="key_green" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="key_yellow" position="463,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="key_blue" position="658,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="timer1" position="60,140" size="700,75" scrollbarMode="showNever" />
++              <widget name="timer2" position="60,230" size="700,75" scrollbarMode="showNever" />
++              <widget name="list" position="60,320" size="700,288" transparent="1" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Timer Selection -->
++      <screen name="TimerSelection" position="90,120" size="550,430" title="Timer selection">
++              <widget name="timerlist" position="0,45" size="550,350" scrollbarMode="showOnDemand" />
++      </screen>
++      <!-- Timeshift state -->
++      <screen name="TimeshiftState" position="70,70" zPosition="2" size="150,60" backgroundColor="transpBlack" flags="wfNoBorder">
++              <widget name="state" position="0,3" size="150,30" font="Regular;25" halign="center" foregroundColor="white" backgroundColor="transpBlack" />
++              <widget source="session.CurrentService" render="Label" position="0,35" size="150,30" font="Regular;25" halign="center" foregroundColor="white" backgroundColor="transpBlack">
++                      <convert type="ServicePosition">Remaining</convert>
++              </widget>
++      </screen>
++      <!-- Translator Info -->
++      <screen name="TranslationInfo" position="center,center" size="420,350" title="Translation">
++              <eLabel position="10,20" size="380,23" font="Regular;23" text="Translation:" />
++              <widget source="TranslatorName" render="Label" position="10,55" size="380,20" font="Regular;20" />
++              <widget source="TranslationInfo" render="Label" position="10,100" size="380,250" font="Regular;20" />
++      </screen>
++      <!-- Tutorial Wizard -->
++      <screen name="TutorialWizard" position="0,0" size="1280,720" title="Welcome..." flags="wfNoBorder" >
++              <widget name="text" position="303,140" size="340,300" font="Regular;22" />
++              <widget source="list" render="Listbox" position="253,440" size="440,180" scrollbarMode="showOnDemand" >
++                      <convert type="StringList" />
++              </widget>
++              <widget name="rc" pixmaps="Vu_HD/rc.png,Vu_HD/rcold.png" position="950,150" zPosition="10" size="154,500" alphatest="blend" />
++              <widget name="arrowdown" pixmap="Vu_HD/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++              <widget name="arrowup" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++              <widget name="arrowup2" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="blend" />
++      </screen>       
++      <!-- Volumebar -->
++      <screen name="Volume" position="92,40" zPosition="1" size="324,62" title="Volume" flags="wfNoBorder" backgroundColor="transparent" >
++              <ePixmap pixmap="Vu_HD/volume_background.png" position="0,0" size="324,62" />           
++              <widget name="Volume" pixmap="Vu_HD/volume_up.png" position="60,13" zPosition="1" size="250,34" transparent="1" />
++      </screen>
++
++      <!-- LCD/OLED Screens -->
++
++      <!-- LCD screen (channelselection) -->
++      <screen name="ChannelSelection_summary" position="0,0" size="132,64" id="1">
++              <widget source="parent.ServiceEvent" render="Label" position="6,0" size="120,25" font="Regular;14" halign="center" valign="center" >
++                      <convert type="ServiceName">Name</convert>
++              </widget>
++              <widget source="parent.ServiceEvent" render="Progress" position="16,27" size="100,5" borderWidth="1">
++                      <convert type="EventTime">Progress</convert>
++              </widget>
++              <widget source="global.CurrentTime" render="Label" position="6,32" size="90,32" font="Regular;32" halign="right" valign="top" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <widget source="global.CurrentTime" render="Label" position="100,34" zPosition="1" size="26,30" font="Regular;16" valign="top" transparent="1">
++                      <convert type="ClockToText">Format:%S</convert>
++              </widget>
++      </screen>
++      <!-- Color OLED screen (ChannelSelection) -->
++      <screen name="ChannelSelection_summary" position="0,0" size="96,64" id="2">
++              <widget source="parent.ServiceEvent" render="Label" position="0,0" size="96,25" font="Regular;14" halign="center" valign="center" >
++                      <convert type="ServiceName">Name</convert>
++              </widget>
++              <widget source="parent.ServiceEvent" render="Progress" position="0,27" size="96,5" borderWidth="1" >
++                      <convert type="EventTime">Progress</convert>
++              </widget>
++              <widget source="global.CurrentTime" render="Label" position="0,32" size="96,32" font="Regular;32" halign="center" valign="center" foregroundColor="#FFFFFF" backgroundColor="#000000" >
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++      </screen>
++      <!-- LCD screen (main) -->
++      <screen name="InfoBarSummary" position="0,0" size="132,64" id="1">
++              <widget source="session.CurrentService" render="Label" position="6,0" size="120,25" font="Regular;14" halign="center" valign="center" >
++                      <convert type="ServiceName">Name</convert>
++              </widget>
++              <widget source="session.Event_Now" render="Progress" position="16,27" size="100,5" borderWidth="1">
++                      <convert type="EventTime">Progress</convert>
++              </widget>
++              <widget source="global.CurrentTime" render="Label" position="6,32" size="90,32" font="Regular;32" halign="right" valign="top" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <widget source="global.CurrentTime" render="Label" position="100,34" zPosition="1" size="26,30" font="Regular;16" valign="top" transparent="1">
++                      <convert type="ClockToText">Format:%S</convert>
++              </widget>
++              <widget source="session.RecordState" render="FixedLabel" text=" " position="6,30" zPosition="1" size="120,34">
++                      <convert type="ConfigEntryTest">config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean</convert>
++                      <convert type="ConditionalShowHide">Blink</convert>
++              </widget>
++      </screen>
++      <!-- Color OLED screen (main) -->
++      <screen name="InfoBarSummary" position="0,0" size="96,64" id="2">
++              <widget source="session.CurrentService" render="Label" position="0,0" size="96,25" font="Regular;14" halign="center" valign="center" >
++                      <convert type="ServiceName">Name</convert>
++              </widget>
++              <widget source="session.Event_Now" render="Progress" position="0,27" size="96,5" borderWidth="1" >
++                      <convert type="EventTime">Progress</convert>
++              </widget>
++              <widget source="global.CurrentTime" render="Label" position="0,32" size="96,32" font="Regular;32" halign="center" valign="center" foregroundColor="#FFFFFF" backgroundColor="#000000" >
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <widget source="session.RecordState" render="FixedLabel" text=" " position="0,32" zPosition="1" size="96,32">
++                      <convert type="ConfigEntryTest">config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean</convert>
++                      <convert type="ConditionalShowHide">Blink</convert>
++              </widget>
++      </screen>
++      <!-- LCD screen (movieplayer) -->
++      <screen name="InfoBarMoviePlayerSummary" position="0,0" size="132,64" id="1">
++              <widget source="session.CurrentService" render="Label" position="6,0" size="120,25" font="Regular;14" halign="center" valign="center" >
++                      <convert type="ServiceName">Name</convert>
++              </widget>
++              <widget source="session.CurrentService" render="Progress" position="16,27" size="100,5" borderWidth="1">
++                      <convert type="ServicePosition">Position</convert>
++              </widget>
++              <widget source="global.CurrentTime" render="Label" position="6,32" size="120,32" font="Regular;32" halign="center" valign="center" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <widget source="session.RecordState" render="FixedLabel" text=" " position="6,32" zPosition="1" size="120,32">
++                      <convert type="ConfigEntryTest">config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean</convert>
++                      <convert type="ConditionalShowHide">Blink</convert>
++              </widget>
++      </screen>
++      <!-- Color OLED screen (movieplayer) -->
++      <screen name="InfoBarMoviePlayerSummary" position="0,0" size="96,64" id="2">
++              <widget source="session.CurrentService" render="Label" position="0,0" size="96,25" font="Regular;14" halign="center" valign="center" >
++                      <convert type="ServiceName">Name</convert>
++              </widget>
++              <widget source="session.CurrentService" render="Progress" position="0,27" size="96,5" borderWidth="1" >
++                      <convert type="ServicePosition">Position</convert>
++              </widget>
++              <widget source="global.CurrentTime" render="Label" position="0,32" size="96,32" font="Regular;32" halign="center" valign="center" foregroundColor="#FFFFFF" backgroundColor="#000000" >
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <widget source="session.RecordState" render="FixedLabel" text=" " position="0,32" zPosition="1" size="96,32">
++                      <convert type="ConfigEntryTest">config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean</convert>
++                      <convert type="ConditionalShowHide">Blink</convert>
++              </widget>
++      </screen>
++      <!-- LCD screen (ChoiceBox) -->
++      <screen name="ChoiceBox_summary" position="0,0" size="132,64" id="1">
++              <widget source="parent.summary_list" render="Label" position="6,0" size="126,64" font="Regular;11" />
++      </screen>
++      <!-- Color OLED screen (ChoiceBox) -->
++      <screen name="ChoiceBox_summary" position="0,0" size="96,64" id="2">
++              <widget source="parent.summary_list" render="Label" position="0,0" size="96,64" font="Regular;10" />
++      </screen>       
++      <!-- LCD screen (MessageBox) -->
++      <screen name="MessageBox_summary" position="0,0" size="132,64" id="1">
++              <widget source="parent.Text" render="Label" position="0,0" size="132,52" font="Regular;11" halign="center" valign="center" />
++              <widget source="parent.selectedChoice" render="Label" position="6,50" size="120,14" font="Regular;14" halign="center" valign="center" />
++      </screen>
++      <!-- Color OLED screen (MessageBox) -->
++      <screen name="MessageBox_summary" position="0,0" size="96,64" id="2">
++              <widget source="parent.Text" render="Label" position="0,0" size="96,52" font="Regular;10" halign="center" valign="center" />
++              <widget source="parent.selectedChoice" render="Label" position="0,50" size="96,14" font="Regular;12" halign="center" valign="center" />
++      </screen>
++      <!-- LCD screen (menus) -->
++      <screen name="MenuSummary" position="0,0" size="132,64" id="1">
++              <widget source="parent.title" render="Label" position="6,0" size="120,32" font="Regular;14" halign="center" valign="center"/>
++              <widget source="parent.menu" render="Label" position="6,32" size="120,32" font="Regular;16" halign="center" valign="center">
++                      <convert type="StringListSelection" />
++              </widget>
++      </screen> 
++      <!-- Color OLED screen (menus) -->
++      <screen name="MenuSummary" position="0,0" size="96,64" id="2">
++              <widget source="parent.title" render="Label" position="0,0" size="96,32" font="Regular;14" halign="center" valign="center"/>
++              <widget source="parent.menu" render="Label" position="0,32" size="96,32" font="Regular;14" halign="center" valign="center">
++                      <convert type="StringListSelection" />
++              </widget>
++      </screen>       
++      <!-- LCD screen (ServiceScan) -->
++      <screen name="ServiceScanSummary" position="0,0" size="132,64" id="1">
++              <widget name="Title" position="6,4" size="120,42" font="Regular;16" transparent="1" />
++              <widget name="Service" position="6,22" size="120,26" font="Regular;12" transparent="1" />
++              <widget name="scan_progress" position="6,50" zPosition="1" borderWidth="1" size="56,12" backgroundColor="dark" />
++      </screen>
++      <!-- Color OLED screen (ServiceScan) -->
++      <screen name="ServiceScanSummary" position="0,0" size="96,64" id="2">
++              <widget name="Title" position="0,0" size="96,30" font="Regular;14" transparent="1" />
++              <widget name="Service" position="0,30" size="96,20" font="Regular;10" transparent="1" />
++              <widget name="scan_progress" position="0,50" zPosition="1" borderWidth="1" size="96,12" backgroundColor="dark" />
++      </screen>
++      <!-- LCD screen (setup) -->
++      <screen name="SetupSummary" position="0,0" size="132,64" id="1">
++              <widget source="SetupTitle" render="Label" position="6,0" size="120,16" font="Regular;12" />
++              <widget source="SetupEntry" render="Label" position="6,16" size="120,32" font="Regular;12" />
++              <widget source="SetupValue" render="Label" position="6,48" size="120,16" font="Regular;12" />
++      </screen>
++      <!-- Color OLED screen (setup) -->
++      <screen name="SetupSummary" position="0,0" size="96,64" id="2">
++              <widget source="SetupTitle" render="Label" position="0,0" size="96,16" font="Regular;10" />
++              <widget source="SetupEntry" render="Label" position="0,16" size="96,32" font="Regular;10" />
++              <widget source="SetupValue" render="Label" position="0,48" size="96,16" font="Regular;10" />
++      </screen>
++      <!-- LCD screen (misc) -->
++      <screen name="SimpleSummary" position="0,0" size="132,64" id="1">
++              <widget source="parent.Title" render="Label" position="6,0" size="120,64" font="Regular;16" halign="center" valign="center" />
++      </screen>
++      <!-- Color OLED screen (misc) -->
++      <screen name="SimpleSummary" position="0,0" size="96,64" id="2">
++              <widget source="parent.Title" render="Label" position="0,0" size="96,64" font="Regular;14" halign="center" valign="center" />
++      </screen>
++      <!-- LCD screen (standby) -->
++      <screen name="StandbySummary" position="0,0" size="132,64" id="1">
++              <widget source="global.CurrentTime" render="Label" position="6,0" size="120,64" font="Regular;40" halign="center" valign="center">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <widget source="session.RecordState" render="FixedLabel" position="6,0" zPosition="1" size="120,64" text=" ">
++                      <convert type="ConfigEntryTest">config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean</convert>
++                      <convert type="ConditionalShowHide">Blink</convert>
++              </widget>
++      </screen>
++      <!-- Color OLED screen (standby) -->
++      <screen name="StandbySummary" position="0,0" size="96,64" id="2">
++              <widget source="global.CurrentTime" render="Label" position="0,0" size="96,64" font="Regular;40" halign="center" valign="center">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <widget source="session.RecordState" render="FixedLabel" position="0,0" zPosition="1" size="96,64" text=" ">
++                      <convert type="ConfigEntryTest">config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean</convert>
++                      <convert type="ConditionalShowHide">Blink</convert>
++              </widget>
++      </screen>
++      <!-- LCD screen (JobView) -->
++      <screen name="JobView_summary" position="0,0" size="132,64" id="1">
++              <widget source="parent.summary_job_name" render="Label" position="6,4" size="120,42" font="Regular;16" />
++              <widget source="parent.summary_job_task" render="Label" position="6,22" size="120,26" font="Regular;12" />
++              <widget source="parent.summary_job_progress" render="Progress" position="6,50" size="60,12" borderWidth="1" zPosition="1" />
++              <widget source="parent.summary_job_progress" render="Label" position="66,50" size="50,12" font="Regular;12" zPosition="2" halign="center" transparent="1"  >
++                      <convert type="ProgressToText" />
++              </widget>
++      </screen>
++      <!-- Color OLED screen (JobView) -->
++      <screen name="JobView_summary" position="0,0" size="96,64" id="2">
++              <widget source="parent.summary_job_name" render="Label" position="0,4" size="96,42" font="Regular;14" />
++              <widget source="parent.summary_job_task" render="Label" position="0,22" size="96,26" font="Regular;10" />
++              <widget source="parent.summary_job_progress" render="Progress" position="0,50" size="60,12" borderWidth="1" zPosition="1" />
++              <widget source="parent.summary_job_progress" render="Label" position="60,50" size="36,12" font="Regular;10" zPosition="2" halign="center" transparent="1"  >
++                      <convert type="ProgressToText" />
++              </widget>
++      </screen>
++      <!-- LCD screen (Wizard) -->
++      <screen name="WizardSummary" position="0,0" size="132,64" id="1">
++              <widget source="text" render="Label" position="6,0" size="120,16" font="Regular;16" transparent="1" />
++              <widget source="parent.list" render="Label" position="6,18" size="120,46" font="Regular;12">
++                      <convert type="StringListSelection" />
++              </widget>
++      </screen>
++      <!-- Color OLED screen (Wizard) -->
++      <screen name="WizardSummary" position="0,0" size="96,64" id="2">
++              <widget source="text" render="Label" position="0,0" size="96,16" font="Regular;14" transparent="1" />
++              <widget source="parent.list" render="Label" position="0,18" size="96,46" font="Regular;12">
++                      <convert type="StringListSelection" />
++              </widget>
++      </screen>
++      
++      <!-- JobView -->
++      <screen name="JobView" position="center,center" size="520,350" title="Job View">
++              <widget source="job_name" render="Label" position="20,12" size="480,60" font="Regular;28" />
++              <widget source="job_task" render="Label" position="20,90" size="480,50" font="Regular;23" />
++              <widget source="job_progress" render="Progress" position="20,162" size="480,36" borderWidth="2" backgroundColor="#254f7497" />
++              <widget source="job_progress" render="Label" position="120,166" size="280,32" font="Regular;28" foregroundColor="#000000" zPosition="2" halign="center" transparent="1"  >
++                      <convert type="ProgressToText" />
++              </widget>
++              <widget source="job_status" render="Label" position="20,212" size="480,26" font="Regular;23" />
++              <widget name="config" position="20,254" size="480,20" />
++              <widget source="cancelable" render="Pixmap" pixmap="Vu_HD/buttons/red.png" position="20,300" size="25,25" alphatest="on" >
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="cancelable" render="FixedLabel" text="Cancel" position="50,300" zPosition="1" size="110,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" >
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="finished" render="Pixmap" pixmap="Vu_HD/buttons/green.png" position="190,300" size="25,25" alphatest="on" >
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="finished" render="FixedLabel" text="OK" font="Regular;20" halign="center" valign="center" position="220,300" size="110,40" transparent="1" backgroundColor="#1f771f" >
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="backgroundable" render="Pixmap" pixmap="Vu_HD/buttons/blue.png" position="360,300" size="25,25" alphatest="on" >
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="backgroundable" render="FixedLabel" text="Continue in background" font="Regular;20" halign="center" valign="center" position="390,300" size="110,40" transparent="1" backgroundColor="#18188b" >
++                      <convert type="ConditionalShowHide" />
++              </widget>
++      </screen>
++      <!-- VirtualKeyBoard -->
++      <screen name="VirtualKeyBoard" position="center,center" size="560,350" zPosition="99" title="Virtual KeyBoard">
++              <ePixmap pixmap="skin_default/vkey_text.png" position="9,35" zPosition="-4" size="542,52" alphatest="on" />
++              <widget name="header" position="10,10" size="500,20" font="Regular;20" transparent="1" noWrap="1" />
++              <widget name="text" position="12,35" size="536,46" font="Regular;46" transparent="1" noWrap="1" halign="right" />
++              <widget name="list" position="10,100" size="540,225" selectionDisabled="1" foregroundColor="#ececec" backgroundColor="#1c2c5c" transparent="1" />
++      </screen>
++      <!-- FileBrowser -->
++      <screen name="FileBrowser" position="center,120" size="700,500" title="DVD File Browser" >
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="100,0" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="295,0" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="138,0" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="#279e9fa4" transparent="1" />
++              <widget source="key_green" render="Label" position="333,0" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="#279e9fa4" transparent="1" />
++              <widget name="filelist" position="50,50" size="600,450" scrollbarMode="showOnDemand" />
++      </screen>
++      <screen name="CutListEditor" position="0,0" size="1280,720" title="Cutlist editor" flags="wfNoBorder">
++              <widget source="global.CurrentTime" render="Label" position="1130,40" size="80,26" font="Regular;26" halign="right" transparent="1" >
++                      <convert type="ClockToText">Default</convert>
++              </widget>
++              <widget source="global.CurrentTime" render="Label" position="1000,72" size="210,22" font="Regular;20" halign="right" transparent="1">
++                      <convert type="ClockToText">Format:%d.%m.%Y</convert>
++              </widget>
++              <eLabel text="Cutlist editor" position="90,120" size="320,32" font="Regular;27" transparent="1" />
++              <eLabel position="80,155" size="340,420" zPosition="1" backgroundColor="black" />
++              <eLabel position="81,156" size="338,418" zPosition="2" backgroundColor="white" />
++              <widget source="cutlist" render="Listbox"       position="90,165" zPosition="3" size="320,400" scrollbarMode="showOnDemand" backgroundColor="white" transparent="1" >
++                      <convert type="TemplatedMultiContent">
++                              {"template": [
++                                              MultiContentEntryText(size=(220, 20), text = 1),
++                                              MultiContentEntryText(pos=(220,2), size=(100, 20), text = 2, flags = RT_HALIGN_RIGHT)
++                                      ],
++                               "fonts": [gFont("Regular", 20)],
++                               "itemHeight": 25
++                              }
++                      </convert>
++              </widget>
++              <eLabel position="479,124" zPosition="3" size="696,377" backgroundColor="#ff000000" />
++              <widget name="Video" position="491,130" zPosition="-10" size="672,365" />
++              <widget source="session.CurrentService" render="Label" position="450,510" size="790,30" zPosition="3" font="Regular;24" backgroundColor="#27c2bbb2" halign="center" valign="center" transparent="1">
++                      <convert type="ServiceName">Name</convert>
++              </widget>
++              <widget source="session.CurrentService" render="Label" position="450,550" size="790,25" zPosition="3" font="Regular;20" halign="center" valign="center" transparent="1">
++                      <convert type="ServicePosition">Position,Detailed</convert>
++              </widget>
++              <widget name="Timeline" position="479,587" size="696,20" zPosition="3" pointer="skin_default/position_arrow.png:3,5" backgroundColor="#2707255d" />
++              <eLabel text="OK = Menu" position="1060,630" size="140,22" zPosition="1" font="Regular;20" backgroundColor="#27c2bbb2" transparent="1" />
++      </screen>
++      <screen name="DVDToolbox" position="center,120"  size="560,420" title="DVD media toolbox" >
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="0,0" size="140,40" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="140,0" size="140,40" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="280,0" size="140,40" alphatest="blend" />
++              <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
++              <widget source="info" render="Label" position="20,50" size="520,100" font="Regular;20" />
++              <widget name="details" position="20,180" size="520,200" font="Regular;16" />
++              <widget source="space_bar" render="Progress" position="10,390" size="540,26" borderWidth="1" backgroundColor="#254f7497" />
++              <widget source="space_label" render="Label" position="20,394" size="520,22" zPosition="2" font="Regular;18" halign="center" transparent="1" foregroundColor="#000000" />
++      </screen>
++      <screen name="ProjectSettings" position="center,120" size="560,420" title="Collection settings" >
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="0,0" size="140,40" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="140,0" size="140,40" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="280,0" size="140,40" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/blue.png" position="420,0" size="140,40" alphatest="blend" />
++              <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
++              <widget source="key_blue" render="Label" position="440,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
++              <widget name="config" position="5,50" size="550,276" scrollbarMode="showOnDemand" />
++              <ePixmap pixmap="Vu_HD/div-h.png" position="0,330" zPosition="1" size="560,2" />
++              <widget source="info" render="Label" position="10,340" size="550,80" font="Regular;18" halign="center" valign="center" />
++      </screen>
++      <screen name="TitleCutter" position="0,0" size="1280,720" title="Cutlist editor" flags="wfNoBorder">
++              <widget source="global.CurrentTime" render="Label" position="1130,40" size="80,26" font="Regular;26" halign="right" transparent="1" >
++                      <convert type="ClockToText">Default</convert>
++              </widget>
++              <widget source="global.CurrentTime" render="Label" position="1000,72" size="210,22" font="Regular;20" halign="right" transparent="1">
++                      <convert type="ClockToText">Format:%d.%m.%Y</convert>
++              </widget>
++              <eLabel text="Cutlist editor" position="90,120" size="320,32" font="Regular;27" transparent="1" />
++              <eLabel position="80,155" size="340,420" zPosition="1" backgroundColor="black" />
++              <eLabel position="81,156" size="338,418" zPosition="2" backgroundColor="white" />
++              <widget source="cutlist" render="Listbox"       position="90,165" zPosition="3" size="320,400" scrollbarMode="showOnDemand" backgroundColor="white" transparent="1" >
++                      <convert type="TemplatedMultiContent">
++                              {"template": [
++                                              MultiContentEntryText(size=(220, 20), text = 1),
++                                              MultiContentEntryText(pos=(220,2), size=(100, 20), text = 2, flags = RT_HALIGN_RIGHT)
++                                      ],
++                               "fonts": [gFont("Regular", 20)],
++                               "itemHeight": 25
++                              }
++                      </convert>
++              </widget>
++              <eLabel position="479,124" zPosition="3" size="696,377" backgroundColor="#ff000000" />
++              <widget name="Video" position="491,130" zPosition="-10" size="672,365" />
++              <widget source="session.CurrentService" render="Label" position="450,510" size="790,30" zPosition="3" font="Regular;24" backgroundColor="#27c2bbb2" halign="center" valign="center" transparent="1">
++                      <convert type="ServiceName">Name</convert>
++              </widget>
++              <widget source="session.CurrentService" render="Label" position="450,550" size="790,25" zPosition="3" font="Regular;20" halign="center" valign="center" transparent="1">
++                      <convert type="ServicePosition">Position,Detailed</convert>
++              </widget>
++              <widget name="Timeline" position="479,587" size="696,20" zPosition="3" pointer="skin_default/position_arrow.png:3,5" backgroundColor="#2707255d" />
++              <eLabel text="OK = Menu" position="1060,630" size="140,22" zPosition="1" font="Regular;20" backgroundColor="#27c2bbb2" transparent="1" />
++      </screen>
++      <screen name="TitleList" position="209,48" size="865,623" title="DVD Tool" flags="wfNoBorder" backgroundColor="transparent">    
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="DVD Tool" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" halign="right" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/blue.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="83,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_green" render="Label" position="278,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_yellow" render="Label" position="473,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_blue" render="Label" position="663,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="title_label" render="Label" position="160,148" size="540,38" font="Regular;18" backgroundColor="#27c2bbb2" transparent="1" />
++              <widget source="error_label" render="Label" position="160,148" size="540,340" zPosition="3" font="Regular;20" backgroundColor="#27c2bbb2" transparent="1" />
++              <widget source="titles" render="Listbox" scrollbarMode="showOnDemand" position="160,186" size="540,277" zPosition="3" transparent="1" >
++                      <convert type="TemplatedMultiContent">
++                              {"template": [
++                                              MultiContentEntryText(pos = (0, 0), size = (420, 20), font = 0, flags = RT_HALIGN_LEFT, text = 1), # index 1 Title,
++                                              MultiContentEntryText(pos = (0, 20), size = (328, 17), font = 1, flags = RT_HALIGN_LEFT, text = 2), # index 2 description,
++                                              MultiContentEntryText(pos = (420, 6), size = (120, 20), font = 1, flags = RT_HALIGN_RIGHT, text = 3), # index 3 begin time,
++                                              MultiContentEntryText(pos = (328, 20), size = (154, 17), font = 1, flags = RT_HALIGN_RIGHT, text = 4), # index 4 channel,
++                                              MultiContentEntryText(pos = (482, 20), size = (58, 20), font = 1, flags = RT_HALIGN_RIGHT, text = 5), # index 4 channel,
++                                      ],
++                                      "fonts": [gFont("Regular", 20), gFont("Regular", 14)],
++                                      "itemHeight": 37
++                              }
++                      </convert>
++              </widget>
++              <widget source="space_bar_single" render="Progress" position="160,490" size="270,24" borderWidth="1" zPosition="2" backgroundColor="#254f7497" />
++              <widget source="space_label_single" render="Label" position="160,493" size="270,22" zPosition="3" font="Regular;18" halign="center" transparent="1" foregroundColor="#000000" />
++              <widget source="space_bar_dual" render="Progress" position="160,490" size="540,24" borderWidth="1" backgroundColor="#254f7497" />
++              <widget source="space_label_dual" render="Label" position="160,493" size="540,22" zPosition="2" font="Regular;18" halign="center" transparent="1" foregroundColor="#000000" />
++      </screen>
++      <screen name="DVDMovieSelection" position="center,120" size="560,425" title="Select a movie">
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="0,0" size="140,40" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="140,0" size="140,40" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="280,0" size="140,40" alphatest="blend" />
++              <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
++              <widget name="waitingtext" position="0,45" size="560,375" zPosition="4" font="Regular;22" halign="center" valign="center" />
++              <widget name="list" position="5,40" size="550,355" zPosition="2" scrollbarMode="showOnDemand" />
++              <widget name="DescriptionBorder" pixmap="Vu_HD/border_eventinfo.png" position="0,296" zPosition="1" size="560,103" transparent="1" alphatest="on" />
++              <widget source="Service" render="Label" position="5,298" zPosition="1" size="480,35" font="Regular;17" foregroundColor="#cccccc">
++                      <convert type="MovieInfo">ShortDescription</convert>
++              </widget>
++              <widget source="Service" render="Label" position="495,298" zPosition="1" size="60,22" font="Regular;17" halign="right">
++                      <convert type="ServiceTime">Duration</convert>
++                      <convert type="ClockToText">AsLength</convert>
++              </widget>
++              <widget source="Service" render="Label" position="380,317" zPosition="2" size="175,22" font="Regular;17" halign="right">
++                      <convert type="MovieInfo">RecordServiceName</convert>
++              </widget>
++              <widget source="Service" render="Label" position="5,337" zPosition="1" size="550,58" font="Regular;19">
++                      <convert type="EventName">ExtendedDescription</convert>
++              </widget>
++              <widget name="freeDiskSpace" position="10,405" size="540,20" font="Regular;19" valign="center" halign="right" />
++      </screen>       
++      <screen name="TitleProperties" position="center,120" size="560,425" title="Properties of current title" >
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="0,0" size="140,40" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="140,0" size="140,40" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/blue.png" position="420,0" size="140,40" alphatest="blend" />
++              <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget source="key_blue" render="Label" position="440,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
++              <widget source="serviceinfo" render="Label" position="10,46" size="350,144" font="Regular;18" />
++              <widget name="thumbnail" position="370,46" size="180,144" alphatest="on" />
++              <widget name="config" position="10,196" size="540,228" scrollbarMode="showOnDemand" />
++      </screen>
++      <screen name="DVDPlayer" flags="wfNoBorder" position="200,516" size="880,162" title="InfoBar" backgroundColor="transparent">
++              <!-- Background -->
++              <ePixmap position="0,0" zPosition="-1" size="880,144" pixmap="Vu_HD/Bg_Media_info.png" />
++              <ePixmap position="35,18" size="37,28" pixmap="Vu_HD/menu/ico_title_media-info.png" alphatest="blend" />                
++              <!-- colorbuttons -->
++              <ePixmap position="50,75" pixmap="Vu_HD/icons/ico_player.png" size="152,18" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="770,15" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="790,17" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <!-- Servicename -->
++              <ePixmap pixmap="Vu_HD/icons/icon_event.png" position="85,15" zPosition="1" size="15,10" alphatest="on" />
++              <widget source="session.CurrentService" render="Label" position="110,10" size="300,20" font="Regular;20" backgroundColor="#27d9dee2" transparent="1" noWrap="1">
++                      <convert type="ServiceName">Name</convert>
++              </widget>
++              <!-- Chapter info -->
++              <widget name="chapterLabel" position="110,32" size="360,20" font="Regular;16" foregroundColor="#3c3c3c" backgroundColor="#27d9dee2" transparent="1" />
++              <!-- Audio track info -->
++              <ePixmap pixmap="Vu_HD/icons/icon_dolby.png" position="675,52" zPosition="1" size="43,15" alphatest="blend"/>
++              <widget name="audioLabel" position="720,50" size="130,22" font="Regular;16" backgroundColor="#27aeaeae" transparent="1" />
++              <!-- Subtitle track info -->
++              <widget source="session.CurrentService" render="Pixmap" pixmap="Vu_HD/icons/icon_txt.png" position="520,52" zPosition="1" size="26,16" alphatest="blend" >
++                      <convert type="ServiceInfo">HasTelext</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget name="subtitleLabel" position="550,50" size="120,22" font="Regular;16" backgroundColor="#263c59" transparent="1" />
++              <!-- Angle info -->
++              <widget name="anglePix" pixmap="Vu_HD/icons/icon_view.png" position="370,50" size="26,16" alphatest="on" />
++              <widget name="angleLabel" position="400,48" size="120,22" font="Regular;16" backgroundColor="#263c59" transparent="1" />
++              <!-- Elapsed time -->
++              <widget source="session.CurrentService" render="Label" position="240,95" size="100,24" font="Semiboldit;18" halign="left" valign="center" foregroundColor="#3d0e82" backgroundColor="#27aeaeae" transparent="1">
++                      <convert type="ServicePosition">Position,ShowHours</convert>
++              </widget>
++              <!-- Progressbar (movie position)-->
++              <ePixmap position="240,75" size="563,18" pixmap="Vu_HD/icons/Mediaplayerbar_gray.png" alphatest="blend" />              
++              <widget source="session.CurrentService" render="PositionGauge" position="242,68" size="563,25" zPosition="2" pointer="Vu_HD/icons/Mediaplayerbar_purple.png:563,0" transparent="1">
++                      <convert type="ServicePosition">Gauge</convert>
++              </widget>
++              <!-- Remaining time -->
++              <widget source="session.CurrentService" render="Label" position="700,95" size="95,20" font="Regular;16" halign="right" valign="center" foregroundColor="#3c3c3c" backgroundColor="#27aeaeae" transparent="1">
++                      <convert type="ServicePosition">Remaining,Negate,ShowHours</convert>
++              </widget>
++      </screen>
++      <screen name="ModemSetup" position="180,100" size="320,300" title="Modem" >
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="10,10" size="140,40" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="160,10" size="140,40" alphatest="blend" />
++              <widget name="key_green" position="30,10" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget name="key_red" position="180,10" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget name="list" position="10,60" size="300,120" />
++              <widget name="state" position="10,210" size="300,80" font="Regular;20" />
++      </screen>
++      <screen name="picshow" position="center,120" size="560,420" title="PicturePlayer" >
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="0,0" size="140,40" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="140,0" size="140,40" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="280,0" size="140,40" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/blue.png" position="420,0" size="140,40" alphatest="blend" />
++              <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
++              <widget source="key_blue" render="Label" position="440,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
++              <widget source="label" render="Label" position="5,55" size="350,140" font="Regular;19" backgroundColor="#25062748" transparent="1"  />
++              <widget name="thn" position="360,40" size="180,160" alphatest="on" />
++              <widget name="filelist" position="5,205" zPosition="2" size="550,210" scrollbarMode="showOnDemand" />
++      </screen>       
++      <screen name="Pic_Exif" position="center,center" size="560,360" title="Info" >
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="0,0" size="140,40" alphatest="blend" />
++              <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="menu" render="Listbox" position="5,50" size="550,310" scrollbarMode="showOnDemand" selectionDisabled="1" >
++                      <convert type="TemplatedMultiContent">
++                      {
++                              "template": [  MultiContentEntryText(pos = (5, 5), size = (250, 30), flags = RT_HALIGN_LEFT, text = 0), MultiContentEntryText(pos = (260, 5), size = (290, 30), flags = RT_HALIGN_LEFT, text = 1)],
++                              "fonts": [gFont("Regular", 20)],
++                              "itemHeight": 30
++                      }
++                      </convert>
++              </widget>
++      </screen>
++      <screen name="CleanupWizard" position="0,0" size="1280,720" title="Welcome..." flags="wfNoBorder" >
++              <widget name="text" position="400,100" size="550,270" font="Regular;23" />
++              <widget source="list" render="Listbox" transparent="1" position="300,400" size="500,300" scrollbarMode="showOnDemand" >
++                      <convert type="StringList" />
++              </widget>
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="150,250" size="25,25" alphatest="blend" />
++              <widget name="languagetext" position="200,253" size="120,30" font="Regular;18" />
++              <widget name="config" position="300,400" zPosition="1" size="500,300" transparent="1" scrollbarMode="showOnDemand" />            
++              <widget name="portpic" position="100,400" zPosition="10" size="150,150" transparent="1" alphatest="on"/>
++              <widget name="rc" pixmap="Vu_HD/rc.png" position="950,150" zPosition="10" size="154,500" transparent="1" alphatest="blend"/>
++              <widget name="arrowdown" pixmap="Vu_HD/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++              <widget name="arrowdown2" pixmap="Vu_HD/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++              <widget name="arrowup" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++              <widget name="arrowup2" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++      </screen>
++              <screen name="CleanupWizardConfiguration" position="209,48" size="865,623" title="CleanupWizard settings" flags="wfNoBorder" backgroundColor="transparent">     
++              <ePixmap pixmap="Vu_HD/Bg_EPG_list.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="CleanupWizard settings" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_green" render="Label" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="config" zPosition="2" position="50,130" itemHeight="36" size="750,324" scrollbarMode="showOnDemand" transparent="1" />
++              <eLabel text=" " position="145,460" zPosition="10" size="560,2" transparent="1" backgroundColor="#8c8c8c" />
++              <widget source="status" render="Label" position="160,525" size="540,60" zPosition="10" foregroundColor="#3c3c3c" backgroundColor="#27aeaeae" font="Regular;20" halign="center" valign="center" transparent="1"/>
++      </screen>
++      <screen name="CIselectMainMenu" position="100,80" size="520,538" title="CI assignment" flags="wfNoBorder" backgroundColor="transparent">        
++              <ePixmap pixmap="Vu_HD/Bg_Subtitle.png" position="0,0" size="520,538" zPosition="-1" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="16,36" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="CI assignment" position="69,45" size="400,32" font="Semiboldit;32" foregroundColor="#4c4c4c" backgroundColor="#b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="20,91" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="210,91" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="58,93" zPosition="1" size="150,20" font="Regular;20" halign="center" valign="center" backgroundColor="#27b5b9bd" transparent="1" />
++              <widget source="key_green" render="Label" position="248,93" zPosition="1" size="150,20" font="Regular;20" halign="center" valign="center" backgroundColor="#27b5b9bd" transparent="1" />
++              <widget name="CiList" position="15,125" itemHeight="42" selectionPixmap="Vu_HD/buttons/FocusBar_H42.png" transparent="1" zPosition="1" size="490,336" scrollbarMode="showOnDemand" />
++      </screen>
++      <screen name="CIconfigMenu" position="209,48" size="865,623" title="CI assignment" flags="wfNoBorder" backgroundColor="transparent">    
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="CI assignment" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" halign="right" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/blue.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="73,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_green" render="Label" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_yellow" render="Label" position="473,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_blue" render="Label" position="668,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="CAidList_desc" render="Label" position="155,200" size="550,22" font="Regular;20"  backgroundColor="#27d9dee2" transparent="1" />
++              <widget source="CAidList" render="Label" position="155,230" size="550,45" font="Regular;20"  backgroundColor="#27d9dee2" transparent="1" />
++              <ePixmap pixmap="Vu_HD/div-h.png" position="150,275" zPosition="1" size="560,2" />
++              <widget source="ServiceList_desc" render="Label" position="155,280" size="550,22" font="Regular;20" backgroundColor="#27d9dee2" transparent="1"  />
++              <widget name="ServiceList" position="155,310" size="550,250" zPosition="1" scrollbarMode="showOnDemand" />
++              <widget source="ServiceList_info" render="Label" position="155,310" size="550,250" zPosition="2" font="Regular;20" backgroundColor="#27d9dee2" transparent="1"  />
++      </screen>
++      <screen name="easyCIconfigMenu" position="209,48" size="865,623" title="CI assignment" flags="wfNoBorder" backgroundColor="transparent">        
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="CI assignment" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" halign="right" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="73,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_green" render="Label" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_yellow" render="Label" position="473,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="ServiceList_desc" render="Label" position="155,200" size="550,22" font="Regular;20" backgroundColor="#27d9dee2" transparent="1"  />
++              <widget name="ServiceList" position="155,230" size="550,300" zPosition="1" scrollbarMode="showOnDemand" />
++              <widget source="ServiceList_info" render="Label" position="155,230" size="550,300" zPosition="2" font="Regular;20" backgroundColor="#27d9dee2" transparent="1"  />
++      </screen>       
++      <screen name="CAidSelect" position="209,48" size="865,623" title="select CAId's" flags="wfNoBorder" backgroundColor="transparent">      
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="select CAId's" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" halign="right" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="73,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_green" render="Label" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="list" position="155,150" size="540,350" scrollbarMode="showOnDemand" />
++              <ePixmap pixmap="Vu_HD/div-h.png" position="150,520" zPosition="1" size="450,2" />
++              <widget source="introduction" render="Label" position="150,530" size="450,40" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#27d9dee2" transparent="1" />
++      </screen>
++      <screen name="myProviderSelection" position="209,48" size="865,623" title="Select provider to add..." flags="wfNoBorder" backgroundColor="transparent"> 
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Select provider to add..." position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" halign="right" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="73,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_green" render="Label" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_yellow" render="Label" position="473,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_blue" render="Label" position="668,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="list" position="155,150" size="550,350" scrollbarMode="showOnDemand" />
++              <ePixmap pixmap="Vu_HD/div-h.png" position="150,510" zPosition="1" size="560,2" />
++              <widget source="introduction" render="Label" position="150,520" size="560,40" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#27d9dee2" transparent="1" />
++      </screen>
++      <screen name="myChannelSelection" position="209,48" size="865,623" title="Select service to add..." flags="wfNoBorder" backgroundColor="transparent">   
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Select service to add..." position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" halign="right" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/blue.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="73,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_green" render="Label" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_yellow" render="Label" position="473,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_blue" render="Label" position="668,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="list" position="155,150" size="550,350" scrollbarMode="showOnDemand" />
++              <ePixmap pixmap="Vu_HD/div-h.png" position="150,510" zPosition="1" size="560,2" />
++              <widget source="introduction" render="Label" position="150,520" size="560,40" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#27d9dee2" transparent="1" />
++      </screen>
++      <screen name="CrashlogAutoSubmitConfiguration" position="209,48" size="865,623" title="CrashlogAutoSubmit settings" flags="wfNoBorder" backgroundColor="transparent">   
++              <ePixmap pixmap="Vu_HD/Bg_EPG_list.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="CrashlogAutoSubmit settings" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" halign="right" backgroundColor="#27d9dee2" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_green" render="Label" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="config" zPosition="2" position="50,130" itemHeight="36" size="750,324" scrollbarMode="showOnDemand" transparent="1" />
++              <eLabel text=" " position="145,460" zPosition="10" size="560,2" transparent="1" backgroundColor="#8c8c8c" />
++              <widget source="status" render="Label" position="160,525" size="540,60" zPosition="10" foregroundColor="#3c3c3c" backgroundColor="#27aeaeae" font="Regular;20" halign="center" valign="center" transparent="1"/>
++              <widget name="VKeyIcon" pixmap="Vu_HD/buttons/key_text.png" position="160,490" zPosition="10" size="35,25" transparent="1" alphatest="on" />
++              <widget name="HelpWindow" pixmap="Vu_HD/vkey_icon.png" position="310,400" zPosition="1" size="1,1" transparent="1" alphatest="on" />
++      </screen>
++      <screen name="DefaultServiceScan" position="150,115" size="420,390" title="Service Scan">
++              <widget source="FrontendInfo" render="Pixmap" pixmap="Vu_HD/icons/scan-s.png" position="5,5" size="64,64" transparent="1" alphatest="blend">
++                      <convert type="FrontendInfo">TYPE</convert>
++                      <convert type="ValueRange">0,0</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="FrontendInfo" render="Pixmap" pixmap="Vu_HD/icons/scan-c.png" position="5,5" size="64,64" transparent="1" alphatest="on">
++                      <convert type="FrontendInfo">TYPE</convert>
++                      <convert type="ValueRange">1,1</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="FrontendInfo" render="Pixmap" pixmap="Vu_HD/icons/scan-t.png" position="5,5" size="64,64" transparent="1" alphatest="on">
++                      <convert type="FrontendInfo">TYPE</convert>
++                      <convert type="ValueRange">2,2</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget name="network" position="80,15" size="330,20" font="Regular;20" />
++              <widget name="transponder" position="80,40" size="330,20" font="Regular;20" />
++              <widget name="scan_state" position="10,80" zPosition="2" size="400,20" font="Regular;18" />
++              <widget name="pass" position="10,80" size="400,20" font="Regular;18" />
++              <widget name="scan_progress" position="10,105" size="400,15" pixmap="Vu_HD/progress_big.png" borderWidth="2" borderColor="#cccccc" />
++              <widget name="servicelist" position="10,135" size="400,265" selectionDisabled="1" />
++      </screen>
++      <screen name="DiseqcTester" position="90,100" size="520,400" title="DiSEqC Tester" >
++              <!--ePixmap pixmap="Vu_HD/icons/dish_scan.png" position="5,25" zPosition="0" size="119,110" transparent="1" alphatest="on" />
++              <widget source="Frontend" render="Label" position="190,10" zPosition="2" size="260,20" font="Regular;19" halign="center" valign="center" transparent="1">
++                      <convert type="FrontendInfo">SNRdB</convert>
++              </widget>
++              <eLabel name="snr" text="SNR:" position="120,35" size="60,22" font="Regular;21" halign="right" transparent="1" />
++              <widget source="Frontend" render="Progress" position="190,35" size="260,20" pixmap="Vu_HD/bar_snr.png" borderWidth="2" borderColor="#cccccc">
++                      <convert type="FrontendInfo">SNR</convert>
++              </widget>
++              <widget source="Frontend" render="Label" position="460,35" size="60,22" font="Regular;21">
++                      <convert type="FrontendInfo">SNR</convert>
++              </widget>
++              <eLabel name="agc" text="AGC:" position="120,60" size="60,22" font="Regular;21" halign="right" transparent="1" />
++              <widget source="Frontend" render="Progress" position="190,60" size="260,20" pixmap="Vu_HD/bar_snr.png" borderWidth="2" borderColor="#cccccc">
++                      <convert type="FrontendInfo">AGC</convert>
++              </widget>
++              <widget source="Frontend" render="Label" position="460,60" size="60,22" font="Regular;21">
++                      <convert type="FrontendInfo">AGC</convert>
++              </widget>
++              <eLabel name="ber" text="BER:" position="120,85" size="60,22" font="Regular;21" halign="right" transparent="1" />
++              <widget source="Frontend" render="Progress" position="190,85" size="260,20" pixmap="Vu_HD/bar_ber.png" borderWidth="2" borderColor="#cccccc">
++                      <convert type="FrontendInfo">BER</convert>
++              </widget>
++              <widget source="Frontend" render="Label" position="460,85" size="60,22" font="Regular;21">
++                      <convert type="FrontendInfo">BER</convert>
++              </widget>
++              <eLabel name="lock" text="Lock:" position="120,115" size="60,22" font="Regular;21" halign="right" />
++              <widget source="Frontend" render="Pixmap" pixmap="Vu_HD/icons/lock_on.png" position="190,110" zPosition="1" size="38,31" alphatest="on">
++                      <convert type="FrontendInfo">LOCK</convert>
++                      <convert type="ConditionalShowHide" />
++              </widget>
++              <widget source="Frontend" render="Pixmap" pixmap="skin_default/icons/lock_off.png" position="190,110" zPosition="1" size="38,31" alphatest="on">
++                      <convert type="FrontendInfo">LOCK</convert>
++                      <convert type="ConditionalShowHide">Invert</convert>
++              </widget-->
++              <widget source="progress_list" render="Listbox" position="0,0" size="510,150" scrollbarMode="showOnDemand">
++                      <convert type="TemplatedMultiContent">
++                              {"template": [
++                                              MultiContentEntryText(pos = (10, 0), size = (330, 25), flags = RT_HALIGN_LEFT, text = 1), # index 1 is the index name,
++                                              MultiContentEntryText(pos = (330, 0), size = (150, 25), flags = RT_HALIGN_RIGHT, text = 2) # index 2 is the status,
++                                      ],
++                               "fonts": [gFont("Regular", 20)],
++                               "itemHeight": 25
++                              }
++                      </convert>
++              </widget>
++              <eLabel name="overall_progress" text="Overall progress:" position="20,162" size="480,22" font="Regular;21" halign="center" transparent="1" />
++              <widget source="overall_progress" render="Progress" position="20,192" size="480,20" borderWidth="2" backgroundColor="#254f7497" />
++              <eLabel name="overall_progress" text="Progress:" position="20,222" size="480,22" font="Regular;21" halign="center" transparent="1" />
++              <widget source="sub_progress" render="Progress" position="20,252" size="480,20" borderWidth="2" backgroundColor="#254f7497" />
++              
++              <eLabel name="" text="Failed:" position="20,282" size="140,22" font="Regular;21" halign="left" transparent="1" />
++              <widget source="failed_counter" render="Label" position="160,282" size="100,20" font="Regular;21" />
++              
++              <eLabel name="" text="Succeeded:" position="20,312" size="140,22" font="Regular;21" halign="left" transparent="1" />
++              <widget source="succeeded_counter" render="Label" position="160,312" size="100,20" font="Regular;21" />
++              
++              <eLabel name="" text="With errors:" position="20,342" size="140,22" font="Regular;21" halign="left" transparent="1" />
++              <widget source="witherrors_counter" render="Label" position="160,342" size="100,20" font="Regular;21" />
++              
++              <eLabel name="" text="Not tested:" position="20,372" size="140,22" font="Regular;21" halign="left" transparent="1" />
++              <widget source="untestable_counter" render="Label" position="160,372" size="100,20" font="Regular;21" />
++              
++              <widget source="CmdText" render="Label" position="300,282" size="180,200" font="Regular;21" />
++      </screen>
++      <screen name="DiseqcTesterNimSelection" position="center,center" size="400,330" title="Choose Tuner">
++              <widget source="nimlist" render="Listbox" position="0,0" size="380,300" scrollbarMode="showOnDemand">
++                      <convert type="TemplatedMultiContent">
++                              {"template": [
++                                              MultiContentEntryText(pos = (10, 5), size = (360, 30), flags = RT_HALIGN_LEFT, text = 1), # index 1 is the nim name,
++                                              MultiContentEntryText(pos = (50, 30), size = (320, 30), font = 1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is a description of the nim settings,
++                                      ],
++                               "fonts": [gFont("Regular", 20), gFont("Regular", 15)],
++                               "itemHeight": 70
++                              }
++                      </convert>
++              </widget>
++      </screen>       
++      <screen name="FPUpgrade" position="150,200" size="450,200" title="FP upgrade required" >
++              <widget name="text" position="0,0" size="550,50" font="Regular;20" />
++              <widget name="oldversion_label" position="10,100" size="290,25" font="Regular;20" />
++              <widget name="newversion_label" position="10,125" size="290,25" font="Regular;20" />
++              <widget name="oldversion" position="300,100" size="50,25" font="Regular;20" />
++              <widget name="newversion" position="300,125" size="50,25" font="Regular;20" />
++      </screen>
++      <screen name="SystemMessage" position="150,200" size="450,200" title="System Message" >
++              <widget source="text" position="0,0" size="450,200" font="Regular;20" halign="center" valign="center" render="Label" />
++              <ePixmap pixmap="Vu_HD/icons/input_error.png" position="5,5" size="53,53" alphatest="on" />
++      </screen>
++      <screen name="NFIDownload" position="90,95" size="560,420" title="Image download utility">
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="0,0" zPosition="0" size="140,40" transparent="1" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="140,0" zPosition="0" size="140,40" transparent="1" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="280,0" zPosition="0" size="140,40" transparent="1" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/blue.png" position="420,0" zPosition="0" size="140,40" transparent="1" alphatest="blend" />
++              <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;19" valign="center" halign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;19" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;19" valign="center" halign="center" backgroundColor="#a08500" transparent="1" />
++              <widget source="key_blue" render="Label" position="440,0" zPosition="1" size="115,40" font="Regular;19" valign="center" halign="center" backgroundColor="#18188b" transparent="1" />
++              
++              <widget source="label_top" render="Label" position="10,44" size="240,20" font="Regular;16" />
++              <widget name="feedlist" position="10,66" size="250,222" scrollbarMode="showOnDemand" />
++              <widget name="destlist" position="0,66" size="260,222" scrollbarMode="showOnDemand" />
++
++              <widget source="label_bottom" render="Label" position="10,312" size="240,18" font="Regular;16"/>
++              <widget source="path_bottom" render="Label" position="10,330" size="250,42" font="Regular;18" />
++              
++              <widget source="infolabel" render="Label" position="270,44" size="280,284" font="Regular;16" />
++              <widget source="job_progressbar" render="Progress" position="10,374" size="540,26" borderWidth="1" backgroundColor="#254f7497" />
++              <widget source="job_progresslabel" render="Label" position="130,378" zPosition="2" font="Regular;18" halign="center" transparent="1" size="300,22" foregroundColor="#000000" />
++              <widget source="statusbar" render="Label" position="10,404" size="540,16" font="Regular;16" foregroundColor="#cccccc" />
++      </screen>
++      <screen name="NFIFlash" position="90,95" size="560,420" title="Image flash utility">
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="140,0" zPosition="0" size="140,40" transparent="1" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="280,0" zPosition="0" size="140,40" transparent="1" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/buttons/blue.png" position="420,0" zPosition="0" size="140,40" transparent="1" alphatest="on" />
++              <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#a08500" transparent="1" />
++              <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#18188b" transparent="1" />
++              <widget source="listlabel" render="Label" position="16,44" size="200,21" valign="center" font="Regular;18" />
++              <widget name="filelist" position="0,68" size="260,260" scrollbarMode="showOnDemand" />
++              <widget source="infolabel" render="Label" position="270,44" size="280,284" font="Regular;16" />
++              <widget source="job_progressbar" render="Progress" position="10,374" size="540,26" borderWidth="1" backgroundColor="#254f7497" />
++              <widget source="job_progresslabel" render="Label" position="180,378" zPosition="2" font="Regular;18" halign="center" transparent="1" size="200,22" foregroundColor="#000000" />
++              <widget source="statusbar" render="Label" position="10,404" size="540,16" font="Regular;16" foregroundColor="#cccccc" />
++      </screen>
++      <screen name="BackupSelection" position="center,130" size="560,400" title="Select files/folders to backup">
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="0,0" size="140,40" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="140,0" size="140,40" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="280,0" size="140,40" alphatest="blend" />
++              <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
++              <widget name="checkList" position="5,50" size="550,250" transparent="1" scrollbarMode="showOnDemand" />
++      </screen>
++      <screen name="RestoreMenu" position="center,130" size="560,400" title="Restore backups" >
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="0,0" size="140,40" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="140,0" size="140,40" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="280,0" size="140,40" alphatest="blend" />
++              <widget source="key_red" render="Label" position="20,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
++              <widget source="key_green" render="Label" position="160,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
++              <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="115,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
++              <widget name="filelist" position="5,50" size="550,230" scrollbarMode="showOnDemand" />
++      </screen>
++      <screen name="UpdatePluginMenu" position="209,48" size="865,623" title="Software management" flags="wfNoBorder" backgroundColor="transparent">  
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Software management" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="86,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <ePixmap pixmap="Vu_HD/border_menu.png" position="60,140" zPosition="-1" size="342,358" transparent="1" alphatest="blend" />
++              <widget source="menu" render="Listbox" position="70,150" size="322,338" scrollbarMode="showOnDemand" backgroundColor="#27d9dee2" transparent="1">
++                      <convert type="TemplatedMultiContent">
++                              {"template": [
++                                              MultiContentEntryText(pos = (2, 2), size = (330, 24), flags = RT_HALIGN_LEFT, text = 1), # index 0 is the MenuText,
++                                      ],
++                              "fonts": [gFont("Regular", 22)],
++                              "itemHeight": 25
++                              }
++                      </convert>
++              </widget>
++              <widget source="menu" render="Listbox" position="420,150" size="390,338" scrollbarMode="showNever" selectionDisabled="1" backgroundColor="#27d9dee2" transparent="1">
++                      <convert type="TemplatedMultiContent">
++                              {"template": [
++                                              MultiContentEntryText(pos = (2, 2), size = (380, 300), flags = RT_HALIGN_CENTER|RT_VALIGN_CENTER|RT_WRAP, text = 2), # index 2 is the Description,
++                                      ],
++                              "fonts": [gFont("Regular", 22)],
++                              "itemHeight": 300
++                              }
++                      </convert>
++              </widget>
++              <widget source="status" render="Label" position="50,500" zPosition="10" size="750,50" halign="center" valign="center" font="Regular;22" transparent="1" backgroundColor="#27aeaeae" />
++      </screen>
++      <screen name="PluginManager" position="209,48" size="865,623" title="Extensions management" flags="wfNoBorder" backgroundColor="transparent">   
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Plugin.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Extensions management" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/blue.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="86,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_green" render="Label" position="278,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_yellow" render="Label" position="473,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_blue" render="Label" position="668,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="list" render="Listbox" position="50,130" size="750,416" scrollbarMode="showOnDemand">
++                      <convert type="TemplatedMultiContent">
++                      {"templates":
++                              {"default": (51,[
++                                              MultiContentEntryText(pos = (30, 1), size = (670, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
++                                              MultiContentEntryText(pos = (30, 25), size = (670, 24), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description
++                                              MultiContentEntryPixmapAlphaTest(pos = (675, 0), size = (48, 48), png = 5), # index 5 is the status pixmap
++                                              MultiContentEntryPixmapAlphaTest(pos = (0, 49), size = (750, 2), png = 6), # index 6 is the div pixmap
++                                      ]),
++                              "category": (40,[
++                                              MultiContentEntryText(pos = (30, 0), size = (700, 22), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
++                                              MultiContentEntryText(pos = (30, 22), size = (700, 16), font=2, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the description
++                                              MultiContentEntryPixmapAlphaTest(pos = (0, 38), size = (750, 2), png = 3), # index 3 is the div pixmap
++                                      ])
++                              },
++                              "fonts": [gFont("Regular", 22),gFont("Regular", 20),gFont("Regular", 16)],
++                              "itemHeight": 52
++                      }
++                      </convert>
++              </widget>
++              <widget source="status" render="Label" position="50,560" zPosition="10" size="750,23" halign="center" valign="center" font="Regular;22" foregroundColor="#3c3c3c" backgroundColor="#27aeaeae" transparent="1"/>
++      </screen>
++      <screen name="PluginManagerInfo" position="209,48" size="865,623" title="Plugin manager activity information" flags="wfNoBorder" backgroundColor="transparent"> 
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Plugin.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Plugin manager activity information" position="90,50" size="700,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="86,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_green" render="Label" position="278,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="list" render="Listbox" position="50,140" size="750,400" scrollbarMode="showOnDemand" selectionDisabled="1">
++                      <convert type="TemplatedMultiContent">
++                              {"template": [
++                                              MultiContentEntryText(pos = (50, 0), size = (250, 26), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
++                                              MultiContentEntryText(pos = (50, 27), size = (640, 23), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the state
++                                              MultiContentEntryPixmapAlphaTest(pos = (0, 1), size = (48, 48), png = 2), # index 2 is the status pixmap
++                                              MultiContentEntryPixmapAlphaTest(pos = (0, 48), size = (750, 2), png = 3), # index 3 is the div pixmap
++                                      ],
++                              "fonts": [gFont("Regular", 24),gFont("Regular", 22)],
++                              "itemHeight": 50
++                              }
++                      </convert>
++              </widget>
++              <widget source="status" render="Label" position="50,560" zPosition="10" size="750,44" halign="center" valign="center" foregroundColor="#3c3c3c" backgroundColor="#27aeaeae" font="Regular;22" transparent="1" />
++      </screen>
++      <screen name="PluginManagerHelp" position="209,48" size="865,623" title="Plugin manager help" flags="wfNoBorder" backgroundColor="transparent"> 
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Plugin.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Plugin manager help" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="86,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="list" render="Listbox" position="80,140" size="700,400" scrollbarMode="showOnDemand" selectionDisabled="1">
++                      <convert type="TemplatedMultiContent">
++                              {"template": [
++                                              MultiContentEntryText(pos = (50, 0), size = (540, 26), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
++                                              MultiContentEntryText(pos = (50, 27), size = (540, 23), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the state
++                                              MultiContentEntryPixmapAlphaTest(pos = (0, 1), size = (48, 48), png = 2), # index 2 is the status pixmap
++                                              MultiContentEntryPixmapAlphaTest(pos = (0, 48), size = (550, 2), png = 3), # index 3 is the div pixmap
++                                      ],
++                              "fonts": [gFont("Regular", 24),gFont("Regular", 22)],
++                              "itemHeight": 50
++                              }
++                      </convert>
++              </widget>
++              <ePixmap pixmap="Vu_HD/div-h.png" position="70,550" zPosition="10" size="720,2" transparent="1" alphatest="on" />
++              <widget source="status" render="Label" position="50,560" zPosition="10" size="750,44" halign="center" valign="center" font="Regular;22" backgroundColor="#27aeaeae" transparent="1" />
++      </screen>
++      <screen name="PluginDetails" position="209,48" size="865,623" title="Plugin details" flags="wfNoBorder" backgroundColor="transparent">  
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Plugin.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Plugin details" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="86,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_green" render="Label" position="278,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="author" render="Label" position="60,140" size="700,25" zPosition="10" foregroundColor="#3c3c3c" backgroundColor="#27aeaeae" font="Regular;21" transparent="1" />
++              <widget name="statuspic" position="770,130" size="48,48" alphatest="on"/>
++              <widget name="divpic" position="60,190" size="740,2" alphatest="on"/>
++              <widget name="detailtext" position="70,200" size="400,400" zPosition="10" font="Regular;21" foregroundColor="#3c3c3c" backgroundColor="#27aeaeae" transparent="1" halign="left" valign="top"/>
++              <widget name="screenshot" position="490,230" size="300,330" alphatest="on"/>
++      </screen>
++      <screen name="UpdatePlugin" position="209,48" size="865,623" title="Software update" flags="wfNoBorder" backgroundColor="transparent">  
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Plugin.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Software update" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <widget name="activityslider" position="60,140" size="720,5"  />
++              <widget source="package" render="Label" position="70,160" size="700,20" font="Regular;18" halign="center" valign="center" backgroundColor="darkgrey" transparent="1" />
++              <widget source="status" render="Label" position="70,190" size="700,80" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" transparent="1" />
++              <widget name="slider" position="70,280" size="700,30"  />
++      </screen>
++      <screen name="IPKGMenu" position="209,48" size="865,623" title="Select upgrade source to edit." flags="wfNoBorder" backgroundColor="transparent">       
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Plugin.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Select upgrade source to edit." position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="86,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_green" render="Label" position="278,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="filelist" position="50,140" size="750,440" scrollbarMode="showOnDemand" />
++      </screen>
++      <screen name="IPKGSource" position="209,48" size="865,623" title="Edit upgrade source url." flags="wfNoBorder" backgroundColor="transparent">   
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Plugin.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Edit upgrade source url." position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="86,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_green" render="Label" position="278,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="text" position="50,150" size="750,25" font="Regular;20" backgroundColor="background" foregroundColor="#cccccc" />
++      </screen>
++      <screen name="PacketManager" position="209,48" size="865,623" title="Packet manager" flags="wfNoBorder" backgroundColor="transparent">  
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Plugin.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Packet manager" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="86,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_green" render="Label" position="278,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="list" render="Listbox" position="50,150" size="750,416" scrollbarMode="showOnDemand">
++                      <convert type="TemplatedMultiContent">
++                              {"template": [
++                                              MultiContentEntryText(pos = (5, 1), size = (640, 28), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
++                                              MultiContentEntryText(pos = (5, 26), size = (640, 20), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description
++                                              MultiContentEntryPixmapAlphaTest(pos = (645, 2), size = (48, 48), png = 4), # index 4 is the status pixmap
++                                              MultiContentEntryPixmapAlphaTest(pos = (5, 50), size = (740, 2), png = 5), # index 4 is the div pixmap
++                                      ],
++                              "fonts": [gFont("Regular", 22),gFont("Regular", 14)],
++                              "itemHeight": 52
++                              }
++                      </convert>
++              </widget>
++      </screen>
++      <screen name="IpkgInstaller" position="209,48" size="865,623" title="Install extensions" flags="wfNoBorder" backgroundColor="transparent">      
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Plugin.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Install extensions" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="86,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_green" render="Label" position="278,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="list" position="50,150" size="750,350" />
++              <ePixmap pixmap="Vu_HD/div-h.png" position="50,520" zPosition="10" size="750,2" transparent="1" alphatest="on" />
++              <widget source="introduction" render="Label" position="50,540" zPosition="10" size="750,30" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
++      </screen>
++      <screen name="VideoWizard" position="0,0" size="1280,720" title="Welcome..." flags="wfNoBorder" >
++              <widget name="text" position="400,100" size="550,270" font="Regular;23" />
++              <widget source="list" render="Listbox" transparent="1" position="300,400" size="500,300" scrollbarMode="showOnDemand" >
++                      <convert type="StringList" />
++              </widget>
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="150,250" size="25,25" alphatest="blend" />
++              <widget name="languagetext" position="200,253" size="120,30" font="Regular;18" />
++              <widget name="config" position="300,400" zPosition="1" size="500,300" transparent="1" scrollbarMode="showOnDemand" />            
++              <widget name="portpic" position="100,400" zPosition="10" size="150,150" transparent="1" alphatest="on"/>
++              <widget name="rc" pixmap="Vu_HD/rc.png" position="950,150" zPosition="10" size="154,500" transparent="1" alphatest="blend"/>
++              <widget name="arrowdown" pixmap="Vu_HD/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++              <widget name="arrowdown2" pixmap="Vu_HD/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++              <widget name="arrowup" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++              <widget name="arrowup2" pixmap="Vu_HD/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="blend"/>
++      </screen>
++              <!-- FileBrowser -->
++      <screen name="FilebrowserScreen" position="0,0" size="1280,720" title="" flags="wfNoBorder">
++              <widget source="global.CurrentTime" render="Label" position="1130,40" size="80,26" font="Regular;26" halign="right" transparent="1">
++                      <convert type="ClockToText">Default</convert>
++              </widget>
++              <widget source="global.CurrentTime" render="Label" position="1000,72" size="210,22" font="Regular;20" halign="right" transparent="1">
++                      <convert type="ClockToText">Format:%d.%m.%Y</convert>
++              </widget>
++              <eLabel text="Filebrowser" position=" 80,110" size="1120,35" zPosition="3" font="Regular;32" foregroundColor="#3c3c3c" halign="center" transparent="1" />
++              <eLabel position=" 80,150" size="1120,2" backgroundColor="black" zPosition="5" />
++              <eLabel position=" 80,152" size="1120,2"  zPosition="5" />
++              <widget name="list_left" position=" 90,167" size="540,437" scrollbarMode="showOnDemand" transparent="1" />
++              <eLabel position="638,155" size="1,460" backgroundColor="black" zPosition="5" />
++              <eLabel position="639,155" size="2,460"  zPosition="5" />
++              <widget name="list_right" position="650,167" size="540,437" scrollbarMode="showOnDemand" transparent="1" />
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="100,643" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="390,643" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="680,643" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/blue.png" position="970,643" size="25,25" alphatest="blend" />
++              <widget name="red" position="150,645" size="220,30" font="Regular;24" foregroundColor="#3c3c3c" halign="left" transparent="1" />
++              <widget name="green" position="440,645" size="220,30" font="Regular;24" foregroundColor="#3c3c3c" halign="left" transparent="1" />
++              <widget name="yellow" position="730,645" size="220,30" font="Regular;24" foregroundColor="#3c3c3c" halign="left" transparent="1" />
++              <widget name="blue" position="1020,645" size="220,30" font="Regular;24" foregroundColor="#3c3c3c" halign="left" transparent="1" />
++      </screen>
++      <screen name="FilebrowserConfigScreen" position="0,0" size="1280,720" title="" flags="wfNoBorder">
++              <widget source="global.CurrentTime" render="Label" position="1130,40" size="80,26" font="Regular;26" halign="right" transparent="1">
++                      <convert type="ClockToText">Default</convert>
++              </widget>
++              <widget source="global.CurrentTime" render="Label" position="1000,72" size="210,22" font="Regular;20" halign="right" transparent="1">
++                      <convert type="ClockToText">Format:%d.%m.%Y</convert>
++              </widget>
++              <widget source="session.VideoPicture" render="Pig" position="75,115" size="380,215" zPosition="3" backgroundColor="#ff000000" />
++              <eLabel text="FilebrowserConfigScreen" position="510,110" size="700,35" zPosition="3" font="Regular;32" foregroundColor="#3c3c3c" transparent="1" />
++              <eLabel position="500,150" size="730,2" backgroundColor="black" zPosition="5" />
++              <eLabel position="500,152" size="730,2"  zPosition="5" />
++              <widget name="config" position="510,175" size="660,450" zPosition="3" scrollbarMode="showOnDemand" transparent="1" />
++              <eLabel position="476,110" size="1,500" backgroundColor="black" zPosition="5" />
++              <eLabel position="477,110" size="2,500"  zPosition="5" />
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="100,643" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="390,643" size="25,25" alphatest="blend" />
++              <widget name="buttonred" position="150,645" size="220,30" font="Regular;24" foregroundColor="#3c3c3c" halign="left" transparent="1" />
++              <widget name="buttongreen" position="440,645" size="220,30" font="Regular;24" foregroundColor="#3c3c3c" halign="left" transparent="1" />
++      </screen>       
++      <screen name="VideoFinetune" position="0,0" size="1280,720" backgroundColor="black">
++              <widget source="Canvas" render="Canvas" position="280,70" size="720,576" />
++      </screen>
++      <screen name="RecordPathsSettings" position="209,48" size="865,623" title="Recording paths" flags="wfNoBorder" backgroundColor="transparent">   
++              <ePixmap pixmap="Vu_HD/Bg_EPG_list.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Recording paths" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="86,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_green" render="Label" position="278,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="config" position="50,130" itemHeight="36" size="750,300" backgroundColor="#27d9dee2" transparent="1"/>
++      </screen>       
++      <screen name="SecParameterSetup" position="209,48" size="865,623" title="Satellite Equipment Setup" flags="wfNoBorder" backgroundColor="transparent">   
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Satellite Equipment Setup" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <widget name="config" position="130,140" size="600,450" transparent="1"/>
++      </screen>
++      <screen name="SatNimSelection" position="100,80" size="520,538" title="Subtitle selection" flags="wfNoBorder" backgroundColor="transparent">    
++              <ePixmap pixmap="Vu_HD/Bg_Subtitle.png" position="0,0" size="520,538" zPosition="-1" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="16,36" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="select Slot" position="69,45" size="400,32" font="Semiboldit;32" foregroundColor="#4c4c4c" backgroundColor="#b5b9bd" transparent="1" />
++              <widget name="nimlist" position="15,83" itemHeight="42" selectionPixmap="Vu_HD/buttons/FocusBar_H42.png" transparent="1" zPosition="1" size="490,420" scrollbarMode="showOnDemand" />
++      </screen>
++      <screen name="RotorNimSelection" position="100,80" size="520,538" title="Subtitle selection" flags="wfNoBorder" backgroundColor="transparent">  
++              <ePixmap pixmap="Vu_HD/Bg_Subtitle.png" position="0,0" size="520,538" zPosition="-1" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="16,36" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="select Slot" position="69,45" size="400,32" font="Semiboldit;32" foregroundColor="#4c4c4c" backgroundColor="#b5b9bd" transparent="1" />
++              <widget name="nimlist" position="15,83" itemHeight="42" selectionPixmap="Vu_HD/buttons/FocusBar_H42.png" transparent="1" zPosition="1" size="490,420" scrollbarMode="showOnDemand" />
++      </screen>
++      <screen name="PositionerSetup" position="209,48" size="865,623" title="Positioner setup..." flags="wfNoBorder" backgroundColor="transparent">   
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Positioner setup..." position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/blue.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget name="red" position="83,97" size="150,25" backgroundColor="darkgrey" halign="center" valign="center" font="Regular;20" transparent="1"/>
++              <widget name="green" position="278,97" size="150,25" backgroundColor="darkgrey" halign="center" valign="center" font="Regular;20" transparent="1"/>
++              <widget name="yellow" position="473,97" size="150,25" backgroundColor="darkgrey" halign="center" valign="center" font="Regular;20" transparent="1"/>
++              <widget name="blue" position="668,97" size="150,25" backgroundColor="darkgrey" halign="center" valign="center" font="Regular;20" transparent="1"/>
++
++              <widget name="list" position="200,160" size="450,155" backgroundColor="#27d9dee2" transparent="1"/>
++
++              <widget name="snr_db" position="210,355" size="150,22" halign="center" valign="center" font="Regular;21" backgroundColor="#27d9dee2" transparent="1"/>
++              <eLabel text="SNR:" position="150,380" size="60,22" font="Regular;21" backgroundColor="#27d9dee2" transparent="1"/>
++              <eLabel text="BER:" position="150,405" size="60,22" font="Regular;21" backgroundColor="#27d9dee2" transparent="1"/>
++              <eLabel text="Lock:" position="150,430" size="60,22" font="Regular;21" backgroundColor="#27d9dee2" transparent="1"/>
++              <widget name="snr_percentage" position="370,380" size="60,22" font="Regular;21" backgroundColor="#27d9dee2" transparent="1"/>
++              <widget name="ber_value" position="370,405" size="60,22" font="Regular;21" backgroundColor="#27d9dee2" transparent="1"/>
++              <widget name="lock_state" position="210,430" size="150,22" font="Regular;21" backgroundColor="#27d9dee2" transparent="1"/>
++              <widget name="snr_bar" position="210,380" size="150,22" backgroundColor="#27d9dee2" transparent="1"/>
++              <widget name="ber_bar" position="210,405" size="150,22" backgroundColor="#27d9dee2" transparent="1"/>
++
++              <eLabel text="Frequency:" position="450,355" size="120,22" font="Regular;21" backgroundColor="#27d9dee2" transparent="1"/>
++              <eLabel text="Symbolrate:" position="450,380" size="120,22" font="Regular;21" backgroundColor="#27d9dee2" transparent="1"/>
++              <eLabel text="FEC:" position="450,405" size="120,22" font="Regular;21" backgroundColor="#27d9dee2" transparent="1"/>
++              <widget name="frequency_value" position="570,355" size="120,22" font="Regular;21" backgroundColor="#27d9dee2" transparent="1"/>
++              <widget name="symbolrate_value" position="570,380" size="120,22" font="Regular;21" backgroundColor="#27d9dee2" transparent="1"/>
++              <widget name="fec_value" position="570,405" size="120,22" font="Regular;21" backgroundColor="#27d9dee2" transparent="1"/>
++      </screen>       
++      <screen name="VideoEnhancementSetup" position="209,48" size="865,623" title="VideoEnhancementSetup" flags="wfNoBorder" backgroundColor="transparent">   
++              <ePixmap pixmap="Vu_HD/Bg_EPG_list.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Video enhancement setup" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/blue.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="86,97" zPosition="1" size="150,25" font="Regular;20" halign="left" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_green" render="Label" position="278,97" zPosition="1" size="150,25" font="Regular;20" halign="left" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_yellow" render="Label" position="473,97" zPosition="1" size="150,25" font="Regular;20" halign="left" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_blue" render="Label" position="668,97" zPosition="1" size="150,25" font="Regular;20" halign="left" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="config" position="50,133" itemHeight="36" size="750,360" selectionPixmap="Vu_HD/buttons/FocusBar_H36.png" transparent="1"/>
++              <eLabel text=" " position="50,527" size="750,2" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#5c5c5c" />
++              <widget source="introduction" render="Label" position="50,530" size="750,30" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#27b5b9bd" transparent="1" />
++      </screen>
++      <screen name="VideoEnhancementPreview" position="center,360" size="560,170" title="VideoEnhancementPreview">
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="0,10" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="280,10" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="35,10" zPosition="1" size="140,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_green" render="Label" position="315,10" zPosition="1" size="140,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="config" position="5,50" size="550,80" scrollbarMode="showOnDemand" />
++              <eLabel text=" " position="0,130" size="560,2" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#5c5c5c" />
++              <widget source="introduction" render="Label" position="0,140" size="550,25" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#27b5b9bd" transparent="1" />
++      </screen>       
++      <screen name="MyTubePlayerMainScreen" flags="wfNoBorder" position="280,70" size="720,576" title="MyTubePlayerMainScreen..." >
++              <ePixmap position="0,0" zPosition="-1" size="720,576" pixmap="~/mytubemain_bg.png" alphatest="on" transparent="1" backgroundColor="transparent"/>
++              <widget name="config" zPosition="2" position="60,60" size="600,50" scrollbarMode="showNever" transparent="1" />
++              <widget source="feedlist" render="Listbox" position="49,110" size="628,385" zPosition="1" scrollbarMode="showOnDemand" backgroundColorSelected="#5c8cac" transparent="1" backgroundPixmap="~/list_bg.png" selectionPixmap="~/list_sel.png" >
++                      <convert type="TemplatedMultiContent">
++                      {"templates":
++                              {"default": (77,[
++                                              MultiContentEntryPixmapAlphaTest(pos = (0, 0), size = (100, 75), png = 4), # index 4 is the thumbnail
++                                              MultiContentEntryText(pos = (100, 1), size = (500, 22), font=0, flags = RT_HALIGN_LEFT | RT_VALIGN_TOP| RT_WRAP, text = 1), # index 1 is the Title
++                                              MultiContentEntryText(pos = (100, 24), size = (300, 18), font=1, flags = RT_HALIGN_LEFT | RT_VALIGN_TOP| RT_WRAP, text = 5), # index 5 is the Published Date
++                                              MultiContentEntryText(pos = (100, 43), size = (300, 18), font=1, flags = RT_HALIGN_LEFT | RT_VALIGN_TOP| RT_WRAP, text = 6), # index 6 is the Views Count
++                                              MultiContentEntryText(pos = (400, 24), size = (200, 18), font=1, flags = RT_HALIGN_LEFT | RT_VALIGN_TOP| RT_WRAP, text = 7), # index 7 is the duration
++                                              MultiContentEntryText(pos = (400, 43), size = (200, 18), font=1, flags = RT_HALIGN_LEFT | RT_VALIGN_TOP| RT_WRAP, text = 8), # index 8 is the ratingcount
++                                      ]),
++                              "state": (77,[
++                                              MultiContentEntryText(pos = (10, 1), size = (560, 28), font=2, flags = RT_HALIGN_LEFT | RT_VALIGN_TOP| RT_WRAP, text = 0), # index 0 is the name
++                                              MultiContentEntryText(pos = (10, 22), size = (560, 46), font=3, flags = RT_HALIGN_LEFT | RT_VALIGN_TOP| RT_WRAP, text = 1), # index 2 is the description
++                                      ])
++                              },
++                              "fonts": [gFont("Regular", 22),gFont("Regular", 18),gFont("Regular", 26),gFont("Regular", 20)],
++                              "itemHeight": 77
++                      }
++                      </convert>
++              </widget>
++
++              <ePixmap pixmap="skin_default/buttons/key_info.png" position="50,500" zPosition="4" size="35,25" alphatest="on" transparent="1" />
++              <ePixmap pixmap="skin_default/buttons/key_menu.png" position="50,520" zPosition="4" size="35,25" alphatest="on" transparent="1" />
++              <ePixmap position="90,500" size="100,40" zPosition="4" pixmap="~/plugin.png" alphatest="on" transparent="1" />
++              <ePixmap position="190,500" zPosition="4" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
++              <ePixmap position="330,500" zPosition="4" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />
++              <ePixmap position="470,500" zPosition="4" size="140,40" pixmap="skin_default/buttons/yellow.png" transparent="1" alphatest="on" />
++              <widget name="key_red" position="190,500" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
++              <widget name="key_green" position="330,500" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
++              <widget name="key_yellow" position="470,500" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
++              <widget name="ButtonBlue" pixmap="skin_default/buttons/button_blue.png" position="610,510" zPosition="10" size="15,16" transparent="1" alphatest="on" />
++              <widget name="VKeyIcon" pixmap="skin_default/vkey_icon.png" position="620,495" zPosition="10" size="60,48" transparent="1" alphatest="on" />
++              <widget name="thumbnail" position="0,0" size="100,75" alphatest="on"/> # fake entry for dynamic thumbnail resizing, currently there is no other way doing this.
++              <widget name="HelpWindow" position="340,325" zPosition="1" size="1,1" transparent="1" alphatest="on" />
++      </screen>
++      <screen name="MyTubeVideoInfoScreen" flags="wfNoBorder" position="center,center" size="720,576" title="MyTubePlayerMainScreen..." >
++              <ePixmap position="0,0" zPosition="-1" size="720,576" pixmap="~/mytubemain_bg.png" alphatest="on" transparent="1" backgroundColor="transparent"/>
++              <widget name="title" position="60,50" size="600,50" zPosition="5" valign="center" halign="left" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
++              <widget name="starsbg" pixmap="~/starsbar_empty.png" position="560,220" zPosition="5" size="100,20" transparent="1" alphatest="on" />
++              <widget name="stars" pixmap="~/starsbar_filled.png" position="560,220" zPosition="6" size="100,20"  transparent="1" />
++              <widget source="infolist" render="Listbox" position="50,110" size="620,110" zPosition="6" scrollbarMode="showNever" foregroundColor="white" backgroundColor="#1c3c5c" selectionDisabled="1" transparent="1">
++                      <convert type="TemplatedMultiContent">
++                      {"templates":
++                              {"default": (110,[
++                                              MultiContentEntryPixmapAlphaTest(pos = (0, 4), size = (130, 98), png = 0), # index 0 is the thumbnail
++                                              MultiContentEntryPixmapAlphaTest(pos = (130, 4), size = (130, 98), png = 1), # index 0 is the thumbnail
++                                              MultiContentEntryPixmapAlphaTest(pos = (260, 4), size = (130, 98), png = 2), # index 0 is the thumbnail
++                                              MultiContentEntryPixmapAlphaTest(pos = (390, 4), size = (130, 98), png = 3), # index 0 is the thumbnail
++                                      ]),
++                              "state": (110,[
++                                              MultiContentEntryText(pos = (10, 40), size = (550, 38), font=2, flags = RT_HALIGN_LEFT | RT_VALIGN_TOP| RT_WRAP, text = 0), # index 0 is the name
++                                      ])
++                              },
++                              "fonts": [gFont("Regular", 20),gFont("Regular", 14),gFont("Regular", 28)],
++                              "itemHeight": 110
++                      }
++                      </convert>
++              </widget>
++              <widget name="author" position="60,220" size="300,20" zPosition="10" font="Regular;21" transparent="1" foregroundColor="white" backgroundColor="#1c3c5c" halign="left" valign="top" />
++              <widget name="duration" position="370,220" size="200,20" zPosition="10" font="Regular;21" transparent="1" foregroundColor="white" backgroundColor="#1c3c5c" halign="left" valign="top" />
++              <widget name="published" position="60,245" size="300,20" zPosition="10" font="Regular;21" transparent="1" foregroundColor="white" backgroundColor="#1c3c5c" halign="left" valign="top" />
++              <widget name="views" position="370,245" size="200,20" zPosition="10" font="Regular;21" transparent="1" foregroundColor="white" backgroundColor="#1c3c5c" halign="left" valign="top" />
++              <widget name="tags" position="60,270" size="600,20" zPosition="10" font="Regular;21" transparent="1" foregroundColor="white" backgroundColor="#1c3c5c" halign="left" valign="top" />
++              <widget name="detailtext" position="60,300" size="610,200" zPosition="10" font="Regular;21" transparent="1" foregroundColor="white" backgroundColor="#1c3c5c" halign="left" valign="top"/>
++              <ePixmap position="100,500" size="100,40" zPosition="0" pixmap="~/plugin.png" alphatest="on" transparent="1" />
++              <ePixmap position="220,500" zPosition="4" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
++              <widget name="key_red" position="220,500" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
++              <widget name="thumbnail" position="0,0" size="130,98" alphatest="on"/>
++      </screen>
++      <screen name="MyTubeVideoHelpScreen" flags="wfNoBorder" position="center,center" size="720,576" title="MyTubePlayerMainScreen..." >
++              <ePixmap position="0,0" zPosition="-1" size="720,576" pixmap="~/mytubemain_bg.png" alphatest="on" transparent="1" backgroundColor="transparent"/>
++              <widget name="title" position="60,50" size="600,50" zPosition="5" valign="center" halign="left" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
++              <widget name="detailtext" position="60,120" size="610,370" zPosition="10" font="Regular;21" foregroundColor="white" backgroundColor="#1c3c5c" transparent="1" halign="left" valign="top"/>
++              <ePixmap position="100,500" size="100,40" zPosition="0" pixmap="~/plugin.png" alphatest="on" transparent="1" />
++              <ePixmap position="220,500" zPosition="4" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
++              <widget name="key_red" position="220,500" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
++      </screen>
++      <screen name="MyTubePlayer" flags="wfNoBorder" position="center,550" size="720,160" title="InfoBar" backgroundColor="transparent">
++              <ePixmap position="0,0" pixmap="skin_default/info-bg_mp.png" zPosition="-1" size="720,160" />
++              <ePixmap position="29,40" pixmap="skin_default/screws_mp.png" size="665,104" alphatest="on" />
++              <ePixmap position="48,70" pixmap="skin_default/icons/mp_buttons.png" size="108,13" alphatest="on" />
++              <ePixmap pixmap="skin_default/icons/icon_event.png" position="207,78" size="15,10" alphatest="on" />
++              <widget source="session.CurrentService" render="Label" position="230,73" size="360,40" font="Regular;20" foregroundColor="#ececec" backgroundColor="#263c59" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1">
++                      <convert type="ServiceName">Name</convert>
++              </widget>
++              <widget source="session.CurrentService" render="Label" position="580,73" size="90,24" font="Regular;20" foregroundColor="#ececec" halign="right" backgroundColor="#4e5a74" transparent="1">
++                      <convert type="ServicePosition">Length</convert>
++              </widget>
++              <widget source="session.CurrentService" render="Label" position="205,129" size="100,20" font="Regular;18" foregroundColor="#ececec" halign="center" valign="center" backgroundColor="#06224f" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1">
++                      <convert type="ServicePosition">Position</convert>
++              </widget>
++              <widget source="session.CurrentService" render="PositionGauge" position="300,133" size="270,10" zPosition="2" pointer="skin_default/position_pointer.png:540,0" transparent="1" foregroundColor="#20224f">
++                      <convert type="ServicePosition">Gauge</convert>
++              </widget>
++              <widget source="session.CurrentService" render="Label" position="576,129" size="100,20" font="Regular;18" foregroundColor="#ececec" halign="center" valign="center" backgroundColor="#06224f" shadowColor="#1d354c" shadowOffset="-1,-1" transparent="1">
++                      <convert type="ServicePosition">Remaining</convert>
++              </widget>
++      </screen>
++      <screen name="MyTubeSuggestionsListScreen" position="340,163" zPosition="6" size="610,160" flags="wfNoBorder" >
++              <ePixmap position="0,0" zPosition="-1" size="610,160" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/MyTube/suggestions_bg.png" alphatest="on" transparent="1" backgroundColor="transparent"/>
++              <widget source="suggestionslist" render="Listbox" position="10,5" zPosition="7" size="580,150" scrollbarMode="showOnDemand" transparent="1" foregroundColor="#cccccc" backgroundColor="#1c3c5c" >
++                      <convert type="TemplatedMultiContent">
++                              {"template": [
++                                              MultiContentEntryText(pos = (0, 1), size = (340, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
++                                              MultiContentEntryText(pos = (350, 1), size = (180, 24), font=1, flags = RT_HALIGN_RIGHT, text = 1), # index 1 are the rtesults
++                                      ],
++                              "fonts": [gFont("Regular", 22),gFont("Regular", 18)],
++                              "itemHeight": 25
++                              }
++                      </convert>
++              </widget>
++      </screen>
++      <screen name="MyTubeHistoryScreen" position="340,163" zPosition="6" size="610,160" flags="wfNoBorder" >
++              <ePixmap position="0,0" zPosition="-1" size="610,160" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/MyTube/suggestions_bg.png" alphatest="on" transparent="1" backgroundColor="transparent"/>
++              <widget source="historylist" render="Listbox" position="10,5" zPosition="7" size="580,150" scrollbarMode="showOnDemand" transparent="1" foregroundColor="#cccccc" backgroundColor="#1c3c5c" >
++                      <convert type="TemplatedMultiContent">
++                              {"template": [
++                                              MultiContentEntryText(pos = (0, 1), size = (340, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
++                                      ],
++                              "fonts": [gFont("Regular", 22),gFont("Regular", 18)],
++                              "itemHeight": 25
++                              }
++                      </convert>
++              </widget>
++      </screen>       
++
++      <!-- Genuine Vuplus Plugin -->
++      <screen name="VuplusAuthenticity" position="center,center" size="800,370" title="Return the Love Event (only for genuine box)">
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="250,15" size="25,25" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="435,15" size="25,25" alphatest="on" />
++              <widget source="key_red" render="Label" position="265,15" zPosition="1" size="140,25" font="Regular;24" halign="center" valign="center" transparent="1" />
++              <widget source="key_green" render="Label" position="450,15" zPosition="1" size="140,25" font="Regular;24" halign="center" valign="center" transparent="1" />
++              <widget name="config" zPosition="2" position="80,70" size="640,80" scrollbarMode="showOnDemand" transparent="1" />
++              <widget name="text1" position="0,165" size="800,90" font="Regular;32" halign="center" valign="center"/>
++              <widget name="text2" position="100,260" size="600,110" font="Regular;24" halign="center" valign="center"/>
++      </screen>
++      <screen name="MessageBoxGenuine" position="center,center" size="600,10" title="Message">
++              <widget name="text" position="65,8" size="420,0" font="Regular;22" />
++              <widget name="ErrorPixmap" pixmap="Vu_HD/icons/input_error.png" position="5,5" size="53,53" alphatest="blend" />
++              <widget name="QuestionPixmap" pixmap="Vu_HD/icons/input_question.png" position="5,5" size="53,53" alphatest="blend" />
++              <widget name="InfoPixmap" pixmap="Vu_HD/icons/input_info.png" position="5,5" size="53,53" alphatest="blend" />
++              <widget name="list" position="100,100" size="380,375" transparent="1" backgroundColor="darkgrey" />
++              <applet type="onLayoutFinish">
++# this should be factored out into some helper code, but currently demonstrates applets.
++from enigma import eSize, ePoint
++
++orgwidth = self.instance.size().width()
++orgpos = self.instance.position()
++textsize = self[&quot;text&quot;].getSize()
++
++# y size still must be fixed in font stuff...
++textsize = (textsize[0] + 50, textsize[1] + 50)
++offset = 0
++if self.type == self.TYPE_YESNO:
++      offset = 60
++wsizex = textsize[0] + 60
++wsizey = textsize[1] + offset
++if (280 &gt; wsizex):
++      wsizex = 280
++wsize = (wsizex, wsizey)
++
++
++# resize
++self.instance.resize(eSize(*wsize))
++
++# resize label
++self[&quot;text&quot;].instance.resize(eSize(*textsize))
++
++# move list
++listsize = (wsizex, 50)
++self[&quot;list&quot;].instance.move(ePoint(0, textsize[1]))
++self[&quot;list&quot;].instance.resize(eSize(*listsize))
++
++# center window
++newwidth = wsize[0]
++self.instance.move(ePoint(orgpos.x() + (orgwidth - newwidth)/2, orgpos.y()))
++              </applet>
++      </screen>
++
++      <!-- HDMI CEC Plugin -->
++      <screen name="HdmiCecPlugin" position="center,center" size="590,320" title="HDMI-CEC Plugin" >
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="20,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="160,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="300,0" size="140,40" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/buttons/blue.png" position="440,0" size="140,40" alphatest="on" />
++
++              <widget source="key_red" render="Label" position="25,0" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget source="key_green" render="Label" position="165,0" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget source="key_yellow" render="Label" position="305,0" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget source="key_blue" render="Label" position="445,0" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1" />
++
++              <widget name="config" zPosition="2" position="10,50" size="580,270" scrollbarMode="showOnDemand" transparent="1" />
++      </screen>
++
++      <!-- LED Brightness Setup Plugin -->
++      <screen name="LEDBrightnessSetup" position="center,center" size="560,300" title="LED Brightness Setup">
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="10,10" size="25,25" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="195,10" size="25,25" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="380,10" size="25,25" alphatest="on" />
++
++              <widget source="key_red" render="Label" position="30,10" zPosition="1" size="140,25" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget source="key_green" render="Label" position="215,10" zPosition="1" size="140,25" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget source="key_yellow" render="Label" position="400,10" zPosition="1" size="140,25" font="Regular;20" halign="center" valign="center" transparent="1" />
++
++              <widget name="config" zPosition="2" position="5,50" size="550,200" scrollbarMode="showOnDemand" transparent="1"/>
++              <widget name="current_entry" position="130,240" size="300,30" font="Regular;18" halign="center" valign="center"/>
++      </screen>
++
++      <!-- Fancontrol Plugin -->
++      <screen name="FancontrolConfiguration" position="center,center" size="560,300" title="Standbymode Fancontrol settings" >
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="110,10" size="30,40" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="310,10" size="30,40" alphatest="on" />
++
++              <widget source="key_red" render="Label" position="115,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget source="key_green" render="Label" position="315,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1" />
++
++              <widget name="config" zPosition="2" position="5,70" size="550,200" scrollbarMode="showOnDemand" transparent="1" />
++      </screen>
++
++      <!-- RC Code Plugin -->
++      <screen name="RemoteControlCode" position="center,center" size="560,250" title="Remote Control System Code Setting" >
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="110,10" size="30,40" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="310,10" size="30,40" alphatest="on" />
++
++              <widget source="key_red" render="Label" position="115,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget source="key_green" render="Label" position="315,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1" />
++
++              <widget name="config" zPosition="2" position="5,50" size="550,200" scrollbarMode="showOnDemand" transparent="1" />
++      </screen>
++
++      <screen name="MessageBoxConfirmCode" position="center,center" size="620,10" title="Message">
++              <widget name="text" position="65,8" size="420,0" font="Regular;20" />
++              <widget name="ErrorPixmap" pixmap="Vu_HD/icons/input_error.png" position="5,5" size="53,53" alphatest="blend" />
++              <widget name="QuestionPixmap" pixmap="Vu_HD/icons/input_question.png" position="5,5" size="53,53" alphatest="blend" />
++              <widget name="InfoPixmap" pixmap="Vu_HD/icons/input_info.png" position="5,5" size="53,53" alphatest="blend" />
++              <widget name="list" position="100,100" size="380,375" transparent="1" backgroundColor="#279e9fa4" />
++              <applet type="onLayoutFinish">
++# this should be factored out into some helper code, but currently demonstrates applets.
++from enigma import eSize, ePoint
++
++orgwidth = self.instance.size().width()
++orgheight = self.instance.size().height()
++orgpos = self.instance.position()
++textsize = self[&quot;text&quot;].getSize()
++
++# y size still must be fixed in font stuff...
++textsize = (textsize[0] + 50, textsize[1] + 50)
++offset = 0
++if self.type == self.TYPE_YESNO:
++      offset = 60
++wsizex = textsize[0] + 60
++wsizey = textsize[1] + offset
++if (280 &gt; wsizex):
++      wsizex = 280
++wsize = (wsizex, wsizey)
++
++
++# resize
++self.instance.resize(eSize(*wsize))
++
++# resize label
++self[&quot;text&quot;].instance.resize(eSize(*textsize))
++
++# move list
++listsize = (wsizex, 50)
++self[&quot;list&quot;].instance.move(ePoint(0, textsize[1]))
++self[&quot;list&quot;].instance.resize(eSize(*listsize))
++
++# center window
++newwidth = wsize[0]
++newheight = wsize[1]
++self.instance.move(ePoint(orgpos.x() + (orgwidth - newwidth)/2, orgpos.y() + (orgheight - newheight)/2))
++              </applet>
++      </screen>
++
++      <!-- Manual Fancontrol Plugin -->
++      <screen name="ManualFancontrol" position="center,center" size="560,300" title="Fancontrol Settings in Standby mode" >
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="110,10" size="140,40" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="310,10" size="140,40" alphatest="on" />
++
++              <widget source="key_red" render="Label" position="120,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget source="key_green" render="Label" position="320,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1" />
++
++              <widget name="config" zPosition="2" position="5,70" size="550,200" scrollbarMode="showOnDemand" transparent="1" />
++              <widget source="current" render="Label" position="150,270" zPosition="1" size="280,30" font="Regular;20" halign="center" valign="center" />
++      </screen>
++
++      <!-- UI 3D Setup Plugin -->
++      <screen name="UI3DSetupScreen" position="center,center" size="560,300" title="UI 3D setup" >
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="110,10" size="140,40" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="310,10" size="140,40" alphatest="on" />
++
++              <widget source="key_red" render="Label" position="120,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget source="key_green" render="Label" position="320,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1" />
++
++              <widget name="config" zPosition="2" position="5,70" size="550,200" scrollbarMode="showOnDemand" transparent="1" />
++      </screen>
++
++      <!-- Blindscan Plugin -->
++      <screen name="Blindscan" position="center,center" size="560,390" title="Blindscan">
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="40,10" size="140,40" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="210,10" size="140,40" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/buttons/blue.png" position="380,10" size="140,40" alphatest="on" />
++
++              <widget source="key_red" render="Label" position="50,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1"/>
++              <widget source="key_green" render="Label" position="220,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1"/>
++              <widget source="key_blue" render="Label" position="390,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1"/>
++
++              <widget name="config" position="5,70" size="550,280" scrollbarMode="showOnDemand" />
++              <widget name="introduction" position="0,365" size="560,20" font="Regular;20" halign="center" />
++      </screen>
++
++      <!-- Web Browser Plugin -->
++      <screen name="BrowserLauncher" position="center,center" size="309,498" title="Web Browser">
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="4,0" size="40,40" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="154,0" size="40,40" alphatest="on" />
++
++              <widget source="key_red" render="Label" position="30,0" zPosition="1" size="125,30" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget source="key_green" render="Label" position="180,0" zPosition="1" size="125,30" font="Regular;20" halign="center" valign="center" transparent="1" />
++
++              <widget name="config" position="0,50" size="309,100" scrollbarMode="showOnDemand" />
++              <ePixmap pixmap="rc_wb_desc.png" position="0,150" size="309,296" alphatest="on" />
++              <widget name="info" position="0,455" size="309,50" font="Regular;18" halign="center" foregroundColor="blue" transparent="1" />
++      </screen>
++
++      <!-- Crash Report Plugin -->
++      <screen name="CrashlogReportConfiguration" position="209,48" size="865,623" title="CrashlogReport Setting" flags="wfNoBorder" backgroundColor="transparent">    
++              <ePixmap pixmap="Vu_HD/Bg_EPG_list.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="CrashlogReport Setting" position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" halign="right" backgroundColor="#27d9dee2" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="435,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/button_off.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_green" render="Label" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget name="config" zPosition="2" position="50,130" itemHeight="36" size="750,324" scrollbarMode="showOnDemand" transparent="1" />
++              <widget source="status" render="Label" position="160,525" size="540,60" zPosition="10" foregroundColor="#3c3c3c" backgroundColor="#27aeaeae" font="Regular;20" halign="center" valign="center" transparent="1"/>
++              <widget name="VKeyIcon" pixmap="Vu_HD/buttons/key_text.png" position="500,350" zPosition="10" size="35,25" transparent="1" alphatest="on" />
++              <widget name="HelpWindow" pixmap="Vu_HD/vkey_icon.png" position="310,400" zPosition="1" size="1,1" transparent="1" alphatest="on" />
++      </screen>
++
++      <!-- FPGA Upgrade Plugin -->
++      <screen name="FPGAUpgrade" position="center,center" size="560,420" title="FPGA Upgrade" >
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="40,10" size="140,40" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="210,10" size="140,40" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/blue.png" position="380,10" size="140,40" alphatest="blend" />
++
++              <widget source="key_red" render="Label" position="60,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1"/>
++              <widget source="key_green" render="Label" position="230,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1"/>
++              <widget source="key_blue" render="Label" position="400,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1"/>
++
++              <widget source="status" render="Label" position="15,60" zPosition="1" size="540,40" font="Regular;18" halign="left" valign="center" transparent="1" />
++              <widget name="file_list" position="0,100" size="555,320" scrollbarMode="showOnDemand" />
++        </screen>
++
++      <screen name="UpgradeStatus" position="center,center" size="450,130" title=" ">
++              <widget name="name" position="10,0" size="430,20" font="Regular;18" halign="left" valign="bottom"/>
++              <widget name="slider" position="10,25" size="430,30" borderWidth="2" borderColor="#cccccc"/>
++              <widget name="status" position="10,25" zPosition="1" size="430,30" font="Regular;18" halign="center" valign="center" foregroundColor="blue" backgroundColor="blue" transparent="1"/>
++              <widget source="info" render="Label" position="10,70" zPosition="1" size="430,60" font="Regular;22" halign="center" valign="center" transparent="1"/>
++      </screen>
++
++      <!-- Firmware Upgrade Plugin -->
++      <screen name="FirmwareUpgrade" position="center,center" size="560,175" title="Firmware Upgrade" >
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="125,7" size="80,40" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="330,7" size="80,40" alphatest="blend" />
++
++              <widget source="key_red" render="Label" position="160,0" zPosition="1" size="155,40" font="Regular;20" halign="left" valign="center" transparent="1" />
++              <widget source="key_green" render="Label" position="365,0" zPosition="1" size="155,40" font="Regular;20" halign="left" valign="center" transparent="1" />
++
++              <widget name="config" zPosition="2" position="0,50" itemHeight="36" size="540,40" scrollbarMode="showOnDemand" transparent="1" />
++              <widget source="status" render="Label" position="0,100" zPosition="1" size="540,75" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
++        </screen>
++
++      <screen name="FUFilebrowser" position="center,center" size="500,290" title="File Browser" >
++              <ePixmap pixmap="Vu_HD/buttons/blue.png" position="5,7" size="80,40" alphatest="blend" />
++              <widget source="key_blue" render="Label" position="40,0" zPosition="1" size="300,40" font="Regular;20" halign="left" valign="center" transparent="1"/>
++              <widget name="file_list" position="0,50" size="500,160" scrollbarMode="showOnDemand" />
++
++              <widget source="status" render="Label" position="0,230" zPosition="1" size="500,60" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
++        </screen>
++
++
++      <!-- WLan Setup Plugin -->
++      <screen name="WlanSelection" position="209,48" size="865,623" title="Wireless Network Configuration..." flags="wfNoBorder" backgroundColor="transparent">
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Wireless Network Adapter Selection..." position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_green" render="Label" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <ePixmap pixmap="Vu_HD/border_menu.png" position="120,140" zPosition="-1" size="342,358" transparent="1" alphatest="blend" />
++              <widget name="menulist" position="130,150" size="322,338" transparent="1" backgroundColor="#27d9dee2" zPosition="10" scrollbarMode="showOnDemand" />
++              <widget source="description" render="Label" position="500,140" size="280,360" font="Regular;19" halign="center" valign="center" backgroundColor="#c5c9cc" transparent="1"/>
++      </screen>
++
++      <screen name="WlanSetup" position="209,48" size="865,623" title="Wireless Network Configuration..." flags="wfNoBorder" backgroundColor="transparent">   
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Wireless Network Setup Menu..." position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_green" render="Label" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <ePixmap pixmap="Vu_HD/border_menu.png" position="120,140" zPosition="-1" size="342,358" transparent="1" alphatest="blend" />
++              <widget name="menulist" position="130,150" size="322,338" transparent="1" backgroundColor="#27d9dee2" zPosition="10" scrollbarMode="showOnDemand" />
++              <widget source="description" render="Label" position="500,140" size="280,360" font="Regular;19" halign="center" valign="center" backgroundColor="#c5c9cc" transparent="1"/>
++      </screen>
++
++      <screen name="WlanConfig" position="209,48" size="865,623" title="Wireless Network Configuration..." flags="wfNoBorder" backgroundColor="transparent">  
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Wireless Network Configuration..." position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_green" render="Label" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <ePixmap pixmap="Vu_HD/border_menu.png" position="120,140" zPosition="-1" size="342,358" transparent="1" alphatest="blend" />
++              <widget name="config" position="130,150" size="322,338" transparent="1" backgroundColor="#27d9dee2" zPosition="10" scrollbarMode="showOnDemand" />
++              <eLabel text="IP Address : " position="500,160" size="200,26" font="Semiboldit;22" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />             
++              <widget source="ipaddress" render="Label" position="530,190" zPosition="1" size="150,26" font="Regular;20" halign="center" valign="center" backgroundColor="#27b5b9bd" foregroundColor="#1c1c1c" transparent="1" />             
++              <eLabel text="NetMask : " position="500,220" size="200,26" font="Semiboldit;22" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />                
++              <widget source="netmask" render="Label" position="530,250" zPosition="1" size="150,26" font="Regular;20" halign="center" valign="center" backgroundColor="#27b5b9bd" foregroundColor="#1c1c1c" transparent="1" />               
++              <eLabel text="Gateway : " position="500,280" size="200,26" font="Semiboldit;22" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />                
++              <widget source="gateway" render="Label" position="530,310" zPosition="1" size="150,26" font="Regular;20" halign="center" valign="center" backgroundColor="#27b5b9bd" foregroundColor="#1c1c1c" transparent="1" />               
++              <widget name="VKeyIcon" pixmap="Vu_HD/buttons/key_text.png" position="500,350" zPosition="10" size="35,25" transparent="1" alphatest="on" />
++                <widget name="HelpWindow" pixmap="Vu_HD/vkey_icon.png" position="310,535" zPosition="1" size="1,1" transparent="1" alphatest="on" />
++      </screen>
++
++      <screen name="WlanScanAp" position="209,48" size="865,623" title="Wireless Network Configuration..." flags="wfNoBorder" backgroundColor="transparent">
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Wireless Network AP Scan..." position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="240,98" size="25,25" alphatest="blend" />
++              <ePixmap pixmap="Vu_HD/buttons/blue.png" position="630,98" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_green" render="Label" position="268,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="key_blue" render="Label" position="665,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <ePixmap pixmap="Vu_HD/border_menu.png" position="120,140" zPosition="-1" size="342,358" transparent="1" alphatest="blend" />
++              <widget name="menulist" position="130,150" size="322,338" transparent="1" backgroundColor="#27d9dee2" zPosition="10" scrollbarMode="showOnDemand" />
++              <widget source="Address" render="Label" position="490,220" zPosition="1" size="300,30" font="Regular;20" halign="center" valign="center" backgroundColor="#27b5b9bd" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="ESSID" render="Label" position="490,250" zPosition="1" size="300,30" font="Regular;20" halign="center" valign="center" backgroundColor="#27b5b9bd" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="Protocol" render="Label" position="490,280" zPosition="1" size="300,30" font="Regular;20" halign="center" valign="center" backgroundColor="#27b5b9bd" foregroundColor="#1c1c1c" transparent="1" />      
++              <widget source="Frequency" render="Label" position="490,310" zPosition="1" size="300,30" font="Regular;20" halign="center" valign="center" backgroundColor="#27b5b9bd" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="Encryption key" render="Label" position="490,340" zPosition="1" size="300,30" font="Regular;20" halign="center" valign="center" backgroundColor="#27b5b9bd" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="BitRate" render="Label" position="490,370" zPosition="1" size="300,60" font="Regular;20" halign="center" valign="center" backgroundColor="#27b5b9bd" foregroundColor="#1c1c1c" transparent="1" />
++      </screen>
++
++      <screen name="Wlanstatus" position="209,48" size="865,623" title="Wireless Network Configuration..." flags="wfNoBorder" backgroundColor="transparent">
++              <ePixmap pixmap="Vu_HD/Bg_EPG_view.png" zPosition="-1" position="0,0" size="865,623" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/menu/ico_title_Setup.png" position="32,41" size="40,40" alphatest="blend"  transparent="1" />
++              <eLabel text="Wireless Network Status..." position="90,50" size="600,32" font="Semiboldit;32" foregroundColor="#5d5d5d" backgroundColor="#27b5b9bd" transparent="1" />
++              <ePixmap pixmap="Vu_HD/icons/clock.png" position="750,55" zPosition="1" size="20,20" alphatest="blend" />
++              <widget source="global.CurrentTime" render="Label" position="770,57" zPosition="1" size="50,20" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" halign="right" transparent="1">
++                      <convert type="ClockToText">Format:%H:%M</convert>
++              </widget>
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="45,98" size="25,25" alphatest="blend" />
++              <widget source="key_red" render="Label" position="66,97" zPosition="1" size="150,25" font="Regular;20" halign="center" valign="center" backgroundColor="darkgrey" foregroundColor="#1c1c1c" transparent="1" />
++              <widget source="status" render="Label" position="110,200" size="650,400" transparent="1" font="Regular;20" foregroundColor="#1c1c1c" backgroundColor="#27d9dee2" zPosition="1" />
++      </screen>
++
++      <!-- Wireless Access Point Plugin -->
++      <screen name = "WirelessAccessPoint" position="center,center" size="650,520" title="Wireless Access Point Setup" >
++              <ePixmap pixmap="Vu_HD/buttons/red.png" position="20,10" size="140,40" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/buttons/green.png" position="180,10" size="140,40" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/buttons/yellow.png" position="340,10" size="140,40" alphatest="on" />
++              <ePixmap pixmap="Vu_HD/buttons/blue.png" position="500,10" size="140,40" alphatest="on" />
++              <widget source="key_red" render="Label" position="25,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget source="key_green" render="Label" position="185,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget source="key_yellow" render="Label" position="345,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget source="key_blue" render="Label" position="505,10" zPosition="1" size="140,30" font="Regular;20" halign="center" valign="center" transparent="1" />
++              <widget name="config" zPosition="2" position="10,60" size="630,350" scrollbarMode="showOnDemand" transparent="1" />
++              <widget source="current_settings" render="Label" position="10,410" size="630,20" font="Regular;19" halign="center" valign="center" transparent="1" />
++              <widget source="IPAddress_text" render="Label" position="160,440" size="190,21" font="Regular;19" transparent="1" />
++              <widget source="Netmask_text" render="Label" position="160,465" size="190,21" font="Regular;19" transparent="1" />
++              <widget source="Gateway_text" render="Label" position="160,490" size="190,21" font="Regular;19" transparent="1" />
++              <widget source="IPAddress" render="Label" position="370,440" size="240,21" font="Regular;19" transparent="1" />
++              <widget source="Netmask" render="Label" position="370,465" size="240,21" font="Regular;19" transparent="1" />
++              <widget source="Gateway" render="Label" position="370,490" size="240,21" font="Regular;19" transparent="1" />
++      </screen>
++
++</skin>
++
+diff --git a/data/fonts/Makefile.am b/data/fonts/Makefile.am
+index 2f7e7c7..f81801a 100644
+--- a/data/fonts/Makefile.am
++++ b/data/fonts/Makefile.am
+@@ -5,4 +5,7 @@ dist_install_DATA = \
+       lcd.ttf \
+       md_khmurabi_10.ttf \
+       nmsbd.ttf \
+-      tuxtxt.ttf
++      tuxtxt.ttf \
++      MyriadPro-Regular.otf \
++      MyriadPro-Semibold.otf \
++      MyriadPro-SemiboldIt.otf
+diff --git a/data/skin.xml b/data/skin.xml
+index ccd8eb7..9233610 100755
+--- a/data/skin.xml
++++ b/data/skin.xml
+@@ -150,11 +150,10 @@
+                       <convert type="ConditionalShowHide" />
+               </widget>
+               <!-- Audio icon (is there multichannel audio?) -->
+-<!--  ikseong         
+               <widget source="session.CurrentService" render="Pixmap" pixmap="skin_default/icons/icon_dolby.png" position="645,48" zPosition="1" size="26,16" alphatest="on">
+                       <convert type="ServiceInfo">IsMultichannel</convert>
+                       <convert type="ConditionalShowHide" />
+-              </widget>       -->
++              </widget>
+               <!-- Progressbar (current event duration)-->
+               <ePixmap pixmap="skin_default/progress_bg.png" position="48,77" size="84,7" transparent="1" alphatest="on" />
+               <widget source="session.Event_Now" render="Progress" pixmap="skin_default/progress_small.png" position="50,78" zPosition="1" size="80,5" transparent="1">
+diff --git a/lib/gdi/epng.cpp b/lib/gdi/epng.cpp
+index fd33298..d8c1982 100644
+--- a/lib/gdi/epng.cpp
++++ b/lib/gdi/epng.cpp
+@@ -116,10 +116,71 @@ int loadPNG(ePtr<gPixmap> &result, const char *filename)
+               }
+               surface->clut.start=0;
+               png_read_end(png_ptr, end_info);
++#ifndef BUILD_VUPLUS
+       } else {
+               result=0;
+               eDebug("%s: %dx%dx%d png, %d", filename, (int)width, (int)height, (int)bit_depth, color_type);
+       }
++#else         //csh Support for 32bit png file.
++      }else if (color_type == PNG_COLOR_TYPE_RGB_ALPHA && bit_depth == 8){
++//            eDebug("%s: %dx%dx%d png, %d", filename, (int)width, (int)height, (int)bit_depth, color_type);
++              result=new gPixmap(eSize(width, height), bit_depth*4);
++              gSurface *surface = result->surface;
++              int pass;
++              png_bytep *rowptr=new png_bytep[height];
++
++
++              //png_set_swap_alpha(png_ptr);
++
++              if (color_type & PNG_COLOR_MASK_COLOR)
++                      png_set_bgr(png_ptr);
++
++
++
++              int number_passes = png_set_interlace_handling(png_ptr);
++
++              for (unsigned int i=0; i<height; i++)
++                      rowptr[i]=((png_byte*)(surface->data))+i*surface->stride;
++
++              for (pass = 0; pass < number_passes; pass++)
++                      for (int y = 0; y < height; y++)
++                      {
++                              png_read_rows(png_ptr, &rowptr[y], png_bytepp_NULL, 1);
++                      }
++
++/*
++              png_bytep testptr = rowptr[32] + sizeof(unsigned int)*32;
++
++              for(int i = 0 ; i < 40 ; i ++)
++                      fprintf(stderr, "0x%x\n", testptr[i]);
++*/
++              for (int y = 0; y < height; y++){                               //csh  
++                      __u32 col;                      
++                      unsigned int *ptr = (unsigned int *)rowptr[y];
++                      for(int i = 0 ; i < width ; i ++){
++                              col= ptr[i];
++                              col ^=0xFF000000;
++                              ptr[i] = col;
++                      }
++              }
++ 
++              surface->clut.data=0;
++              surface->clut.colors=0;
++              surface->clut.start=0; 
++/*
++              testptr = rowptr[32] + sizeof(unsigned int)*32;
++              fprintf(stderr, "----------------------------------------------\n");
++              for(int i = 0 ; i < 40 ; i ++)
++                      fprintf(stderr, "0x%x\n", testptr[i]);
++*/
++              delete [] rowptr;
++              png_read_end(png_ptr, end_info);
++
++      } else {
++              result=0;
++              eDebug("%s: %dx%dx%d png, %d", filename, (int)width, (int)height, (int)bit_depth, color_type);
++      }
++#endif
+       png_destroy_read_struct(&png_ptr, &info_ptr,&end_info);
+       fclose(fp);
+diff --git a/lib/python/Screens/ChannelSelection.py b/lib/python/Screens/ChannelSelection.py
+index 688fe50..7bc66dc 100755
+--- a/lib/python/Screens/ChannelSelection.py
++++ b/lib/python/Screens/ChannelSelection.py
+@@ -2,6 +2,8 @@ from Tools.Profile import profile
+ from Screen import Screen
+ from Components.Button import Button
++#     ikseong
++from Components.Label import Label
+ from Components.ServiceList import ServiceList
+ from Components.ActionMap import NumberActionMap, ActionMap, HelpableActionMap
+ from Components.MenuList import MenuList
+@@ -731,6 +733,9 @@ class ChannelSelectionBase(Screen):
+               self["key_yellow"] = Button(_("Provider"))
+               self["key_blue"] = Button(_("Favourites"))
++              #       ikseong
++              self["etitle"] = Label(_('Channel Selection'))
++
+               self["list"] = ServiceList()
+               self.servicelist = self["list"]
+@@ -876,25 +881,51 @@ class ChannelSelectionBase(Screen):
+               pos = titleStr.find(']')
+               if pos == -1:
+                       pos = titleStr.find(')')
+-              if pos != -1:
+-                      titleStr = titleStr[:pos+1]
+-                      Len = len(self.servicePath)
+-                      if Len > 0:
+-                              base_ref = self.servicePath[0]
+-                              if Len > 1:
+-                                      end_ref = self.servicePath[Len-1]
+-                              else:
+-                                      end_ref = None
+-                              nameStr = self.getServiceName(base_ref)
+-                              titleStr += ' ' + nameStr
+-                              if end_ref is not None:
+-                                      if Len > 2:
+-                                              titleStr += '/../'
++              #       ikseong
++              if config.skin.primary_skin.value       =="750S/skin.xml":
++                      if pos != -1:
++                              titleStr = titleStr[:pos+1]
++                              Len = len(self.servicePath)
++                              if Len > 0:
++                                      base_ref = self.servicePath[0]
++                                      if Len > 1:
++                                              end_ref = self.servicePath[Len-1]
+                                       else:
+-                                              titleStr += '/'
+-                                      nameStr = self.getServiceName(end_ref)
+-                                      titleStr += nameStr
+-                              self.setTitle(titleStr)
++                                              end_ref = None
++                                      nameStr = self.getServiceName(base_ref)
++                                      if end_ref is not None:
++                                              titles = ".../"+ nameStr
++                                              if Len > 2:
++                                                      titles += '/../'
++                                              else:
++                                                      titles += '/'
++                                              nameStr = self.getServiceName(end_ref)
++                                              titles += nameStr
++                                              self["etitle"].setText(titles)
++                                      else:
++                                              titles = "Channel Selection "+titleStr + ' ' + nameStr                  
++                                              self["etitle"].setText(titles)
++              else:   
++              #       
++                      if pos != -1:
++                              titleStr = titleStr[:pos+1]
++                              Len = len(self.servicePath)
++                              if Len > 0:
++                                      base_ref = self.servicePath[0]
++                                      if Len > 1:
++                                              end_ref = self.servicePath[Len-1]
++                                      else:
++                                              end_ref = None
++                                      nameStr = self.getServiceName(base_ref)
++                                      titleStr += ' ' + nameStr
++                                      if end_ref is not None:
++                                              if Len > 2:
++                                                      titleStr += '/../'
++                                              else:
++                                                      titleStr += '/'
++                                              nameStr = self.getServiceName(end_ref)
++                                              titleStr += nameStr
++                                      self.setTitle(titleStr)
+       def moveUp(self):
+               self.servicelist.moveUp()
+diff --git a/lib/python/Screens/FixedMenu.py b/lib/python/Screens/FixedMenu.py
+index 0122346..c877a19 100644
+--- a/lib/python/Screens/FixedMenu.py
++++ b/lib/python/Screens/FixedMenu.py
+@@ -20,3 +20,10 @@ class FixedMenu(Screen):
+                       })
+               self["title"] = StaticText(title)
++              #       ikseong
++              self["thistory"] = StaticText(title)
++              self["title0"] = StaticText('')
++              self["title1"] = StaticText('')
++              self["title2"] = StaticText('')
++              #
++
+diff --git a/lib/python/Screens/Menu.py b/lib/python/Screens/Menu.py
+index 2a8801c..20403d8 100755
+--- a/lib/python/Screens/Menu.py
++++ b/lib/python/Screens/Menu.py
+@@ -22,6 +22,28 @@ from Screens.Setup import Setup, getSetupTitle
+ # read the menu
+ mdom = xml.etree.cElementTree.parse(resolveFilename(SCOPE_SKIN, 'menu.xml'))
++#     ikseong make menu title
++class title_History:
++      def __init__(self):
++              self.thistory = ''
++      def reset(self):
++              self.thistory = ''
++      def reducehistory(self):
++#             print "reducehistory" , self.thistory
++              history_len = len(self.thistory.split('>'))
++              if(history_len < 3):
++                      self.reset()
++                      return
++              if(self.thistory == ''):
++                      return
++              result = self.thistory.rsplit('>',2)
++              if(result[0] == ''):
++                      self.reset()
++                      return
++              self.thistory = result[0] + '> '
++
++t_history = title_History()
++#     
+ class boundFunction:
+       def __init__(self, fnc, *args):
+               self.fnc = fnc
+@@ -237,9 +259,41 @@ class Menu(Screen):
+               a = a and _(a)
+               if a is None:
+                       a = _(parent.get("text", "").encode("UTF-8"))
++              #       ikseong - enter Main menu
++              else:
++                      t_history.reset()
++                      
+               self["title"] = StaticText(a)
+               self.menu_title = a
++              #       ikseong make menu title
++              self["thistory"] = StaticText(t_history.thistory)
++              history_len = len(t_history.thistory)
++              self["title0"] = StaticText('')
++              self["title1"] = StaticText('')
++              self["title2"] = StaticText('')
++              if history_len < 13 :
++                      self["title0"] = StaticText(a)
++              elif history_len < 21 :
++                      self["title0"] = StaticText('')
++                      self["title1"] = StaticText(a)
++              else:
++                      self["title0"] = StaticText('')
++                      self["title1"] = StaticText('')
++                      self["title2"] = StaticText(a)                          
++
++#             english title                   
++#             if(t_history.thistory ==''):
++#                     t_history.thistory = str(etitle) + ' > '
++#             else:
++#                     t_history.thistory = t_history.thistory + str(etitle) + ' > '
++
++              if(t_history.thistory ==''):
++                      t_history.thistory = str(a) + ' > '
++              else:
++                      t_history.thistory = t_history.thistory + str(a) + ' > '
++              #
++
+       def keyNumberGlobal(self, number):
+               print "menu keyNumber:", number
+               # Calculate index
+@@ -250,9 +304,15 @@ class Menu(Screen):
+                       self.okbuttonClick()
+       def closeNonRecursive(self):
++              #       ikseong for menu title
++              t_history.reducehistory()
++              #
+               self.close(False)
+       def closeRecursive(self):
++              #       ikseong for menu title
++              t_history.reset()
++              #
+               self.close(True)
+       def createSummary(self):
+diff --git a/skin.py b/skin.py
+index 19da203..f191530 100755
+--- a/skin.py
++++ b/skin.py
+@@ -50,7 +50,7 @@ def loadSkin(name, scope = SCOPE_SKIN):
+ # example: loadSkin("nemesis_greenline/skin.xml")
+ config.skin = ConfigSubsection()
+-config.skin.primary_skin = ConfigText(default = "skin.xml")
++config.skin.primary_skin = ConfigText(default = "Vu_HD/skin.xml")
+ profile("LoadSkin")
+ try:
+@@ -133,6 +133,36 @@ def loadPixmap(path, desktop):
+               raise SkinError("pixmap file %s not found!" % (path))
+       return ptr
++#     ikseong
++from enigma import runMainloop, eDVBDB, eTimer, quitMainloop, \
++      getDesktop, ePythonConfigQuery, eAVSwitch, eServiceEvent
++pngcache = []
++def cachemenu():
++      pixmaplist = []
++      for (path, skin) in dom_skins:
++              for x in skin.findall("screen"):
++                      if x.attrib.get('name') == 'menu_mainmenu':
++                              print x.attrib.get('name')
++                              for s in x.findall("ePixmap"):
++                                      if s.attrib.get('pixmap','') is not '':
++                                              pixmaplist.append(s.attrib.get('pixmap',''))
++                              for s in x.findall('widget'):
++                                      if s.attrib.get('pixmap','') is not '':
++                                              pixmaplist.append(s.attrib.get('pixmap',''))
++      desktop = getDesktop(0)
++      for s in pixmaplist:
++              value ='/usr/share/enigma2/'+s
++#             print value
++              ptr = loadPixmap(value, desktop)
++              pngcache.append((value,ptr))
++#     ikseong
++try:
++      if config.skin.primary_skin.value == "750S/skin.xml" or config.skin.primary_skin.value == "Vu_HD/skin.xml":
++              cachemenu()
++except:
++      print "fail cache main menu"
++#
++
+ def applySingleAttribute(guiObject, desktop, attrib, value, scale = ((1,1),(1,1))):
+       # and set attributes
+       try:
+@@ -151,7 +181,15 @@ def applySingleAttribute(guiObject, desktop, attrib, value, scale = ((1,1),(1,1)
+               elif attrib == 'itemHeight':
+                       guiObject.setItemHeight(int(value))
+               elif attrib in ("pixmap", "backgroundPixmap", "selectionPixmap"):
+-                      ptr = loadPixmap(value, desktop) # this should already have been filename-resolved.
++#ikseong
++                      global pngcache
++                      ptr = None
++                      for cvalue, cptr in pngcache:
++                              if cvalue== value:
++                                      ptr=cptr
++                      if ptr is None:
++                              ptr = loadPixmap(value, desktop) # this should already have been filename-resolved.
++#
+                       if attrib == "pixmap":
+                               guiObject.setPixmap(ptr)
+                       elif attrib == "backgroundPixmap":
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_textvfd.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_textvfd.patch
new file mode 100644 (file)
index 0000000..f053a20
--- /dev/null
@@ -0,0 +1,43 @@
+diff --git a/lib/python/Screens/ChoiceBox.py b/lib/python/Screens/ChoiceBox.py
+index 7c8b142..39e70d4 100644
+--- a/lib/python/Screens/ChoiceBox.py
++++ b/lib/python/Screens/ChoiceBox.py
+@@ -31,7 +31,9 @@ class ChoiceBox(Screen):
+                       pos += 1
+               self["list"] = ChoiceList(list = self.list, selection = selection)
+               self["summary_list"] = StaticText()
+-              self.updateSummary()
++#     ikseong
++#             self.updateSummary()
++              self.updateSummary(selection)
+                               
+               self["actions"] = NumberActionMap(["WizardActions", "InputActions", "ColorActions", "DirectionActions"], 
+               {
+@@ -120,14 +122,21 @@ class ChoiceBox(Screen):
+       def updateSummary(self, curpos=0):
+               pos = 0
+               summarytext = ""
++#     ikseong         
++#             for entry in self.summarylist:
++#                     if pos > curpos-2 and pos < curpos+5:
++#                             if pos == curpos:
++#                                     summarytext += ">"
++#                             else:
++#                                     summarytext += entry[0]
++#                             summarytext += ' ' + entry[1] + '\n'
++#                     pos += 1
+               for entry in self.summarylist:
+-                      if pos > curpos-2 and pos < curpos+5:
+-                              if pos == curpos:
+-                                      summarytext += ">"
+-                              else:
+-                                      summarytext += entry[0]
+-                              summarytext += ' ' + entry[1] + '\n'
++                      if pos == curpos:
++                              summarytext += entry[1] +'\n'
++                              break
+                       pos += 1
++#
+               self["summary_list"].setText(summarytext)
+       def cancel(self):
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_vfd.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_vfd.patch
new file mode 100644 (file)
index 0000000..473eea1
--- /dev/null
@@ -0,0 +1,141 @@
+diff --git a/configure.ac b/configure.ac
+index 4902a9c..4bd2117 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -207,4 +207,5 @@ tools/enigma2.sh
+ enigma2.pc
+ ])
+ AC_DEFINE(BUILD_VUPLUS,1,[Define to 1 for vuplus])
++AC_DEFINE(BUILD_VUPLUS_DUO,1,[Define to 1 for duo])
+ AC_OUTPUT
+diff --git a/lib/gdi/glcddc.cpp b/lib/gdi/glcddc.cpp
+index 096705e..bcf0f5f 100755
+--- a/lib/gdi/glcddc.cpp
++++ b/lib/gdi/glcddc.cpp
+@@ -34,6 +34,16 @@ void gLCDDC::exec(gOpcode *o)
+ {
+       switch (o->opcode)
+       {
++#ifdef BUILD_VUPLUS_DUO /* ikseong  */
++      case gOpcode::renderText:
++              if (o->parm.renderText->text)
++              {
++                      lcd->updates(gDC::m_current_offset,o->parm.renderText->text);
++                      free(o->parm.renderText->text);
++                      delete o->parm.renderText;
++              }
++              break;
++#endif                        
+       case gOpcode::flush:
+ //            if (update)
+ #ifndef BUILD_VUPLUS /* ikseong  */
+diff --git a/lib/gdi/lcd.cpp b/lib/gdi/lcd.cpp
+index 9cb657c..83add38 100755
+--- a/lib/gdi/lcd.cpp
++++ b/lib/gdi/lcd.cpp
+@@ -228,3 +228,25 @@ void eDBoxLCD::update()
+       }
+ }
++#ifdef BUILD_VUPLUS_DUO /* ikseong  */
++char *eDBoxLCD::remaketext(char *text)
++{
++      int len = strlen(text);
++      int i;
++      for(i=0;i<len;i++)
++      {
++              if(text[i]==0x0a)
++                      text[i] = 0x20;
++      }
++      return text;
++}
++
++void eDBoxLCD::updates(ePoint start,char *text)
++{
++      if((lcdfd >= 0) && (start.y() < 5))
++      {
++              text = remaketext(text);
++              write(lcdfd,text,strlen(text));
++      }
++}
++#endif
+diff --git a/lib/gdi/lcd.h b/lib/gdi/lcd.h
+index e7b4c2c..561e3b0 100644
+--- a/lib/gdi/lcd.h
++++ b/lib/gdi/lcd.h
+@@ -36,6 +36,9 @@ public:
+       int stride() { return _stride; }
+       eSize size() { return res; }
+       virtual void update()=0;
++#ifdef BUILD_VUPLUS_DUO /* ikseong  */
++      virtual void updates(ePoint start,char *text) = 0;
++#endif
+ #endif
+ };
+@@ -59,6 +62,10 @@ public:
+       void setInverted( unsigned char );
+       bool isOled() const { return !!is_oled; }
+       void update();
++#ifdef BUILD_VUPLUS_DUO /* ikseong  */
++      char *remaketext(char *text);
++      void updates(ePoint start,char *text);
++#endif
+ };
+ #endif
+diff --git a/lib/python/Screens/ChoiceBox.py b/lib/python/Screens/ChoiceBox.py
+index 7c8b142..39e70d4 100644
+--- a/lib/python/Screens/ChoiceBox.py
++++ b/lib/python/Screens/ChoiceBox.py
+@@ -31,7 +31,9 @@ class ChoiceBox(Screen):
+                       pos += 1
+               self["list"] = ChoiceList(list = self.list, selection = selection)
+               self["summary_list"] = StaticText()
+-              self.updateSummary()
++#     ikseong
++#             self.updateSummary()
++              self.updateSummary(selection)
+                               
+               self["actions"] = NumberActionMap(["WizardActions", "InputActions", "ColorActions", "DirectionActions"], 
+               {
+@@ -120,14 +122,21 @@ class ChoiceBox(Screen):
+       def updateSummary(self, curpos=0):
+               pos = 0
+               summarytext = ""
++#     ikseong         
++#             for entry in self.summarylist:
++#                     if pos > curpos-2 and pos < curpos+5:
++#                             if pos == curpos:
++#                                     summarytext += ">"
++#                             else:
++#                                     summarytext += entry[0]
++#                             summarytext += ' ' + entry[1] + '\n'
++#                     pos += 1
+               for entry in self.summarylist:
+-                      if pos > curpos-2 and pos < curpos+5:
+-                              if pos == curpos:
+-                                      summarytext += ">"
+-                              else:
+-                                      summarytext += entry[0]
+-                              summarytext += ' ' + entry[1] + '\n'
++                      if pos == curpos:
++                              summarytext += entry[1] +'\n'
++                              break
+                       pos += 1
++#
+               self["summary_list"].setText(summarytext)
+       def cancel(self):
+diff --git a/lib/python/enigma_python.i b/lib/python/enigma_python.i
+index 0bddce1..040952d 100755
+--- a/lib/python/enigma_python.i
++++ b/lib/python/enigma_python.i
+@@ -131,6 +131,7 @@ is usually caused by not marking PSignals as immutable.
+ #define DEBUG
+ #define BUILD_VUPLUS
++#define BUILD_VUPLUS_DUO
+ typedef long time_t;
+ %include "typemaps.i"
+ %include "std_string.i"
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_vfd_mode.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_vfd_mode.patch
new file mode 100644 (file)
index 0000000..7d873ee
--- /dev/null
@@ -0,0 +1,124 @@
+diff --git a/configure.ac b/configure.ac
+index 27beb1e..8e007e1 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -46,6 +46,28 @@ AC_CHECK_LIB([xmlccwrap], [exit], [LIBXMLCCWRAP_LIBS="-lxmlccwrap"], [AC_MSG_ERR
+ AC_SUBST(LIBXMLCCWRAP_LIBS)
+ AC_LANG_POP
++
++AC_ARG_WITH(display-text-vfd,
++        AC_HELP_STRING([--with-display-text-vfd], [use text based vfd, yes or no]),
++        [[withtextvfd=$withval]],
++        [[withtextvfd=no]]
++)
++if test x"$withtextvfd" != xno ; then
++        AC_DEFINE(DISPLAY_TEXTVFD, 1,[Define when using an text based vfd device])
++fi
++AM_CONDITIONAL(DISPLAY_TEXTVFD, test x"$withtextvfd" != xno)
++
++AC_ARG_WITH(display-graphic-vfd,
++        AC_HELP_STRING([--with-display-graphic-vfd], [use graphic based vfd, yes or no]),
++        [[withgraphicvfd=$withval]],
++        [[withgraphicvfd=no]]
++)
++if test x"$withgraphicvfd" != xno ; then
++        AC_DEFINE(DISPLAY_GRAPHICVFD, 1,[Define when using an graphic based vfd device])
++fi
++AM_CONDITIONAL(DISPLAY_GRAPHICVFD, test x"$withgraphicvfd != xno")
++
++
+ AC_ARG_WITH(libsdl,
+       AS_HELP_STRING([--with-libsdl],[use libsdl, yes or no]),
+       [with_libsdl=$withval],[with_libsdl=no])
+diff --git a/lib/gdi/glcddc.cpp b/lib/gdi/glcddc.cpp
+index 8ac8cd3..74f6afd 100755
+--- a/lib/gdi/glcddc.cpp
++++ b/lib/gdi/glcddc.cpp
+@@ -34,13 +34,23 @@ void gLCDDC::exec(const gOpcode *o)
+ {
+       switch (o->opcode)
+       {
++#if defined(DISPLAY_TEXTVFD)
++      case gOpcode::renderText:
++              if (o->parm.renderText->text)
++              {
++                      lcd->updates(gDC::m_current_offset, o->parm.renderText->text);
++                      free(o->parm.renderText->text);
++                      delete o->parm.renderText;
++              }
++              break;
++#endif /*defined(DISPLAY_TEXTVFD)*/
+       case gOpcode::flush:
++#if defined(DISPLAY_GRAPHICVFD) && !defined(DISPLAY_TEXTVFD)
+ //            if (update)
+-#ifndef BUILD_VUPLUS /* ikseong  */
+                       lcd->update();
+ #else
+-                      ;
+-#endif
++              ;
++#endif /*defined(DISPLAY_GRAPHICVFD) && !defined(DISPLAY_TEXTVFD)*/
+       default:
+               gDC::exec(o);
+               break;
+diff --git a/lib/gdi/lcd.cpp b/lib/gdi/lcd.cpp
+index a5ac351..74bc3e0 100755
+--- a/lib/gdi/lcd.cpp
++++ b/lib/gdi/lcd.cpp
+@@ -183,9 +183,7 @@ eDBoxLCD *eDBoxLCD::getInstance()
+ void eDBoxLCD::update()
+ {
+-#ifdef BUILD_VUPLUS /* ikseong  */
+-      return ;
+-#endif
++#if defined(DISPLAY_GRAPHICVFD) && !defined(DISPLAY_TEXTVFD)
+       if (lcdfd >= 0)
+       {
+               if (!is_oled || is_oled == 2)
+@@ -227,5 +225,20 @@ void eDBoxLCD::update()
+                       write(lcdfd, raw, 64*64);
+               }
+       }
++#endif /*defined(DISPLAY_GRAPHICVFD) && !defined(DISPLAY_TEXTVFD)*/
+ }
++#if defined(DISPLAY_TEXTVFD)
++void eDBoxLCD::updates(ePoint start,char *text)
++{
++      if((lcdfd >= 0) && (start.y() < 5))
++      {
++              int i = 0, text_len = strlen(text);
++              for(; i<text_len ; i++)
++              {
++                      if(text[i]==0x0a) text[i] = 0x20;
++              }
++              write(lcdfd, text, text_len);
++      }
++}
++#endif /*defined(DISPLAY_TEXTVFD)*/
+diff --git a/lib/gdi/lcd.h b/lib/gdi/lcd.h
+index e7b4c2c..80a56f2 100644
+--- a/lib/gdi/lcd.h
++++ b/lib/gdi/lcd.h
+@@ -36,6 +36,9 @@ public:
+       int stride() { return _stride; }
+       eSize size() { return res; }
+       virtual void update()=0;
++#if defined(DISPLAY_TEXTVFD)
++      virtual void updates(ePoint start,char *text) = 0;
++#endif /*defined(DISPLAY_TEXTVFD)*/
+ #endif
+ };
+@@ -59,6 +62,9 @@ public:
+       void setInverted( unsigned char );
+       bool isOled() const { return !!is_oled; }
+       void update();
++#if defined(DISPLAY_TEXTVFD)
++      void updates(ePoint start,char *text);
++#endif /*defined(DISPLAY_TEXTVFD)*/
+ };
+ #endif
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_0.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_0.png
new file mode 100755 (executable)
index 0000000..c74e818
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_0.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_1.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_1.png
new file mode 100755 (executable)
index 0000000..7d5319b
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_1.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_2.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_2.png
new file mode 100755 (executable)
index 0000000..7ab668b
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_2.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_3.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_3.png
new file mode 100755 (executable)
index 0000000..7c559c6
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_3.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_4.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_4.png
new file mode 100755 (executable)
index 0000000..ca0fc51
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_4.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_5.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_5.png
new file mode 100755 (executable)
index 0000000..d3968de
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_5.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_6.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_6.png
new file mode 100755 (executable)
index 0000000..f48d3aa
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_6.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_7.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_7.png
new file mode 100755 (executable)
index 0000000..9e36d88
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_7.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_8.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_8.png
new file mode 100755 (executable)
index 0000000..f88ec95
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_8.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_9.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_9.png
new file mode 100755 (executable)
index 0000000..8a55eaa
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/number_key/key_9.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/skin_user.xml b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/skin_user.xml
new file mode 100644 (file)
index 0000000..d35cc2f
--- /dev/null
@@ -0,0 +1,243 @@
+<skin>
+       <fonts>
+               <font filename="nmsbd.ttf" name="VFD" scale="90"/>
+       </fonts>
+       <screen name="InfoBarSummary" position="0,0" size="256,64" id="1">
+               <widget source="session.CurrentService" render="Label" position="0,7" size="143,48" font="VFD;24" halign="center" valign="center" >
+                       <convert type="ServiceName">Name</convert>
+               </widget>
+               <widget source="session.Event_Now" render="Progress" position="0,59" size="143,5" borderWidth="1">
+                       <convert type="EventTime">Progress</convert>
+               </widget>
+               <widget source="global.CurrentTime" render="Label" position="180,44" size="58,20" font="VFD;20" halign="right" valign="center" transparent="1">
+                       <convert type="ClockToText">Format:%H:%M</convert>
+               </widget>
+               <widget source="global.CurrentTime" render="Label" position="241,46" zPosition="1" size="15,10" font="VFD;10" valign="center" transparent="1">
+                       <convert type="ClockToText">Format:%S</convert>
+               </widget>
+               <widget source="session.RecordState" render="Pixmap" pixmap="vfd_icons/vfd_icon_rec.png" position="155,0"  size="28,12">
+                       <convert type="ConditionalShowHide" />
+               </widget>       
+               <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_crypt.png" position="186,0"  size="10,12">
+                       <convert type="ServiceInfo">IsCrypted</convert>
+                       <convert type="ConditionalShowHide" />
+               </widget>
+               <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_txt.png" position="199,0" size="14,12">
+                       <convert type="ServiceInfo">HasTelext</convert>
+                       <convert type="ConditionalShowHide" />
+               </widget>
+               <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_format.png" position="216,0" size="21,12">
+                       <convert type="ServiceInfo">IsWidescreen</convert>
+                       <convert type="ConditionalShowHide" />
+               </widget>
+               <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_dolby.png" position="240,0" size="16,12">
+                       <convert type="ServiceInfo">IsMultichannel</convert>
+                       <convert type="ConditionalShowHide" />
+               </widget>
+        </screen>
+        <screen name="ChannelSelection_summary" position="0,0" size="256,64" id="1">
+               <widget source="parent.ServiceEvent" render="Label" position="0,7" size="143,48" font="VFD;24" halign="center" valign="center" >
+                       <convert type="ServiceName">Name</convert>
+               </widget>
+               <widget source="session.Event_Now" render="Progress" position="0,59" size="143,5" borderWidth="1">
+                       <convert type="EventTime">Progress</convert>
+               </widget>
+               <widget source="global.CurrentTime" render="Label" position="180,44" size="58,20" font="VFD;20" halign="right" valign="center" transparent="1">
+                       <convert type="ClockToText">Format:%H:%M</convert>
+               </widget>
+               <widget source="global.CurrentTime" render="Label" position="241,46" zPosition="1" size="15,10" font="VFD;10" valign="center" transparent="1">
+                       <convert type="ClockToText">Format:%S</convert>
+               </widget>
+               <widget source="session.RecordState" render="Pixmap" pixmap="vfd_icons/vfd_icon_rec.png" position="155,0"  size="28,12">
+                       <convert type="ConditionalShowHide" />
+               </widget>       
+               <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_crypt.png" position="186,0"  size="10,12">
+                       <convert type="ServiceInfo">IsCrypted</convert>
+                       <convert type="ConditionalShowHide" />
+               </widget>
+               <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_txt.png" position="199,0" size="14,12">
+                       <convert type="ServiceInfo">HasTelext</convert>
+                       <convert type="ConditionalShowHide" />
+               </widget>
+               <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_format.png" position="216,0" size="21,12">
+                       <convert type="ServiceInfo">IsWidescreen</convert>
+                       <convert type="ConditionalShowHide" />
+               </widget>
+               <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_dolby.png" position="240,0" size="16,12">
+                       <convert type="ServiceInfo">IsMultichannel</convert>
+                       <convert type="ConditionalShowHide" />
+               </widget>
+       </screen>
+       <screen name="InfoBarMoviePlayerSummary" position="0,0" size="256,64" id="1">
+               <widget source="session.CurrentService" render="Label" position="0,7" size="143,48" font="VFD;24" halign="center" valign="center" >
+                       <convert type="ServiceName">Name</convert>
+               </widget>
+               <widget source="session.CurrentService" render="Progress" position="0,59" size="143,5" borderWidth="1">
+                       <convert type="ServicePosition">Position</convert>
+               </widget>
+               <widget source="global.CurrentTime" render="Label" position="180,44" size="58,20" font="VFD;20" halign="right" valign="center" transparent="1">
+                       <convert type="ClockToText">Format:%H:%M</convert>
+               </widget>
+               <widget source="global.CurrentTime" render="Label" position="241,46" zPosition="1" size="15,10" font="VFD;10" valign="center" transparent="1">
+                       <convert type="ClockToText">Format:%S</convert>
+               </widget>
+               <widget source="session.RecordState" render="Pixmap" pixmap="vfd_icons/vfd_icon_rec.png" position="155,0"  size="28,12">
+                       <convert type="ConditionalShowHide" />
+               </widget>       
+               <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_crypt.png" position="186,0"  size="10,12">
+                       <convert type="ServiceInfo">IsCrypted</convert>
+                       <convert type="ConditionalShowHide" />
+               </widget>
+               <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_txt.png" position="199,0" size="14,12">
+                       <convert type="ServiceInfo">HasTelext</convert>
+                       <convert type="ConditionalShowHide" />
+               </widget>
+               <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_format.png" position="216,0" size="21,12">
+                       <convert type="ServiceInfo">IsWidescreen</convert>
+                       <convert type="ConditionalShowHide" />
+               </widget>
+               <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_dolby.png" position="240,0" size="16,12">
+                       <convert type="ServiceInfo">IsMultichannel</convert>
+                       <convert type="ConditionalShowHide" />
+               </widget>
+       </screen>
+       <screen name="ChoiceBox_summary" position="0,0" size="256,64" id="1">
+               <widget source="parent.summary_list" render="Label" position="6,0" size="244,64" font="Regular;12" />
+       </screen>
+       <screen name="MessageBox_summary" position="0,0" size="256,64" id="1">
+               <widget source="parent.Text" render="Label" position="6,0" size="244,45" font="Regular;15" halign="center" valign="center" />
+               <widget source="parent.selectedChoice" render="Label" position="6,46" size="244,18" font="Regular;18" halign="center" valign="center" />
+       </screen>
+       <screen name="MenuSummary" position="0,0" size="256,64" id="1">
+               <widget source="parent.title" render="Label" position="0,0" size="143,32" font="VFD;18" halign="center" valign="center"/>
+               <widget source="parent.menu" render="Label" position="0,32" size="143,32" font="VFD;18" halign="center" valign="center">
+                       <convert type="StringListSelection" />
+               </widget>
+               <widget source="global.CurrentTime" render="Label" position="180,44" size="58,20" font="VFD;20" halign="right" valign="center" transparent="1">
+                       <convert type="ClockToText">Format:%H:%M</convert>
+               </widget>
+               <widget source="global.CurrentTime" render="Label" position="241,46" zPosition="1" size="15,10" font="VFD;10" valign="center" transparent="1">
+                       <convert type="ClockToText">Format:%S</convert>
+               </widget>
+               <widget source="session.RecordState" render="Pixmap" pixmap="vfd_icons/vfd_icon_rec.png" position="155,0"  size="28,12">
+                       <convert type="ConditionalShowHide" />
+               </widget>       
+               <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_crypt.png" position="186,0"  size="10,12">
+                       <convert type="ServiceInfo">IsCrypted</convert>
+                       <convert type="ConditionalShowHide" />
+               </widget>
+               <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_txt.png" position="199,0" size="14,12">
+                       <convert type="ServiceInfo">HasTelext</convert>
+                       <convert type="ConditionalShowHide" />
+               </widget>
+               <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_format.png" position="216,0" size="21,12">
+                       <convert type="ServiceInfo">IsWidescreen</convert>
+                       <convert type="ConditionalShowHide" />
+               </widget>
+               <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_dolby.png" position="240,0" size="16,12">
+                       <convert type="ServiceInfo">IsMultichannel</convert>
+                       <convert type="ConditionalShowHide" />
+               </widget>
+       </screen>
+       <screen name="ServiceScanSummary" position="0,0" size="256,64" id="1">
+               <widget name="Title" position="0,0" size="256,26" font="VFD;20" transparent="1" />
+               <widget name="Service" position="0,30" size="256,30" font="VFD;15" transparent="1" />
+               <widget name="scan_progress" position="0,59" zPosition="1" borderWidth="1" size="143,5" backgroundColor="dark" />
+       </screen>
+       <screen name="SetupSummary" position="0,0" size="256,64" id="1">
+               <widget source="SetupTitle" render="Label" position="6,0" size="143,16" font="VFD;16" />
+               <widget source="SetupEntry" render="Label" position="6,16" size="143,32" font="VFD;14" />
+               <widget source="SetupValue" render="Label" position="6,48" size="143,16" font="VFD;14" />
+               <widget source="global.CurrentTime" render="Label" position="180,44" size="58,20" font="VFD;20" halign="right" valign="center" transparent="1">
+                       <convert type="ClockToText">Format:%H:%M</convert>
+               </widget>
+               <widget source="global.CurrentTime" render="Label" position="241,46" zPosition="1" size="15,10" font="VFD;10" valign="center" transparent="1">
+                       <convert type="ClockToText">Format:%S</convert>
+               </widget>
+               <widget source="session.RecordState" render="Pixmap" pixmap="vfd_icons/vfd_icon_rec.png" position="155,0"  size="28,12">
+                       <convert type="ConditionalShowHide" />
+               </widget>       
+               <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_crypt.png" position="186,0"  size="10,12">
+                       <convert type="ServiceInfo">IsCrypted</convert>
+                       <convert type="ConditionalShowHide" />
+               </widget>
+               <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_txt.png" position="199,0" size="14,12">
+                       <convert type="ServiceInfo">HasTelext</convert>
+                       <convert type="ConditionalShowHide" />
+               </widget>
+               <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_format.png" position="216,0" size="21,12">
+                       <convert type="ServiceInfo">IsWidescreen</convert>
+                       <convert type="ConditionalShowHide" />
+               </widget>
+               <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_dolby.png" position="240,0" size="16,12">
+                       <convert type="ServiceInfo">IsMultichannel</convert>
+                       <convert type="ConditionalShowHide" />
+               </widget>
+       </screen>
+       <screen name="StandbySummary" position="0,0" size="256,64" id="1">
+               <widget source="global.CurrentTime" render="Label" position="20,22" size="113,32" font="VFD;40" halign="right" valign="center" transparent="1">
+                       <convert type="ClockToText">Format:%H:%M</convert>
+               </widget>
+               <widget source="global.CurrentTime" render="Label" position="135,20" zPosition="1" size="32,20" font="VFD;20" valign="center" transparent="1">
+                       <convert type="ClockToText">Format:%S</convert>
+               </widget>
+               <widget source="session.RecordState" render="Pixmap" pixmap="vfd_icons/vfd_icon_rec.png" position="155,0"  size="28,12">
+                       <convert type="ConditionalShowHide" />
+               </widget>       
+               <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_crypt.png" position="186,0"  size="10,12">
+                       <convert type="ServiceInfo">IsCrypted</convert>
+                       <convert type="ConditionalShowHide" />
+               </widget>
+               <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_txt.png" position="199,0" size="14,12">
+                       <convert type="ServiceInfo">HasTelext</convert>
+                       <convert type="ConditionalShowHide" />
+               </widget>
+               <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_format.png" position="216,0" size="21,12">
+                       <convert type="ServiceInfo">IsWidescreen</convert>
+                       <convert type="ConditionalShowHide" />
+               </widget>
+               <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_dolby.png" position="240,0" size="16,12">
+                       <convert type="ServiceInfo">IsMultichannel</convert>
+                       <convert type="ConditionalShowHide" />
+               </widget>
+       </screen>
+       <screen name="SimpleSummary" position="0,0" size="256,64" id="1">
+               <widget source="parent.Title" render="Label" position="0,0" size="143,64" font="VFD;20" halign="center" valign="center" />
+               <widget source="global.CurrentTime" render="Label" position="180,44" size="58,20" font="VFD;20" halign="right" valign="center" transparent="1">
+                       <convert type="ClockToText">Format:%H:%M</convert>
+               </widget>
+               <widget source="global.CurrentTime" render="Label" position="241,46" zPosition="1" size="15,10" font="VFD;10" valign="center" transparent="1">
+                       <convert type="ClockToText">Format:%S</convert>
+               </widget>
+               <widget source="session.RecordState" render="Pixmap" pixmap="vfd_icons/vfd_icon_rec.png" position="155,0"  size="28,12">
+                       <convert type="ConditionalShowHide" />
+               </widget>       
+               <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_crypt.png" position="186,0"  size="10,12">
+                       <convert type="ServiceInfo">IsCrypted</convert>
+                       <convert type="ConditionalShowHide" />
+               </widget>
+               <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_txt.png" position="199,0" size="14,12">
+                       <convert type="ServiceInfo">HasTelext</convert>
+                       <convert type="ConditionalShowHide" />
+               </widget>
+               <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_format.png" position="216,0" size="21,12">
+                       <convert type="ServiceInfo">IsWidescreen</convert>
+                       <convert type="ConditionalShowHide" />
+               </widget>
+               <widget source="session.CurrentService" render="Pixmap" pixmap="vfd_icons/vfd_icon_dolby.png" position="240,0" size="16,12">
+                       <convert type="ServiceInfo">IsMultichannel</convert>
+                       <convert type="ConditionalShowHide" />
+               </widget>
+       </screen>
+       <screen name="MediaPlayerLCDScreen" position="0,0" size="256,64" id="1">
+               <widget name="text1" position="4,0" size="252,38" font="VFD;18"/>
+               <widget name="text3" position="4,39" size="252,12" font="VFD;12"/>
+               <widget name="text4" position="4,52" size="252,12" font="VFD;12"/>
+       </screen>
+       <screen name="WizardSummary" position="0,0" size="256,64" id="1">
+               <widget source="text" render="Label" position="6,0" size="252,16" font="VFD;18" transparent="1" />
+               <widget source="parent.list" render="Label" position="6,18" size="252,46" font="VFD;12">
+                       <convert type="StringListSelection" />
+               </widget>
+       </screen>
+</skin>
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_crypt.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_crypt.png
new file mode 100755 (executable)
index 0000000..e722ee2
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_crypt.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_dolby.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_dolby.png
new file mode 100755 (executable)
index 0000000..e15fce5
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_dolby.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_format.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_format.png
new file mode 100755 (executable)
index 0000000..382637e
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_format.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_rec.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_rec.png
new file mode 100755 (executable)
index 0000000..061d63c
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_rec.png differ
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_txt.png b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_txt.png
new file mode 100755 (executable)
index 0000000..9df696c
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/vfd_icons/vfd_icon_txt.png differ
diff --git a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugin-dvbmediasink_0.10.bb b/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugin-dvbmediasink_0.10.bb
new file mode 100644 (file)
index 0000000..11febfc
--- /dev/null
@@ -0,0 +1,17 @@
+SUMMARY = "Plugin for gstreamer: dvbmediasink"
+SECTION = "multimedia"
+LICENSE = "MIT | LGPLv2.1"
+LIC_FILES_CHKSUM = "file://src/gstdvbaudiosink.c;beginline=1;endline=45;md5=023ebb8eaef9b8cce8591a9d96638392 \
+                    file://src/gstdvbvideosink.c;beginline=1;endline=44;md5=b597d3f0a4e3b49db42d2b5140bd7004"
+DEPENDS = "gstreamer gst-plugins-base"
+SRCREV = "1bc9f47255396df4b3119a02790c4e864566560a"
+PR = "r5"
+
+SCHWERKRAFT_PROJECT = "dvbmediasink"
+
+inherit autotools schwerkraft-git
+
+FILES_${PN} = "${libdir}/gstreamer-0.10/*.so"
+FILES_${PN}-dev += "${libdir}/gstreamer-0.10/*.la"
+FILES_${PN}-staticdev += "${libdir}/gstreamer-0.10/*.a"
+FILES_${PN}-dbg += "${libdir}/gstreamer-0.10/.debug"
diff --git a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad-0.10.23/0001-mpegtsdemux-fix-bd-streamtype-detection.diff.patch b/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad-0.10.23/0001-mpegtsdemux-fix-bd-streamtype-detection.diff.patch
new file mode 100644 (file)
index 0000000..7061e4a
--- /dev/null
@@ -0,0 +1,201 @@
+From 55091d9a55ad100b99638503da038432549632f8 Mon Sep 17 00:00:00 2001
+From: Andreas Oberritter <obi@opendreambox.org>
+Date: Wed, 21 Mar 2012 15:45:17 +0100
+Subject: [PATCH 1/3] mpegtsdemux-fix-bd-streamtype-detection.diff
+
+---
+ gst/mpegdemux/gstmpegtsdemux.c |  134 +++++++++++++++++++++++----------------
+ 1 files changed, 79 insertions(+), 55 deletions(-)
+
+diff --git a/gst/mpegdemux/gstmpegtsdemux.c b/gst/mpegdemux/gstmpegtsdemux.c
+index 012c1cc..fffc50f 100644
+--- a/gst/mpegdemux/gstmpegtsdemux.c
++++ b/gst/mpegdemux/gstmpegtsdemux.c
+@@ -647,6 +647,18 @@ gst_mpegts_demux_get_stream_for_PID (GstMpegTSDemux * demux, guint16 PID)
+ }
+ static gboolean
++gst_mpeg_desc_reg_format_id_in_array(GArray *array, guint32 identifier)
++{
++  guint i = 0;
++  for (; i < array->len; ++i) {
++    guint8 *desc = g_array_index(array, guint8*, i);
++    if (DESC_REGISTRATION_format_identifier (desc) == identifier)
++      return TRUE;
++  }
++  return FALSE;
++}
++
++static gboolean
+ gst_mpegts_demux_fill_stream (GstMpegTSStream * stream, guint8 id,
+     guint8 stream_type)
+ {
+@@ -655,6 +667,8 @@ gst_mpegts_demux_fill_stream (GstMpegTSStream * stream, guint8 id,
+   GstMpegTSDemuxClass *klass;
+   GstMpegTSDemux *demux;
+   GstCaps *caps;
++  GArray *stream_desc_reg_array = NULL;
++  gboolean is_hdmv = FALSE;
+   if (stream->stream_type && stream->stream_type != stream_type)
+     goto wrong_type;
+@@ -666,6 +680,31 @@ gst_mpegts_demux_fill_stream (GstMpegTSStream * stream, guint8 id,
+   template = NULL;
+   caps = NULL;
++  if (stream->ES_info) {
++    stream_desc_reg_array =
++      gst_mpeg_descriptor_find_all (stream->ES_info, DESC_REGISTRATION);
++    if (stream_desc_reg_array &&
++        gst_mpeg_desc_reg_format_id_in_array(stream_desc_reg_array, DRF_ID_HDMV)) {
++      is_hdmv = TRUE;
++    }
++  }
++
++  if (!is_hdmv) {
++    GstMpegTSStream *PMT_stream =
++      gst_mpegts_demux_get_stream_for_PID (stream->demux, stream->PMT_pid);
++    GstMPEGDescriptor *program_info = PMT_stream->PMT.program_info;
++    if (program_info) {
++      GArray *program_desc_reg_array =
++        gst_mpeg_descriptor_find_all (program_info, DESC_REGISTRATION);
++      if (program_desc_reg_array) {
++        if (gst_mpeg_desc_reg_format_id_in_array(program_desc_reg_array, DRF_ID_HDMV)) {
++          is_hdmv = TRUE;
++        }
++        g_array_free(program_desc_reg_array, TRUE);
++      }
++    }
++  }
++
+   switch (stream_type) {
+     case ST_VIDEO_MPEG1:
+     case ST_VIDEO_MPEG2:
+@@ -756,11 +795,8 @@ gst_mpegts_demux_fill_stream (GstMpegTSStream * stream, guint8 id,
+       break;
+     case ST_PRIVATE_EA:        /* Try to detect a VC1 stream */
+     {
+-      guint8 *desc = NULL;
+-
+-      if (stream->ES_info)
+-        desc = gst_mpeg_descriptor_find (stream->ES_info, DESC_REGISTRATION);
+-      if (!(desc && DESC_REGISTRATION_format_identifier (desc) == DRF_ID_VC1)) {
++      if (!(stream_desc_reg_array &&
++          gst_mpeg_desc_reg_format_id_in_array(stream_desc_reg_array, DRF_ID_VC1))) {
+         GST_WARNING ("0xea private stream type found but no descriptor "
+             "for VC1. Assuming plain VC1.");
+       }
+@@ -772,47 +808,7 @@ gst_mpegts_demux_fill_stream (GstMpegTSStream * stream, guint8 id,
+           NULL);
+       break;
+     }
+-    case ST_BD_AUDIO_AC3:
+-    {
+-      GstMpegTSStream *PMT_stream =
+-          gst_mpegts_demux_get_stream_for_PID (stream->demux, stream->PMT_pid);
+-      GstMPEGDescriptor *program_info = PMT_stream->PMT.program_info;
+-      guint8 *desc = NULL;
+-
+-      if (program_info)
+-        desc = gst_mpeg_descriptor_find (program_info, DESC_REGISTRATION);
+-
+-      if (desc && DESC_REGISTRATION_format_identifier (desc) == DRF_ID_HDMV) {
+-        template = klass->audio_template;
+-        name = g_strdup_printf ("audio_%04x", stream->PID);
+-        caps = gst_caps_new_simple ("audio/x-eac3", NULL);
+-      } else if (stream->ES_info && gst_mpeg_descriptor_find (stream->ES_info,
+-              DESC_DVB_ENHANCED_AC3)) {
+-        template = klass->audio_template;
+-        name = g_strdup_printf ("audio_%04x", stream->PID);
+-        caps = gst_caps_new_simple ("audio/x-eac3", NULL);
+-      } else {
+-        if (!stream->ES_info ||
+-            !gst_mpeg_descriptor_find (stream->ES_info, DESC_DVB_AC3)) {
+-          GST_WARNING ("AC3 stream type found but no corresponding "
+-              "descriptor to differentiate between AC3 and EAC3. "
+-              "Assuming plain AC3.");
+-        }
+-        template = klass->audio_template;
+-        name = g_strdup_printf ("audio_%04x", stream->PID);
+-        caps = gst_caps_new_simple ("audio/x-ac3", NULL);
+-      }
+-      break;
+-    }
+-    case ST_BD_AUDIO_EAC3:
+-      template = klass->audio_template;
+-      name = g_strdup_printf ("audio_%04x", stream->PID);
+-      caps = gst_caps_new_simple ("audio/x-eac3", NULL);
+-      break;
+     case ST_PS_AUDIO_DTS:
+-    case ST_BD_AUDIO_DTS:
+-    case ST_BD_AUDIO_DTS_HD:
+-    case ST_BD_AUDIO_DTS_HD_MASTER_AUDIO:
+       template = klass->audio_template;
+       name = g_strdup_printf ("audio_%04x", stream->PID);
+       caps = gst_caps_new_simple ("audio/x-dts", NULL);
+@@ -822,24 +818,52 @@ gst_mpegts_demux_fill_stream (GstMpegTSStream * stream, guint8 id,
+       name = g_strdup_printf ("audio_%04x", stream->PID);
+       caps = gst_caps_new_simple ("audio/x-lpcm", NULL);
+       break;
+-    case ST_BD_AUDIO_LPCM:
+-      template = klass->audio_template;
+-      name = g_strdup_printf ("audio_%04x", stream->PID);
+-      caps = gst_caps_new_simple ("audio/x-private-ts-lpcm", NULL);
+-      break;
+     case ST_PS_DVD_SUBPICTURE:
+       template = klass->subpicture_template;
+       name = g_strdup_printf ("subpicture_%04x", stream->PID);
+       caps = gst_caps_new_simple ("video/x-dvd-subpicture", NULL);
+       break;
+-    case ST_BD_PGS_SUBPICTURE:
+-      template = klass->subpicture_template;
+-      name = g_strdup_printf ("subpicture_%04x", stream->PID);
+-      caps = gst_caps_new_simple ("subpicture/x-pgs", NULL);
+-      break;
+     default:
+       break;
+   }
++
++  if (!template && is_hdmv) {
++    switch (stream_type) {
++      case ST_BD_AUDIO_AC3:
++        template = klass->audio_template;
++        name = g_strdup_printf ("audio_%04x", stream->PID);
++        caps = gst_caps_new_simple ("audio/x-ac3", NULL);
++        break;
++      case ST_BD_AUDIO_EAC3:
++        template = klass->audio_template;
++        name = g_strdup_printf ("audio_%04x", stream->PID);
++        caps = gst_caps_new_simple ("audio/x-eac3", NULL);
++        break;
++      case ST_BD_AUDIO_DTS:
++      case ST_BD_AUDIO_DTS_HD:
++      case ST_BD_AUDIO_DTS_HD_MASTER_AUDIO:
++        template = klass->audio_template;
++        name = g_strdup_printf ("audio_%04x", stream->PID);
++        caps = gst_caps_new_simple ("audio/x-dts", NULL);
++        break;
++      case ST_BD_AUDIO_LPCM:
++        template = klass->audio_template;
++        name = g_strdup_printf ("audio_%04x", stream->PID);
++        caps = gst_caps_new_simple ("audio/x-private-ts-lpcm", NULL);
++        break;
++      case ST_BD_PGS_SUBPICTURE:
++        template = klass->subpicture_template;
++        name = g_strdup_printf ("subpicture_%04x", stream->PID);
++        caps = gst_caps_new_simple ("subpicture/x-pgs", NULL);
++        break;
++      default:
++        break;
++    }
++  }
++
++  if (stream_desc_reg_array)
++    g_array_free(stream_desc_reg_array, TRUE);
++
+   if (name == NULL || template == NULL || caps == NULL) {
+     if (name)
+       g_free (name);
+-- 
+1.7.5.4
+
diff --git a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad-0.10.23/0002-add-indexing-capabilities-to-generate-a-SPN-PTS-map-.patch b/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad-0.10.23/0002-add-indexing-capabilities-to-generate-a-SPN-PTS-map-.patch
new file mode 100644 (file)
index 0000000..1be4bbd
--- /dev/null
@@ -0,0 +1,423 @@
+From 0d5e73089dcf64398a4835d84c0dbcf77ef04e14 Mon Sep 17 00:00:00 2001
+From: Andreas Frisch <fraxinas@opendreambox.org>
+Date: Mon, 28 Mar 2011 10:31:23 +0200
+Subject: [PATCH 2/3] add indexing capabilities to generate a SPN/PTS map on
+ the fly in m2ts-mode
+
+---
+ gst/mpegtsmux/mpegtsmux.c |  234 ++++++++++++++++++++++++++++++++++++++++++++-
+ gst/mpegtsmux/mpegtsmux.h |   13 +++
+ 2 files changed, 243 insertions(+), 4 deletions(-)
+
+diff --git a/gst/mpegtsmux/mpegtsmux.c b/gst/mpegtsmux/mpegtsmux.c
+index a243e40..d5492a4 100644
+--- a/gst/mpegtsmux/mpegtsmux.c
++++ b/gst/mpegtsmux/mpegtsmux.c
+@@ -104,7 +104,8 @@
+   ARG_PROG_MAP,
+   ARG_M2TS_MODE,
+   ARG_PAT_INTERVAL,
+-  ARG_PMT_INTERVAL
++  ARG_PMT_INTERVAL,
++  ARG_ALIGNMENT
+ };
+ static GstStaticPadTemplate mpegtsmux_sink_factory =
+@@ -157,6 +158,12 @@
+ static void mpegtsdemux_set_header_on_caps (MpegTsMux * mux);
+ static gboolean mpegtsmux_sink_event (GstPad * pad, GstEvent * event);
+ static gboolean mpegtsmux_src_event (GstPad * pad, GstEvent * event);
++static void mpegtsmux_set_index (GstElement * element, GstIndex * index);
++static GstIndex *mpegtsmux_get_index (GstElement * element);
++
++static GstFormat pts_format;
++static GstFormat spn_format;
++guint get_packets_per_buffer (MpegTsMux * mux);
+ GST_BOILERPLATE (MpegTsMux, mpegtsmux, GstElement, GST_TYPE_ELEMENT);
+@@ -175,6 +182,10 @@
+       "MPEG Transport Stream Muxer", "Codec/Muxer",
+       "Multiplexes media streams into an MPEG Transport Stream",
+       "Fluendo <contact@fluendo.com>");
++
++  pts_format =
++      gst_format_register ("PTS", "MPEG System Presentation Time Stamp");
++  spn_format = gst_format_register ("SPN", "Source Packet Number");
+ }
+ static void
+@@ -191,6 +202,9 @@
+   gstelement_class->release_pad = mpegtsmux_release_pad;
+   gstelement_class->change_state = mpegtsmux_change_state;
++  gstelement_class->set_index = GST_DEBUG_FUNCPTR (mpegtsmux_set_index);
++  gstelement_class->get_index = GST_DEBUG_FUNCPTR (mpegtsmux_get_index);
++
+   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PROG_MAP,
+       g_param_spec_boxed ("prog-map", "Program map",
+           "A GstStructure specifies the mapping from elementary streams to programs",
+@@ -213,6 +227,12 @@
+           "Set the interval (in ticks of the 90kHz clock) for writing out the PMT table",
+           1, G_MAXUINT, TSMUX_DEFAULT_PMT_INTERVAL,
+           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
++
++  g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ALIGNMENT,
++      g_param_spec_uint ("alignment", "packet alignment",
++          "Queue this amount of ts/m2ts packets before pushing buffer. On EOS, pad with dummy packets until aligned. Default: 32 for m2ts streams, else disabled.",
++          0, G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
++
+ }
+ static void
+@@ -247,6 +267,15 @@
+   mux->streamheader_sent = FALSE;
+   mux->force_key_unit_event = NULL;
+   mux->pending_key_unit_ts = GST_CLOCK_TIME_NONE;
++
++  mux->spn_count = 0;
++
++  mux->element_index = NULL;
++  mux->element_index_writer_id = -1;
++
++  mux->arbitrary_align = FALSE;
++  mux->alignment_adapter = gst_adapter_new ();
++  mux->packets_per_buffer = 0;
+ }
+ static void
+@@ -288,6 +317,15 @@
+     g_list_free (mux->streamheader);
+     mux->streamheader = NULL;
+   }
++  if (mux->alignment_adapter) {
++    gst_adapter_clear (mux->alignment_adapter);
++    g_object_unref (mux->alignment_adapter);
++    mux->alignment_adapter = NULL;
++  }
++
++  if (mux->element_index)
++    gst_object_unref (mux->element_index);
++
+   GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object));
+ }
+@@ -331,12 +369,27 @@
+         walk = g_slist_next (walk);
+       }
+       break;
++    case ARG_ALIGNMENT:
++      mux->packets_per_buffer = g_value_get_uint (value);
++      mux->arbitrary_align = TRUE;
++      break;
+     default:
+       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+       break;
+   }
+ }
++guint
++get_packets_per_buffer (MpegTsMux * mux)
++{
++  if (mux->arbitrary_align == TRUE) {
++    return mux->packets_per_buffer;
++  } else if (mux->m2ts_mode) {
++    return BDMV_PACKETS_PER_BUFFER;
++  }
++  return DEFAULT_PACKETS_PER_BUFFER;
++}
++
+ static void
+ gst_mpegtsmux_get_property (GObject * object, guint prop_id,
+     GValue * value, GParamSpec * pspec)
+@@ -356,6 +409,9 @@
+     case ARG_PMT_INTERVAL:
+       g_value_set_uint (value, mux->pmt_interval);
+       break;
++    case ARG_ALIGNMENT:
++      g_value_set_uint (value, get_packets_per_buffer (mux));
++      break;
+     default:
+       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+       break;
+@@ -363,6 +419,37 @@
+ }
+ static void
++mpegtsmux_set_index (GstElement * element, GstIndex * index)
++{
++  MpegTsMux *mux = GST_MPEG_TSMUX (element);
++
++  GST_OBJECT_LOCK (mux);
++  if (mux->element_index)
++    gst_object_unref (mux->element_index);
++  mux->element_index = index ? gst_object_ref (index) : NULL;
++  GST_OBJECT_UNLOCK (mux);
++  GST_DEBUG_OBJECT (mux, "Set index %" GST_PTR_FORMAT, mux->element_index);
++  gst_index_add_format (index, mux->element_index_writer_id, pts_format);
++  gst_index_add_format (index, mux->element_index_writer_id, spn_format);
++}
++
++static GstIndex *
++mpegtsmux_get_index (GstElement * element)
++{
++  GstIndex *result = NULL;
++  MpegTsMux *mux = GST_MPEG_TSMUX (element);
++
++  GST_OBJECT_LOCK (mux);
++  if (mux->element_index)
++    result = gst_object_ref (mux->element_index);
++  GST_OBJECT_UNLOCK (mux);
++
++  GST_DEBUG_OBJECT (mux, "Returning index %" GST_PTR_FORMAT, result);
++
++  return result;
++}
++
++static void
+ release_buffer_cb (guint8 * data, void *user_data)
+ {
+   GstBuffer *buf = (GstBuffer *) user_data;
+@@ -505,6 +592,24 @@
+     ret = GST_FLOW_OK;
+   }
++  if (mux->element_index) {
++    gboolean parsed = FALSE;
++    if (ts_data->stream->is_video_stream) {
++      if (gst_structure_get_boolean (s, "parsed", &parsed) && parsed) {
++        if (mux->element_index_writer_id == -1) {
++          gst_index_get_writer_id (mux->element_index, GST_OBJECT (mux),
++              &mux->element_index_writer_id);
++          GST_INFO_OBJECT (mux,
++              "created GstIndex writer_id = %d for PID 0x%04x",
++              mux->element_index_writer_id, ts_data->pid);
++        }
++      } else
++        GST_WARNING_OBJECT (pad,
++            "Indexing capability for PID=0x%04x disabled - parsed input stream is required!",
++            ts_data->pid);
++    }
++  }
++
+ beach:
+   gst_caps_unref (caps);
+   return ret;
+@@ -659,6 +764,105 @@
+   return best;
+ }
++static GstFlowReturn
++aligned_push (MpegTsMux * mux, GstBuffer * buf)
++{
++  guint accu_bytes, packet_length;
++  GstBuffer *out_buf;
++
++  if (get_packets_per_buffer (mux) == 0) {
++    return gst_pad_push (mux->srcpad, buf);
++  }
++
++  packet_length = mux->m2ts_mode ? M2TS_PACKET_LENGTH : NORMAL_TS_PACKET_LENGTH;
++  gst_adapter_push (mux->alignment_adapter, buf);
++
++  accu_bytes = gst_adapter_available (mux->alignment_adapter);
++  GST_DEBUG_OBJECT (mux,
++      "Accumulating packet in alignment adapter, accu_bytes=%i", accu_bytes);
++
++  if (accu_bytes == get_packets_per_buffer (mux) * packet_length) {
++    out_buf = gst_adapter_take_buffer (mux->alignment_adapter, accu_bytes);
++    gst_buffer_set_caps (out_buf, GST_PAD_CAPS (mux->srcpad));
++    gst_adapter_clear (mux->alignment_adapter);
++    GST_DEBUG_OBJECT (mux,
++        "Accumulated desired amount of packets in alignment unit, handing off %i bytes",
++        accu_bytes);
++    return gst_pad_push (mux->srcpad, out_buf);
++  } else if (accu_bytes > get_packets_per_buffer (mux) * packet_length) {
++    GST_WARNING_OBJECT (mux, "Packet alignment error!");
++    gst_adapter_clear (mux->alignment_adapter);
++    return GST_FLOW_CUSTOM_ERROR;
++  }
++
++  return GST_FLOW_OK;
++}
++
++static void
++mpegtsmux_eos_align (MpegTsMux * mux)
++{
++  guint accu_bytes, packet_length, packets_needed, dummy_packet_count;
++  guint continuity_counter;
++  unsigned char header[4];
++  guint p;
++  GstBuffer *buf;
++  guint32 m2ts_header = 0;
++
++  accu_bytes = gst_adapter_available (mux->alignment_adapter);
++  packet_length = mux->m2ts_mode ? M2TS_PACKET_LENGTH : NORMAL_TS_PACKET_LENGTH;
++  packets_needed = get_packets_per_buffer (mux) - accu_bytes / packet_length;
++
++  if (get_packets_per_buffer (mux) == 0 || accu_bytes == 0) {
++    return;
++  }
++
++  GST_DEBUG_OBJECT (mux,
++      "received EOS - %i bytes accumulated in alignment adapter -> %i dummy packets needed for padding!\n",
++      accu_bytes, packets_needed);
++
++  if (mux->m2ts_mode) {
++    gst_adapter_copy (mux->alignment_adapter, header,
++        accu_bytes - packet_length, 4);
++    m2ts_header = GST_READ_UINT32_BE (header);
++    gst_adapter_copy (mux->alignment_adapter, header,
++        accu_bytes - packet_length + 7, 1);
++  } else {
++    gst_adapter_copy (mux->alignment_adapter, header,
++        accu_bytes - packet_length + 3, 1);
++  }
++
++  continuity_counter = header[0] & 0xF;
++
++  for (dummy_packet_count = 0; dummy_packet_count < packets_needed;
++      dummy_packet_count++) {
++    buf = gst_buffer_new_and_alloc (packet_length);
++    if (mux->m2ts_mode) {
++      // monotonically increase m2ts_header
++      m2ts_header++;
++      GST_WRITE_UINT32_BE (GST_BUFFER_DATA (buf), m2ts_header);
++      p = (guint) GST_BUFFER_DATA (buf) + 4;
++    } else {
++      p = (guint) GST_BUFFER_DATA (buf);
++    }
++    GST_WRITE_UINT8 (p++, TSMUX_SYNC_BYTE);
++    // dummy PID
++    GST_WRITE_UINT16_BE (p, 0x1FFF);
++    p += 2;
++    // adaptation field exists | no payload exists | continuity counter
++    GST_WRITE_UINT8 (p++, 0x20 + ((++continuity_counter) & 0xF));
++    // adaptation field length | flags
++    GST_WRITE_UINT16_BE (p, 0xB700);
++    p += 2;
++    // adaptation field
++    memset ((guint*)p, 0xFF, 0xB6);
++
++    aligned_push (mux, buf);
++    GST_LOG_OBJECT (mux,
++        "generated dummy packet %i with m2ts_header=0x%x, contiuity=0x%02x\n",
++        dummy_packet_count, m2ts_header, continuity_counter);
++  }
++}
++
+ #define COLLECT_DATA_PAD(collect_data) (((GstCollectData *)(collect_data))->pad)
+ static MpegTsPadData *
+@@ -971,6 +1175,7 @@
+   } else {
+     /* FIXME: Drain all remaining streams */
+     /* At EOS */
++    mpegtsmux_eos_align (mux);
+     gst_pad_push_event (mux->srcpad, gst_event_new_eos ());
+   }
+@@ -1081,7 +1286,7 @@
+     GST_LOG_OBJECT (mux, "marking as delta unit");
+     GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT);
+   } else {
+-    GST_DEBUG_OBJECT (mux, "marking as non-delta unit");
++    GST_DEBUG_OBJECT (mux, "marking as non-delta unit, spn %i", mux->spn_count);
+     mux->is_delta = TRUE;
+   }
+ }
+@@ -1104,6 +1309,8 @@
+     return FALSE;
+   }
++//   mux->spn_count++;
++
+   /* copies the TS data of 188 bytes to the m2ts buffer at an offset
+      of 4 bytes to leave space for writing the timestamp later */
+   memcpy (GST_BUFFER_DATA (buf) + 4, data, len);
+@@ -1168,13 +1375,25 @@
+         break;
+       gst_buffer_set_caps (out_buf, GST_PAD_CAPS (mux->srcpad));
+       GST_BUFFER_TIMESTAMP (out_buf) = MPEG_SYS_TIME_TO_GSTTIME (cur_pcr);
++      
++      mux->spn_count++;
++
++      if (mux->element_index) {
++        if (!GST_BUFFER_FLAG_IS_SET (out_buf, GST_BUFFER_FLAG_DELTA_UNIT)) {
++          gst_index_add_association (mux->element_index,
++              mux->element_index_writer_id,
++              GST_ASSOCIATION_FLAG_KEY_UNIT, spn_format,
++              mux->spn_count, pts_format,
++              GSTTIME_TO_MPEGTIME (GST_BUFFER_TIMESTAMP (out_buf)), NULL);
++        }
++      }
+       /* Write the 4 byte timestamp value, bottom 30 bits only = PCR */
+       GST_WRITE_UINT32_BE (GST_BUFFER_DATA (out_buf), cur_pcr & 0x3FFFFFFF);
+       GST_LOG_OBJECT (mux, "Outputting a packet of length %d PCR %"
+           G_GUINT64_FORMAT, M2TS_PACKET_LENGTH, cur_pcr);
+-      ret = gst_pad_push (mux->srcpad, out_buf);
++      ret = aligned_push (mux, out_buf);
+       if (G_UNLIKELY (ret != GST_FLOW_OK)) {
+         mux->last_flow_ret = ret;
+         return FALSE;
+@@ -1190,7 +1409,7 @@
+   GST_LOG_OBJECT (mux, "Outputting a packet of length %d PCR %"
+       G_GUINT64_FORMAT, M2TS_PACKET_LENGTH, new_pcr);
+-  ret = gst_pad_push (mux->srcpad, buf);
++  ret = aligned_push (mux, buf);
+   if (G_UNLIKELY (ret != GST_FLOW_OK)) {
+     mux->last_flow_ret = ret;
+     return FALSE;
+@@ -1221,7 +1440,7 @@
+   GST_BUFFER_TIMESTAMP (buf) = mux->last_ts;
+-  ret = gst_pad_push (mux->srcpad, buf);
++  ret = aligned_push (mux, buf);
+   if (G_UNLIKELY (ret != GST_FLOW_OK)) {
+     mux->last_flow_ret = ret;
+     return FALSE;
+@@ -1319,6 +1538,8 @@
+     case GST_STATE_CHANGE_READY_TO_NULL:
+       if (mux->adapter)
+         gst_adapter_clear (mux->adapter);
++      if (mux->alignment_adapter)
++        gst_adapter_clear (mux->alignment_adapter);
+       break;
+     default:
+       break;
+diff --git a/gst/mpegtsmux/mpegtsmux.h b/gst/mpegtsmux/mpegtsmux.h
+index 26003a8..1b88a33 100644
+--- a/gst/mpegtsmux/mpegtsmux.h
++++ b/gst/mpegtsmux/mpegtsmux.h
+@@ -130,6 +130,14 @@
+   gboolean streamheader_sent;
+   GstClockTime pending_key_unit_ts;
+   GstEvent *force_key_unit_event;
++
++  guint32 spn_count;
++  GstIndex *element_index;
++  gint      element_index_writer_id;
++ 
++  gboolean arbitrary_align;
++  guint packets_per_buffer;
++  GstAdapter *alignment_adapter;
+ };
+ struct MpegTsMuxClass  {
+@@ -186,6 +194,9 @@
+ #define MAX_PROG_NUMBER       32
+ #define DEFAULT_PROG_ID       0
++#define DEFAULT_PACKETS_PER_BUFFER 0
++#define BDMV_PACKETS_PER_BUFFER          32
++
+ G_END_DECLS
+ #endif
+-- 
+1.7.5.4
+
diff --git a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad-0.10.23/0003-mpegpsdemux_speedup.diff.patch b/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad-0.10.23/0003-mpegpsdemux_speedup.diff.patch
new file mode 100644 (file)
index 0000000..48647cf
--- /dev/null
@@ -0,0 +1,112 @@
+From 9fce0ed5dd37daa6d98d0a4aaed05faafb2e6771 Mon Sep 17 00:00:00 2001
+From: Andreas Oberritter <obi@opendreambox.org>
+Date: Wed, 21 Mar 2012 15:55:42 +0100
+Subject: [PATCH 3/3] mpegpsdemux_speedup.diff
+
+---
+ gst/mpegdemux/gstmpegdemux.c |   52 +++++++++++++++++++++++++++++++++++++-----
+ gst/mpegdemux/gstmpegdemux.h |    4 +++
+ 2 files changed, 50 insertions(+), 6 deletions(-)
+
+diff --git a/gst/mpegdemux/gstmpegdemux.c b/gst/mpegdemux/gstmpegdemux.c
+index 8359285..35a7ee9 100644
+--- a/gst/mpegdemux/gstmpegdemux.c
++++ b/gst/mpegdemux/gstmpegdemux.c
+@@ -285,7 +285,10 @@ gst_flups_demux_reset (GstFluPSDemux * demux)
+     if (stream != NULL) {
+       if (stream->pad)
+         gst_element_remove_pad (GST_ELEMENT_CAST (demux), stream->pad);
+-
++      if (stream->buf)
++        free(stream->buf);
++      if (stream->meta_buf)
++        gst_buffer_unref(stream->meta_buf);
+       g_free (stream);
+       demux->streams[i] = NULL;
+     }
+@@ -415,6 +418,15 @@ gst_flups_demux_create_stream (GstFluPSDemux * demux, gint id, gint stream_type)
+   stream->type = stream_type;
+   stream->pad = gst_pad_new_from_template (template, name);
+   stream->segment_thresh = threshold;
++
++  if (threshold == VIDEO_SEGMENT_THRESHOLD) {
++    stream->buf = malloc(64*1024);
++    stream->buf_pos = 0;
++    stream->meta_buf = gst_buffer_new();
++  }
++  else
++    stream->buf = 0;
++
+   gst_pad_set_event_function (stream->pad,
+       GST_DEBUG_FUNCPTR (gst_flups_demux_src_event));
+   gst_pad_set_query_function (stream->pad,
+@@ -466,6 +478,7 @@ gst_flups_demux_send_data (GstFluPSDemux * demux, GstFluPSStream * stream,
+   GstFlowReturn result;
+   guint64 timestamp;
+   guint size;
++  gboolean sent = FALSE;
+   if (stream == NULL)
+     goto no_stream;
+@@ -568,11 +581,38 @@ gst_flups_demux_send_data (GstFluPSDemux * demux, GstFluPSStream * stream,
+   demux->next_pts = G_MAXUINT64;
+   demux->next_dts = G_MAXUINT64;
+-  result = gst_pad_push (stream->pad, buf);
+-  GST_DEBUG_OBJECT (demux, "pushed stream id 0x%02x type 0x%02x, time: %"
+-      GST_TIME_FORMAT ", size %d. result: %s",
+-      stream->id, stream->type, GST_TIME_ARGS (timestamp),
+-      size, gst_flow_get_name (result));
++  if (stream->buf && stream->buf_pos && (timestamp != GST_CLOCK_TIME_NONE || stream->buf_pos+size > 64*1024)) {
++    GstBuffer *tmp = gst_buffer_new_and_alloc(stream->buf_pos);
++    gst_buffer_copy_metadata(tmp, stream->meta_buf, GST_BUFFER_COPY_ALL);
++    GST_BUFFER_SIZE(tmp) = stream->buf_pos;
++    memcpy(GST_BUFFER_DATA(tmp), stream->buf, stream->buf_pos);
++    result = gst_pad_push (stream->pad, tmp);
++    GST_DEBUG_OBJECT (demux, "pushed stream id 0x%02x type 0x%02x, time: %"
++        GST_TIME_FORMAT ", size %d. result: %s",
++        stream->id, stream->type, GST_TIME_ARGS (timestamp),
++        stream->buf_pos, gst_flow_get_name (result));
++    stream->buf_pos = 0;
++    sent = TRUE;
++  }
++
++  if (!stream->buf || size > 64*1024) {
++    result = gst_pad_push (stream->pad, buf);
++    GST_DEBUG_OBJECT (demux, "pushed stream id 0x%02x type 0x%02x, time: %"
++        GST_TIME_FORMAT ", size %d. result: %s",
++        stream->id, stream->type, GST_TIME_ARGS (timestamp),
++        size, gst_flow_get_name (result));
++  }
++  else {
++    if (!stream->buf_pos)
++      gst_buffer_copy_metadata(stream->meta_buf, buf, GST_BUFFER_COPY_ALL);
++
++    memcpy(stream->buf + stream->buf_pos, GST_BUFFER_DATA(buf), size);
++    stream->buf_pos += size;
++    gst_buffer_unref(buf);
++
++    if (!sent)
++      result = GST_FLOW_OK;
++  }
+   return result;
+diff --git a/gst/mpegdemux/gstmpegdemux.h b/gst/mpegdemux/gstmpegdemux.h
+index 6cf7aed..5977578 100644
+--- a/gst/mpegdemux/gstmpegdemux.h
++++ b/gst/mpegdemux/gstmpegdemux.h
+@@ -92,6 +92,10 @@ struct _GstFluPSStream
+   gboolean discont;
+   gboolean notlinked;
+   gboolean need_segment;
++
++  GstBuffer *meta_buf;
++  unsigned char *buf;
++  size_t buf_pos;
+ };
+ struct _GstFluPSDemux
+-- 
+1.7.5.4
+
diff --git a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad-0.10.23/orc.m4-fix-location-of-orcc-when-cross-compiling.patch b/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad-0.10.23/orc.m4-fix-location-of-orcc-when-cross-compiling.patch
new file mode 100644 (file)
index 0000000..d1942cf
--- /dev/null
@@ -0,0 +1,39 @@
+From 114ec19a882192dfcb5f71bb12c811d0a3b7f324 Mon Sep 17 00:00:00 2001
+From: Andreas Oberritter <obi@opendreambox.org>
+Date: Tue, 8 May 2012 17:27:55 +0200
+Subject: [PATCH] orc.m4: fix location of orcc when cross-compiling
+
+* Prepend PKG_CONFIG_SYSROOT to orcc, so configure doesn't
+  accidentially use an incompatible version of orcc installed
+  on the build system.
+
+Signed-off-by: Andreas Oberritter <obi@opendreambox.org>
+---
+ m4/orc.m4 |    4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/common/m4/orc.m4 b/common/m4/orc.m4
+index 26b2459..81b111e 100644
+--- a/common/m4/orc.m4
++++ b/common/m4/orc.m4
+@@ -3,6 +3,8 @@ dnl pkg-config-based checks for Orc
+ dnl specific:
+ dnl ORC_CHECK([REQUIRED_VERSION])
++m4_pattern_allow(PKG_CONFIG_SYSROOT_DIR)
++
+ AC_DEFUN([ORC_CHECK],
+ [
+   ORC_REQ=ifelse([$1], , "0.4.6", [$1])
+@@ -24,7 +26,7 @@ AC_DEFUN([ORC_CHECK],
+       HAVE_ORC=yes
+       if test "x$ORCC" = "x" ; then
+         AC_MSG_CHECKING(for usable orcc)
+-        ORCC=`$PKG_CONFIG --variable=orcc orc-0.4`
++        ORCC=$PKG_CONFIG_SYSROOT_DIR`$PKG_CONFIG --variable=orcc orc-0.4`
+         dnl check whether the orcc found by pkg-config can be run from the build environment
+         dnl if this is not the case (e.g. when cross-compiling) fall back to orcc from PATH
+         AS_IF([$ORCC --version 1> /dev/null 2> /dev/null], [], [ORCC=`which orcc`])
+-- 
+1.7.9.5
+
diff --git a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad_0.10.23.bbappend b/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-bad_0.10.23.bbappend
new file mode 100644 (file)
index 0000000..94b8221
--- /dev/null
@@ -0,0 +1,15 @@
+DEPENDS += "libmms"
+PR .= "-vuplus0"
+
+SRC_URI += " \
+        file://0001-mpegtsdemux-fix-bd-streamtype-detection.diff.patch \
+        file://0002-add-indexing-capabilities-to-generate-a-SPN-PTS-map-.patch \
+        file://0003-mpegpsdemux_speedup.diff.patch \
+        file://orc.m4-fix-location-of-orcc-when-cross-compiling.patch \
+"
+
+EXTRA_OECONF += "--enable-orc --with-plugins="
+# fix "configure: error: cannot run test program while cross compiling"
+EXTRA_OECONF += "--disable-mpeg2enc --disable-mplex"
+
+FILESEXTRAPATHS_prepend := "${THISDIR}/${P}:"
diff --git a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-base-0.10.36/orc.m4-fix-location-of-orcc-when-cross-compiling.patch b/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-base-0.10.36/orc.m4-fix-location-of-orcc-when-cross-compiling.patch
new file mode 100644 (file)
index 0000000..d1942cf
--- /dev/null
@@ -0,0 +1,39 @@
+From 114ec19a882192dfcb5f71bb12c811d0a3b7f324 Mon Sep 17 00:00:00 2001
+From: Andreas Oberritter <obi@opendreambox.org>
+Date: Tue, 8 May 2012 17:27:55 +0200
+Subject: [PATCH] orc.m4: fix location of orcc when cross-compiling
+
+* Prepend PKG_CONFIG_SYSROOT to orcc, so configure doesn't
+  accidentially use an incompatible version of orcc installed
+  on the build system.
+
+Signed-off-by: Andreas Oberritter <obi@opendreambox.org>
+---
+ m4/orc.m4 |    4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/common/m4/orc.m4 b/common/m4/orc.m4
+index 26b2459..81b111e 100644
+--- a/common/m4/orc.m4
++++ b/common/m4/orc.m4
+@@ -3,6 +3,8 @@ dnl pkg-config-based checks for Orc
+ dnl specific:
+ dnl ORC_CHECK([REQUIRED_VERSION])
++m4_pattern_allow(PKG_CONFIG_SYSROOT_DIR)
++
+ AC_DEFUN([ORC_CHECK],
+ [
+   ORC_REQ=ifelse([$1], , "0.4.6", [$1])
+@@ -24,7 +26,7 @@ AC_DEFUN([ORC_CHECK],
+       HAVE_ORC=yes
+       if test "x$ORCC" = "x" ; then
+         AC_MSG_CHECKING(for usable orcc)
+-        ORCC=`$PKG_CONFIG --variable=orcc orc-0.4`
++        ORCC=$PKG_CONFIG_SYSROOT_DIR`$PKG_CONFIG --variable=orcc orc-0.4`
+         dnl check whether the orcc found by pkg-config can be run from the build environment
+         dnl if this is not the case (e.g. when cross-compiling) fall back to orcc from PATH
+         AS_IF([$ORCC --version 1> /dev/null 2> /dev/null], [], [ORCC=`which orcc`])
+-- 
+1.7.9.5
+
diff --git a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-base_0.10.36.bbappend b/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-base_0.10.36.bbappend
new file mode 100644 (file)
index 0000000..f27d55a
--- /dev/null
@@ -0,0 +1,8 @@
+DEPENDS += "cdparanoia orc orc-native"
+PR .= "-vuplus0"
+
+SRC_URI += "file://orc.m4-fix-location-of-orcc-when-cross-compiling.patch"
+
+EXTRA_OECONF += "--enable-orc"
+
+FILESEXTRAPATHS_prepend := "${THISDIR}/${P}:"
diff --git a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-good-0.10.31/audioparser-raise-ranks.patch b/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-good-0.10.31/audioparser-raise-ranks.patch
new file mode 100644 (file)
index 0000000..ad73541
--- /dev/null
@@ -0,0 +1,19 @@
+--- gst-plugins-good-0.10.30/gst/audioparsers/plugin.c~        2012-01-04 21:55:58.816556710 +0100
++++ gst-plugins-good-0.10.30/gst/audioparsers/plugin.c 2012-01-04 21:55:58.843221178 +0100
+@@ -34,13 +34,13 @@
+   gboolean ret;
+   ret = gst_element_register (plugin, "aacparse",
+-      GST_RANK_PRIMARY + 1, GST_TYPE_AAC_PARSE);
++      GST_RANK_PRIMARY + 2, GST_TYPE_AAC_PARSE);
+   ret &= gst_element_register (plugin, "amrparse",
+       GST_RANK_PRIMARY + 1, GST_TYPE_AMR_PARSE);
+   ret &= gst_element_register (plugin, "ac3parse",
+-      GST_RANK_PRIMARY + 1, GST_TYPE_AC3_PARSE);
++      GST_RANK_PRIMARY + 2, GST_TYPE_AC3_PARSE);
+   ret &= gst_element_register (plugin, "dcaparse",
+-      GST_RANK_PRIMARY + 1, GST_TYPE_DCA_PARSE);
++      GST_RANK_PRIMARY + 2, GST_TYPE_DCA_PARSE);
+   ret &= gst_element_register (plugin, "flacparse",
+       GST_RANK_PRIMARY + 1, GST_TYPE_FLAC_PARSE);
+   ret &= gst_element_register (plugin, "mpegaudioparse",
diff --git a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-good-0.10.31/orc.m4-fix-location-of-orcc-when-cross-compiling.patch b/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-good-0.10.31/orc.m4-fix-location-of-orcc-when-cross-compiling.patch
new file mode 100644 (file)
index 0000000..d1942cf
--- /dev/null
@@ -0,0 +1,39 @@
+From 114ec19a882192dfcb5f71bb12c811d0a3b7f324 Mon Sep 17 00:00:00 2001
+From: Andreas Oberritter <obi@opendreambox.org>
+Date: Tue, 8 May 2012 17:27:55 +0200
+Subject: [PATCH] orc.m4: fix location of orcc when cross-compiling
+
+* Prepend PKG_CONFIG_SYSROOT to orcc, so configure doesn't
+  accidentially use an incompatible version of orcc installed
+  on the build system.
+
+Signed-off-by: Andreas Oberritter <obi@opendreambox.org>
+---
+ m4/orc.m4 |    4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/common/m4/orc.m4 b/common/m4/orc.m4
+index 26b2459..81b111e 100644
+--- a/common/m4/orc.m4
++++ b/common/m4/orc.m4
+@@ -3,6 +3,8 @@ dnl pkg-config-based checks for Orc
+ dnl specific:
+ dnl ORC_CHECK([REQUIRED_VERSION])
++m4_pattern_allow(PKG_CONFIG_SYSROOT_DIR)
++
+ AC_DEFUN([ORC_CHECK],
+ [
+   ORC_REQ=ifelse([$1], , "0.4.6", [$1])
+@@ -24,7 +26,7 @@ AC_DEFUN([ORC_CHECK],
+       HAVE_ORC=yes
+       if test "x$ORCC" = "x" ; then
+         AC_MSG_CHECKING(for usable orcc)
+-        ORCC=`$PKG_CONFIG --variable=orcc orc-0.4`
++        ORCC=$PKG_CONFIG_SYSROOT_DIR`$PKG_CONFIG --variable=orcc orc-0.4`
+         dnl check whether the orcc found by pkg-config can be run from the build environment
+         dnl if this is not the case (e.g. when cross-compiling) fall back to orcc from PATH
+         AS_IF([$ORCC --version 1> /dev/null 2> /dev/null], [], [ORCC=`which orcc`])
+-- 
+1.7.9.5
+
diff --git a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-good_0.10.31.bbappend b/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-good_0.10.31.bbappend
new file mode 100644 (file)
index 0000000..958007a
--- /dev/null
@@ -0,0 +1,9 @@
+DEPENDS := "${@oe_filter_out('^(gconf|pulseaudio)$', '${DEPENDS}', d)}"
+PR .= "-vuplus0"
+
+SRC_URI += "file://audioparser-raise-ranks.patch \
+            file://orc.m4-fix-location-of-orcc-when-cross-compiling.patch"
+
+EXTRA_OECONF += "--enable-orc"
+
+FILESEXTRAPATHS_prepend := "${THISDIR}/${P}:"
diff --git a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly-0.10.19/dvdsubdec-addproperty-singlebuffer.patch b/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly-0.10.19/dvdsubdec-addproperty-singlebuffer.patch
new file mode 100644 (file)
index 0000000..8247a9f
--- /dev/null
@@ -0,0 +1,103 @@
+From: Fraxinas <andreas.frisch@multimedia-labs.de>
+Subject: [PATCH] dvdsubdec: add singlebuffer property (fixes bug 619136)
+
+diff -u a/gst/dvdsub/gstdvdsubdec.c b/gst/dvdsub/gstdvdsubdec.c
+--- a/gst/dvdsub/gstdvdsubdec.c        2009-11-05 19:06:16.000000000 +0100
++++ b/gst/dvdsub/gstdvdsubdec.c        2010-05-26 16:27:06.000000000 +0200
+@@ -41,6 +41,10 @@
+ static GstClockTime gst_dvd_sub_dec_get_event_delay (GstDvdSubDec * dec);
+ static gboolean gst_dvd_sub_dec_sink_event (GstPad * pad, GstEvent * event);
+ static gboolean gst_dvd_sub_dec_sink_setcaps (GstPad * pad, GstCaps * caps);
++static void gst_dvd_sub_set_property (GObject * object, guint prop_id,
++    const GValue * value, GParamSpec * pspec);
++static void gst_dvd_sub_get_property (GObject * object, guint prop_id,
++    GValue * value, GParamSpec * pspec);
+ static GstFlowReturn gst_send_subtitle_frame (GstDvdSubDec * dec,
+     GstClockTime end_ts);
+@@ -100,6 +104,9 @@
+ }
+ RLE_state;
++#define ARG_SINGLEBUFFER              0x01
++#define DEFAULT_SINGLEBUFFER          FALSE
++
+ static void
+ gst_dvd_sub_dec_base_init (gpointer klass)
+ {
+@@ -123,6 +130,13 @@
+   gobject_class = (GObjectClass *) klass;
++  gobject_class->set_property = gst_dvd_sub_set_property;
++  gobject_class->get_property = gst_dvd_sub_get_property;
++
++  g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SINGLEBUFFER,
++      g_param_spec_boolean ("singlebuffer", "Single Buffer", "invoke only one single buffer upon changed dvd subpicture. false will output continuous video stream",
++          DEFAULT_SINGLEBUFFER, G_PARAM_READWRITE));
++  
+   gobject_class->finalize = gst_dvd_sub_dec_finalize;
+ }
+@@ -167,6 +181,40 @@
+   dec->out_buffer = NULL;
+   dec->buf_dirty = TRUE;
+   dec->use_ARGB = FALSE;
++  
++  dec->singlebuffer = DEFAULT_SINGLEBUFFER;
++}
++
++static void
++gst_dvd_sub_set_property (GObject * object, guint prop_id,
++    const GValue * value, GParamSpec * pspec)
++{
++  GstDvdSubDec *src;
++
++  src = GST_DVD_SUB_DEC (object);
++
++  switch (prop_id) {
++    case ARG_SINGLEBUFFER:
++      src->singlebuffer = g_value_get_boolean (value);
++      break;
++    default:
++      break;
++  }
++}
++
++static void
++gst_dvd_sub_get_property (GObject * object, guint prop_id, GValue * value,
++    GParamSpec * pspec)
++{
++  GstDvdSubDec *src;
++
++  src = GST_DVD_SUB_DEC (object);
++
++  switch (prop_id) {
++    case ARG_SINGLEBUFFER:
++      g_value_set_boolean (value, src->singlebuffer);
++      break;
++  }
+ }
+ static void
+@@ -697,6 +745,8 @@
+     dec->out_buffer = out_buf;
+     dec->buf_dirty = FALSE;
+   }
++  else if (dec->singlebuffer)
++        goto out;
+   out_buf = gst_buffer_create_sub (dec->out_buffer, 0,
+       GST_BUFFER_SIZE (dec->out_buffer));
+diff -u a/gst/dvdsub/gstdvdsubdec.h b/gst/dvdsub/gstdvdsubdec.h
+--- a/gst/dvdsub//gstdvdsubdec.h       2009-05-21 20:45:29.000000000 +0200
++++ b/gst/dvdsub/gstdvdsubdec.h        2010-05-26 13:39:32.000000000 +0200
+@@ -91,6 +91,8 @@
+   GstBuffer *out_buffer;
+   gboolean buf_dirty;
++  
++  gboolean singlebuffer;
+ };
+ struct _GstDvdSubDecClass
diff --git a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly-0.10.19/fix-opencore-amr-1.patch b/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly-0.10.19/fix-opencore-amr-1.patch
new file mode 100644 (file)
index 0000000..042cd9d
--- /dev/null
@@ -0,0 +1,55 @@
+Upstream-Status: Backport
+
+From 593ddf4bb9dc3c4d97bdde8d087db42147511274 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= <tim.muller@collabora.co.uk>
+Date: Sat, 3 Mar 2012 16:56:13 +0000
+Subject: [PATCH 1/2] configure: get rid of non-pkg-config ways to check for
+ opencore-amr
+
+---
+ configure.ac |   22 ++++++++++------------
+ 1 file changed, 10 insertions(+), 12 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index e5be3ed..3c2e341 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -250,12 +250,11 @@ AG_GST_CHECK_FEATURE(A52DEC, [a52dec], a52dec, [
+ dnl *** amr-nb ***
+ translit(dnm, m, l) AM_CONDITIONAL(USE_AMRNB, true)
+ AG_GST_CHECK_FEATURE(AMRNB, [amrnb library], amrnb, [
+-  PKG_CHECK_MODULES(AMRNB, opencore-amrnb, HAVE_AMRNB="yes",
+-      [ AG_GST_CHECK_LIBHEADER(AMRNB, opencore-amrnb,
+-                         Decoder_Interface_init, $LIBM,
+-                         opencore-amrnb/interf_dec.h,
+-                         AMRNB_LIBS="-lopencore-amrnb")
+-      ])
++  PKG_CHECK_MODULES(AMRNB, opencore-amrnb, [
++    HAVE_AMRNB="yes"
++  ], [
++    HAVE_AMRNB="no"
++  ])
+   AC_SUBST(AMRNB_CFLAGS)
+   AC_SUBST(AMRNB_LIBS)
+ ])
+@@ -263,12 +262,11 @@ AG_GST_CHECK_FEATURE(AMRNB, [amrnb library], amrnb, [
+ dnl *** amr-wb dec ***
+ translit(dnm, m, l) AM_CONDITIONAL(USE_AMRWB, true)
+ AG_GST_CHECK_FEATURE(AMRWB, [amrwb library], amrwbdec, [
+-  PKG_CHECK_MODULES(AMRWB, opencore-amrwb, HAVE_AMRWB="yes",
+-      [ AG_GST_CHECK_LIBHEADER(AMRWB, opencore-amrwb,
+-                         D_IF_decode, ,
+-                         opencore-amrwb/dec_if.h,
+-                         AMRWB_LIBS="-lopencore-amrwb")
+-      ])
++  PKG_CHECK_MODULES(AMRWB, opencore-amrwb, [
++    HAVE_AMRWB="yes"
++  ], [
++    HAVE_AMRWB="no"
++  ])
+   AC_SUBST(AMRWB_CFLAGS)
+   AC_SUBST(AMRWB_LIBS)
+ ])
+-- 
+1.7.9.5
+
diff --git a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly-0.10.19/fix-opencore-amr-2.patch b/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly-0.10.19/fix-opencore-amr-2.patch
new file mode 100644 (file)
index 0000000..4828feb
--- /dev/null
@@ -0,0 +1,105 @@
+Upstream-Status: Backport
+
+From 425e6e395f6bcaff77d0393126e1253066ddcd8a Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= <tim.muller@collabora.co.uk>
+Date: Sat, 3 Mar 2012 17:17:31 +0000
+Subject: [PATCH 2/2] amrnb, amrwbdec: fix build with opencore-amr >= 0.1.3
+
+In previous versions, the opencore-amr include sub-directory
+would be specified in the include path in the CFLAGS, but this
+is no longer the case in newer versions, so we need to add those
+to our include directives.
+
+Based on patch by: Christian Morales Vega
+
+https://bugzilla.gnome.org/show_bug.cgi?id=671123
+---
+ configure.ac            |    6 ++++++
+ ext/amrnb/amrnbdec.h    |    5 +++++
+ ext/amrnb/amrnbenc.h    |    7 ++++++-
+ ext/amrwbdec/amrwbdec.h |    6 ++++++
+ 4 files changed, 23 insertions(+), 1 deletion(-)
+
+diff --git a/configure.ac b/configure.ac
+index 3c2e341..18f2904 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -251,6 +251,9 @@ dnl *** amr-nb ***
+ translit(dnm, m, l) AM_CONDITIONAL(USE_AMRNB, true)
+ AG_GST_CHECK_FEATURE(AMRNB, [amrnb library], amrnb, [
+   PKG_CHECK_MODULES(AMRNB, opencore-amrnb, [
++    if $PKG_CONFIG --atleast-version=0.1.3 opencore-amrnb; then
++      AC_DEFINE(HAVE_OPENCORE_AMRNB_0_1_3_OR_LATER, 1, [Defined for newer opencore-amrnb])
++    fi
+     HAVE_AMRNB="yes"
+   ], [
+     HAVE_AMRNB="no"
+@@ -263,6 +266,9 @@ dnl *** amr-wb dec ***
+ translit(dnm, m, l) AM_CONDITIONAL(USE_AMRWB, true)
+ AG_GST_CHECK_FEATURE(AMRWB, [amrwb library], amrwbdec, [
+   PKG_CHECK_MODULES(AMRWB, opencore-amrwb, [
++    if $PKG_CONFIG --atleast-version=0.1.3 opencore-amrwb; then
++      AC_DEFINE(HAVE_OPENCORE_AMRWB_0_1_3_OR_LATER, 1, [Defined for newer opencore-amrwb])
++    fi
+     HAVE_AMRWB="yes"
+   ], [
+     HAVE_AMRWB="no"
+diff --git a/ext/amrnb/amrnbdec.h b/ext/amrnb/amrnbdec.h
+index 1e81839..5fe6982 100644
+--- a/ext/amrnb/amrnbdec.h
++++ b/ext/amrnb/amrnbdec.h
+@@ -22,7 +22,12 @@
+ #include <gst/gst.h>
+ #include <gst/audio/gstaudiodecoder.h>
++
++#ifdef HAVE_OPENCORE_AMRNB_0_1_3_OR_LATER
++#include <opencore-amrnb/interf_dec.h>
++#else
+ #include <interf_dec.h>
++#endif
+ G_BEGIN_DECLS
+diff --git a/ext/amrnb/amrnbenc.h b/ext/amrnb/amrnbenc.h
+index 7f673ac..48a8fe8 100644
+--- a/ext/amrnb/amrnbenc.h
++++ b/ext/amrnb/amrnbenc.h
+@@ -21,9 +21,14 @@
+ #define __GST_AMRNBENC_H__
+ #include <gst/gst.h>
+-#include <interf_enc.h>
+ #include <gst/audio/gstaudioencoder.h>
++#ifdef HAVE_OPENCORE_AMRNB_0_1_3_OR_LATER
++#include <opencore-amrnb/interf_enc.h>
++#else
++#include <interf_enc.h>
++#endif
++
+ G_BEGIN_DECLS
+ #define GST_TYPE_AMRNBENC \
+diff --git a/ext/amrwbdec/amrwbdec.h b/ext/amrwbdec/amrwbdec.h
+index c3528fc..6b82ae9 100644
+--- a/ext/amrwbdec/amrwbdec.h
++++ b/ext/amrwbdec/amrwbdec.h
+@@ -22,8 +22,14 @@
+ #include <gst/gst.h>
+ #include <gst/audio/gstaudiodecoder.h>
++
++#ifdef HAVE_OPENCORE_AMRWB_0_1_3_OR_LATER
++#include <opencore-amrwb/dec_if.h>
++#include <opencore-amrwb/if_rom.h>
++#else
+ #include <dec_if.h>
+ #include <if_rom.h>
++#endif
+ G_BEGIN_DECLS
+-- 
+1.7.9.5
+
diff --git a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly-0.10.19/orc.m4-fix-location-of-orcc-when-cross-compiling.patch b/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly-0.10.19/orc.m4-fix-location-of-orcc-when-cross-compiling.patch
new file mode 100644 (file)
index 0000000..d1942cf
--- /dev/null
@@ -0,0 +1,39 @@
+From 114ec19a882192dfcb5f71bb12c811d0a3b7f324 Mon Sep 17 00:00:00 2001
+From: Andreas Oberritter <obi@opendreambox.org>
+Date: Tue, 8 May 2012 17:27:55 +0200
+Subject: [PATCH] orc.m4: fix location of orcc when cross-compiling
+
+* Prepend PKG_CONFIG_SYSROOT to orcc, so configure doesn't
+  accidentially use an incompatible version of orcc installed
+  on the build system.
+
+Signed-off-by: Andreas Oberritter <obi@opendreambox.org>
+---
+ m4/orc.m4 |    4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/common/m4/orc.m4 b/common/m4/orc.m4
+index 26b2459..81b111e 100644
+--- a/common/m4/orc.m4
++++ b/common/m4/orc.m4
+@@ -3,6 +3,8 @@ dnl pkg-config-based checks for Orc
+ dnl specific:
+ dnl ORC_CHECK([REQUIRED_VERSION])
++m4_pattern_allow(PKG_CONFIG_SYSROOT_DIR)
++
+ AC_DEFUN([ORC_CHECK],
+ [
+   ORC_REQ=ifelse([$1], , "0.4.6", [$1])
+@@ -24,7 +26,7 @@ AC_DEFUN([ORC_CHECK],
+       HAVE_ORC=yes
+       if test "x$ORCC" = "x" ; then
+         AC_MSG_CHECKING(for usable orcc)
+-        ORCC=`$PKG_CONFIG --variable=orcc orc-0.4`
++        ORCC=$PKG_CONFIG_SYSROOT_DIR`$PKG_CONFIG --variable=orcc orc-0.4`
+         dnl check whether the orcc found by pkg-config can be run from the build environment
+         dnl if this is not the case (e.g. when cross-compiling) fall back to orcc from PATH
+         AS_IF([$ORCC --version 1> /dev/null 2> /dev/null], [], [ORCC=`which orcc`])
+-- 
+1.7.9.5
+
diff --git a/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly_0.10.19.bbappend b/meta-openvuplus/recipes-enigma2/gstreamer/gst-plugins-ugly_0.10.19.bbappend
new file mode 100644 (file)
index 0000000..581f4b2
--- /dev/null
@@ -0,0 +1,11 @@
+DEPENDS += "libcdio opencore-amr"
+PR .= "-vuplus0"
+
+SRC_URI += "file://dvdsubdec-addproperty-singlebuffer.patch \
+            file://fix-opencore-amr-1.patch \
+            file://fix-opencore-amr-2.patch \
+            file://orc.m4-fix-location-of-orcc-when-cross-compiling.patch"
+
+EXTRA_OECONF += "--enable-orc --with-plugins="
+
+FILESEXTRAPATHS_prepend := "${THISDIR}/${P}:"
diff --git a/meta-openvuplus/recipes-enigma2/libav/libav_0.7.4.bbappend b/meta-openvuplus/recipes-enigma2/libav/libav_0.7.4.bbappend
new file mode 100644 (file)
index 0000000..0346404
--- /dev/null
@@ -0,0 +1,4 @@
+LICENSE = "LGPLv2.1+"
+PR .= "-vuplus0"
+
+EXTRA_OECONF += "--disable-gpl --disable-nonfree --disable-version3 --disable-x11grab"
diff --git a/meta-openvuplus/recipes-enigma2/libdreamdvd/libdreamdvd_0.9.bb b/meta-openvuplus/recipes-enigma2/libdreamdvd/libdreamdvd_0.9.bb
new file mode 100644 (file)
index 0000000..62e69fa
--- /dev/null
@@ -0,0 +1,8 @@
+SUMMARY = "libdvdnav wrapper for dream multimedia stbs"
+LICENSE = "GPLv2+"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=94d55d512a9ba36caa9b7df079bae19f"
+DEPENDS = "libdvdnav"
+SRCREV = "ee7b0b4c1b35264ed7e003782b501040b7b435fd"
+PR = "r0"
+
+inherit autotools pkgconfig schwerkraft-git
diff --git a/meta-openvuplus/recipes-enigma2/libdvbsi++/libdvbsi++_0.3.6.bb b/meta-openvuplus/recipes-enigma2/libdvbsi++/libdvbsi++_0.3.6.bb
new file mode 100644 (file)
index 0000000..5916755
--- /dev/null
@@ -0,0 +1,12 @@
+SUMMARY = "C++ parsing library for Service Information (SI) in DVB systems"
+AUTHOR = "Andreas Oberritter"
+SECTION = "libs/multimedia"
+LICENSE = "LGPLv2.1"
+LIC_FILES_CHKSUM = "file://COPYING;md5=a6f89e2100d9b6cdffcea4f398e37343"
+PR = "r1"
+
+SRC_URI = "http://www.saftware.de/${PN}/${P}.tar.bz2"
+SRC_URI[md5sum] = "4e9fb95c3ab8bb31ff051ed1aa98c8c5"
+SRC_URI[sha256sum] = "7f9a8fc7bed9372784ecb101fc45042dcb36dcd4949c57aa524365366f71ebf2"
+
+inherit autotools pkgconfig
diff --git a/meta-openvuplus/recipes-enigma2/libdvdnav/libdvdnav/0001-dvdnavmini.pc-link-against-libdvdnavmini.patch b/meta-openvuplus/recipes-enigma2/libdvdnav/libdvdnav/0001-dvdnavmini.pc-link-against-libdvdnavmini.patch
new file mode 100644 (file)
index 0000000..84ce442
--- /dev/null
@@ -0,0 +1,25 @@
+upstream: Daniel Baumann <daniel@debian.org>
+status: pending
+
+From 2329cd28d7508f9809f849fa547362aa7df160ba Mon Sep 17 00:00:00 2001
+From: Andreas Oberritter <obi@opendreambox.org>
+Date: Fri, 8 Oct 2010 00:50:54 +0000
+Subject: [PATCH] dvdnavmini.pc: link against libdvdnavmini
+
+---
+ misc/dvdnavmini.pc.in |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/misc/dvdnavmini.pc.in b/misc/dvdnavmini.pc.in
+index 52945b3..773be2f 100644
+--- a/misc/dvdnavmini.pc.in
++++ b/misc/dvdnavmini.pc.in
+@@ -8,4 +8,4 @@ Description: DVD Navigation mini library
+ Version: @VERSION@
+ Cflags: -I${includedir} @DVDREAD_CFLAGS@ @THREAD_CFLAGS@
+-Libs: -L${libdir} -ldvdnav @THREAD_LIBS@
++Libs: -L${libdir} -ldvdnavmini @THREAD_LIBS@
+-- 
+1.7.1
+
diff --git a/meta-openvuplus/recipes-enigma2/libdvdnav/libdvdnav_svn.bb b/meta-openvuplus/recipes-enigma2/libdvdnav/libdvdnav_svn.bb
new file mode 100644 (file)
index 0000000..b00f742
--- /dev/null
@@ -0,0 +1,24 @@
+SUMMARY = "DVD navigation multimeda library"
+SECTION = "libs/multimedia"
+LICENSE = "GPLv2+"
+LIC_FILES_CHKSUM = "file://README;beginline=42;endline=43;md5=3f2e6972567beedaa901b809725027ff \
+                    file://src/dvdnav.c;beginline=1;endline=19;md5=8270661e7e05a78e14714e0fb3048b12"
+DEPENDS = "libdvdread"
+PV = "4.2.0+svnr${SRCPV}"
+PR = "r1"
+
+SRC_URI = "svn://svn.mplayerhq.hu/dvdnav/trunk;module=${PN} \
+           file://0001-dvdnavmini.pc-link-against-libdvdnavmini.patch"
+
+SRCREV = "1243"
+S = "${WORKDIR}/${PN}"
+
+inherit autotools lib_package binconfig pkgconfig
+
+FILES_${PN} = "${libdir}/${PN}${SOLIB}"
+
+python populate_packages_prepend() {
+        description = bb.data.expand('${DESCRIPTION}', d)
+        libdir = bb.data.expand('${libdir}', d)
+        do_split_packages(d, libdir, '^lib(.*)\.so\..*', 'lib%s', description + ' (%s)', extra_depends='', allow_links=True)
+}
diff --git a/meta-openvuplus/recipes-enigma2/libdvdread/libdvdread_svn.bb b/meta-openvuplus/recipes-enigma2/libdvdread/libdvdread_svn.bb
new file mode 100644 (file)
index 0000000..afc488c
--- /dev/null
@@ -0,0 +1,13 @@
+SUMMARY = "DVD access multimeda library"
+SECTION = "libs/multimedia"
+LICENSE = "GPLv2+"
+LIC_FILES_CHKSUM = "file://COPYING;md5=64e753fa7d1ca31632bc383da3b57c27"
+PV = "4.2.0+svnr${SRCPV}"
+PR = "r1"
+
+SRC_URI = "svn://svn.mplayerhq.hu/dvdnav/trunk;module=${PN}"
+
+SRCREV = "1243"
+S = "${WORKDIR}/${PN}"
+
+inherit autotools lib_package binconfig pkgconfig
diff --git a/meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2-1.2.5/autofoo.patch b/meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2-1.2.5/autofoo.patch
new file mode 100644 (file)
index 0000000..9eb2b87
--- /dev/null
@@ -0,0 +1,125 @@
+--- libsigc++-1.2.5-old/configure.in   2003-05-14 10:04:25.000000000 +0200
++++ libsigc++-1.2.5/configure.in       2004-07-03 10:00:13.000000000 +0200
+@@ -35,9 +35,9 @@
+ dnl AC_SUBST(SIGC_RELEASE, $SIGC_RELEASE)
+ AC_SUBST(SIGC_VERSION)
+-AC_DEFINE_UNQUOTED(SIGC_MAJOR_VERSION, $SIGC_MAJOR_VERSION)
+-AC_DEFINE_UNQUOTED(SIGC_MINOR_VERSION, $SIGC_MINOR_VERSION)
+-AC_DEFINE_UNQUOTED(SIGC_MICRO_VERSION, $SIGC_MICRO_VERSION)
++AC_DEFINE_UNQUOTED(SIGC_MAJOR_VERSION, $SIGC_MAJOR_VERSION, [library major version])
++AC_DEFINE_UNQUOTED(SIGC_MINOR_VERSION, $SIGC_MINOR_VERSION, [library minor version])
++AC_DEFINE_UNQUOTED(SIGC_MICRO_VERSION, $SIGC_MICRO_VERSION, [library micro version])
+ AC_CONFIG_AUX_DIR(scripts)
+@@ -50,6 +50,23 @@
+ dnl Specify a configuration file
+ AM_CONFIG_HEADER(sigc++/config/sigcconfig.h)
++AH_BOTTOM([
++// Window DLL declarations 
++
++#ifdef LIBSIGC_DLL
++ #if defined(LIBSIGC_COMPILATION) && defined(DLL_EXPORT)
++  #define LIBSIGC_API __declspec(dllexport)
++  #define LIBSIGC_TMPL 
++ #elif !defined(LIBSIGC_COMPILATION)
++  #define LIBSIGC_API __declspec(dllimport)
++  #define LIBSIGC_TMPL extern
++ #else
++  #define LIBSIGC_API
++ #endif /* LIBSIGC_COMPILATION - DLL_EXPORT */
++#else
++ #define LIBSIGC_API
++#endif /* LIBSIGC_DLL */
++])
+ AM_MAINTAINER_MODE
+@@ -288,10 +307,10 @@
+   };
+ ],[
+ ],
+-  AC_DEFINE(SIGC_CXX_EXPLICIT,explicit)
++  AC_DEFINE(SIGC_CXX_EXPLICIT,explicit,[if C++ compiler supports explicit])
+   ac_cxx_explicit=yes
+ ,
+-  AC_DEFINE(SIGC_CXX_EXPLICIT,)
++  AC_DEFINE(SIGC_CXX_EXPLICIT)
+   ac_cxx_explicit=no
+ )
+ AC_MSG_RESULT([$ac_cxx_explicit])
+@@ -305,7 +324,7 @@
+   };
+ ],[
+ ],
+-  AC_DEFINE(SIGC_CXX_EXPLICIT_COPY,explicit)
++  AC_DEFINE(SIGC_CXX_EXPLICIT_COPY,explicit,[if C++ compiler supports explicit copy ctor])
+   ac_cxx_explicit_copy_ctor=yes
+ ,
+   AC_DEFINE(SIGC_CXX_EXPLICIT_COPY,)
+@@ -413,7 +432,7 @@
+   k<void,void> a;
+ ],[
+   ac_cxx_partial_specialization=yes
+-  AC_DEFINE(SIGC_CXX_PARTIAL_SPEC)
++  AC_DEFINE(SIGC_CXX_PARTIAL_SPEC,,[if C++ compiler supports partial specialization])
+ ],[
+ #  config_error=yes
+   ac_cxx_partial_specialization=no
+@@ -434,7 +453,7 @@
+ ],[
+   ac_cxx_namespaces=yes
+   AC_MSG_RESULT([$ac_cxx_namespaces])
+-  AC_DEFINE(SIGC_CXX_NAMESPACES)
++  AC_DEFINE(SIGC_CXX_NAMESPACES,,[if C++ compiler supports name spaces])
+ ],[
+   ac_cxx_namespaces=no
+   AC_MSG_RESULT([$ac_cxx_namespaces])
+@@ -474,7 +493,7 @@
+ A<int> i;
+ ],[
+ ],[
+-  AC_DEFINE(SIGC_CXX_INT_CTOR)
++  AC_DEFINE(SIGC_CXX_INT_CTOR,,[if C++ compiler has intrinsic constructors])
+   ac_cxx_tmpl_intctor=yes
+ ],[
+   ac_cxx_tmpl_intctor=no
+@@ -515,7 +534,7 @@
+ ],[
+ ],[
+   ac_cxx_void_return=yes
+-  AC_DEFINE(SIGC_CXX_VOID_RETURN)
++  AC_DEFINE(SIGC_CXX_VOID_RETURN,,[if C++ compiler allows void returns])
+ ],[
+   ac_cxx_void_return=no
+ ])
+@@ -530,7 +549,7 @@
+ ],[
+ ],[
+   ac_cxx_void_cast_return=yes
+-  AC_DEFINE(SIGC_CXX_VOID_CAST_RETURN)
++  AC_DEFINE(SIGC_CXX_VOID_CAST_RETURN,,[if C++ compiler supports void cast return])
+ ],[
+   ac_cxx_void_cast_return=no
+ ])
+@@ -565,7 +584,7 @@
+     P<int&>::ptr q=b;
+ ],[
+   ac_cxx_specialize_references=yes
+-  AC_DEFINE(SIGC_CXX_SPECIALIZE_REFERENCES)
++  AC_DEFINE(SIGC_CXX_SPECIALIZE_REFERENCES,,[if C++ compiler allows specialization of references])
+ ],[
+   ac_cxx_specialize_references=no
+ ])
+--- libsigc++-1.2.5-old/Makefile.am    2004-06-27 12:45:19.000000000 +0200
++++ libsigc++-1.2.5/Makefile.am        2004-07-03 08:40:44.000000000 +0200
+@@ -1,6 +1,6 @@
+ SUBDIRS = sigc++ tests doc
+ DIST_SUBDIRS = $(SUBDIRS) examples scripts MSVC_6 MSVC_Net2003
+-ACLOCAL_AMFLAGS = -I $(srcdir)/scripts
++ACLOCAL_AMFLAGS = -I ./scripts
+ EXTRA_DIST = \
+       FEATURES IDEAS                  \
diff --git a/meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2-1.2.5/fix-install.patch b/meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2-1.2.5/fix-install.patch
new file mode 100644 (file)
index 0000000..1cdfedb
--- /dev/null
@@ -0,0 +1,15 @@
+upstream: unmaintained
+
+| ...build/tmp/sysroots/i686-linux/usr/bin/install: will not overwrite just-created `...build/tmp/work/mipsel-oe-linux/libsigc++-1.2-1.2.5-r2/image/usr/include/sigc++-1.2/sigc++/method_slot.h' with `method_slot.h'
+
+--- libsigc++-1.2.7/sigc++/Makefile.am.orig    2010-09-24 12:03:24.000000000 +0000
++++ libsigc++-1.2.7/sigc++/Makefile.am 2010-09-24 12:03:30.000000000 +0000
+@@ -12,7 +12,7 @@
+ sigc_built_h  = bind_return.h \
+                 object_slot.h retype_return.h slot.h bind.h           \
+                 class_slot.h hide.h retype.h signal.h       \
+-                  method_slot.h method_slot.h
++                  method_slot.h
+ built_sources = $(sigc_built_cc) $(sigc_built_h)
+ dist_sources  = $(sigc_fixed_cc) $(sigc_fixed_h)
diff --git a/meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2-1.2.5/pkgconfig.patch b/meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2-1.2.5/pkgconfig.patch
new file mode 100644 (file)
index 0000000..7495a4d
--- /dev/null
@@ -0,0 +1,13 @@
+
+#
+# Patch managed by http://www.holgerschurig.de/patcher.html
+#
+
+--- libsigc++-1.2.5/sigc++-1.2.pc.in~pkgconfig
++++ libsigc++-1.2.5/sigc++-1.2.pc.in
+@@ -7,4 +7,4 @@
+ Description: Type-safe signal and callback system for C++
+ Version: @VERSION@
+ Libs: -L${libdir} -lsigc-1.2
+-Cflags: -I${exec_prefix}/lib/sigc++-1.2/include -I${includedir}/sigc++-1.2
++Cflags: -I${libdir}/sigc++-1.2/include -I${includedir}/sigc++-1.2
diff --git a/meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2-1.2.5/to_1.2.7.patch b/meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2-1.2.5/to_1.2.7.patch
new file mode 100644 (file)
index 0000000..21fa729
--- /dev/null
@@ -0,0 +1,159 @@
+diff -Naur libsigc++-1.2.5/sigc++/macros/signal.h.m4 libsigc++-1.2.7/sigc++/macros/signal.h.m4
+--- libsigc++-1.2.5/sigc++/macros/signal.h.m4  2003-03-06 09:06:12.000000000 +0100
++++ libsigc++-1.2.7/sigc++/macros/signal.h.m4  2005-01-29 00:10:34.000000000 +0100
+@@ -82,6 +82,8 @@
+       bool empty();
+       void clear();
+       void cleanup(); // nothrow
++   private:
++      void _remove(SignalConnectionNode* c);
+   };
+ class LIBSIGC_API SignalBase\r
+diff -Naur libsigc++-1.2.5/sigc++/object.h libsigc++-1.2.7/sigc++/object.h
+--- libsigc++-1.2.5/sigc++/object.h    2003-05-08 21:35:11.000000000 +0200
++++ libsigc++-1.2.7/sigc++/object.h    2012-02-14 13:08:00.193044640 +0100
+@@ -69,7 +69,7 @@
+       virtual void unreference() const;\r
+       virtual void set_manage();\r
\r
+-      ObjectBase& operator=(const ObjectBase& /* o */)\r
++      ObjectBase& operator=(const ObjectBase& o)\r
+         { return *this; }\r
\r
+       ObjectBase()\r
+@@ -79,7 +79,11 @@
+         : control_(0) {}\r
\r
+       virtual ~ObjectBase()=0;\r
+-      \r
++\r
++      Control_* control() const \r
++        { \r
++          return const_cast<ObjectBase *>(this)->control(); \r
++        }\r
+       Control_* control() \r
+         { \r
+           if (!control_) \r
+@@ -129,7 +133,6 @@
+       template <class T2>\r
+       Ptr(const Ptr<T2>& p2) \r
+         {\r
+-          T* test_assignment_ = (T2*)0;\r
+           assign( p2.get() );\r
+         }\r
\r
+@@ -144,7 +147,7 @@
\r
+       template <class T2>\r
+       Ptr& operator=(const Ptr<T2>& p2)\r
+-        { T *test_assignment_=(T2*)0; reset(p2.get()); return *this; }\r
++        { reset(p2.get()); return *this; }\r
+     \r
+       Ptr& operator=(const Ptr& p)\r
+         { reset(p.get()); return *this; }\r
+@@ -175,7 +178,7 @@
+           if (control_)\r
+             control_->ref();\r
+         }\r
+-\r
++      \r
+       void reset(T* t = 0)\r
+         {\r
+           if (object_ == t)\r
+@@ -197,4 +200,3 @@
\r
\r
+ #endif // SIGC_OBJECT\r
+-\r
+diff -Naur libsigc++-1.2.5/sigc++/signal.cc libsigc++-1.2.7/sigc++/signal.cc
+--- libsigc++-1.2.5/sigc++/signal.cc   2002-12-12 20:18:24.000000000 +0100
++++ libsigc++-1.2.7/sigc++/signal.cc   2005-01-29 00:10:34.000000000 +0100
+@@ -93,33 +93,11 @@
+     defered_ = false;
+     SignalConnectionNode* i = begin_;
+-
+-    while(begin_ && begin_->defered_)
+-      begin_ = begin_->next_;
+-
+-    while(end_ && end_->defered_)
+-      end_ = end_->prev_;
+-
+-    // Hmm, this looks a bit tricky to me.  The code above removes all
+-    // elements from the front and the back that have defered_ = true set.
+-    // But the following loop unreferences *all* defered elements, including
+-    // those that are still in the list.
+-    //
+-    // I don't know whether this is a bug -- it's possible that defered nodes
+-    // are always at the front or back.  If not, a node could be unreferenced
+-    // twice which is bad.
+-    //
+-    // --Daniel
+-
+     while(i)
+     {
+       SignalConnectionNode* next = i->next_;
+-
+       if(i->defered_)
+-      {
+-        i->parent_ = 0;
+-        i->unreference();
+-      }
++      _remove(i);
+       i = next;
+     }
+@@ -141,7 +119,7 @@
+       begin_->prev_=c;
+     else
+       end_=c;
+-    end_=c;
++    begin_=c;
+     return c;
+   }
+@@ -161,21 +139,8 @@
+ void SignalNode::remove(SignalConnectionNode* c)
+   {
+-    if (!exec_count_)
+-      {
+-        if (c->prev_)
+-          c->prev_->next_=c->next_;
+-        else
+-          begin_=c->next_;
+-       
+-        if (c->next_)
+-          c->next_->prev_=c->prev_;
+-        else
+-          end_=c->prev_;
+-
+-        c->parent_ = 0;
+-        c->unreference();
+-      }
++    if(!exec_count_)
++      _remove(c);
+     else
+       {
+         c->defered_=true;
+@@ -184,6 +149,19 @@
+       }
+   }
++void SignalNode::_remove(SignalConnectionNode* c)
++  {
++    if (c->prev_)
++      c->prev_->next_=c->next_;
++    else
++      begin_=c->next_;
++    if (c->next_)
++      c->next_->prev_=c->prev_;
++    else
++      end_=c->prev_;
++    c->parent_ = 0;
++    c->unreference();
++  }
+ /**********************************************************/
diff --git a/meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2_1.2.5.bb b/meta-openvuplus/recipes-enigma2/libsigc++-1.2/libsigc++-1.2_1.2.5.bb
new file mode 100644 (file)
index 0000000..632a6f5
--- /dev/null
@@ -0,0 +1,21 @@
+SUMMARY = "A library for loose coupling of C++ method calls"
+SECTION = "libs"
+LICENSE = "LGPLv2.1"
+LIC_FILES_CHKSUM = "file://COPYING;md5=d8045f3b8f929c1cb29a1e3fd737b499"
+PR = "r2"
+
+SRC_URI = "${SOURCEFORGE_MIRROR}/libsigc/libsigc++-${PV}.tar.gz \
+           file://autofoo.patch \
+           file://fix-install.patch \
+           file://pkgconfig.patch \
+           file://to_1.2.7.patch"
+SRC_URI[md5sum] = "d0d1ffcae0eced97ef4f17ce0ba81352"
+SRC_URI[sha256sum] = "dcd6d3ea9a2c185b5286f80eefe9ac1402036b8fa21cfc742442d99579bd2b3e"
+
+S = "${WORKDIR}/libsigc++-${PV}"
+
+inherit autotools pkgconfig
+
+EXTRA_AUTORECONF = "--exclude=autoheader"
+
+FILES_${PN}-dev += "${libdir}/sigc++-*/"
diff --git a/meta-openvuplus/recipes-enigma2/libungif/libungif-native_4.1.3.bb b/meta-openvuplus/recipes-enigma2/libungif/libungif-native_4.1.3.bb
new file mode 100644 (file)
index 0000000..c8cc832
--- /dev/null
@@ -0,0 +1,7 @@
+require libungif_${PV}.bb
+
+S = "${WORKDIR}/libungif-${PV}"
+
+PACKAGES = ""
+
+inherit autotools native
diff --git a/meta-openvuplus/recipes-enigma2/libungif/libungif_4.1.3.bb b/meta-openvuplus/recipes-enigma2/libungif/libungif_4.1.3.bb
new file mode 100644 (file)
index 0000000..d14c643
--- /dev/null
@@ -0,0 +1,15 @@
+DESCRIPTION = "shared library for GIF images"
+SECTION = "libs"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://COPYING;md5=ae11c61b04b2917be39b11f78d71519a"
+PR = "r3"
+
+SRC_URI = "${SOURCEFORGE_MIRROR}/giflib/libungif-${PV}.tar.bz2"
+SRC_URI[md5sum] = "8c198831cc0495596c78134b8849e9ad"
+SRC_URI[sha256sum] = "59e835a57e6df03e4d2253b2357253f3d13da9473ff465563a3b9833a744fc36"
+
+inherit autotools lib_package
+
+PACKAGES =+ "${PN}-utils"
+
+FILES_${PN}-utils = "${bindir}/*"
diff --git a/meta-openvuplus/recipes-enigma2/libxmlccwrap/files/disable_libxslt.patch b/meta-openvuplus/recipes-enigma2/libxmlccwrap/files/disable_libxslt.patch
new file mode 100644 (file)
index 0000000..b178641
--- /dev/null
@@ -0,0 +1,96 @@
+diff -Naur libxmlccwrap-0.0.12_org/configure.ac libxmlccwrap-0.0.12/configure.ac
+--- libxmlccwrap-0.0.12_org/configure.ac       2005-07-28 21:27:58.000000000 +0200
++++ libxmlccwrap-0.0.12/configure.ac   2007-10-29 15:36:49.000000000 +0100
+@@ -15,7 +15,7 @@
+ AM_PROG_LIBTOOL
+ AC_CHECK_LIB(xml2,main)
+-AC_CHECK_LIB(xslt,main)
++#AC_CHECK_LIB(xslt,main)
+ AC_OUTPUT([Makefile \
+           xmlccwrap/Makefile \
+diff -Naur libxmlccwrap-0.0.12_org/xmlccwrap/xmlccwrap.cc libxmlccwrap-0.0.12/xmlccwrap/xmlccwrap.cc
+--- libxmlccwrap-0.0.12_org/xmlccwrap/xmlccwrap.cc     2003-12-18 23:48:08.000000000 +0100
++++ libxmlccwrap-0.0.12/xmlccwrap/xmlccwrap.cc 2007-10-24 22:54:15.000000000 +0200
+@@ -23,8 +23,10 @@
+ #include <libxml/tree.h>
+ #include <libxml/HTMLparser.h>
+ #include <libxml/encoding.h>
++/*
+ #include <libxslt/xsltutils.h>
+ #include <libxslt/transform.h>
++*/
+ #include "xmlccwrap.h"
+ #include "libxmlexport.h"
+@@ -47,7 +49,7 @@
+   Element *readnode(xmlNodePtr);
+   void writenode(xmlDocPtr, Element *, xmlNodePtr, int = 0);
+-
++/*
+   XSLTTree::XSLTTree()
+   {
+     xsltP = 0;
+@@ -83,7 +85,7 @@
+   {
+     return xsltP;
+   }
+-
++*/
+   XMLTree::XMLTree() : _filename(), _root(), _compression(0)
+   { }
+@@ -380,7 +382,7 @@
+     return retval;
+   }
+-
++/*
+   bool XMLTree::xslt(const XSLTTree & xsltTree, const std::string & outputfile, ParameterMap & parameterMap)
+   {
+     bool ret = false;
+@@ -425,7 +427,7 @@
+     ParameterMap parameterMap;
+     return xslt(xsltTree, outputfile, parameterMap);
+   }
+-
++*/
+   const std::string & XMLTree::getErrorString()
+   {
+diff -Naur libxmlccwrap-0.0.12_org/xmlccwrap/xmlccwrap.h libxmlccwrap-0.0.12/xmlccwrap/xmlccwrap.h
+--- libxmlccwrap-0.0.12_org/xmlccwrap/xmlccwrap.h      2003-12-18 23:42:37.000000000 +0100
++++ libxmlccwrap-0.0.12/xmlccwrap/xmlccwrap.h  2007-10-24 22:54:15.000000000 +0200
+@@ -43,7 +41,7 @@
+     typedef std::multimap<std::string, std::string> ParameterMap;
+     typedef ParameterMap::value_type ValuePair;
+-
++/*
+     class XSLTTree
+     {
+       private:
+@@ -60,7 +58,7 @@
+         bool read(const std::string &fn);
+         const void * exportxsltStylesheetPtr() const;
+     };
+-
++*/
+     class XMLTree
+     {
+@@ -102,10 +100,10 @@
+         bool write(const std::string &fn);
+         const std::string & writeBuffer() const;
+-
++/*
+         bool xslt(const XSLTTree & xsltTree, const std::string & outputfile, ParameterMap & parameterMap);
+         bool xslt(const XSLTTree & xsltTree, const std::string & outputfile);
+-
++*/
+         const std::string & getErrorString();
+     };
diff --git a/meta-openvuplus/recipes-enigma2/libxmlccwrap/files/dont_build_unneeded.patch b/meta-openvuplus/recipes-enigma2/libxmlccwrap/files/dont_build_unneeded.patch
new file mode 100644 (file)
index 0000000..69eaa15
--- /dev/null
@@ -0,0 +1,6 @@
+diff -Naur libxmlccwrap-0.0.12_org/Makefile.am libxmlccwrap-0.0.12/Makefile.am
+--- libxmlccwrap-0.0.12_org/Makefile.am        2002-12-11 23:18:41.000000000 +0100
++++ libxmlccwrap-0.0.12/Makefile.am    2007-10-29 15:35:11.000000000 +0100
+@@ -1 +1 @@
+-SUBDIRS = xmlccwrap html testlib
++SUBDIRS = xmlccwrap
diff --git a/meta-openvuplus/recipes-enigma2/libxmlccwrap/files/fix_assignment_operator.patch b/meta-openvuplus/recipes-enigma2/libxmlccwrap/files/fix_assignment_operator.patch
new file mode 100644 (file)
index 0000000..1d64590
--- /dev/null
@@ -0,0 +1,10 @@
+--- libxmlccwrap-0.0.12_org/xmlccwrap/xmlccwrap.cc     2003-12-18 23:48:08.000000000 +0100
++++ libxmlccwrap-0.0.12/xmlccwrap/xmlccwrap.cc 2007-10-24 22:54:15.000000000 +0200
+@@ -498,6 +500,7 @@
+     for (ElementIterator curnode = nodes.begin(); curnode != nodes.end(); curnode++)
+       add
+         (**curnode);
++    return *this;
+   }
diff --git a/meta-openvuplus/recipes-enigma2/libxmlccwrap/libxmlccwrap_0.0.12.bb b/meta-openvuplus/recipes-enigma2/libxmlccwrap/libxmlccwrap_0.0.12.bb
new file mode 100644 (file)
index 0000000..51b934a
--- /dev/null
@@ -0,0 +1,21 @@
+SUMMARY = "A small libxml2 c++ wrapper"
+AUTHOR = "Jürgen Rinas <jrinas@gmx.de>"
+HOMEPAGE = "http://www.ant.uni-bremen.de/whomes/rinas/libxmlccwrap/"
+SECTION = "libs"
+LICENSE = "LGPLv2.1+"
+LIC_FILES_CHKSUM = "file://COPYING;md5=fad9b3332be894bab9bc501572864b29"
+DEPENDS = "libxml2"
+PR = "r1"
+
+SRC_URI = "http://www.ant.uni-bremen.de/whomes/rinas/libxmlccwrap/download/${P}.tar.gz \
+          file://dont_build_unneeded.patch \
+          file://disable_libxslt.patch \
+          file://fix_assignment_operator.patch"
+
+SRC_URI[md5sum] = "9f8bbad3452d704603246273b2dda758"
+SRC_URI[sha256sum] = "38fb5f75f8b7dad1c8d535cc7b18ea9f1603e14a8b9256a2f60cf721513dc299"
+
+inherit autotools
+
+FILES_${PN} = "${libdir}/${P}${SOLIBSDEV}"
+FILES_${PN}-dev = "${includedir} ${libdir}/${PN}${SOLIBSDEV} ${libdir}/*.la"
diff --git a/meta-openvuplus/recipes-enigma2/opencore-amr/opencore-amr_0.1.3.bb b/meta-openvuplus/recipes-enigma2/opencore-amr/opencore-amr_0.1.3.bb
new file mode 100644 (file)
index 0000000..7976379
--- /dev/null
@@ -0,0 +1,20 @@
+SUMMARY = "Adaptive Multi Rate speech codecs"
+SECTION = "libs/multimedia"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=dd2c2486aca02190153cf399e508c7e7"
+PR = "r0"
+
+SRC_URI = "${SOURCEFORGE_MIRROR}/${BPN}/${BP}.tar.gz"
+SRC_URI[md5sum] = "09d2c5dfb43a9f6e9fec8b1ae678e725"
+SRC_URI[sha256sum] = "106bf811c1f36444d7671d8fd2589f8b2e0cca58a2c764da62ffc4a070595385"
+
+inherit autotools pkgconfig
+
+PACKAGES =+ "libopencore-amrnb libopencore-amrwb"
+
+RDEPENDS_${PN} = "libopencore-amrnb libopencore-amrwb"
+
+FILES_libopencore-amrnb = "${libdir}/libopencore-amrnb${SOLIBS}"
+FILES_libopencore-amrwb = "${libdir}/libopencore-amrwb${SOLIBS}"
+
+ALLOW_EMPTY_${PN} = "1"
diff --git a/meta-openvuplus/recipes-enigma2/opkg/opkg-collateral.bbappend b/meta-openvuplus/recipes-enigma2/opkg/opkg-collateral.bbappend
new file mode 100644 (file)
index 0000000..429c37f
--- /dev/null
@@ -0,0 +1,3 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
+
+PR .= "-vuplus0"
diff --git a/meta-openvuplus/recipes-enigma2/opkg/opkg-collateral/dest b/meta-openvuplus/recipes-enigma2/opkg/opkg-collateral/dest
new file mode 100644 (file)
index 0000000..e041eb7
--- /dev/null
@@ -0,0 +1,5 @@
+dest root /
+dest cf /media/cf/
+dest ram /media/ram/
+dest hdd /media/hdd/
+dest usb /media/usb/
diff --git a/meta-openvuplus/recipes-enigma2/opkg/opkg/0001-Fixed-opkg-losing-auto_installed-flag-on-upgrading.patch b/meta-openvuplus/recipes-enigma2/opkg/opkg/0001-Fixed-opkg-losing-auto_installed-flag-on-upgrading.patch
new file mode 100644 (file)
index 0000000..4553124
--- /dev/null
@@ -0,0 +1,32 @@
+Upstream-Status: Backport
+
+From 319d02609992273e887242ed9788db68d3310b6c Mon Sep 17 00:00:00 2001
+From: "pixdamix@gmail.com"
+ <pixdamix@gmail.com@e8e0d7a0-c8d9-11dd-a880-a1081c7ac358>
+Date: Thu, 19 Jan 2012 13:52:06 +0000
+Subject: [PATCH 01/10] Fixed opkg losing auto_installed flag on upgrading
+
+Thanks-to: Christian Hitz <christian.hitz@aizo.com>
+
+git-svn-id: http://opkg.googlecode.com/svn/trunk@635 e8e0d7a0-c8d9-11dd-a880-a1081c7ac358
+---
+ libopkg/opkg_install.c |    3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/libopkg/opkg_install.c b/libopkg/opkg_install.c
+index 74a2ce1..3925f58 100644
+--- a/libopkg/opkg_install.c
++++ b/libopkg/opkg_install.c
+@@ -1449,6 +1449,9 @@ opkg_install_pkg(pkg_t *pkg, int from_upgrade)
+                /* removing files from old package, to avoid ghost files */
+                remove_data_files_and_list(old_pkg);
+                remove_maintainer_scripts(old_pkg);
++
++               /* maintain the "Auto-Installed: yes" flag */
++               pkg->auto_installed = old_pkg->auto_installed;
+         }
+-- 
+1.7.9.5
+
diff --git a/meta-openvuplus/recipes-enigma2/opkg/opkg/0002-Don-t-mark-Conflicts-as-Depends.patch b/meta-openvuplus/recipes-enigma2/opkg/opkg/0002-Don-t-mark-Conflicts-as-Depends.patch
new file mode 100644 (file)
index 0000000..9e122de
--- /dev/null
@@ -0,0 +1,29 @@
+From 8c00c6be3723a0dcf05a10b5aba8c1c3b1fe4cf7 Mon Sep 17 00:00:00 2001
+From: Andreas Oberritter <obi@opendreambox.org>
+Date: Wed, 16 May 2012 23:29:04 +0200
+Subject: [PATCH 02/10] Don't mark Conflicts as Depends
+
+- Fixes 'whatconflicts' sub-command.
+
+Signed-off-by: Andreas Oberritter <obi@opendreambox.org>
+---
+ libopkg/pkg_depends.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/libopkg/pkg_depends.c b/libopkg/pkg_depends.c
+index 1e14d1f..a61e80e 100644
+--- a/libopkg/pkg_depends.c
++++ b/libopkg/pkg_depends.c
+@@ -609,8 +609,8 @@ void buildConflicts(pkg_t * pkg)
+     conflicts = pkg->conflicts = xcalloc(pkg->conflicts_count, sizeof(compound_depend_t));
+     for (i = 0; i < pkg->conflicts_count; i++) {
+-       conflicts->type = CONFLICTS;
+        parseDepends(conflicts, pkg->conflicts_str[i]);
++       conflicts->type = CONFLICTS;
+        free(pkg->conflicts_str[i]);
+        conflicts++;
+     }
+-- 
+1.7.9.5
+
diff --git a/meta-openvuplus/recipes-enigma2/opkg/opkg/0003-Statically-link-libopkg-and-libbb.patch b/meta-openvuplus/recipes-enigma2/opkg/opkg/0003-Statically-link-libopkg-and-libbb.patch
new file mode 100644 (file)
index 0000000..cfb7268
--- /dev/null
@@ -0,0 +1,107 @@
+From 698fdfccb2b2855fbe73ecad159b7987b49ddded Mon Sep 17 00:00:00 2001
+From: Andreas Oberritter <obi@opendreambox.org>
+Date: Thu, 17 May 2012 01:23:43 +0200
+Subject: [PATCH 03/10] Statically link libopkg and libbb
+
+* Based on https://dev.openwrt.org/browser/trunk/package/opkg/patches/007-force_static.patch
+
+Signed-off-by: Andreas Oberritter <obi@opendreambox.org>
+---
+ libbb/Makefile.am   |    8 ++++----
+ libopkg/Makefile.am |   14 +++-----------
+ src/Makefile.am     |    4 ++--
+ tests/Makefile.am   |    6 +++---
+ 4 files changed, 12 insertions(+), 20 deletions(-)
+
+diff --git a/libbb/Makefile.am b/libbb/Makefile.am
+index 1cc82df..337d94f 100644
+--- a/libbb/Makefile.am
++++ b/libbb/Makefile.am
+@@ -2,9 +2,9 @@ HOST_CPU=@host_cpu@
+ BUILD_CPU=@build_cpu@
+ ALL_CFLAGS=-g -O -Wall -DHOST_CPU_STR=\"@host_cpu@\" -DBUILD_CPU=@build_cpu@
+-noinst_LTLIBRARIES = libbb.la
++noinst_LIBRARIES = libbb.a
+-libbb_la_SOURCES = gz_open.c \
++libbb_a_SOURCES = gz_open.c \
+       libbb.h \
+       unzip.c \
+       wfopen.c \
+@@ -22,5 +22,5 @@ libbb_la_SOURCES = gz_open.c \
+       all_read.c \
+       mode_string.c
+-libbb_la_CFLAGS = $(ALL_CFLAGS)
+-#libbb_la_LDFLAGS = -static
++libbb_a_CFLAGS = $(ALL_CFLAGS)
++#libbb_a_LDFLAGS = -static
+diff --git a/libopkg/Makefile.am b/libopkg/Makefile.am
+index 043c5c4..5882595 100644
+--- a/libopkg/Makefile.am
++++ b/libopkg/Makefile.am
+@@ -38,18 +38,10 @@ if HAVE_SHA256
+ opkg_util_sources += sha256.c sha256.h
+ endif
+-lib_LTLIBRARIES = libopkg.la
+-libopkg_la_SOURCES = \
++noinst_LIBRARIES = libopkg.a
++libopkg_a_SOURCES = \
+       $(opkg_libcore_sources) \
+       $(opkg_cmd_sources) $(opkg_db_sources) \
+       $(opkg_util_sources) $(opkg_list_sources)
+-libopkg_la_LIBADD = $(top_builddir)/libbb/libbb.la $(CURL_LIBS) $(GPGME_LIBS) $(OPENSSL_LIBS) $(PATHFINDER_LIBS)
+-
+-libopkg_la_LDFLAGS = -version-info 1:0:0
+-
+-# make sure we only export symbols that are for public use
+-#libopkg_la_LDFLAGS = -export-symbols-regex "^opkg_.*"
+-
+-
+-
++libopkg_a_LIBADD = $(top_builddir)/libbb/libbb.a $(CURL_LIBS) $(GPGME_LIBS) $(OPENSSL_LIBS) $(PATHFINDER_LIBS)
+diff --git a/src/Makefile.am b/src/Makefile.am
+index efdc19d..bb7a792 100644
+--- a/src/Makefile.am
++++ b/src/Makefile.am
+@@ -2,5 +2,5 @@ AM_CFLAGS = -I${top_srcdir}/libopkg ${ALL_CFLAGS}
+ bin_PROGRAMS = opkg-cl
+ opkg_cl_SOURCES = opkg-cl.c
+-opkg_cl_LDADD = $(top_builddir)/libopkg/libopkg.la \
+-                $(top_builddir)/libbb/libbb.la 
++opkg_cl_LDADD = $(top_builddir)/libopkg/libopkg.a \
++                $(top_builddir)/libbb/libbb.a
+diff --git a/tests/Makefile.am b/tests/Makefile.am
+index 1a6f565..132c792 100644
+--- a/tests/Makefile.am
++++ b/tests/Makefile.am
+@@ -4,11 +4,11 @@ AM_CFLAGS = $(ALL_CFLAGS) -Wall -g -O3 -I${top_srcdir}/libopkg
+ #noinst_PROGRAMS = libopkg_test opkg_active_list_test
+ noinst_PROGRAMS = libopkg_test
+-#opkg_hash_test_LDADD = $(top_builddir)/libbb/libbb.la $(top_builddir)/libopkg/libopkg.la
++#opkg_hash_test_LDADD = $(top_builddir)/libbb/libbb.a $(top_builddir)/libopkg/libopkg.a
+ #opkg_hash_test_SOURCES = opkg_hash_test.c
+ #opkg_hash_test_CFLAGS = $(ALL_CFLAGS) -I$(top_srcdir)
+-#opkg_extract_test_LDADD = $(top_builddir)/libbb/libbb.la $(top_builddir)/libopkg/libopkg.la
++#opkg_extract_test_LDADD = $(top_builddir)/libbb/libbb.a $(top_builddir)/libopkg/libopkg.a
+ #opkg_extract_test_SOURCES = opkg_extract_test.c
+ #opkg_extract_test_CFLAGS = $(ALL_CFLAGS) -I$(top_srcdir)
+@@ -16,7 +16,7 @@ noinst_PROGRAMS = libopkg_test
+ #opkg_active_list_test_SOURCES = opkg_active_list_test.c
+ #opkg_active_list_test_CFLAGS = $(ALL_CFLAGS) -I$(top_srcdir)
+-libopkg_test_LDADD = $(top_builddir)/libopkg/libopkg.la
++libopkg_test_LDADD = $(top_builddir)/libopkg/libopkg.a $(top_builddir)/libbb/libbb.a
+ libopkg_test_SOURCE = libopkg_test.c
+ libopkg_test_LDFLAGS = -static
+-- 
+1.7.9.5
+
diff --git a/meta-openvuplus/recipes-enigma2/opkg/opkg/0004-Makefile.am-remove-g-and-O-compiler-flags.patch b/meta-openvuplus/recipes-enigma2/opkg/opkg/0004-Makefile.am-remove-g-and-O-compiler-flags.patch
new file mode 100644 (file)
index 0000000..c9b9d6b
--- /dev/null
@@ -0,0 +1,50 @@
+From ca86fc9ad82713e17cd69e92ce2033631fa73675 Mon Sep 17 00:00:00 2001
+From: Andreas Oberritter <obi@opendreambox.org>
+Date: Thu, 17 May 2012 01:32:43 +0200
+Subject: [PATCH 04/10] Makefile.am: remove -g and -O compiler flags
+
+Signed-off-by: Andreas Oberritter <obi@opendreambox.org>
+---
+ Makefile.am       |    2 +-
+ libbb/Makefile.am |    2 +-
+ tests/Makefile.am |    2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/Makefile.am b/Makefile.am
+index 26f2d99..1c6226f 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -6,7 +6,7 @@ SUBDIRS = libbb libopkg src tests utils man
+ HOST_CPU=@host_cpu@
+ BUILD_CPU=@build_cpu@
+ OPKGLIBDIR=@opkglibdir@ 
+-ALL_CFLAGS=-g -O -Wall -DHOST_CPU_STR=\"@host_cpu@\" -DBUILD_CPU=@build_cpu@ -DLIBDIR=\"@libdir@\" -DOPKGLIBDIR=\"@opkglibdir@\" -DDATADIR=\"@datadir@\"
++ALL_CFLAGS=-Wall -DHOST_CPU_STR=\"@host_cpu@\" -DBUILD_CPU=@build_cpu@ -DLIBDIR=\"@libdir@\" -DOPKGLIBDIR=\"@opkglibdir@\" -DDATADIR=\"@datadir@\"
+ PATHFINDER_CFLAGS = @PATHFINDER_CFLAGS@
+ PATHFINDER_LIBS   = @PATHFINDER_LIBS@
+diff --git a/libbb/Makefile.am b/libbb/Makefile.am
+index 337d94f..6af5f04 100644
+--- a/libbb/Makefile.am
++++ b/libbb/Makefile.am
+@@ -1,6 +1,6 @@
+ HOST_CPU=@host_cpu@
+ BUILD_CPU=@build_cpu@
+-ALL_CFLAGS=-g -O -Wall -DHOST_CPU_STR=\"@host_cpu@\" -DBUILD_CPU=@build_cpu@
++ALL_CFLAGS=-Wall -DHOST_CPU_STR=\"@host_cpu@\" -DBUILD_CPU=@build_cpu@
+ noinst_LIBRARIES = libbb.a
+diff --git a/tests/Makefile.am b/tests/Makefile.am
+index 132c792..4dccb74 100644
+--- a/tests/Makefile.am
++++ b/tests/Makefile.am
+@@ -1,4 +1,4 @@
+-AM_CFLAGS = $(ALL_CFLAGS) -Wall -g -O3 -I${top_srcdir}/libopkg
++AM_CFLAGS = $(ALL_CFLAGS) -Wall -I${top_srcdir}/libopkg
+ #noinst_PROGRAMS = opkg_hash_test opkg_extract_test
+ #noinst_PROGRAMS = libopkg_test opkg_active_list_test
+-- 
+1.7.9.5
+
diff --git a/meta-openvuplus/recipes-enigma2/opkg/opkg/0005-pkg_depends-remove-unused-variables-to-fix-compiler-.patch b/meta-openvuplus/recipes-enigma2/opkg/opkg/0005-pkg_depends-remove-unused-variables-to-fix-compiler-.patch
new file mode 100644 (file)
index 0000000..1820e52
--- /dev/null
@@ -0,0 +1,48 @@
+From 4a5bc6cbce81497442f79ded5c78389024df0e60 Mon Sep 17 00:00:00 2001
+From: Andreas Oberritter <obi@opendreambox.org>
+Date: Thu, 17 May 2012 01:14:23 +0200
+Subject: [PATCH 05/10] pkg_depends: remove unused variables to fix compiler
+ warnings
+
+Signed-off-by: Andreas Oberritter <obi@opendreambox.org>
+---
+ libopkg/pkg_depends.c |    5 -----
+ 1 file changed, 5 deletions(-)
+
+diff --git a/libopkg/pkg_depends.c b/libopkg/pkg_depends.c
+index a61e80e..68a81f9 100644
+--- a/libopkg/pkg_depends.c
++++ b/libopkg/pkg_depends.c
+@@ -269,13 +269,10 @@ is_pkg_a_replaces(pkg_t *pkg_scout,pkg_t *pkg)
+ {
+     int i ;
+     int replaces_count = pkg->replaces_count;
+-    abstract_pkg_t **replaces;
+     if (pkg->replaces_count==0)    // No replaces, it's surely a conflict
+         return 0;
+-    replaces = pkg->replaces;
+-
+     for (i = 0; i < replaces_count; i++) {
+         if (strcmp(pkg_scout->name,pkg->replaces[i]->name)==0) {      // Found
+             opkg_msg(DEBUG2, "Seems I've found a replace %s %s\n",
+@@ -295,7 +292,6 @@ pkg_vec_t * pkg_hash_fetch_conflicts(pkg_t * pkg)
+     depend_t ** possible_satisfiers;
+     depend_t * possible_satisfier;
+     int i, j, k;
+-    int count;
+     abstract_pkg_t * ab_pkg;
+     pkg_t **pkg_scouts;
+     pkg_t *pkg_scout;
+@@ -315,7 +311,6 @@ pkg_vec_t * pkg_hash_fetch_conflicts(pkg_t * pkg)
+     }
+     installed_conflicts = pkg_vec_alloc();
+-    count = pkg->conflicts_count;
+-- 
+1.7.9.5
+
diff --git a/meta-openvuplus/recipes-enigma2/opkg/opkg/0006-pkg_hash_fetch_conflicts-fix-possible-segfaults.patch b/meta-openvuplus/recipes-enigma2/opkg/opkg/0006-pkg_hash_fetch_conflicts-fix-possible-segfaults.patch
new file mode 100644 (file)
index 0000000..89934f2
--- /dev/null
@@ -0,0 +1,34 @@
+From e2b289330280e9f9fb5dd2cc10c736ca06d273f4 Mon Sep 17 00:00:00 2001
+From: Andreas Oberritter <obi@opendreambox.org>
+Date: Thu, 17 May 2012 01:15:15 +0200
+Subject: [PATCH 06/10] pkg_hash_fetch_conflicts: fix possible segfaults
+
+Signed-off-by: Andreas Oberritter <obi@opendreambox.org>
+---
+ libopkg/pkg_depends.c |    8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/libopkg/pkg_depends.c b/libopkg/pkg_depends.c
+index 68a81f9..6ff75f1 100644
+--- a/libopkg/pkg_depends.c
++++ b/libopkg/pkg_depends.c
+@@ -322,10 +322,14 @@ pkg_vec_t * pkg_hash_fetch_conflicts(pkg_t * pkg)
+       /* foreach possible satisfier */
+       for(j = 0; j < conflicts->possibility_count; j++){
+             possible_satisfier = possible_satisfiers[j];
+-            if (!possible_satisfier)
++            if (!possible_satisfier) {
+                 opkg_msg(ERROR, "Internal error: possible_satisfier=NULL\n");
+-            if (!possible_satisfier->pkg)
++                continue;
++            }
++            if (!possible_satisfier->pkg) {
+                 opkg_msg(ERROR, "Internal error: possible_satisfier->pkg=NULL\n");
++                continue;
++            }
+           test_vec = possible_satisfier->pkg->pkgs;
+           if (test_vec) {
+                 /* pkg_vec found, it is an actual package conflict
+-- 
+1.7.9.5
+
diff --git a/meta-openvuplus/recipes-enigma2/opkg/opkg/0007-pkg_hash_fetch_conflicts-move-iteration-over-conflic.patch b/meta-openvuplus/recipes-enigma2/opkg/opkg/0007-pkg_hash_fetch_conflicts-move-iteration-over-conflic.patch
new file mode 100644 (file)
index 0000000..575c1e1
--- /dev/null
@@ -0,0 +1,94 @@
+From b925a520a63fb291675f707e602d04295236c85b Mon Sep 17 00:00:00 2001
+From: Andreas Oberritter <obi@opendreambox.org>
+Date: Thu, 17 May 2012 01:17:52 +0200
+Subject: [PATCH 07/10] pkg_hash_fetch_conflicts: move iteration over
+ conflicts to subroutine
+
+Signed-off-by: Andreas Oberritter <obi@opendreambox.org>
+---
+ libopkg/pkg_depends.c |   46 ++++++++++++++++++++++++----------------------
+ 1 file changed, 24 insertions(+), 22 deletions(-)
+
+diff --git a/libopkg/pkg_depends.c b/libopkg/pkg_depends.c
+index 6ff75f1..1999b64 100644
+--- a/libopkg/pkg_depends.c
++++ b/libopkg/pkg_depends.c
+@@ -284,39 +284,22 @@ is_pkg_a_replaces(pkg_t *pkg_scout,pkg_t *pkg)
+ }
+-
+-pkg_vec_t * pkg_hash_fetch_conflicts(pkg_t * pkg)
++static void __pkg_hash_fetch_conflicts(pkg_t * pkg, pkg_vec_t * installed_conflicts)
+ {
+-    pkg_vec_t * installed_conflicts, * test_vec;
++    pkg_vec_t * test_vec;
+     compound_depend_t * conflicts;
+     depend_t ** possible_satisfiers;
+     depend_t * possible_satisfier;
+     int i, j, k;
+-    abstract_pkg_t * ab_pkg;
+     pkg_t **pkg_scouts;
+     pkg_t *pkg_scout;
+-    /*
+-     * this is a setup to check for redundant/cyclic dependency checks,
+-     * which are marked at the abstract_pkg level
+-     */
+-    if(!(ab_pkg = pkg->parent)){
+-      opkg_msg(ERROR, "Internal error: %s not in hash table\n", pkg->name);
+-      return (pkg_vec_t *)NULL;
+-    }
+-
+     conflicts = pkg->conflicts;
+-    if(!conflicts){
+-      return (pkg_vec_t *)NULL;
+-    }
+-    installed_conflicts = pkg_vec_alloc();
+-
+-
+-
++    if(!conflicts)
++      return;
+     /* foreach conflict */
+     for(i = 0; i < pkg->conflicts_count; i++){
+-
+       possible_satisfiers = conflicts->possibilities;
+       /* foreach possible satisfier */
+@@ -352,11 +335,30 @@ pkg_vec_t * pkg_hash_fetch_conflicts(pkg_t * pkg)
+       }
+       conflicts++;
+     }
++}
++
++pkg_vec_t * pkg_hash_fetch_conflicts(pkg_t * pkg)
++{
++    pkg_vec_t * installed_conflicts;
++    abstract_pkg_t * ab_pkg;
++
++    /*
++     * this is a setup to check for redundant/cyclic dependency checks,
++     * which are marked at the abstract_pkg level
++     */
++    if(!(ab_pkg = pkg->parent)){
++      opkg_msg(ERROR, "Internal error: %s not in hash table\n", pkg->name);
++      return (pkg_vec_t *)NULL;
++    }
++
++    installed_conflicts = pkg_vec_alloc();
++
++    __pkg_hash_fetch_conflicts(pkg, installed_conflicts);
+     if (installed_conflicts->len)
+           return installed_conflicts;
+     pkg_vec_free(installed_conflicts);
+-      return (pkg_vec_t *)NULL;
++    return (pkg_vec_t *)NULL;
+ }
+ int version_constraints_satisfied(depend_t * depends, pkg_t * pkg)
+-- 
+1.7.9.5
+
diff --git a/meta-openvuplus/recipes-enigma2/opkg/opkg/0008-pkg_hash_fetch_conflicts-take-into-account-conflicts.patch b/meta-openvuplus/recipes-enigma2/opkg/opkg/0008-pkg_hash_fetch_conflicts-take-into-account-conflicts.patch
new file mode 100644 (file)
index 0000000..e958289
--- /dev/null
@@ -0,0 +1,49 @@
+From 53de52b533ee30676d051ee941cfc0a517e9190e Mon Sep 17 00:00:00 2001
+From: Andreas Oberritter <obi@opendreambox.org>
+Date: Thu, 17 May 2012 01:18:42 +0200
+Subject: [PATCH 08/10] pkg_hash_fetch_conflicts: take into account conflicts
+ of installed packages
+
+Signed-off-by: Andreas Oberritter <obi@opendreambox.org>
+---
+ libopkg/pkg_depends.c |   17 +++++++++++++++++
+ 1 file changed, 17 insertions(+)
+
+diff --git a/libopkg/pkg_depends.c b/libopkg/pkg_depends.c
+index 1999b64..f237733 100644
+--- a/libopkg/pkg_depends.c
++++ b/libopkg/pkg_depends.c
+@@ -337,6 +337,22 @@ static void __pkg_hash_fetch_conflicts(pkg_t * pkg, pkg_vec_t * installed_confli
+     }
+ }
++static void __pkg_hash_fetch_conflictees(pkg_t *pkg, pkg_vec_t *installed_conflicts)
++{
++    int i;
++
++    pkg_vec_t *available_pkgs = pkg_vec_alloc();
++    pkg_hash_fetch_all_installed(available_pkgs);
++
++    for (i = 0; i < available_pkgs->len; i++) {
++        pkg_t *cpkg = available_pkgs->pkgs[i];
++        if (pkg_conflicts(cpkg, pkg) && !is_pkg_in_pkg_vec(installed_conflicts, cpkg))
++            pkg_vec_insert(installed_conflicts, cpkg);
++    }
++
++    pkg_vec_free(available_pkgs);
++}
++
+ pkg_vec_t * pkg_hash_fetch_conflicts(pkg_t * pkg)
+ {
+     pkg_vec_t * installed_conflicts;
+@@ -354,6 +370,7 @@ pkg_vec_t * pkg_hash_fetch_conflicts(pkg_t * pkg)
+     installed_conflicts = pkg_vec_alloc();
+     __pkg_hash_fetch_conflicts(pkg, installed_conflicts);
++    __pkg_hash_fetch_conflictees(pkg, installed_conflicts);
+     if (installed_conflicts->len)
+           return installed_conflicts;
+-- 
+1.7.9.5
+
diff --git a/meta-openvuplus/recipes-enigma2/opkg/opkg/0009-Revert-Add-Recommended-packages-to-the-depended_upon.patch b/meta-openvuplus/recipes-enigma2/opkg/opkg/0009-Revert-Add-Recommended-packages-to-the-depended_upon.patch
new file mode 100644 (file)
index 0000000..bf61aef
--- /dev/null
@@ -0,0 +1,100 @@
+From 70d10c10288da23755055c881bea01b61a2d4df7 Mon Sep 17 00:00:00 2001
+From: Andreas Oberritter <obi@opendreambox.org>
+Date: Thu, 17 May 2012 22:57:35 +0200
+Subject: [PATCH 09/10] Revert "Add Recommended packages to the
+ depended_upon_by field."
+
+This reverts commit ac2222f7d6514fb403ce0848f6812a22a48f75c7.
+---
+ libopkg/pkg_depends.c |   70 ++++++++++++++++++++++---------------------------
+ 1 file changed, 32 insertions(+), 38 deletions(-)
+
+diff --git a/libopkg/pkg_depends.c b/libopkg/pkg_depends.c
+index f237733..ec60b99 100644
+--- a/libopkg/pkg_depends.c
++++ b/libopkg/pkg_depends.c
+@@ -787,49 +787,43 @@ pkg_depend_str(pkg_t *pkg, int idx)
+       return str;
+ }
++/*
++ * WARNING: This function assumes pre_depends and depends are at the
++ * start of the pkg->depends array.
++ */
+ void buildDependedUponBy(pkg_t * pkg, abstract_pkg_t * ab_pkg)
+ {
+-      compound_depend_t * depends;
+-      int count, othercount;
+-      int i, j;
+-      abstract_pkg_t * ab_depend;
+-      abstract_pkg_t ** temp;
+-
+-      count = pkg->pre_depends_count +
+-                      pkg->depends_count +
+-                      pkg->recommends_count +
+-                      pkg->suggests_count;
+-
+-      for (i = 0; i < count; i++) {
+-              depends = &pkg->depends[i];
+-              if (depends->type != PREDEPEND
+-                  && depends->type != DEPEND
+-                  && depends->type != RECOMMEND)
+-                      continue;
+-              for (j = 0; j < depends->possibility_count; j++) {
+-                      ab_depend = depends->possibilities[j]->pkg;
+-                      if (!ab_depend->depended_upon_by) {
+-                              ab_depend->depended_upon_by =
+-                                      xcalloc(1, sizeof(abstract_pkg_t *));
+-                      }
++     compound_depend_t * depends;
++     int count, othercount;
++     int i, j;
++     abstract_pkg_t * ab_depend;
++     abstract_pkg_t ** temp;
+-                      temp = ab_depend->depended_upon_by;
+-                      othercount = 1;
+-                      while (*temp) {
+-                          temp++;
+-                          othercount++;
+-                      }
+-                      *temp = ab_pkg;
++     count = pkg->pre_depends_count + pkg->depends_count;
++     depends = pkg->depends;
+-                      ab_depend->depended_upon_by =
+-                              xrealloc(ab_depend->depended_upon_by,
+-                              (othercount + 1) * sizeof(abstract_pkg_t *));
++     for (i = 0; i < count; i++) {
++        for (j = 0; j < depends->possibility_count; j++){
++             ab_depend = depends->possibilities[j]->pkg;
++             if(!ab_depend->depended_upon_by)
++                  ab_depend->depended_upon_by = xcalloc(1, sizeof(abstract_pkg_t *));
++
++             temp = ab_depend->depended_upon_by;
++             othercount = 1;
++             while(*temp){
++                  temp++;
++                  othercount++;
++             }
++             *temp = ab_pkg;
+-                      /* the array may have been moved by realloc */
+-                      temp = ab_depend->depended_upon_by + othercount;
+-                      *temp = NULL;
+-              }
+-      }
++             ab_depend->depended_upon_by = xrealloc(ab_depend->depended_upon_by,
++                                                                      (othercount + 1) * sizeof(abstract_pkg_t *));
++             /* the array may have moved */
++             temp = ab_depend->depended_upon_by + othercount;
++             *temp = NULL;
++        }
++        depends++;
++     }
+ }
+ static depend_t * depend_init(void)
+-- 
+1.7.9.5
+
diff --git a/meta-openvuplus/recipes-enigma2/opkg/opkg/0010-opkg_remove-auto-delete-.pyo-files.patch b/meta-openvuplus/recipes-enigma2/opkg/opkg/0010-opkg_remove-auto-delete-.pyo-files.patch
new file mode 100644 (file)
index 0000000..3bc2e5d
--- /dev/null
@@ -0,0 +1,33 @@
+From 719cc4ab765c008bd7e4f2d085692657c33d171e Mon Sep 17 00:00:00 2001
+From: Andreas Oberritter <obi@opendreambox.org>
+Date: Mon, 21 May 2012 14:05:37 +0200
+Subject: [PATCH 10/10] opkg_remove: auto-delete .pyo files
+
+Signed-off-by: Andreas Oberritter <obi@opendreambox.org>
+---
+ libopkg/opkg_remove.c |    7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/libopkg/opkg_remove.c b/libopkg/opkg_remove.c
+index 5f4219b..4320dc3 100644
+--- a/libopkg/opkg_remove.c
++++ b/libopkg/opkg_remove.c
+@@ -375,8 +375,15 @@ remove_data_files_and_list(pkg_t *pkg)
+         }
+         if (!conf->noaction) {
++              size_t l = strlen(file_name);
+               opkg_msg(INFO, "Deleting %s.\n", file_name);
+              unlink(file_name);
++              if (l >= 3 && !strcmp(&file_name[l - 3], ".py")) {
++                      char pyo_file_name[l + 2];
++                      strcpy(pyo_file_name, file_name);
++                      strcat(pyo_file_name, "o");
++                      unlink(pyo_file_name);
++              }
+         } else
+               opkg_msg(INFO, "Not deleting %s. (noaction)\n",
+                               file_name);
+-- 
+1.7.9.5
+
diff --git a/meta-openvuplus/recipes-enigma2/opkg/opkg_svn.bbappend b/meta-openvuplus/recipes-enigma2/opkg/opkg_svn.bbappend
new file mode 100644 (file)
index 0000000..e5a54e4
--- /dev/null
@@ -0,0 +1,14 @@
+PR .= "-vuplus0"
+
+SRC_URI += "file://0001-Fixed-opkg-losing-auto_installed-flag-on-upgrading.patch \
+            file://0002-Don-t-mark-Conflicts-as-Depends.patch \
+            file://0003-Statically-link-libopkg-and-libbb.patch \
+            file://0004-Makefile.am-remove-g-and-O-compiler-flags.patch \
+            file://0005-pkg_depends-remove-unused-variables-to-fix-compiler-.patch \
+            file://0006-pkg_hash_fetch_conflicts-fix-possible-segfaults.patch \
+            file://0007-pkg_hash_fetch_conflicts-move-iteration-over-conflic.patch \
+            file://0008-pkg_hash_fetch_conflicts-take-into-account-conflicts.patch \
+            file://0009-Revert-Add-Recommended-packages-to-the-depended_upon.patch \
+            file://0010-opkg_remove-auto-delete-.pyo-files.patch"
+
+FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
diff --git a/meta-openvuplus/recipes-enigma2/python/python-coherence_git.bb b/meta-openvuplus/recipes-enigma2/python/python-coherence_git.bb
new file mode 100644 (file)
index 0000000..202e827
--- /dev/null
@@ -0,0 +1,33 @@
+SUMMARY = "Python UPnP framework"
+HOMEPAGE = "http://coherence.beebits.net/"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENCE;md5=3f7c147addd67ce1d53239c68a6b7022"
+DEPENDS = "libxml2"
+SRCREV = "f4864b1f63866d738c18c02dcb16d824a049880c"
+PV = "0.6.7"
+PR = "r4"
+
+SRC_URI = "git://github.com/sreichholf/coherence.git;protocol=git"
+
+S = "${WORKDIR}/git/Coherence"
+
+inherit setuptools
+
+do_configure_prepend() {
+        sed -e 's,^from coherence import __version__$,__version__ = "${PV}",' -i setup.py
+}
+do_install_append() {
+        rm ${D}${bindir}/applet-coherence
+        rm -r ${D}${PYTHON_SITEPACKAGES_DIR}/Coherence-${PV}-*.egg-info
+        rm -r ${D}${PYTHON_SITEPACKAGES_DIR}/coherence/test
+        rm -r ${D}${PYTHON_SITEPACKAGES_DIR}/misc/Desktop-Applet
+}
+
+RDEPENDS_${PN} = "python-xmlrpc python-twisted-web"
+
+PACKAGES =+ "${PN}-bin"
+
+RDEPENDS_${PN}-bin = "${PN} python-zopeinterface"
+
+FILES_${PN}-bin = "${bindir} ${PYTHON_SITEPACKAGES_DIR}/misc/*.py"
diff --git a/meta-openvuplus/recipes-enigma2/python/python-daap/python-daap.patch b/meta-openvuplus/recipes-enigma2/python/python-daap/python-daap.patch
new file mode 100644 (file)
index 0000000..8fb9ae5
--- /dev/null
@@ -0,0 +1,57 @@
+--- python-daap-0.7.1/daap.py  2007-09-10 20:35:45.000000000 +0200
++++ python-daap-0.7.1/daap.py  2010-11-03 19:39:09.000000000 +0100
+@@ -417,18 +417,21 @@
+         # this returns an HTTP response object
+         response    = self._get_response(r, params)
+         status = response.status
+-        content = response.read()
+-        # if we got gzipped data base, gunzip it.
+-        if response.getheader("Content-Encoding") == "gzip":
+-            log.debug("gunzipping data")
+-            old_len = len(content)
+-            compressedstream = StringIO( content )
+-            gunzipper = gzip.GzipFile(fileobj=compressedstream)
+-            content = gunzipper.read()
+-            log.debug("expanded from %s bytes to %s bytes", old_len, len(content))
+-        # close this, we're done with it
++      #Dr.Best --> fix 
++      if status == 200:
++              content = response.read()
++              # if we got gzipped data base, gunzip it.
++              if response.getheader("Content-Encoding") == "gzip":
++                  log.debug("gunzipping data")
++                  old_len = len(content)
++                  compressedstream = StringIO( content )
++                  gunzipper = gzip.GzipFile(fileobj=compressedstream)
++                  content = gunzipper.read()
++                  log.debug("expanded from %s bytes to %s bytes", old_len, len(content))
++      # close this, we're done with it
+         response.close()
++
+         if status == 401:
+             raise DAAPError('DAAPClient: %s: auth required'%r)
+         elif status == 403:
+@@ -511,7 +514,7 @@
+ # the atoms we want. Making this list smaller reduces memory footprint,
+ # and speeds up reading large libraries. It also reduces the metainformation
+ # available to the client.
+-daap_atoms = "dmap.itemid,dmap.itemname,daap.songalbum,daap.songartist,daap.songformat,daap.songtime,daap.songsize,daap.songgenre,daap.songyear,daap.songtracknumber"
++daap_atoms = "dmap.itemid,dmap.itemname,daap.songalbum,daap.songartist,daap.songformat,daap.songtime,daap.songsize,daap.songgenre,daap.songyear,daap.songtracknumber,daap.songtrackcount,daap.songbitrate"
+ class DAAPDatabase(object):
+@@ -560,7 +563,12 @@
+         'id':'miid',
+         'type':'asfm',
+         'time':'astm',
+-        'size':'assz'}
++        'size':'assz',
++        'year':'asyr',
++        'genre':'asgn',
++      'tracknr': 'astn',
++      'trackcount': 'astc',
++      'bitrate': 'asbr'}
+     def __init__(self, database, atom):
+         self.database = database
diff --git a/meta-openvuplus/recipes-enigma2/python/python-daap_0.7.1.bb b/meta-openvuplus/recipes-enigma2/python/python-daap_0.7.1.bb
new file mode 100644 (file)
index 0000000..994b3a7
--- /dev/null
@@ -0,0 +1,17 @@
+SUMMARY = "A pure Python DAAP client implementation"
+SECTION = "devel/python"
+PRIORITY = "optional"
+LICENSE = "LGPLv2.1"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=fbc093901857fcd118f065f900982c24"
+PR = "r3"
+
+inherit distutils
+
+SRC_URI = "http://jerakeen.org/files/PythonDaap-${PV}.tar.gz"
+S = "${WORKDIR}/PythonDaap-${PV}"
+
+RDEPENDS_${PN} = "python-compression"
+
+
+SRC_URI[md5sum] = "b3db3d60b0ee83f5f23101d2c3bb99e0"
+SRC_URI[sha256sum] = "ea1d3a8141654781a0df31e6607c4722436fa33eb2e9934492770b3b61be8122"
diff --git a/meta-openvuplus/recipes-enigma2/python/python-daap_0.7.1.bbappend b/meta-openvuplus/recipes-enigma2/python/python-daap_0.7.1.bbappend
new file mode 100644 (file)
index 0000000..26d705e
--- /dev/null
@@ -0,0 +1,5 @@
+PR .= "-vuplus0"
+
+SRC_URI += " \
+       file://python-daap.patch \
+"
diff --git a/meta-openvuplus/recipes-enigma2/python/python-flickrapi_1.4.2.bb b/meta-openvuplus/recipes-enigma2/python/python-flickrapi_1.4.2.bb
new file mode 100644 (file)
index 0000000..e0c0db9
--- /dev/null
@@ -0,0 +1,31 @@
+SUMMARY = "The official Python interface to the Flickr API"
+HOMEPAGE = "http://stuvel.eu/flickrapi"
+SECTION = "devel/python"
+LICENSE = "PSF"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=d54e175a4083eea51ac31acaff818df5"
+PRIORITY = "optional"
+PR = "r3"
+
+SRC_URI = "http://pypi.python.org/packages/source/f/flickrapi/flickrapi-${PV}.zip"
+SRC_URI[md5sum] = "90dca08a45968b18da0894887f3e59b3"
+SRC_URI[sha256sum] = "ac9304f571175b8af4fc2ee17d3e110847b526640665ca53d97bbf9df98329bc"
+
+S = "${WORKDIR}/flickrapi-${PV}"
+
+inherit distutils
+
+# NOTE: the package only offers documentation as data, so fix the path here
+# instead of trying to move all files retroactively.
+DISTUTILS_INSTALL_ARGS += "--install-data=${D}/${docdir}/${PN}"
+
+# NOTE: requires python-misc for webbrowser and subprocess as missing dependency of the webbrowser
+RDEPENDS_${PN} = "\
+  python-core \
+  python-elementtree \
+  python-logging \
+  python-misc \
+  python-netclient \
+  python-subprocess \
+  python-threading \
+  python-xml \
+"
diff --git a/meta-openvuplus/recipes-enigma2/python/python-gdata_2.0.14.bb b/meta-openvuplus/recipes-enigma2/python/python-gdata_2.0.14.bb
new file mode 100644 (file)
index 0000000..8c0ab29
--- /dev/null
@@ -0,0 +1,21 @@
+SUMMARY = "Google Data APIs Python Client Library"
+HOMEPAGE = "http://code.google.com/p/gdata-python-client/"
+SECTION = "devel/python"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://README.txt;beginline=1;endline=13;md5=7a713fc5eed20ac1904c2efe0b816a33"
+RDEPENDS = "python-elementtree"
+RDEPENDS_${PN}-tests = "${PN}"
+PR = "r2"
+
+SRC_URI = "http://gdata-python-client.googlecode.com/files/gdata-${PV}.tar.gz;name=archive"
+SRC_URI[archive.md5sum] = "29cf394b4f75aa4fae8c1b59079f2a02"
+SRC_URI[archive.sha256sum] = "ba291d2b9d36a0f1b1b31a5a3ac3ba11f1bcce21c915a6ec78d109a43dafb1b0"
+
+S = "${WORKDIR}/gdata-${PV}"
+
+inherit distutils
+
+PACKAGES =+ "${PN}-tests"
+
+FILES_${PN}-tests = "${libdir}/${PYTHON_DIR}/site-packages/gdata/test*"
+FILES_${PN} += "${datadir}"
diff --git a/meta-openvuplus/recipes-enigma2/python/python-mutagen/patch.diff b/meta-openvuplus/recipes-enigma2/python/python-mutagen/patch.diff
new file mode 100644 (file)
index 0000000..73a112c
--- /dev/null
@@ -0,0 +1,12 @@
+diff -Naur mutagen/easymp4.py mutagen_pach/easymp4.py
+--- mutagen/mutagen/easymp4.py 2009-08-10 12:57:55.000000000 +0200
++++ mutagen/mutagen/easymp4.py 2010-01-11 19:24:05.000000000 +0100
+@@ -204,7 +204,7 @@
+     '\xa9cmt': 'comment',
+     'desc': 'description',
+     '\xa9grp': 'grouping',
+-    '\xa9grn': 'genre',
++    '\xa9gen': 'genre',
+     'cprt': 'copyright',
+     'soal': 'albumsort',
+     'soaa': 'albumartistsort',
diff --git a/meta-openvuplus/recipes-enigma2/python/python-mutagen_1.18.bb b/meta-openvuplus/recipes-enigma2/python/python-mutagen_1.18.bb
new file mode 100644 (file)
index 0000000..b785e2a
--- /dev/null
@@ -0,0 +1,22 @@
+SUMMARY = "Module for manipulating ID3 (v1 + v2) tags in Python"
+SECTION = "devel/python"
+LICENSE = "GPLv2"
+LIC_FILES_CHKSUM = "file://COPYING;md5=94d55d512a9ba36caa9b7df079bae19f"
+SRCNAME = "mutagen"
+PR = "r2"
+
+DEPENDS = "python"
+RDEPENDS = "python-shell"
+
+SRC_URI = "http://mutagen.googlecode.com/files/mutagen-${PV}.tar.gz \
+       file://patch.diff \
+"
+
+SRC_URI[md5sum] = "0c2cd954e4bacd79fadd45afc4acce4c"
+SRC_URI[sha256sum] = "30b6147baf59ab3609939acf49a1a1c73b15d8b1c637a01bfee89da7feea0d6c"
+
+S = "${WORKDIR}/mutagen-${PV}"
+
+inherit distutils
+
+
diff --git a/meta-openvuplus/recipes-enigma2/python/python-native_2.7.2.bbappend b/meta-openvuplus/recipes-enigma2/python/python-native_2.7.2.bbappend
new file mode 100644 (file)
index 0000000..04139f0
--- /dev/null
@@ -0,0 +1,2 @@
+RPROVIDES += "python-pickle-native python-pprint-native"
+
diff --git a/meta-openvuplus/recipes-enigma2/python/python-pycrypto/no-usr-include.patch b/meta-openvuplus/recipes-enigma2/python/python-pycrypto/no-usr-include.patch
new file mode 100644 (file)
index 0000000..4b74b5a
--- /dev/null
@@ -0,0 +1,11 @@
+--- pycrypto-2.5/setup.py.orig 2012-03-13 17:29:36.215553438 +0100
++++ pycrypto-2.5/setup.py      2012-03-13 17:29:46.339553341 +0100
+@@ -366,7 +366,7 @@
+       'ext_modules': plat_ext + [
+             # _fastmath (uses GNU mp library)
+             Extension("Crypto.PublicKey._fastmath",
+-                      include_dirs=['src/','/usr/include/'],
++                      include_dirs=['src/'],
+                       libraries=['gmp'],
+                       sources=["src/_fastmath.c"]),
diff --git a/meta-openvuplus/recipes-enigma2/python/python-pycrypto_2.5.bb b/meta-openvuplus/recipes-enigma2/python/python-pycrypto_2.5.bb
new file mode 100644 (file)
index 0000000..b7a4811
--- /dev/null
@@ -0,0 +1,17 @@
+SUMMARY = "A collection of cryptographic algorithms and protocols"
+SECTION = "devel/python"
+LICENSE = "PD & Python-2.0"
+LIC_FILES_CHKSUM = "file://COPYRIGHT;md5=35f354d199e8cb7667b059a23578e63d"
+DEPENDS = "gmp"
+PR = "r2"
+
+SRC_URI = "http://ftp.dlitz.net/pub/dlitz/crypto/pycrypto/pycrypto-${PV}.tar.gz \
+           file://no-usr-include.patch"
+SRC_URI[md5sum] = "783e45d4a1a309e03ab378b00f97b291"
+SRC_URI[sha256sum] = "e950a78184e2a7defccf5d45e0c29c1e9edeb29984433f0d110a21e9631e38de"
+
+S = "${WORKDIR}/pycrypto-${PV}"
+
+inherit autotools distutils
+
+BBCLASSEXTEND = "native"
diff --git a/meta-openvuplus/recipes-enigma2/python/python-transmissionrpc_hg.bb b/meta-openvuplus/recipes-enigma2/python/python-transmissionrpc_hg.bb
new file mode 100644 (file)
index 0000000..01db4e3
--- /dev/null
@@ -0,0 +1,17 @@
+DESCRIPTION = "Transmission RPC is a python module that can communicate with the bittorrent client Transmission through json-rpc"
+HOMEPAGE = "http://bitbucket.org/blueluna/transmissionrpc/wiki/Home"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=725cfd8eb1ec903074184b7edf9379c9"
+SRCREV = "4fe71eb818d0"
+PV = "0.7+hg${SRCREV}"
+PRIORITY = "optional"
+PR = "r1"
+
+SRC_URI = "hg://bitbucket.org/blueluna;proto=http;module=transmissionrpc;rev=${SRCREV}"
+
+S = "${WORKDIR}/transmissionrpc"
+
+inherit setuptools
+
+RDEPENDS_${PN} = "python-simplejson"
diff --git a/meta-openvuplus/recipes-enigma2/python/python-twisted_12.0.0.bb b/meta-openvuplus/recipes-enigma2/python/python-twisted_12.0.0.bb
new file mode 100644 (file)
index 0000000..a4314f7
--- /dev/null
@@ -0,0 +1,237 @@
+DESCRIPTION = "Twisted is an event-driven networking framework written in Python and licensed under the LGPL. \
+Twisted supports TCP, UDP, SSL/TLS, multicast, Unix sockets, a large number of protocols                   \
+(including HTTP, NNTP, IMAP, SSH, IRC, FTP, and others), and much more."
+HOMEPAGE = "http://www.twistedmatrix.com"
+SECTION = "console/network"
+
+#twisted/topfiles/NEWS:655: - Relicensed: Now under the MIT license, rather than LGPL.
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;beginline=40;md5=3fced11d6df719b47505837a51c16ae5"
+
+SRC_URI = "http://twistedmatrix.com/Releases/Twisted/12.0/Twisted-${PV}.tar.bz2"
+SRC_URI[md5sum] = "cf49a8676c21c50faf1b42b528049471"
+SRC_URI[sha256sum] = "e5561c9714583fd052ea9e0b10331609a719b3878f9d2593e4c57eab0ba0effd"
+
+S = "${WORKDIR}/Twisted-${PV}"
+PR = "r2"
+
+inherit setuptools
+
+do_install_append() {
+    # remove some useless files before packaging
+    find ${D} -name "*.bat" -o -name "*.c" -o -name "*.h" -exec rm {} \;
+}
+
+PACKAGES += "\
+  ${PN}-zsh \
+  ${PN}-test \
+  ${PN}-protocols \
+  ${PN}-bin \
+  ${PN}-conch \
+  ${PN}-lore \
+  ${PN}-mail \
+  ${PN}-names \
+  ${PN}-news \
+  ${PN}-runner \
+  ${PN}-web \
+  ${PN}-words \
+  ${PN}-flow \
+  ${PN}-pair \
+  ${PN}-core \
+"
+
+RDEPENDS_${PN} += "\
+  ${PN}-bin \
+  ${PN}-conch \
+  ${PN}-lore \
+  ${PN}-mail \
+  ${PN}-names \
+  ${PN}-news \
+  ${PN}-runner \
+  ${PN}-web \
+  ${PN}-words \
+"
+
+ALLOW_EMPTY_${PN} = "1"
+FILES_${PN} = ""
+
+FILES_${PN}-test = " \
+  ${libdir}/${PYTHON_DIR}/site-packages/twisted/test \
+  ${libdir}/${PYTHON_DIR}/site-packages/twisted/*/test \
+"
+RDEPENDS_${PN}-test = "${PN}"
+
+FILES_${PN}-protocols = " \
+  ${libdir}/${PYTHON_DIR}/site-packages/twisted/protocols/ \
+"
+
+FILES_${PN}-zsh = " \
+  ${libdir}/${PYTHON_DIR}/site-packages/twisted/python/zsh \
+  ${libdir}/${PYTHON_DIR}/site-packages/twisted/python/zshcomp.* \
+"
+
+FILES_${PN}-bin = " \
+  ${libdir}/${PYTHON_DIR}/site-packages/twisted/protocols/_c_urlarg.so \
+  ${libdir}/${PYTHON_DIR}/site-packages/twisted/spread/cBanana.so \
+"
+
+FILES_${PN}-conch = " \
+  ${bindir}/ckeygen \
+  ${bindir}/tkconch \
+  ${bindir}/conch \
+  ${bindir}/conchftp \
+  ${bindir}/cftp \
+  ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_conch.py* \
+  ${libdir}/${PYTHON_DIR}/site-packages/twisted/conch  \
+"
+RDEPENDS_${PN}-conch = "${PN}-core ${PN}-protocols"
+
+FILES_${PN}-core = " \
+${bindir}/manhole \
+${bindir}/mktap \
+${bindir}/twistd \
+${bindir}/tap2deb \
+${bindir}/tap2rpm \
+${bindir}/tapconvert \
+${bindir}/tkmktap \
+${bindir}/trial \
+${bindir}/easy_install* \
+${bindir}/pyhtmlizer \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/*.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__init__.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/notestplugin.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/testplugin.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_ftp.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_inet.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_manhole.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_portforward.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_socks.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_telnet.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_trial.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/dropin.cache \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/application \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/cred \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/enterprise \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/internet \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/manhole \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/manhole \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/persisted \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/protocols\
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python\
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/timeoutqueue.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/filepath.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/dxprofile.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/plugin.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/htmlizer.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/__init__.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/dispatch.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/hook.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/threadpool.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/otp.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/usage.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/roots.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/versions.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/urlpath.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/util.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/components.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/logfile.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/runtime.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/reflect.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/context.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/threadable.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/rebuild.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/failure.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/lockfile.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/formmethod.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/finalize.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/win32.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/dist.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/shortcut.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/zipstream.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/release.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/syslog.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/log.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/compat.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/zshcomp.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/procutils.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/text.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/_twisted_zsh_stub \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/_epoll.so \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/_initgroups.so \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/scripts/ \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/spread/ \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/tap/ \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/trial/ \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/__init__.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/_version.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/copyright.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/im.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/*.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/python/*.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/*.py* \
+"
+RDEPENDS_${PN}-core = "python-core python-zopeinterface"
+
+FILES_${PN}-lore = " \
+${bindir}/bookify \
+${bindir}/lore \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_lore.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/lore \
+"
+RDEPENDS_${PN}-lore = "${PN}-core"
+
+FILES_${PN}-mail = " \
+${bindir}/mailmail \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_mail.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/mail \
+"
+RDEPENDS_${PN}-mail = "${PN}-core ${PN}-protocols"
+
+FILES_${PN}-names = " \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_names.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/names \
+"
+RDEPENDS_${PN}-names = "${PN}-core"
+
+FILES_${PN}-news = " \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_news.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/news \
+"
+RDEPENDS_${PN}-news = "${PN}-core ${PN}-protocols"
+
+FILES_${PN}-runner = " \
+${libdir}/site-packages/twisted/runner/portmap.so \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/runner\
+"
+RDEPENDS_${PN}-runner = "${PN}-core ${PN}-protocols"
+
+FILES_${PN}-web = " \
+${bindir}/websetroot \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_web.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/web\
+"
+RDEPENDS_${PN}-web += "${PN}-core ${PN}-protocols"
+
+FILES_${PN}-words = " \
+${bindir}/im \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_words.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/words\
+"
+RDEPENDS_${PN}-words += "${PN}-core"
+
+FILES_${PN}-flow = " \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_flow.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/flow \"
+RDEPENDS_${PN}-flow += "${PN}-core"
+
+FILES_${PN}-pair = " \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_pair.py* \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/pair \
+"
+RDEPENDS_${PN}-pair += "${PN}-core"
+
+FILES_${PN}-dbg += " \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/*/.debug \
+${libdir}/${PYTHON_DIR}/site-packages/twisted/*/*/.debug \
+"
+RDEPENDS_${PN}-dbg = "${PN}"
diff --git a/meta-openvuplus/recipes-enigma2/python/python-wifi_0.5.0.bb b/meta-openvuplus/recipes-enigma2/python/python-wifi_0.5.0.bb
new file mode 100644 (file)
index 0000000..e831a74
--- /dev/null
@@ -0,0 +1,29 @@
+SUMMARY = "Provides access to Linux Wireless Extensions"
+HOMEPAGE = "http://pythonwifi.wikispot.org/"
+SECTION = "devel/python"
+LICENSE = "LGPLv2+"
+LICENSE_${PN}-examples = "GPLv2+"
+LIC_FILES_CHKSUM = "file://README;beginline=56;endline=57;md5=31ebd3ff22b6f3c0160a143e0c4a98a3 \
+                    file://examples/iwconfig.py;beginline=1;endline=20;md5=60fd41501905b3e20e9065995edfc0cf \
+                    file://pythonwifi/iwlibs.py;beginline=1;endline=22;md5=679475d61cc083a24158bb8b473f0c6f"
+RDEPENDS_${PN} = "python-ctypes python-datetime"
+PR = "r2"
+
+SRC_URI = "http://download.berlios.de/pythonwifi/${P}.tar.bz2"
+SRC_URI[md5sum] = "8fe7fd0a4edce1f9bedaff4acb7fd500"
+SRC_URI[sha256sum] = "3e3f645d37ab20450f60c785cec5f21b330f28a6c46c7c1b0898305dd7a34b26"
+
+inherit setuptools
+
+do_install_append() {
+        install -d ${D}${docdir}/${PN}
+        mv ${D}${datadir}/README ${D}${docdir}/${PN}
+        mv ${D}${datadir}/INSTALL ${D}${docdir}/${PN}
+        mv ${D}${datadir}/docs/* ${D}${docdir}/${PN}
+        install -d ${D}${sbindir}
+        mv ${D}${datadir}/examples/* ${D}${sbindir}
+}
+
+PACKAGES =+ "${PN}-examples"
+
+FILES_${PN}-examples = "${sbindir}"
diff --git a/meta-openvuplus/recipes-enigma2/python/python/ctypes-error-handling-fix.patch b/meta-openvuplus/recipes-enigma2/python/python/ctypes-error-handling-fix.patch
new file mode 100644 (file)
index 0000000..5e07082
--- /dev/null
@@ -0,0 +1,40 @@
+--- a/Modules/_ctypes/_ctypes.c        2012-01-26 15:41:30.000000000 +0100
++++ b/Modules/_ctypes/_ctypes.c        2012-01-26 15:44:41.046977137 +0100
+@@ -602,10 +602,16 @@
+ #ifdef __CYGWIN__
+ /* dlerror() isn't very helpful on cygwin */
+         PyErr_Format(PyExc_ValueError,
+-                     "symbol '%s' not found (%s) ",
++                     "symbol '%s' not found",
+                      name);
+ #else
+-        PyErr_SetString(PyExc_ValueError, ctypes_dlerror());
++        const char *err = ctypes_dlerror();
++        if (!err)
++            PyErr_Format(PyExc_ValueError,
++                         "symbol '%s' not found",
++                         name);
++        else
++            PyErr_SetString(PyExc_ValueError, err);
+ #endif
+         return NULL;
+     }
+@@ -3290,10 +3296,16 @@
+ #ifdef __CYGWIN__
+ /* dlerror() isn't very helpful on cygwin */
+         PyErr_Format(PyExc_AttributeError,
+-                     "function '%s' not found (%s) ",
++                     "function '%s' not found",
+                      name);
+ #else
+-        PyErr_SetString(PyExc_AttributeError, ctypes_dlerror());
++        const char *err = ctypes_dlerror();
++        if (!err)
++            PyErr_Format(PyExc_AttributeError,
++                         "function '%s' not found",
++                         name);
++        else
++            PyErr_SetString(PyExc_AttributeError, err);
+ #endif
+         return NULL;
+     }
diff --git a/meta-openvuplus/recipes-enigma2/python/python/fix_pthread_site.patch b/meta-openvuplus/recipes-enigma2/python/python/fix_pthread_site.patch
new file mode 100644 (file)
index 0000000..d392060
--- /dev/null
@@ -0,0 +1,38 @@
+--- configure.in.org   2008-05-01 12:40:58.000000000 +0200
++++ configure.in       2008-05-01 12:39:39.000000000 +0200
+@@ -998,7 +999,7 @@
+ # so we need to run a program to see whether it really made the
+ # function available.
+ AC_MSG_CHECKING(whether $CC accepts -pthread)
+-AC_CACHE_VAL(ac_cv_thread,
++AC_CACHE_VAL(ac_cv_pthread,
+ [ac_save_cc="$CC"
+ CC="$CC -pthread"
+ AC_TRY_RUN([
+@@ -1023,11 +1024,11 @@
+ # If we have set a CC compiler flag for thread support then
+ # check if it works for CXX, too.
+-ac_cv_cxx_thread=no
+ if test ! -z "$CXX"
+ then
+ AC_MSG_CHECKING(whether $CXX also accepts flags for thread support)
+-ac_save_cxx="$CXX"
++AC_CACHE_VAL(ac_cv_cxx_thread,
++[ac_save_cxx="$CXX"
+ if test "$ac_cv_kpthread" = "yes"
+ then
+@@ -1056,9 +1057,11 @@
+   fi
+   rm -fr conftest*
+ fi
++CXX="$ac_save_cxx"])
+ AC_MSG_RESULT($ac_cv_cxx_thread)
++else
++  ac_cv_cxx_thread=no
+ fi
+-CXX="$ac_save_cxx"
+ dnl # check for ANSI or K&R ("traditional") preprocessor
+ dnl AC_MSG_CHECKING(for C preprocessor type)
diff --git a/meta-openvuplus/recipes-enigma2/python/python/no-ldconfig.patch b/meta-openvuplus/recipes-enigma2/python/python/no-ldconfig.patch
new file mode 100644 (file)
index 0000000..fff1ccd
--- /dev/null
@@ -0,0 +1,23 @@
+Fixes exception on 'import uuid' if ldconfig is unavailable.
+
+diff -Naur Python-2.6.7.orig/Lib/ctypes/util.py Python-2.6.7/Lib/ctypes/util.py
+--- Python-2.6.7.orig/Lib/ctypes/util.py       2010-03-20 03:11:16.000000000 +0100
++++ Python-2.6.7/Lib/ctypes/util.py    2012-01-12 15:26:37.562726637 +0100
+@@ -204,7 +204,16 @@
+             return res.group(1)
+         def find_library(name):
+-            return _findSoname_ldconfig(name) or _get_soname(_findLib_gcc(name))
++            from glob import glob
++            paths = ['/lib', '/usr/lib']
++            if os.environ.has_key('LD_LIBRARY_PATH'):
++                paths = os.environ['LD_LIBRARY_PATH'].split(':') + paths
++            for path in paths:
++                for lib in glob("%s/lib%s.so.*" % (path, name)):
++                    rpath = os.path.realpath(lib)
++                    if os.path.isfile(rpath):
++                        return rpath
++            return None
+ ################################################################
+ # test code
diff --git a/meta-openvuplus/recipes-enigma2/python/python/some_configure_fixes.patch b/meta-openvuplus/recipes-enigma2/python/python/some_configure_fixes.patch
new file mode 100644 (file)
index 0000000..eced413
--- /dev/null
@@ -0,0 +1,32 @@
+--- configure.in       2008-02-13 20:17:17.000000000 +0100
++++ configure.in       2008-10-21 22:45:31.000000000 +0200
+@@ -3369,27 +3369,9 @@
+   AC_MSG_RESULT(no)
+ )
+-AC_MSG_CHECKING(for /dev/ptmx)
++AC_CHECK_FILE(/dev/ptmx, AC_DEFINE(HAVE_DEV_PTMX, 1, [Define if we have /dev/ptmx.]))
+-if test -r /dev/ptmx
+-then
+-  AC_MSG_RESULT(yes)
+-  AC_DEFINE(HAVE_DEV_PTMX, 1,
+-  [Define if we have /dev/ptmx.])
+-else
+-  AC_MSG_RESULT(no)
+-fi
+-
+-AC_MSG_CHECKING(for /dev/ptc)
+-
+-if test -r /dev/ptc
+-then
+-  AC_MSG_RESULT(yes)
+-  AC_DEFINE(HAVE_DEV_PTC, 1,
+-  [Define if we have /dev/ptc.])
+-else
+-  AC_MSG_RESULT(no)
+-fi
++AC_CHECK_FILE(/dev/ptc, AC_DEFINE(HAVE_DEV_PTC, 1, [Define if we have /dev/ptc.]))
+ case $MACHDEP in
+ darwin)       
diff --git a/meta-openvuplus/recipes-enigma2/python/python_2.7.2.bbappend b/meta-openvuplus/recipes-enigma2/python/python_2.7.2.bbappend
new file mode 100644 (file)
index 0000000..dca8c27
--- /dev/null
@@ -0,0 +1,19 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
+
+PR .= "-vuplus0"
+
+SRC_URI += " \
+        file://some_configure_fixes.patch;striplevel=0 \
+        file://fix_pthread_site.patch;striplevel=0 \
+        file://no-ldconfig.patch \
+        file://ctypes-error-handling-fix.patch \
+"
+
+EXTRA_OECONF += " \
+       ac_cv_file__dev_ptmx=yes \
+       ac_cv_file__dev_ptc=no \
+       ac_cv_no_strict_aliasing_ok=yes \
+       ac_cv_pthread=yes \
+       ac_cv_cxx_thread=yes \
+       ac_cv_sizeof_off_t=8 \
+"
diff --git a/meta-openvuplus/recipes-enigma2/rt2870sta/files/RT2870STA.dat b/meta-openvuplus/recipes-enigma2/rt2870sta/files/RT2870STA.dat
new file mode 100644 (file)
index 0000000..b08b10a
--- /dev/null
@@ -0,0 +1,79 @@
+#The word of "Default" must not be removed
+Default
+CountryRegion=5
+CountryRegionABand=7
+CountryCode=
+ChannelGeography=1
+SSID=11n-AP
+NetworkType=Infra
+WirelessMode=5
+Channel=0
+BeaconPeriod=100
+TxPower=100
+BGProtection=0
+TxPreamble=0
+RTSThreshold=2347
+FragThreshold=2346
+TxBurst=1
+PktAggregate=0
+WmmCapable=1
+AckPolicy=0;0;0;0
+AuthMode=OPEN
+EncrypType=NONE
+WPAPSK=
+DefaultKeyID=1
+Key1Type=0
+Key1Str=
+Key2Type=0
+Key2Str=
+Key3Type=0
+Key3Str=
+Key4Type=0
+Key4Str=
+PSMode=CAM
+AutoRoaming=0
+RoamThreshold=70
+APSDCapable=0
+APSDAC=0;0;0;0
+HT_RDG=1
+HT_EXTCHA=0
+HT_OpMode=0
+HT_MpduDensity=4
+HT_BW=1
+HT_BADecline=0
+HT_AutoBA=1
+HT_AMSDU=0
+HT_BAWinSize=64
+HT_GI=1
+HT_MCS=33
+HT_MIMOPSMode=3
+HT_DisallowTKIP=1
+HT_STBC=0
+EthConvertMode=
+EthCloneMac=
+IEEE80211H=0
+TGnWifiTest=0
+WirelessEvent=0
+MeshId=MESH
+MeshAutoLink=1
+MeshAuthMode=OPEN
+MeshEncrypType=NONE
+MeshWPAKEY=
+MeshDefaultkey=1
+MeshWEPKEY=
+CarrierDetect=0
+AntDiversity=0
+BeaconLostTime=4
+FtSupport=0
+Wapiifname=ra0
+WapiPsk=
+WapiPskType=
+WapiUserCertPath=
+WapiAsCertPath=
+PSP_XLINK_MODE=0
+WscManufacturer=
+WscModelName=
+WscDeviceName=
+WscModelNumber=
+WscSerialNumber=
+RadioOn=1
diff --git a/meta-openvuplus/recipes-enigma2/rt2870sta/rt2870sta_1.0.0.bb b/meta-openvuplus/recipes-enigma2/rt2870sta/rt2870sta_1.0.0.bb
new file mode 100644 (file)
index 0000000..94f9120
--- /dev/null
@@ -0,0 +1,18 @@
+DESCRIPTION = "install RT2870STA.dat file for ralink drivers"
+
+PV = "1.0.0"
+PR = "r0"
+LICENSE = "CLOSED"
+
+SRC_URI = "file://RT2870STA.dat"
+
+S = "${WORKDIR}/"
+
+do_compile() {
+        :
+}
+
+do_install() {
+       install -d  ${D}/etc/Wireless/RT2870STA/
+       install -m 0755 ${WORKDIR}/RT2870STA.dat ${D}/etc/Wireless/RT2870STA/
+}
diff --git a/meta-openvuplus/recipes-enigma2/rt73-firmware/rt73-firmware_1.8.bb b/meta-openvuplus/recipes-enigma2/rt73-firmware/rt73-firmware_1.8.bb
new file mode 100644 (file)
index 0000000..70c5760
--- /dev/null
@@ -0,0 +1,17 @@
+DESCRIPTION = "Firmware for rt73 based USB wifi adaptors"
+LICENSE = "unknown"
+LIC_FILES_CHKSUM = "file://LICENSE.ralink-firmware.txt;md5=682eac07428a4e8f138bc082f090ecac"
+
+PR = "r1"
+
+SRC_URI = "http://www.ralinktech.com.tw/data/RT71W_Firmware_V${PV}.zip"
+
+S = "${WORKDIR}/RT71W_Firmware_V${PV}"
+
+do_install() {
+       install -d ${D}/${base_libdir}/firmware
+       install -m 0644 rt73.bin ${D}/${base_libdir}/firmware/
+}
+
+FILES_${PN} = "${base_libdir}/firmware/"
+PACKAGE_ARCH = "all"
diff --git a/meta-openvuplus/recipes-enigma2/showiframe/showiframe_1.8.bb b/meta-openvuplus/recipes-enigma2/showiframe/showiframe_1.8.bb
new file mode 100644 (file)
index 0000000..1176e31
--- /dev/null
@@ -0,0 +1,9 @@
+SUMMARY = "Displays an IFrame using a LinuxTV video decoder"
+SECTION = "base"
+LICENSE = "GPLv2"
+LIC_FILES_CHKSUM = "file://src/showiframe.c;endline=10;md5=513a8a3c6a14de8ef311dfa25fb0eaa6"
+PR = "r1"
+
+SRCREV = "f19e4b573ba755ca6300df72b0736e98c967aba5"
+
+inherit autotools opendreambox-git
diff --git a/meta-openvuplus/recipes-enigma2/swig/swig_2.0.4.bb b/meta-openvuplus/recipes-enigma2/swig/swig_2.0.4.bb
new file mode 100644 (file)
index 0000000..e05c9d6
--- /dev/null
@@ -0,0 +1,11 @@
+require recipes-devtools/swig/swig.inc
+
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e7807a6282784a7dde4c846626b08fc6 \
+                    file://LICENSE-GPL;md5=d32239bcb673463ab874e80d47fae504 \
+                    file://LICENSE-UNIVERSITIES;md5=8ce9dcc8f7c994de4a408b205c72ba08"
+
+DEPENDS += "libpcre-native"
+PR = "${INC_PR}.0"
+
+SRC_URI[md5sum] = "4319c503ee3a13d2a53be9d828c3adc0"
+SRC_URI[sha256sum] = "763a117730d26f8e5ed67f5718c6c0761fbb8461680fc20269db8c0839e1ec8a"
diff --git a/meta-openvuplus/recipes-enigma2/tasks/task-vuplus-enigma2.bb b/meta-openvuplus/recipes-enigma2/tasks/task-vuplus-enigma2.bb
new file mode 100644 (file)
index 0000000..58ceee2
--- /dev/null
@@ -0,0 +1,7 @@
+PR = "${INC_PR}.0"
+
+RDEPENDS_${PN} = " \
+  enigma2-streamproxy-xinetd \
+"
+
+require task-vuplus-enigma2.inc
diff --git a/meta-openvuplus/recipes-enigma2/tasks/task-vuplus-enigma2.inc b/meta-openvuplus/recipes-enigma2/tasks/task-vuplus-enigma2.inc
new file mode 100644 (file)
index 0000000..663065b
--- /dev/null
@@ -0,0 +1,86 @@
+SUMMARY = "Enigma2 Task for Vuplus"
+SECTION = "vuplus/base"
+LICENSE = "CLOSED"
+INC_PR = "r0"
+
+inherit task
+
+PACKAGE_ARCH = "${MACHINE_ARCH}"
+
+#DEPENDS_${PN} += " \
+#      enigma2-plugin-extensions-openwebif \
+#"
+
+RDEPENDS_${PN} += " \
+  enigma2 \
+  enigma2-defaultservices \
+  enigma2-streamproxy \
+  tuxbox-tuxtxt-32bpp \
+  enigma2-meta \
+  enigma2-plugins-meta \
+  enigma2-skins-meta \
+"
+
+#  enigma2-plugin-extensions-mediascanner \
+#  enigma2-plugin-systemplugins-factorytest \
+#  enigma2-plugin-systemplugins-crashreport \
+#  enigma2-plugin-extensions-remotestreamconvert \
+#  enigma2-plugin-systemplugins-zappingmodeselection \
+#  enigma2-plugin-extensions-addstreamurl \
+#"
+
+# vuplus-blindscan-utils \
+# enigma2-plugin-systemplugins-3gmodemmanager \
+# enigma2-plugin-extensions-streamtv \
+# enigma2-plugin-extensions-dlnaserver \
+# enigma2-plugin-extensions-dlnabrowser \
+
+RRECOMMENDS_${PN} += " \
+  aio-grab \
+  python-crypt \
+  python-netserver \
+  python-twisted-core \
+  python-twisted-protocols \
+  python-twisted-web \
+"
+
+#  enigma2-plugin-extensions-mediaplayer \
+#  enigma2-plugin-extensions-pictureplayer \
+#  enigma2-plugin-systemplugins-skinselector \
+#  enigma2-plugin-systemplugins-ui3dsetup \
+#  enigma2-plugin-systemplugins-uipositionsetup \
+#  enigma2-plugin-systemplugins-hdmicec \
+#  ${@base_contains("MACHINE_FEATURES", "wifi", "enigma2-plugin-systemplugins-wirelessaccesspoint", "", d)} \
+#  ${@base_contains("MACHINE_FEATURES", "wifi", "task-vuplus-wlan", "", d)} \
+#"
+
+#RDEPENDS_${PN} += " \
+#  ${@base_contains("VUPLUS_FEATURES", "fan_simple", "enigma2-plugin-systemplugins-fancontrol","", d)} \
+#  ${@base_contains("VUPLUS_FEATURES", "fan_manual", "enigma2-plugin-systemplugins-manualfancontrol", "", d)} \
+#  ${@base_contains("VUPLUS_FEATURES", "rc_code", "enigma2-plugin-systemplugins-remotecontrolcode", "", d)} \
+#  ${@base_contains("VUPLUS_FEATURES", "led", "enigma2-plugin-systemplugins-ledbrightnesssetup", "", d)} \
+#"
+
+#RDEPENDS_task-vuplus-enigma2_append_bm750 = "\
+#  enigma2-plugin-systemplugins-fancontrol \
+#"
+# vuplus-webbrowser-utils enigma2-plugin-extensions-webbrowser
+
+#RDEPENDS_task-vuplus-enigma2_append_vuuno = "\
+#  enigma2-plugin-systemplugins-fpgaupgrade \
+#  enigma2-plugin-systemplugins-blindscan \
+#  enigma2-plugin-systemplugins-manualfancontrol \
+#  enigma2-plugin-systemplugins-remotecontrolcode \
+#"
+# vuplus-webbrowser-utils enigma2-plugin-extensions-webbrowser
+
+#RDEPENDS_task-vuplus-enigma2_append_vuultimo = "\
+#  enigma2-plugin-systemplugins-firmwareupgrade \
+#  enigma2-plugin-systemplugins-blindscan \
+#  enigma2-plugin-systemplugins-manualfancontrol \
+#  enigma2-plugin-systemplugins-remotecontrolcode \
+#  enigma2-plugin-systemplugins-ledbrightnesssetup \
+#"
+# vuplus-webbrowser-utils enigma2-plugin-extensions-webbrowser
+
+PACKAGE_ARCH = "${MACHINE_ARCH}"
diff --git a/meta-openvuplus/recipes-enigma2/timezones/files/GPL-1.0 b/meta-openvuplus/recipes-enigma2/timezones/files/GPL-1.0
new file mode 100644 (file)
index 0000000..9d4ef93
--- /dev/null
@@ -0,0 +1,252 @@
+
+GNU General Public License, version 1
+
+                    GNU GENERAL PUBLIC LICENSE
+                     Version 1, February 1989
+
+ Copyright (C) 1989 Free Software Foundation, Inc.
+                    51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The license agreements of most software companies try to keep users
+at the mercy of those companies.  By contrast, our General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  The
+General Public License applies to the Free Software Foundation`s
+software and to any other program whose authors commit to using it.
+You can use it for your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Specifically, the General Public License is designed to make
+sure that you have the freedom to give away or sell copies of free
+software, that you receive source code or can get it if you want it,
+that you can change the software or use pieces of it in new free
+programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of a such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must tell them their rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author`s protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors` reputations.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any program or other work which
+contains a notice placed by the copyright holder saying it may be
+distributed under the terms of this General Public License.  The
+"Program", below, refers to any such program or work, and a "work based
+on the Program" means either the Program or any work containing the
+Program or a portion of it, either verbatim or with modifications.  Each
+licensee is addressed as "you".
+
+  1. You may copy and distribute verbatim copies of the Program`s source
+code as you receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice and
+disclaimer of warranty; keep intact all the notices that refer to this
+General Public License and to the absence of any warranty; and give any
+other recipients of the Program a copy of this General Public License
+along with the Program.  You may charge a fee for the physical act of
+transferring a copy.
+
+  2. You may modify your copy or copies of the Program or any portion of
+it, and copy and distribute such modifications under the terms of Paragraph
+1 above, provided that you also do the following:
+
+    a) cause the modified files to carry prominent notices stating that
+    you changed the files and the date of any change; and
+
+    b) cause the whole of any work that you distribute or publish, that
+    in whole or in part contains the Program or any part thereof, either
+    with or without modifications, to be licensed at no charge to all
+    third parties under the terms of this General Public License (except
+    that you may choose to grant warranty protection to some or all
+    third parties, at your option).
+
+    c) If the modified program normally reads commands interactively when
+    run, you must cause it, when started running for such interactive use
+    in the simplest and most usual way, to print or display an
+    announcement including an appropriate copyright notice and a notice
+    that there is no warranty (or else, saying that you provide a
+    warranty) and that users may redistribute the program under these
+    conditions, and telling the user how to view a copy of this General
+    Public License.
+
+    d) You may charge a fee for the physical act of transferring a
+    copy, and you may at your option offer warranty protection in
+    exchange for a fee.
+
+Mere aggregation of another independent work with the Program (or its
+derivative) on a volume of a storage or distribution medium does not bring
+the other work under the scope of these terms.
+
+  3. You may copy and distribute the Program (or a portion or derivative of
+it, under Paragraph 2) in object code or executable form under the terms of
+Paragraphs 1 and 2 above provided that you also do one of the following:
+
+    a) accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of
+    Paragraphs 1 and 2 above; or,
+
+    b) accompany it with a written offer, valid for at least three
+    years, to give any third party free (except for a nominal charge
+    for the cost of distribution) a complete machine-readable copy of the
+    corresponding source code, to be distributed under the terms of
+    Paragraphs 1 and 2 above; or,
+
+    c) accompany it with the information you received as to where the
+    corresponding source code may be obtained.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form alone.)
+
+Source code for a work means the preferred form of the work for making
+modifications to it.  For an executable file, complete source code means
+all the source code for all modules it contains; but, as a special
+exception, it need not include source code for modules which are standard
+libraries that accompany the operating system on which the executable
+file runs, or for standard header files or definitions files that
+accompany that operating system.
+
+  4. You may not copy, modify, sublicense, distribute or transfer the
+Program except as expressly provided under this General Public License.
+Any attempt otherwise to copy, modify, sublicense, distribute or transfer
+the Program is void, and will automatically terminate your rights to use
+the Program under this License.  However, parties who have received
+copies, or rights to use copies, from you under this General Public
+License will not have their licenses terminated so long as such parties
+remain in full compliance.
+
+  5. By copying, distributing or modifying the Program (or any work based
+on the Program) you indicate your acceptance of this license to do so,
+and all its terms and conditions.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the original
+licensor to copy, distribute or modify the Program subject to these
+terms and conditions.  You may not impose any further restrictions on the
+recipients` exercise of the rights granted herein.
+
+  7. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of the license which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+the license, you may choose any version ever published by the Free Software
+Foundation.
+
+  8. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+        Appendix: How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to humanity, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these
+terms.
+
+  To do so, attach the following notices to the program.  It is safest to
+attach them to the start of each source file to most effectively convey
+the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program`s name and a brief idea of what it does.>
+    Copyright (C) 19yy  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 1, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) 19xx name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w`.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c` for details.
+
+The hypothetical commands `show w` and `show c` should show the
+appropriate parts of the General Public License.  Of course, the
+commands you use may be called something other than `show w` and `show
+c`; they could even be mouse-clicks or menu items--whatever suits your
+program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  program `Gnomovision` (a program to direct compilers to make passes
+  at assemblers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+That`s all there is to it!
+
diff --git a/meta-openvuplus/recipes-enigma2/timezones/files/zoneinfo.tar.bz2 b/meta-openvuplus/recipes-enigma2/timezones/files/zoneinfo.tar.bz2
new file mode 100644 (file)
index 0000000..19fa928
Binary files /dev/null and b/meta-openvuplus/recipes-enigma2/timezones/files/zoneinfo.tar.bz2 differ
diff --git a/meta-openvuplus/recipes-enigma2/timezones/timezones-alternative.bb b/meta-openvuplus/recipes-enigma2/timezones/timezones-alternative.bb
new file mode 100644 (file)
index 0000000..0fb50f3
--- /dev/null
@@ -0,0 +1,25 @@
+DESCRIPTION = "Timezone data, alternative"
+SECTION = "base"
+PRIORITY = "optional"
+MAINTAINER = "Felix Domke <tmbinc@elitedvb.net>"
+LICENSE = "GPL"
+LIC_FILES_CHKSUM = "file://${THISDIR}/files/GPL-1.0;md5=e9e36a9de734199567a4d769498f743d"
+
+PV = "2008i"
+PR = "r0"
+
+SRC_URI = "file://zoneinfo.tar.bz2"
+S = "${WORKDIR}/zoneinfo"
+
+FILES_${PN} = "usr/share/zoneinfo/[A-Z]*"
+PACKAGE_ARCH = "all"
+
+do_install() {
+       install -d ${D}/usr/share/zoneinfo/
+       
+       for file in ${S}/*
+       do
+               [ -f $file ] && install -m 644 "$file" ${D}/usr/share/zoneinfo/
+       done;
+       true;
+}