From: Chang.H.S Date: Tue, 27 Nov 2012 09:52:36 +0000 (+0900) Subject: task-vuplus-enigma2 X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_openvuplus_3.0;a=commitdiff_plain;h=57d440ad1d11eadb332a2ac3adc651d6cab2970b task-vuplus-enigma2 --- diff --git a/meta-openvuplus/classes/schwerkraft-git.bbclass b/meta-openvuplus/classes/schwerkraft-git.bbclass new file mode 100644 index 0000000..312a8e1 --- /dev/null +++ b/meta-openvuplus/classes/schwerkraft-git.bbclass @@ -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 index 0000000..87035b0 --- /dev/null +++ b/meta-openvuplus/recipes-base/firmwares/files/Marvell-Licence.txt @@ -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 index 0000000..1d02c51 --- /dev/null +++ b/meta-openvuplus/recipes-base/firmwares/firmware-drxd-a2.bb @@ -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 index 0000000..004fd4a --- /dev/null +++ b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-af9005.bb @@ -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 index 0000000..03916f5 --- /dev/null +++ b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-fe-af9013.bb @@ -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 index 0000000..0079bd2 --- /dev/null +++ b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-af9015.bb @@ -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 index 0000000..7097f6d --- /dev/null +++ b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-af9035.bb @@ -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 index 0000000..193c763 --- /dev/null +++ b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-avertv-a800.bb @@ -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 index 0000000..431bc48 --- /dev/null +++ b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-dib0700.bb @@ -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 index 0000000..5298eb3 --- /dev/null +++ b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-dibusb.bb @@ -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 index 0000000..570241e --- /dev/null +++ b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-digitv.bb @@ -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 index 0000000..7a6c1d4 --- /dev/null +++ b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-ec168.bb @@ -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 index 0000000..bd5a261 --- /dev/null +++ b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-nova-t-usb2.bb @@ -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 index 0000000..221497a --- /dev/null +++ b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-sms1xxx-hcw-dvbt.bb @@ -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 index 0000000..aeaf2a0 --- /dev/null +++ b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-sms1xxx-nova-dvbt.bb @@ -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 index 0000000..62292cc --- /dev/null +++ b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-ttusb-budget.bb @@ -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 index 0000000..d53b9db --- /dev/null +++ b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-umt-010.bb @@ -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 index 0000000..1eebc64 --- /dev/null +++ b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-wt220u-zl0353.bb @@ -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 index 0000000..67a4b19 --- /dev/null +++ b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb-xc5000.bb @@ -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 index 0000000..25e68b6 --- /dev/null +++ b/meta-openvuplus/recipes-base/firmwares/firmware-dvb-usb.bb @@ -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 index 0000000..359057b --- /dev/null +++ b/meta-openvuplus/recipes-base/firmwares/firmware-htc9271.bb @@ -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 index 0000000..6418604 --- /dev/null +++ b/meta-openvuplus/recipes-base/firmwares/firmware-rt2561.bb @@ -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 index 0000000..a9357c0 --- /dev/null +++ b/meta-openvuplus/recipes-base/firmwares/firmware-rt3070.bb @@ -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 index 0000000..1cae3f9 --- /dev/null +++ b/meta-openvuplus/recipes-base/firmwares/firmware-rtl8721u.bb @@ -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 index 0000000..4c23ccf --- /dev/null +++ b/meta-openvuplus/recipes-base/firmwares/linux-firmware.inc @@ -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 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 index 0000000..9fdfd6f --- /dev/null +++ b/meta-openvuplus/recipes-base/firmwares/marvell-gspi-fw_9.70.3-p37.bb @@ -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 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 index 0000000..181b2ba --- /dev/null +++ b/meta-openvuplus/recipes-base/firmwares/marvell-sdio-fw_9.70.3-p37.bb @@ -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 index 0000000..1459e22 --- /dev/null +++ b/meta-openvuplus/recipes-enigma2/aio-grab/aio-grab/aio-grab_vuplus.patch @@ -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 index 0000000..bc89b2d --- /dev/null +++ b/meta-openvuplus/recipes-enigma2/aio-grab/aio-grab_0.8.bb @@ -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 index 0000000..9199d4a --- /dev/null +++ b/meta-openvuplus/recipes-enigma2/aio-grab/aio-grab_0.8.bbappend @@ -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 index 0000000..40cf4ad --- /dev/null +++ b/meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/Makefile.in.patch @@ -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 index 0000000..55f39b2 --- /dev/null +++ b/meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/cdparanoia-III-10.2-privatefix.patch @@ -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_lenprivate->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_sizeprivate->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 index 0000000..2ca2516 --- /dev/null +++ b/meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/configure.in.patch @@ -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 index 0000000..414ff39 --- /dev/null +++ b/meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/fixes10.patch @@ -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 index 0000000..4dbd2bb --- /dev/null +++ b/meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/interface_Makefile.in.patch @@ -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 index 0000000..962a43a --- /dev/null +++ b/meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia/paranoia_Makefile.in.patch @@ -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 index 0000000..b88c74b --- /dev/null +++ b/meta-openvuplus/recipes-enigma2/cdparanoia/cdparanoia_svn.bb @@ -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 index 0000000..7f5188a --- /dev/null +++ b/meta-openvuplus/recipes-enigma2/dreambox-dvbincludes/dreambox-dvbincludes.bb @@ -0,0 +1,34 @@ +SUMMARY = "This package provides dbox2/dreambox \ +compatible header files for the API to the drivers." + +MAINTAINER = "Felix Domke " + +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 index 0000000..bb2a4a2 --- /dev/null +++ b/meta-openvuplus/recipes-enigma2/dreambox-dvbincludes/dreambox-dvbincludes_1.1.bb @@ -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 index 0000000..5ee1ebd --- /dev/null +++ b/meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/01peerdns @@ -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 index 0000000..f0ea5a5 --- /dev/null +++ b/meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/01peerdns-remove @@ -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 index 0000000..c099b6e --- /dev/null +++ b/meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/dial.modem @@ -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 index 0000000..ef0cc50 --- /dev/null +++ b/meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/disconnect.modem @@ -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 index 0000000..25b3144 --- /dev/null +++ b/meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/dm800/options @@ -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 index 0000000..746ee81 --- /dev/null +++ b/meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/options @@ -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 index 0000000..7825deb --- /dev/null +++ b/meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts/pap-secrets @@ -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 index 0000000..859ab5c --- /dev/null +++ b/meta-openvuplus/recipes-enigma2/dreambox-modem-ppp-scripts/dreambox-modem-ppp-scripts_0.1.bb @@ -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 index 0000000..b91a750 --- /dev/null +++ b/meta-openvuplus/recipes-enigma2/dvbtools/dvb-apps-1.1.1/update-to-tip.diff @@ -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 +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 + Andrew de Quincey +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 + #include ++#include + #include + #include + #include +@@ -31,8 +32,7 @@ + #include + + #include +-#include +-#include ++#include + #include + #include + +@@ -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 . ++ - 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 ++ ++ ++Thu Oct 12 02:19:31 MEST 2000 ++ ++ - The   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 ++ found. ++ - Added the dual-wheel-mouse patch from Holger Fitzner. ++ ++Tue May 30 03:09:24 MEST 2000 ++ ++ - As Matto Fransen reported: the ; after   ++ 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 . 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 *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 . ++ - 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 ++ - 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 . ++ (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 . 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 . ++ - added rpm-spec file from Mario Mikocevic . ++ (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 font3.xbm ++ ++font4.xbm: bdf2xbm vtxt-iso8859-7.bdf ++ ./bdf2xbm font4 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 "AleVT" ; \ ++ man2html -bare -uelem U -nodepage ; \ ++ echo "" ; \ ++ } | sed -e "s, , ,g" -e "s, , ,g" >~/exit/alevt/$$j.html ;\ ++ done ++ ++tar: tar-html clean ++ sed s/VERSION/$(VER)/g ~/exit/alevt/alevt-$(VER).lsm ++ sed s/VERSION/$(VER)/g alevt.spec ++ cd .. ;\ ++ ln -s alevt alevt-$(VER) ;\ ++ tar vcfz ~/exit/alevt/alevt-$(VER).tar.gz alevt-$(VER)/* ;\ ++ rm alevt-$(VER) ++ cat ~/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 ++character set ++.TP ++.B \-f -format ++format to save ++.TP ++.B \-f help -format help ++lists available storage formats ++.TP ++.B \-h -help ++print this page ++.TP ++.B \-n -name ++page name to save ++.B \-t -timeout ++timeout ++.TP ++.B \-s -sid ++service pid ++.TP ++.B \-t -ttpid ++teletext pid ++.TP ++.B \-v -vbi ++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 . ++.PP ++This manual page was written by Uwe Bugla . +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 ++#include ++#include ++#include ++#include ++#include ++#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" ++ " \n" ++ " -f -format \tascii\n" ++ " -f help -format help\n" ++ " -h -help\n" ++ " -n -name \t\tttext-%%s.%%e\n" ++ " -s -sid \t\t(none;dvb only)\n" ++ " -to -timeout \t\t(none)\n" ++ " -t -ttpid \t\t(none;dvb only)\n" ++ " -v -vbi \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 ++maximum delta ++.TP ++.B \-f -format ++time format ++.TP ++.B \-h -help ++print this page ++.TP ++.B \-s -set ++set the system clock ++.TP ++.B \-t -timeout ++timeout ++.TP ++.B \-v -vbi ++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 . ++.PP ++This manual page was written by Uwe Bugla . +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 ++#include ++#include ++#include ++#include ++#include ++#include ++#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 \t7200 (2 hours)\n" ++ " -f -format \t\t%%c\n" ++ " -h -help\n" ++ " -s -set\t\t\toff\n" ++ " -to -timeout \t(none)\n" ++ " -v -vbi \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 name (dvb only) ++.TP ++.B \-ch -child ++child window ++.TP ++.B \-cs -charset ++character set ++.TP ++.B \-h -help ++print this page ++.TP ++.B \-o ++path + file for all services (dvb only) ++.TP ++.B \-p -parent ++parent window ++.TP ++.B \-s -sid ++service id (dvb only) ++.TP ++.B \-t -ttpid ++teletext pid (dvb only) ++.TP ++.B \-v -vbi ++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 . ++.PP ++This manual page was written by Uwe Bugla . +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] xbm ++ Copyright 1998,1999 by E. Toernig (froese@gmx.de) ++*/ ++ ++#include ++#include ++#include ++#include ++#include ++ ++#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 ++#include ++#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 */ ++ ++#include ++#include ++#include ++#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))*CW*32+ c%32*CW +x; ++ bit=(*(src+bitnr/8))&(1<>dbl))*CW*32+ 0xa0%32*CW +x; ++ maskbit=(*(src+maskbitnr/8))&(1<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 ++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 */ ++ ++#include ++#include ++#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=", // substitute 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("",fp); ++ HTML_NL ++#endif ++ fputs("",fp); ++ HTML_NL ++#ifndef STRIPPED_HTML ++ fputs(""); 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("",fp); ++ HTML_NL ++#else ++ switch(latin1) { ++ case LATIN1: fprintf(fp,""); break; ++ case LATIN2: fprintf(fp,""); break; ++ case KOI8: fprintf(fp,""); break; ++ case GREEK: fprintf(fp,""); break; ++ } ++ HTML_NL ++#endif ++ fputs("",fp); ++ fputs("",fp); ++ HTML_NL ++ } //bare ++ ++ fputs("",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   ++ // 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==' ') && (zdata[y][first_unprinted].attr & EA_BLINK) ++ { ++ fprintf(fp,""); ++ nbsp=0; ++ } ++ ++ if (pg->data[y][first_unprinted].fg!=7) ++ { ++ fprintf(fp,"", ++ html_colours[pg->data[y][first_unprinted].fg]); ++ nbsp=0; ++ } ++ for(;(zdata[y][z].ch==' ') ++ { ++ for(;(pg->data[y][z].ch==' ') && (z 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,""); ++ } ++ if (pg->data[y][first_unprinted].attr & EA_BLINK) ++ fprintf(fp,""); ++ ++ first_unprinted=z; ++ } ++ } ++ fputs("
",fp); ++ HTML_NL ++ } ++ fputs("
",fp); ++ if (!D->bare) ++ fputs("",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 ++#include ++#include ++#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=", // substitute for gfx-symbols ++ "fg=<0-7|none>", // assume term has as foreground color ++ "bg=<0-7|none>", // assume term has 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 ++#include ++#include ++#include ++#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 ++#include ++#include ++#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 ++#include ++#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 ++#include ++#include ++#include ++#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 \t\t(none;dvb only)\n" ++ " -ch -child \t\t(none)\n" ++ " -cs -charset\t\tlatin-1\n" ++ " \n" ++ " -h -help\n" ++ " -o \t\t(none;dvb only)\n" ++ " -p -parent \t\t900\n" ++ " -s -sid \t\t(none;dvb only)\n" ++ " -t -ttpid \t\t(none;dvb only)\n" ++ " -v -vbi \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 ++#include ++#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 // for freebsd ++#include ++#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 ++ ++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 ++#include ++#include ++#include ++#include ++#include ++#include ++#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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include "os.h" ++#include "vt.h" ++#include "misc.h" ++#include "vbi.h" ++#include "fdset.h" ++#include "hamm.h" ++#include "lang.h" ++#include ++ ++ ++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, ×tamp, ++ &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 ++#include ++#include ++ ++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 (none;dvb only) ", ++" -ch -child\6 (none) ", ++" -cs -charset \6latin-1 ", ++" \6 ", ++" -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 (none;dvb only) ", ++" -p -parent\6 900 ", ++" -s -sid\6 (none;dvb only) ", ++" -t -ttpid\6 (none;dvb only) ", ++" -v -vbi\6 /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 ", ++" -f -format \6ascii ", ++" \6 ", ++" -f help -format help ", ++" -h -help ", ++" -n -name \6 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 (none;dvb only) ", ++" -t -ttpid\6 (none;dvb only) ", ++" -to -timeout\6 (none) ", ++" -v -vbi\6 /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 7200 (2 hours) ", ++" -f -format\6 %c ", ++" -h -help ", ++" -s -set \6off ", ++" -to -timeout\6(none) ", ++" -v -vbi\6 /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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#define XK_MISCELLANY ++#define XK_LATIN1 ++#include ++#include ++#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<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 ++#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 ++ * ++ * 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 ++#endif ++ ++#include ++#include ++#include ++#include ++#include ++ ++static char *usage_str = ++ "\nusage: gotox [options] -d \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) ++# dna network ++# freq sr fec mod ++C 330000000 6875000 NONE QAM128 #mux1 ++C 370000000 6875000 NONE QAM128 #mux2 ++C 362000000 6875000 NONE QAM128 #mux3 ++C 354000000 6875000 NONE QAM128 #mux4 ++C 346000000 6875000 NONE QAM128 #mux5 ++C 338000000 6875000 NONE QAM128 #mux6 ++C 322000000 6875000 NONE QAM128 #mux7 ++C 314000000 6875000 NONE QAM128 #mux8 ++C 378000000 6875000 NONE QAM128 #mux9 ++C 306000000 6875000 NONE QAM128 #mux10 ++C 298000000 6875000 NONE QAM128 #mux11 ++C 290000000 6875000 NONE QAM128 #mux12 ++C 274000000 6875000 NONE QAM128 #mux13 ++C 266000000 6875000 NONE QAM128 #mux14 ++C 258000000 6875000 NONE QAM128 #mux15 ++C 250000000 6875000 NONE QAM128 #mux16 +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§ionID=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) ++#! 20090528 1 0 OFDM ES ++#------------------------------------------------------------------------------ ++# location and provider: Baixo Minho, Pontevedra (Spain) ++# date (yyyy-mm-dd) : 2009-07-11 ++# provided by (opt) : neonmann@gmail.com ++# ++# T[2] [# 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) ++#! 20090808 2 0 OFDM FI ++#------------------------------------------------------------------------------ ++# location and provider: Åland Smedsböle/Sund ++# date (yyyy-mm-dd) : 2009-12-23 ++# provided by (opt) : k.hampf@gmail.com ++# ++# T[2] [# 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 ++# 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 + # + # 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 +-# +-# 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 ++# ++# 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 + # + # 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 ++# 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) ++#! 20100316 1 0 OFDM IS ++#------------------------------------------------------------------------------ ++# location and provider: ++# date (yyyy-mm-dd) : 2010-10-22 ++# provided by (opt) : ++# ++# T[2] [# 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 ++# 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 + #include + ++#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 + #include + ++#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 ] {| -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 + #include + #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 + #include + ++#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 ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++ ++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 index 0000000..55c3419 --- /dev/null +++ b/meta-openvuplus/recipes-enigma2/dvbtools/dvb-apps-1.1.1/update-to-trunk.diff @@ -0,0 +1,84321 @@ +update to: + +changeset 1281:af23d23c278b + +update scan files for several satellites +submitted by kosava gmail.com +author Christoph Pfister +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. ++ ++ ++ Copyright (C) ++ ++ 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. ++ ++ , 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. ++ ++ ++ Copyright (C) ++ ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General 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. ++ ++ , 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 ++ * & Marcus Metzler ++ * 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 ++#else ++#include ++#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 ++ * & Marcus Metzler ++ * 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 ++ * & Ralph Metzler ++ * 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 ++#ifdef __KERNEL__ ++#include ++#else ++#include ++#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 ++ * Ralph Metzler ++ * Holger Waechtler ++ * Andre Draszik ++ * for convergence integrated media GmbH ++ * ++ * Copyright (C) Manu Abraham ++ * ++ * 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 ++ ++ ++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 +- * & Marcus Metzler +- 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 +-#else +-#include +-#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 +- * & Marcus Metzler +- 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 +- * & Ralph Metzler +- 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 +-#ifdef __KERNEL__ +-#include +-#else +-#include +-#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 +- * Ralph Metzler +- * Holger Waechtler +- * Andre Draszik +- * 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 +- +- +-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 +- * & Ralph Metzler +- 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 +- +- +-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 +- * & Marcus Metzler +- 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 +- // returns 0 on success +- OSD_SetColor, // (color,R{x0},G{y0},B{x1},opacity{y1}) +- // set palette entry to , and 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 , to color number +- // returns 0 on success, -1 on error +- OSD_GetPixel, // (x0,y0) +- // returns color number of pixel ,, 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 +- // 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 +- // 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 +- // 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 +- * 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 +- * & Ralph Metzler +- 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 +-#else +-#include +-#include +-#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 ++ * & Ralph Metzler ++ * 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 ++ ++ ++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 ++ * & Marcus Metzler ++ * 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 ++ // returns 0 on success ++ OSD_SetColor, // (color,R{x0},G{y0},B{x1},opacity{y1}) ++ // set palette entry to , and 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 , to color number ++ // returns 0 on success, -1 on error ++ OSD_GetPixel, // (x0,y0) ++ // returns color number of pixel ,, 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 ++ // 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 ++ // 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 ++ // 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 ++ * 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 ++ * & Ralph Metzler ++ * 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 ++#else ++#include ++#include ++#include ++#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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#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 ++ ++/** ++ * 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#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 ++ ++/** ++ * 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#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 ++ ++/** ++ * 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 ++ * 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#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 ++ * 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 ++ ++/** ++ * 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#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(¶ms, 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, ¶ms); ++ 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 ++ ++/** ++ * 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#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 ++ ++/** ++ * 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 ++ * Copyright (C) 2005 Andrew de Quincey ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General 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 ++#include ++#include ++#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 ++ * Copyright (C) 2005 Andrew de Quincey ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General 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 ++ * Copyright (C) 2005 Andrew de Quincey ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General 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 ++#include ++ ++#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 ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General 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 ++#include ++ ++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 ++ * Copyright (C) 2005 Andrew de Quincey ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General 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 ++#include ++#include ++ ++#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 ++ * Copyright (C) 2005 Andrew de Quincey ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General 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 ++#include ++ ++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: 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: 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: 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: 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 ++ 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 ++#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 ++ 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 ++#include ++ ++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 ++ 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 ++#include ++#include ++#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 ++ 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 ++#include ++#include ++ ++#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 ++ 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 ++#include ++#include ++#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 ++ 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 ++#include ++#include ++ ++#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 ++ 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 ++#include ++#include ++#include ++#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 ++ 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 ++#include ++#include ++#include ++#include ++ ++#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 ++ 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 ++#include ++#include ++#include ++#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 ++ 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 ++#include ++#include ++ ++#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 ++ 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 ++#include ++#include ++#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 ++ 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 ++#include ++#include ++ ++#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 ++ 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 ++#include ++#include ++#include ++#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 ++ 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 ++#include ++#include ++ ++#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 ++ 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 ++#include ++#include ++#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 ++ 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 ++#include ++#include ++#include ++ ++#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 ++ 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 ++#include ++#include ++#include ++#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 ++ 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 ++#include ++#include ++ ++#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 ++ 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 ++#include ++#include ++#include ++#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 ++ 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 ++#include ++#include ++ ++#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 ++ 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 ++#include ++#include ++#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 ++ 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 ++#include ++#include ++ ++#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 ++ 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 ++ 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 ++#include ++#include ++#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 ++ 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 ++#include ++#include ++ ++#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 ++ 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 ++ 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 ++#include ++#include ++ ++/** ++ * 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 ++ 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 ++ 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#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 ++ 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 ++#include ++#include ++ ++#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 ++#include ++#include ++#include ++#include ++#include ++#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 ++#include ++#include ++#include ++#include ++ ++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 ++#include ++#include ++#include ++#include ++#include ++#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 ++#include ++#include ++#include ++#include ++#include ++#include ++#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; iresources[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 ++ 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#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 ++ 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 ++#include ++#include ++ ++/** ++ * 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 ++ ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General 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 ++#include ++#include ++#include ++ ++#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 ++ Copyright (C) 2006 Andrew de Quincey ++ ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#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 ++ Copyright (C) 2006 Andrew de Quincey ++ ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General 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 ++ ++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 ++ * ++ * ++ * This library is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU Lesser General 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 ++#include ++#include ++#include ++#include ++#include ++#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 ++ * ++ * This library is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU Lesser General 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= ++ * switch-frequency= ++ * lof-lo-v= ++ * lof-lo-h= ++ * lof-lo-l= ++ * lof-lo-r= ++ * lof-hi-v= ++ * lof-hi-h= ++ * lof-hi-l= ++ * lof-hi-r= ++ * config-type= ++ * cmd-lo-v= ++ * cmd-lo-h= ++ * cmd-lo-r= ++ * cmd-lo-l= ++ * cmd-hi-v= ++ * cmd-hi-h= ++ * cmd-hi-r= ++ * cmd-hi-l= ++ * ++ * 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-- 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() - 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() - issue a dishnetworks legacy command. ++ * wait() - wait for the given number of milliseconds. ++ * Dreset(
, <0|1>) - control the reset state of a DISEC device, 0:disable reset, 1:enable reset. ++ * Dpower(
, <0|1>) - control the power of a DISEC device, 0:off, 1:on. ++ * Dcommitted(
, , , , ) - 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(
, , , , ) - 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(
, ) - set the frequency of a DISEC device. ++ * Dchannel(
, ) - set the desired channel id of a DISEC device. ++ * Dgotopreset(
, ) - tell a DISEC satellite positioner to move to the given preset id. ++ * Dgotobearing(
, ) - tell a DISEQC terrestrial rotator to go to the ++ * given bearing (range -256.0 -> 512.0 degrees, fractions allowed). ++ * ++ * In the above DISEQC commands,
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 ++#include ++#include ++ ++/** ++ * 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 ++#include ++ ++#include ++ ++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 ++ ++/** ++ * 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 ++#include ++ ++#include ++ ++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 ++ ++/** ++ * 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 ++ ++/** ++ * 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 ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++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 ++ ++/** ++ * 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 ++#include ++ ++#include ++ ++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 ++ ++/** ++ * 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 ++#include ++ ++#include ++ ++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 ++ ++/** ++ * 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 ++#include ++ ++#include ++ ++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 ++ ++/** ++ * 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 ++#include ++ ++#include ++#include ++ ++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 ++ ++/** ++ * 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 ++#include ++ ++#include ++#include ++#include ++ ++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 ++ ++/** ++ * 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 ++#include ++ ++#include ++#include ++ ++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 ++ ++/** ++ * 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 ++#include ++ ++#include ++ ++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 ++ ++/** ++ * 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 ++ ++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 ++ ++/** ++ * 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 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +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 ++#include ++ ++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 ++#include ++#include ++#include ++#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 ++#include ++#include ++ ++/** ++ * 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 ++#include ++#include ++#include ++ ++/** ++ * 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 ++#include ++#include ++ ++/** ++ * 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 ++ ++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 ++ ++/** ++ * 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 ++#include ++#include ++ ++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 ++#include ++#include ++ ++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 ++ ++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 ++#include ++ ++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 ++ ++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 ++#include ++ ++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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++/** ++ * 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 ++ ++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 ++#include ++ ++/** ++ * 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 ++#include ++ ++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 ++ ++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 ++#include ++#include ++#include ++ ++/** ++ * 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 ++#include ++#include ++ ++/** ++ * 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 ++ ++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 ++ ++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 ++#include ++#include ++ ++/** ++ * 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 ++ ++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 ++#include ++ ++/** ++ * 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#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 ++#include ++#include ++ ++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 ++ ++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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++#include ++ ++/** ++ * 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 ++ ++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 ++ ++/** ++ * 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 ++#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 ++#include ++#include ++ ++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 ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General 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 ++ ++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 ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General 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 ++ ++#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 ++#include ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++#include ++ ++/** ++ * 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 ++#include ++#include ++ ++/** ++ * 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 ++#include ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++ ++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 ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++#include ++ ++/** ++ * 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 ++#include ++ ++// 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 ++#include ++#include ++ ++ ++/** ++ * 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 ++#include ++#include ++ ++/** ++ * 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 ++#include ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 +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 ++#include ++ ++/** ++ * 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++/** ++ * The following are disabled because support is incomplete just now. ++ */ ++/* ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++*/ ++ ++/** ++ * The following are not implemented just now ++ */ ++/* ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++*/ ++ ++/** ++ * 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 ++ ++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 ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++ ++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 ++#include ++ ++ ++/** ++ * 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 ++#include ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++ ++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 ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++#include ++ ++/** ++ * 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 ++#include ++#include ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++ ++/** ++ * 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 ++#include ++#include ++ ++/** ++ * 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 ++#include ++#include ++ ++/** ++ * 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 ++#include ++#include ++ ++/** ++ * 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 ++#include ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++ ++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 ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++#include ++ ++/** ++ * 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 ++ ++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 ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++ ++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 ++ ++/** ++ * 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++/** ++ * The following are not implemented just now. ++ */ ++/* ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++*/ ++ ++#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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++ ++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 ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++ ++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 ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++ ++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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/* ++ * 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 ++ ++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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++ ++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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#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 ++#include ++ ++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 ++#include ++ ++/** ++ * 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 ++#include ++#include ++ ++/** ++ * 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 ++#include ++#include ++ ++#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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++ ++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 ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++ ++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 ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++ ++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 ++ ++/** ++ * 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 ++ ++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 ++ ++/** ++ * 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 ++ ++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 ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++ ++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 ++ ++/** ++ * 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 ++#include ++ ++/** ++ * 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 ++ ++/** ++ * 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 ++#include ++#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 ++ ++#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) + ), 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 ++#include ++#include ++#include ++#include ++ ++#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 ++#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 +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 ++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 + Andrew de Quincey +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 + #include ++#include + #include + #include + #include +@@ -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 , or by paper mail: ++ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic ++ */ ++ ++#include ++ ++#include ++#include ++#include ++#include ++#include ++ ++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(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 ++ * ++ * This library is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU Lesser General 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 ++#include ++#include ++#include ++ ++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> \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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#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 []\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; itext_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 ++#include ++#include ++#include ++#include ++#include ++ ++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 ++#include ++#include ++#include ++#include ++ ++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 ++ * ++ * This library is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU Lesser General 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 ++#include ++#include ++#include ++ ++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> \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 @@ ++ ++ ++ ++ http://www.sidsa.com ++ SIDSA (Multiple Stream) ++ 1 ++ ++ ++ http://www.sidsa.com ++ SIDSA (Single Stream) ++ 2 ++ ++ +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 ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define MAX_FILENAME 256 ++ ++void usage(void) { ++ static const char *_usage = ++ "Usage: testesg [-a ]\n" ++ " [-c ]\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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++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 |-atscfile []\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, ++ §ion_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 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 ++#include ++#include ++#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 + #include +@@ -22,7 +23,7 @@ + int fd, r; + + if (argc != 2 || (strcmp(argv[1], "a") && strcmp(argv[1], "b"))) { +- fprintf (stderr, "usage: %s \n", argv[0]); ++ fprintf (stderr, "usage: %s \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 + #include +@@ -24,7 +25,7 @@ + int fd, r; + + if (argc != 2 || (strcmp(argv[1], "on") && strcmp(argv[1], "off"))) { +- fprintf (stderr, "usage: %s \n", argv[0]); ++ fprintf (stderr, "usage: %s \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 + #include +@@ -69,7 +70,7 @@ + int video_pid, audio_pid; + + if (argc != 3) { +- printf ("\nusage: %s